Probelm mit der auswertung, der von KeyboardProc gesendeten parameter!, PLZ HELP



  • hi, ich habe mir auch mal nen keines globalhook proc progen wollen und es ist auch eigentlich fast fertig. mein problem ist es ich weiss nicht wie ich die von der KeyboardProc gesendeten daten auswerten kann?.

    hier die KeyboardProc aus meiner DLL:

    static LRESULT CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lParam ) {
    
        if( nCode < 0 ) {
    
             CallNextHookEx( hKeyHook, nCode, wParam, lParam );
        }
    
        if( nCode == HC_ACTION ) {
    
            SendMessage( hWndDLL, WM_KEYMESSAGE, (WPARAM)wParam, (long)lParam );
        }
        return( CallNextHookEx( hKeyHook, nCode, wParam, lParam ) );
    }
    

    WM_KEYMESSAGE wurd wie folgt initialiert:
    UINT WM_KEYMESSAGE;
    WM_KEYMESSAGE = RegisterWindowMessage( "WM_KEYMESSAGE_MSG" );

    in meiner main.cpp hab ich WM_MESSAGE noch mal definieren muessen
    #define WM_KEYMESSAGE ( WM_USER + 2 )

    tja nun hab ich aber versucht den wParam in meiner WinProc wie folgt auszuwerten:

    [...]
            case WM_KEYMESSAGE: {
    
                switch( LOWORD( wParam ) ) {
    
                    case 'a': {
    
                        SendMessage( hListEvents, LB_ADDSTRING, 0, (long)"a" );
                        break;
                    }
                }
                return 0;
            }
    [...]
    

    hmm klappt aber irgendwie nicht, woran liegts?

    Gruß Tobi.



  • Hmm vielleicht weil WM_KEYMESSAGE unterschiedliche werte in der dll und in dem hauptprogramm haben?
    In der dll bekommt WM_KEYMESSAGE den Wert von RegisterWindowMessage() im Hauptprogramm bekommt es den Wert WM_USER + 2
    Aber die Werte sind doch nicht gleich (das sollte schon ein ziemlicher zufall sein ;)) 💡

    MfG schirrmie



  • hae?
    aber auch wenn ich in der dll WM_USER+2 angebe als message gehts net.



  • Ja ka kann ja auch mist erzählen 😃
    Hast du denn mal geguckt ob die Nachrichten überhaupt gesendet werden (Debugger; Messagebox ausgeben)? Und hast du mal geschaut was bei deinem Hauptprogramm überhaupt ankommt mit spy++ oder so?

    MfG schirrmie



  • T0bi schrieb:

    glob_keymessi = RegisterWindowMessage( "WM_KEYMESSAGE_MSG" );

    Lass mal die Headerdateien nach "WM_KEYMESSAGE_MSG" durchsuchen, dann steht da ungefähr:

    #define FINDMSGSTRINGA "commdlg_FindReplace"
    #define WM_KEYMESSAGE_MSG "Schweine_im_Weltall"
    

    Dann klappts auch mit der Nachbarin.



  • ich hab keine ahnung wie ich prüfen soll ob da was passiert, und shcon gar net mit spy -.-



  • hab jetz mal in der if( nCode == HC_ACTION ) ne MsgBox rein gebaut... die theoretisch immer kommen müsste wenn ich ne taste drücke... tut sie aber net -.-
    heisst das es kommt nix an und kann so au net gesendet werden?
    aber wieso?



  • hallo?


  • Mod

    Noch mal gaaaanz langsam zum mitschreiben:
    Auf beiden Seiten musst Du RegisterWindowMessage verwenden. Also sowohl in Deiner EXE als auch in Deiner DLL.

    Statt switch musst Du in der EXE dann if (msg==g_dwMyWindowMsg) verwenden.



  • hm ok....
    aber kann ich statt RegisterMessage auch in meiner DLL schreiben: in der KeyboardProc

    SendMessage( hWnd, ( WM_USER+2), wParam, lParam );

    und dann in meiner main die WM_KEYMESSAGE mit WM_USER+2 definieren

    und dann halt in meiner WinProc()
    case WM_KEYMESSAGE:

    if( message == WM_USER+2 ) {

    /auswertung

    is das so richtig?

    Gruß Tobi.


  • Mod

    Du solltest über Prozessgrenzen hinweg keine WM_USER+x Nachrichten verwenden!



  • hm ok also doch RegisterMessage.
    aber ich bin mir net sicher wo ich das hin schreibe in der exe
    "if (msg==g_dwMyWindowMsg)"
    waer net wenn de mir des au noch sagst.

    Gruß Tobi.


  • Mod

    Wenn Du das nicht verstehst, solltest Du nicht mit Hooks anfangen... 🤡 SCNR



  • sagst dus mir jetzt oder nicht?
    jeder fängt mal klein an.



  • achja eine kleinigkeit haette ich dem noch hinzu zufügen:
    und zawr, wenn ich jetz in meiner switch( message ) in der WinProc unter
    case WM_KEYMESSAGE: nur SendMessage(...), soll einen string in eine listbox adden, schreibe dann wird aber NUR ein string geadded, wenn ich im fenster selbst bin, bin ich jedoch in einem fremden fenster oder desktop, dann passiert gar nichts. hmm also irgendwie passiert schon was nur noch net des richtige.



  • Du machst es einem ganz schön schwer eine korrekte Antwort zu geben.
    In diesem Forum gibt es bereits mehrere Threads zum Thema "KeyboardProc".
    Als Fehlerursache hat sich jedesmal herausgestellt, dass die Kontrolle oder Übersicht über das Programm verlorengegangen ist.

    Dein letzter Post deutet darauf hin, dass Du den Hook lokal und nicht global gesetzt hast.



  • also ich bin der meinung das das global ist:
    //DLL

    EXPORT bool InstallHook( HWND hWnd ) {
    
        if( hWndDLL != 0 ) {
    
            return false;
        }
        else {
    
            hKeyHook = SetWindowsHookEx( WH_KEYBOARD, (HOOKPROC)KeyboardProc, hInst, 0 /* GLOBAL */ );
    
            if( hKeyHook != 0 ) {
    
                hWndDLL = hWnd;
            }
            else {
    
                return false;
            }
        }
        return true;
    }
    

    und in der main ruf ich diese funktion mit einem button auf.
    Gruß tobi.



  • Stimmt, ist global.

    T0bi schrieb:

    ...bin ich jedoch in einem fremden fenster oder desktop, dann passiert gar nichts.
    hmm also irgendwie passiert schon was nur noch net des richtige.

    Beschreib mal genauer was passiert und warum es nicht das richtige ist.



  • ich habe mir hier schon mal ein paar beiträge angeschaut, mit unter dieser hier
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-127046-and-highlight-is-keyboard+hook.html

    dies entspricht eigentlich genau meinem problem.
    Kurz:
    hat meine anwendung den focus bekommt sie die message, ist es miniminert oder nicht activewindow dann passiert nichts. der grund ist, dem thread nach, das man nicht einfach SendMessage benutzen kann um ueber 2processe zu kommunizieren.

    schade ist nur das in diesem thread keiner zu einer nun endgültigen lösung gekommen ist. es wurde von WM_DATACOPY und pipes gesprochen... aber ich habe davon keine ahnung und wuesste net wo ich diese einsetzen soll.

    hoffe einer von euch kann nun die lösung von diesem thread bringen, wär cool 🙂

    Gruß Tobi.



  • Laut Deiner Beschreibung scheint der Hook warum auch immer trotzdem lokal zu sein.
    Was passiert wenn Du im Hook statt SendMessage () MessageBox () benutzt ?
    Wird die wenigstens angezeigt wenn die Anwendung nicht aktiv oder minimiert ist ?


Anmelden zum Antworten