LPARAM / WPARAM to HWND



  • Hallo liebe Community,
    ich habe heute einen Keyboardhook geschrieben und die Funktion in der DLL, die mir die Keypress-Message übergibt, leitet mir den Virtual KeyCode, wParam und lParam weiter.

    LRESULT EXPORT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    	if(nCode < 0) return CallNextHookEx(NULL, nCode, wParam, lParam);
    
    	if(nCode == HC_ACTION) SendMessage(s_hWnd, s_mID, wParam, lParam);
    
    	return CallNextHookEx(NULL, nCode, wParam, lParam);
    }
    

    Nun wollte ich zusätzlich erkennen, in welchem Fenster der Keypress getätigt wurde. Ich bekomme ja das wParam und lParam übergeben und wollte bei euch mal nachfragen, ob es eine Möglichkeit gibt, über das wParam oder lParam an das Fensterhandle der Anwendung zu kommen, in der die Taste gedrückt und anschließend an mein Programm weiter geleitet wurde. Wenn das nicht möglich ist, kennt ihr eine Variante oder habt ihr Ideen wie ich es sonst schaffen köknnte? Danke schonmal im Vorraus 😉

    ______________________________________

    ...Wer generell Interesse an dem Code hat:

    #include <Windows.h>
    
    #define EXPORT __declspec(dllexport)
    
    #pragma data_seg("SHARED")
    	static HHOOK s_Hook = NULL;
        static HWND  s_hWnd = NULL;
    	static UINT  s_mID  = RegisterWindowMessage(L"WM_GLOBAL_KEYPRESS");
    #pragma data_seg()
    #pragma comment(linker, "/section:SHARED,rws")
    
    HINSTANCE g_hInstance = NULL;
    
    extern "C" BOOL EXPORT  InstallHook(HWND);
    extern "C" BOOL EXPORT  UninstallHook();
    LRESULT EXPORT CALLBACK KeyboardProc(INT, WPARAM, LPARAM);
    
    int APIENTRY DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved)
    {
    	g_hInstance = hInstance;
    	return 1;
    }
    
    extern "C" BOOL EXPORT InstallHook(HWND hWnd)
    {
    	s_hWnd = hWnd;
    
    	if(s_Hook) return TRUE; // Wenn der Hook bereits gesetzt wurde
    
    	s_Hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInstance, NULL);
    
    	if(!s_Hook) return FALSE;
    
    	return TRUE;
    }
    
    extern "C" BOOL EXPORT UninstallHook()
    {
    	if(s_Hook)
    	{
    		UnhookWindowsHookEx(s_Hook);
    		s_Hook = NULL;
    	}
    
    	return TRUE;
    }
    
    LRESULT EXPORT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    	if(nCode < 0) return CallNextHookEx(NULL, nCode, wParam, lParam);
    
    	if(nCode == HC_ACTION) SendMessage(s_hWnd, s_mID, wParam, lParam);
    
    	return CallNextHookEx(NULL, nCode, wParam, lParam);
    }
    

    Grüße Kromat


  • Mod

    Unfassbar. Nicht wissen was ein cast ist aber Hooks schreiben wollen... 😞

    SCNR, sonst Schweige ich grundsätzlich beim Thema Hooks!



  • Ich kann auch deine Mutter als HWND casten und es kommt trotzdem kein Handle auf das gesuchte Fenster heraus.

    ... Wie finde ich die ProcID meiner Anwedung wenn ich nur das Fenster Handle gegeben habe? ...

    ... Martin Richter: Ganz einfach, super leicht, kein Problem und nicht der Rede wert. Einfach casten 😉 Bei weiteren Fragen wendet euch bitte an mich 🙂



  • dieses forum ist schon der brüller aber auf beiden seiten, user wie moderatoren. hahahahahha



  • Nach einem kurzen Blick in die MSDN würd ich einfach mal sagen: Verwend statt einem WH_KEYBOARD einen WH_CALLWNDPROC Hook...



  • LRESULT EXPORT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
        if(nCode == HC_ACTION) SendMessage(s_hWnd, s_mID, wParam, lParam);
    
        return CallNextHookEx(NULL, nCode, wParam, lParam);
    }
    

    Die erste Zeile war unnötig, weil sie in Gesamtheit bedeutete:

    Wenn nCode kleiner als 0 ist, dann wird mit CallNextHookEx returned. Ansonsten wird mit CallNextHookEx returned. Was ja sinnlos ist.^^



  • Stimmt das ist mir noch garnicht aufgefallen. Ich hab das jetzt nochmal umgeschrieben.

    LRESULT EXPORT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    	if(nCode < 0) return CallNextHookEx(s_Hook, nCode, wParam, lParam);
    
    	if(nCode == HC_ACTION) return SendMessage(s_hWnd, s_mID, wParam, lParam);
    }
    

    Das witzige jetzt ist, dass die Messages zwar an mein Programm gehen, allerdings anschließend nichtmehr dort ankommen, wo sie eigentlich hinsollten.

    - Im Browser (Firefox) kommen nach Programmstart gar keine Nachrichten mehr an
    - Text Editor und Startmenü beispielsweise erhalten die Nachrichten noch und können geschriebenen Text darstellen. Wenn ich zusätlich noch CallNextHook nach der versendeten Nachricht einfüge dann bekommt jede Anwendung seine Nachrichten wieder.

    Was mich zu meiner nächsten Frage bringt. Warum kommen Nachrichten im Startemnü und Texteditor an, im Browser jedoch nicht?



  • Andere beleidigen und dann hoffst du noch auf Hilfe? Dein Code ist einfach Käse, und würde dir raten nochmal CallNextHookEx() zu studieren -> MSDN. Und alles lesen auch die Remarks!



  • dieses forum ist schon der brüller aber auf beiden seiten, user wie moderatoren. hahahahahha

    Ja, und dann kommt ein chinesischer Möchtegern Hacker, welcher keine Ahnung von Programmieren hat, aber dank des C++ Forum sein Virus zum laufen bringt, welches ein Atomkraftwerk in Frankreich sabotiert s.d. es zum Gau kommt.

    Was glaubst du wer dann der Gelackmeierte ist?



  • Bitte ein Bit schrieb:

    dieses forum ist schon der brüller aber auf beiden seiten, user wie moderatoren. hahahahahha

    Ja, und dann kommt ein chinesischer Möchtegern Hacker, welcher keine Ahnung von Programmieren hat, aber dank des C++ Forum sein Virus zum laufen bringt, welches ein Atomkraftwerk in Frankreich sabotiert s.d. es zum Gau kommt.

    Was glaubst du wer dann der Gelackmeierte ist?

    Klingt für mich utopisch, obwohl man dazu bestimmt eine Wahrscheinlichkeit errechnen kann. 🤡



  • Aber um deine Frage zu beantworten: Die umliegenden Bewohner. 😞



  • Frag doch einfach mit GetForegroundWindow() das aktive Fenster ab, wenn die Key-Nachricht eintrifft.



  • Das ist ne gute Idee, vielen Dank 🙂 Ich habs gerade ausprobiert und es klappt einwandfrei. Jetzt kann ich den Hook auf erwünschte Prozesse beschränken.



  • Wäre es dafür nicht sinnvoller, mit Dll-Injection zu arbeiten!?



  • Das ist etwas, womit ich mich noch nicht beschäftigt habe. Zurzeit experimentiere ich ein wenig mit Hooks und schaue was möglich ist um ein wenig Routine zu bekommen. Aber bei dem Stichwort muss ich gleich mal google anschmeißen 😉



  • Klingt für mich utopisch, obwohl man dazu bestimmt eine Wahrscheinlichkeit errechnen kann. 🤡

    Klar, aber so tun als könne man damit nichts anrichten, ist auch der falsche Weg.

    Für iranische Atomanlagen hat es aber bereits gereicht. 😞


Anmelden zum Antworten