Fenster reagiert nur bei Focus auf Message



  • Hallo, ich habe mir eine Hook DLL geschrieben und sie funktioniert auch ganz gut. Problem: Mein Hauptfenster reagiert auf die Message (WM_USER + 40) nur, wenn das Fenster aktiviert ist. Ich möchte mir so eine Art backgroundworker basteln (kein Keylogger). Z.B. wenn man die Taste A drückt, soll der Papierkorb geleert werden (nur so als Beispiel). Wenn ich jetzt aber innerhalb des Programms (in die WM_USER+40) das schreibe:

    case (WM_USER+40):
    	CurrentKey = wParam;
    	WriteIntoLog("Bereinige Papierkorb"); //Schreibt diesen Text in eine Listbox...
    

    Diese Funktion wird nur dann aufgerufen, wenn das Fenster den Fokus hat (was ja auch eigentlich logisch ist). Wie kann ich das machen, dass diese Funktion trotzdem ausgeführt wird, ohne diese in die DLL zu implementieren?



  • Ich habe das ungute Gefühl, dass sich die DLL nur mit deinem eigenen Prozess verlinkt hat. Probier mal folgendes: Du schickst ja innerhalb der DLL eine
    Message an dein Fenster. Lass dir doch innerhaalb der DLL mal das Handle
    dieses Fensters anzeigen (per MessageBox oder so), aktiviere eine andere
    Anwendung und drücke "A". Vergleiche den Wert in der MessageBox mit dem
    tatsächlichen Handle deines Fensters.



  • Ich habe an einigen Stellen des Quellcodes Änderungen vorgenommen:

    In der DLL innerhalb der HookProc:

    SendMessage ((HWND) hWindow, (WM_USER+4), (WPARAM) hWindow, 0L);
    

    Im Hauptprogramm

    case (WM_USER+4):
    	if(hwnd == (HWND) lParam)
    		MessageBox(hwnd, L"hwnd und hWindow stimmen überein", L"", NULL);
    	else
    		MessageBox(hwnd, L"hwnd und hWindow stimmen nicht überein", L"", NULL);
            break;
    

    Also meine Messagebox sagt mir, dass es nicht übereinstimmt. (Habe ich da einen Fehler gemacht?).

    Das mit den Messageboxen funktioniert nicht, weil wenn ich HWND in LPCSTR konvertiere einfach nur "n" ausgegeben wird.

    mfg Nolf



  • Ich kann den Beitrag nicht editieren aber diese Stelle war falsch geschrieben:

    if(hwnd == (HWND) lParam)
    

    da muss hin

    if(hwnd == (HWND) wParam)
    

    Es klappt = sie stimmen überein.



  • Trotz der übereinstimmung der Handles Ich kann nichtmal auf die Listbox meiner Anwendung zugreifen, wenn ich das Handle an die DLL übergebe? Was stimmt da nicht?



  • Du solltest die MessageBox IN DER DLL ausgeben, und zwar dann, wenn auf 'A' gedrückt wird.
    Zum wahrscheinlichen Problem: Das Fenster-Handle muss in der DLL als shared memory vorhanden sein. Welchen Compiler hast du?



  • Ich hab den VC++ 2008 Prof. Compiler und das hwnd ist in einem Daten-Segment enthalten:

    Quellcode:

    #pragma data_seg ("Shared")
    HWND hwnd;
    #pragma data_seg ()

    #pragma comment (linker, "/section:Shared,RWS") //Read Write Shared aktivieren

    Diesen Teil habe ich aus dem Keyboardhook-Beispiel in der F.A.Q übernommen.



  • Hast du denn meinen Vorschlag mit der MessageBox jetzt mal ausprobiert?



  • Ja und das Ergebnis sagt, dass die Handles gleich sind.



  • Ich weiß nicht, was ihr beiden da für komisches Gefrickel fabriziert, aber es gibt hier schon seit JAHREN in der FAQ eine Anleitung mit Code für einen globalen Keyboard Hook. Denn eins ist jawohl klar, das Problem ist dein Hook Code, den du uns hier nicht zeigst.



  • Deine Antworten haben aber auch keinen Sinn oder? Mach dir ma ein Bild von was du da redest und les ma das Problem besser durch. Es geht nich darum, dass ich nich weis, wie man nen Keyboardhook schreibt. Es geht darum, dass wenn ein Key gedrückt wurde und an die Hauptanwendung geschickt wurde (was doch auch funktioniert!), dass das Fenster bestimmte Befehle verarbeiten soll, auch wenn es nicht aktiviert ist. Ich glaube einige kennen TeamSpeak und da wird sowas auch gebraucht.



  • LOL UND WARUM MEINST DU IST DAS SO DU ABGEBRANNTE BRATPFANNE? WEIL DU KEINEN GLOBALEN HOOK GESETZT HAST.



  • Komm ma runter, Kind (Bratwurst)^^ rofl...
    Natürlich hab ich nen globalen Hook gesetzt und ich benutz auch ne DLL^^



  • jo dann funzt jawohl auch alles, wenn du es richtig gemacht hast, oder? aber nein es funzt nichts, weil du es falsch gemacht hast. aber wenn du uns deine ncode nicht zeigen willst, dann nerv uns hier bitte auch nicht weiter. wir können hier nicht hellsehen, weisst du.


Anmelden zum Antworten