Maus und Tastatur Hook mit Abfrage des auslösenden Handles



  • Hi,

    ich habe eine DLL welche einen Maus- und Keyboard-Hook installiert. Diese DLL
    wird in einen VB6 Programm benutzt. Wird die Maus bewegt oder die Tastatur
    benutzt, dann schickt die entsprechende Funktion der DLL ein Nachricht an die
    registrierte Funktion in meinem VB Programm.

    Das funktioniert soweit wunderbar. Der Hook ist nur für ein Textfeld
    installiert. Leider bekomme ich trotzdem alle Maus und Keyboard Events des
    ganzen Programmes. Das ganze ist nur zum testen, in dem eigentlichen Programmm
    wo es später benutzt wird erzeugt ein anderer Teil des Programmes Mousemove-
    Events, auf die ich bis jetzt leider noch reagiere. Deshalb habe ich mir diese
    kleine Testprogramm geschrieben.

    Zurück zum Problem...
    Ist es irgendwie möglich in meiner Hookfunktion in meiner DLL zu prüfen welches
    Handle jetzt den Hook ausgelöst hat?

    Und für alle die jetzt wieder denken das es sich um einen Keylogger handelt:
    Es geht um einen Benutzerlogin und Logout, dieser ist mit einem Timer
    realisiert. Wenn für eine gewisse Zeit keine Aktion passiert soll ein
    Loginfenster angezeigt werden, da ich aber nicht prüfen kann ob das Event
    wirklich nur von der Maus kommt und nicht doch Softwareseitig ausgelöst wurde,
    bräuchte ich jetzt etwas Hilfe.

    Wie bekomme ich das Handle raus?



  • Ich hab nicht ganz verstanden warum Du einen Hook benötigst... bzw. was das mit dem Handle aus sich hat...

    Falls Du mit dem Mouse-Hook arbeitest, kannst Du "WindowFromPoint" verwenden...

    Wenn der Hook eh bloss für ein Control sein soll, warum verwendest Du dann nicht Subclassing?



  • Das eine Control ist nur mein Testprogramm zu Hause, dass wofür ich es brauche
    entwickle ich woanders, hier brauche ich einen Hook der gesammten Applikation,
    aber ich muß wissen woher er kam und wer in ausgelöst hat.



  • Leute ich brauch doch nur so etwas wie das Spy++ von Microsoft, in welchem ich
    sehe von welchem Fenster-Handle eine Nachricht geschickt wurde. Ich weiß nur
    leider nicht wie ich an diese Nachricht rankomme.



  • Sag das doch gleich...

    SetWindowsHookEx mit WH_CALLWNDPROC



  • Stellt sich für mich leider noch die Frage wie ich dann meine Handles und
    Mausevents rausfiltere. Ich kann ja mal ein bißchen Testcode posten.

    In meiner Initfunktion in der Dll wird folgendes gesetzt.
    Mouseproc ist meine Hookfunktion, kommt weiter unten.
    g_hDLLInst ist das Instanzehandle der Dll.

    g_hHookMouse = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)MouseProc, g_hDLLInst, 0);
    g_hSubclassedForm = (HWND)hWnd;
    

    Die Funktion zum Auswerten sieht dann so aus.

    LRESULT WINAPI MouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
    	MSG msg;
    
    	if (nCode < 0)
    		return CallNextHookEx(g_hHookMouse, nCode, wParam, lParam);
    
    	if (!(g_iMsgID == 0)) {
    		g_copydata.dwData = wParam;
    		g_copydata.lpData = (PVOID)lParam;
    		g_copydata.cbData = NULL;
    
    		if (!g_hSubclassedForm == 0) {
    			SendMessage(g_hSubclassedForm, WM_COPYDATA, NULL, (LPARAM)&(g_copydata.dwData));
    		}
    
    	}
    	return CallNextHookEx(g_hHookMouse, nCode, wParam, lParam);
    }
    

    Hier der VB6 Code.
    Initfunktion

    SetGlobalMouseHook(hWnd)
    m_pPrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf SubWndProc)
    

    Code von SubWndProc

    Public Function SubWndProc(ByVal hWnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Dim cds As COPYDATASTRUCT
        Dim RepeatCount As Integer
        Dim ScanCode As Byte
    
        If MSG = WM_COPYDATA Then
          i = i + 1
          Form1.Text1.Text = i
    
          Call CopyMemory(cds, ByVal lParam, Len(cds))
          Form2.Text2.Text = cds.cbData & " " & hWnd
        End If
        SubWndProc = CallWindowProc(m_pPrevWndProc, hWnd, MSG, wParam, lParam)
    End Function
    

    Leider hängt sich mein Programm auf sobald ich den Hook initialisiere.



  • Ok, also ich gebe es langsam auf.
    Aber...gibt es eine Möglichkeit wie ich alle Fensternachrichten auch von
    Childprozessen bekomme. So wie es Spy++ macht?



  • Also ich habe das mit dem Hook jetzt sein gelassen und führe in der Dll direkt
    das Subclassing durch. Ich kann auch wunderbar auch meine Mouseevents reagieren.
    Leider funktionieren meine Buttons nicht mehr richtig in meinem VB Programm und
    das Fenster wird bei einem Resize nicht mehr richtig aktualisiert.

    LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 
    	switch (uMsg) 
        { 
    		case WM_MOUSEMOVE:
    			{
    				SendMessage(hwnd, WM_COPYDATA, (unsigned int)hwnd, (LPARAM)&(g_copydata.dwData));
    				return 0;
    			}
    
    		default: 
                return DefWindowProc(hwnd, uMsg, wParam, lParam); 
        } 
    	return 0;
    }
    

    Das Handle mit welchem ich SetWindowLong aufrufe ist das Handle der VB
    Hauptform.

    Es wäre schön wenn sich jemand mit meinem Problem beschäftigen könnte.



  • 1. Du solltest natürlich die alte WndProc aufrufen und nicht DefWindowProc
    2. Du solltest bei WM_MOUSEMOVE nicht rausspringen, sondern auch die alte WndProc aufrufen



  • Danke für die Antwort. Das Problem ist mir auch schon aufgefallen und ich habe
    es gleich geändert. Ich habe zwei Button in meinem VB Programm. Wenn ich
    Subclassing aktiviere funktioniert alles und auch das ausschalten geht. Wenn ich
    es aber ein weiteres mal aktivieren will beendet sich mein Programm einfach.



  • Ich nochmal.
    Hab den Fehler jetzt gefunden. Ich rufe in meinem VB Programm auch nochmal
    SetWindowLong auf damit ich auf die Nachrichten aus meiner Dll reagieren kann,
    wenn ich den Aufruf auskommentiere dann gibt es keinen Absturz mehr, aber auch
    keine Nachrichten. Ist es nicht möglich mehrere Subclassing funktionen zu
    benutzen?



  • So ich habe mir jetzt eine passende Lösung von dem unten angegeben Beitrag
    zusammen gestrickt und es funktioniert alles.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-94626-and-highlight-is-subclassing.html


Anmelden zum Antworten