KeyBoard Hook in VC++.NET

the incredible Leitman

Erfahrenes Mitglied
Hallo Leute...

Ja, ich weiß, es gibt schon genug Windows Hooking Threads in diesem Forum, aber ich checks leider noch immer net :(

Hab mich klar schon laaaange umgesehn und auch schon viel gefunden, aber leider war nie etwas dabei, das mir wirklich weitergeholfen hat... -.-
Entweder Snippets in C#, Beispiele in alter Syntax...

Habe erst mit VS2005 mit Programmieren angefangen, also keine ahnung was vorher noch war, aber ich habe gehört, dass sich nun einiges geändert hat... managed Typen, generic List, etc, etc...
Leider kenne ich nur das und habe echt keine Ahnung wie vorher mit Typen, arrays, Listen, Objecte, oder was auch immer verfahren wurde :(

Jetzt wollte ich mich an ein Hook Beispiel machen, dass fürs .NET Framework 2.0 konzipiert ist... http://blogs.msdn.com/toub/archive/2006/05/03/589423.aspx
dieses Beispiel ist in C# und eigentlich recht einfach gehalten,
ich dachte mit dass kann doch nicht so schwer sein, auf C++ umzubauen... tja falsch gedacht :(

Andere Beispiele habe ich auch schon versucht... mit DLLIMPORT, oder HHOOK, und solche Sachen... aber das sieht mir alles nach oldSyntax Style aus (hab kein einzige ^ gefunden) damit kann ich nichts anfangen :(

Vielen Dank für eure Zeit,
mfG

der Leitman
 
Zuletzt bearbeitet:
OK,
hab nun den Code einigermaßen umgebaut:
C++:
ref class InterceptKeys
{
	private:
		delegate System::IntPtr LowLevelKeyboardProc(int nCode, System::IntPtr wParam, System::IntPtr lParam);

	private:
		static const int WH_KEYBOARD_LL = 13;
		static const int WM_KEYDOWN = 0x0100;
		static LowLevelKeyboardProc ^_proc = HookCallback;
		static System::IntPtr _hookID = System::IntPtr::Zero;

	public:
		static void Main()
		{
			_hookID = SetHook(_proc);
			Application::Run();
			UnhookWindowsHookEx(_hookID);
		}

	private:
		static System::IntPtr SetHook(LowLevelKeyboardProc ^proc)
		{
			System::Diagnostics::Process ^curProcess = gcnew System::Diagnostics::Process();
			curProcess = Process::GetCurrentProcess();

			System::Diagnostics::ProcessModule ^curModule = curProcess->MainModule;

			return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule->ModuleName), 0);
		}

	private:
		static System::IntPtr HookCallback(int nCode, System::IntPtr wParam, System::IntPtr lParam)
		{
			if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
			{
				int vkCode = Marshal::ReadInt32(lParam);
				Console::WriteLine((Keys)vkCode);
			}
			return CallNextHookEx(_hookID, nCode, wParam, lParam);
		}

		[DllImport("user32.dll", CharSet = CharSet::Auto, SetLastError = true)]
		static System::IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc ^lpfn, System::IntPtr hMod, System::UInt32 dwThreadId);

		[DllImport("user32.dll", CharSet = CharSet::Auto, SetLastError = true)]
		//[return MarshalAs(bool)]
		static bool UnhookWindowsHookEx(System::IntPtr hhk);

		[DllImport("user32.dll", CharSet = CharSet::Auto, SetLastError = true)]
		static System::IntPtr CallNextHookEx(System::IntPtr hhk, int nCode, System::IntPtr wParam, System::IntPtr lParam);

		[DllImport("kernel32.dll", CharSet = CharSet::Auto, SetLastError = true)]
		static System::IntPtr GetModuleHandle(System::String ^lpModuleName);
};
Also auf C++ SyntaX ( :: anstelle von . , public: usw...)

Doch leider das noch immer nicht...
Ich erhalte folgende (und noch mehr) Fehlermeldungen:
"error C3374: can't take address of 'LowLevelKeyHook::Form1::InterceptKeys::HookCallback' unless creating delegate instance"
"error C2440: 'initializing' : cannot convert from 'System::IntPtr (__clrcall *)(int,System::IntPtr,System::IntPtr)' to 'LowLevelKeyHook::Form1::InterceptKeys::LowLevelKeyboardProc ^'"
in der Zeile, in der ich _proc als LowLevelKeyboardProc deklarieren möchte :(

was mache ich falsch? :confused:

BITTE, jetzt shice ich schon so lange herum und komm auf keine Lösung :(
hoffe mir kann irgendwer helfen
 
Danke erstmal.... mein Held ^^

Aber leider hab ich absolut wirklich keinen Plan von VB :confused:

Genau das ist ja mein Problem... ich habe schon etliche Beispiele für Keyboard Hooks gefunden, in C#, VB, C++ OLD SYNTAX aber eben nichts, das ich in einer managed ref class verwenden kann :(
 
Wo ist denn genau das Problem mein junger Padawan? :D
Du hast dort lediglich Beispiele wie Du mit der WinAPI umgehen musst. Wie Du das in c++ realisierst, ist doch dein Bier? :confused:
 
Ja leider, genau das ist mein Problem...

ich hab schon ne Vorstellung, wie ich mit der WinApi umgehen muss, auch schon einige Hook Beispiele in C# gemacht um mich mit der Funktionsweise vertraut zu machen,

nur schaff ich es bei Gott im Himmel nicht, das auf managed C++ umzukonvertieren -.-

//EDIT:
ACH du Shice... -.-
*schäme mich*
Warum sagt mir denn auch niemand, dass ich nen Delegate in C++ explizit createn muss? *lol*

Das Einzige, das mir gefehlt hat, war ein "gcnew" :( *stupido, me = stupido*

Nun kann ich die Keyboardeingaben zwar abfangen, aber immer noch nicht nicht weiterleiten..
*lol* Du sollst keine doppelten Verneinungen nicht verwenden XD
... und die ALT Taste auch nicht -.-

Was muss ich zurückgeben, dass die Message nicht anschließend von Windows ausgeführt wird?
Eigentlich dachte ich, das funktioniert nur, wenn ich nen Globale Hook mache? :confused:

Naja gut... dann bin ich also über diesen Weg genauso weit gekommen, wie wenn ichs mittels Events wie KeyDown machen... nur über die WinApi :( -.-

Kann mir vl irgend jemand sagen, was ich wie zurückliefern muss,
dass nicht ein Explorerfenster aufgeht wenn ich Windowstaste + E drücke oder ich Tasks wechseln kann, wenn ich ALT + Tab drücke

BITTE, ich shice damit jetzt schon seit fas 3 Monaten herum und komm keinen Schritt vorwärts :( :-(
 
Zuletzt bearbeitet:
ok, nach einer 2 wöchigen Erholungspause, widme ich mich wieder meinem Erzfeind, dem gloabalem Hook ^^

Das ich ALT+STRG+ENTF sowie ALT+TAB nicht abfangen kann, dachte ich ja an einen globalen Hook...

Nun habe ich in der MSDN aber folgendes gelesen:
Globale Hooks werden von dem FRAMEWORK nicht unterstützt
Abgesehen von dem einfachen WH_KEYBOARD_LL-Hooks und dem einfachen WH_MOUSE_LL-Hooks können Sie globale Hooks in dem Microsoft .NET Framework nicht implementieren. Ein Hooks muss einen systemeigenen DLL-Export, es in einem anderen Prozess, der eine gültige, konsistente Funktion erfordert, um eine gültige, konsistente Funktion aufzurufen, einzufügen enthalten, um einen globalen Anschluss zu installieren. Dieses Verhalten erfordert einen DLL-Export. Das FRAMEWORK unterstützt DLL-Exporte nicht. Da diese Funktionszeiger sich Proxy befinden, die dynamisch erstellt werden, hat verwalteter Code kein Konzept eines konsistenten Werts für einen Funktionszeiger.
Quelle:
http://support.microsoft.com/kb/318804/de

WTF stimmt das? o_O :-O
Kann ich mein Problem also gar nicht lösen?

weiters steht auf der Seite "aktualisiert am 11.12.06", muss also aktuell sein
sowie "Die Informationen in diesem Artikel beziehen sich auf:
• Microsoft .NET Framework 2.0
• Microsoft .NET Framework 1.1
• Microsoft .NET Framework 1.0
• Microsoft Visual C# 2005 Express Edition
• Microsoft Visual C# .NET 2003 Standard Edition
• Microsoft Visual C# .NET 2002 Standard Edition"

Ich verwende aber C++.NET in VS 2005 Professional Edition !
.NET Framework 2.0

Also, kann mich jemand aufklären?
Weiß jemand da genaueres?

Oder gibt es einfach wirklich keine Möglichkeit meine Anwendung am Schließen zu hindern?

// EDIT: Notitz an mich selbst:
Bei Gelegenheit: http://www.codeproject.com/dll/keyboardhook.asp
Neu (January 2007) Windows Hooking
 
Zuletzt bearbeitet:
Zurück