Hooks und PreTranslateMessage



  • Hat wirklich niemand einen Tipp für mich, irgendwie muss es doch möglich sein in einem nicht modalen Fenster einer regulären DLL die PreTranslateMessage aufrufen zu können und somit auch Tooltips verwenden zu können.

    OnKeyDown funktioniert beispielsweise ohne PreTranslateMessage auch nicht, irgendjemand muss doch bestimmt auch schon mal das Problem gehabt haben?

    Bin für jeden Tipp dankbar

    Vielen Dank im voraus.
    Lg Kerberos


  • Mod

    1. Ich verstehe Deinen Code nicht. Warum hast Du denn diesen auskomentierten Block überhaupt drin. Der zweite Code-Block sorg doch für den Aufruf von PreTranslateMessage!
    Es ist Unfug beide Code-Blöcke drin zu haben.
    Der Originalcode von CodeGuru Forum hat dies auch nicht:
    http://www.codeguru.com/forum/archive/index.php/t-82947.html

    2. OnKeyDown hat mit PretranslateMesasage nichts zu tun. Das ist eie direkte Windowsnachricht, die an den Empfänger ausgesendet wird.



  • Hi Martin,

    es ist mir schon bewusst, dass ich nur einen der beiden Blöcke verwenden kann.

    Der erste (und auskommentierte) ist der Block, von dem ich denke dass es so funktionieren müsste, was er aber nicht tut.

    Der zweite ist der Block, mit dem die Anwendung zwar fehlerfrei gestartet und beendet werden kann, aber weder Tooltips, noch OnKeyDown funktioniert.

    Ich hab das jetzt noch so wie in dem Beispiel aus dem CodeGuru-Forum versucht, aber da reagiert dann mein Fenster nicht mehr richtig auf die Nachrichten und wenn ich es beende bekomm ich eine Assertion (also nur im Debug natürlich)

    Wenn die OnKeyDown nichts mit der PreTranslateMessage zu tun hat, wieso funktioniert die dann nicht, bzw. muss ich dann auch alle Nachrichten abfangen und Prüfen, ob die Taste dabei ist, die ich überprüfen möchte?

    Danke und LG
    Kerberos


  • Mod

    1. Nochmal: OnKeyDown habt damit gar nichts zu tun!
    2. Der erste Block darf nicht funktionieren und kann auch nicht funktionieren weil Du die Hook Situation nicht berücksichtigt. Das macht der zweite Block nur korrekt.
    3. Es täte Dir evtl. gut einfach den zweiten Code Block zu lesen. Der behandelt nämlich nur Tastatureingaben!!! Und keine Muasbewegungen. Die Benötigt aber RelayEvent.
    Vielleicht passt Du einfach mal den Code an... 😉



  • Sorry, bin am falschen PC (@nickname... hatten wir ja schon mal).

    Zu 1.: Aber warum funktioniert OnKeyDown dann in meinem Fall nicht, hat das auch was mit der DLL und einem nicht modalen Fenster zu tun?

    Zu 2.:

    weil Du die Hook Situation nicht berücksichtigt.

    Wie meinst du das?

    Zu 3.: Das mir der zweite Code-Block nur Tastatureingaben abfängt ist mir schon klar, aber ich weiss leider nicht welche Nachrichten ich abfangen muss damit mein Fenster so funktioniert wie wenn ich es modal aufrufe, bzw. welche Nachrichten im Normalfall an die PreTranslateMessage weitergeleitet werden. (Im ersten Block habe ich versucht einfach alle Nachrichten abzufangen und an die PreTranslateMessage weiterzuleiten). Wäre nett wenn du mir sagen könntest, wie ich Mausbewegungen filtern könnte (WM_MOUSEMOVE, hab ich schon probiert, funktioniert aber leider nicht).

    Das Beispiel aus dem CodeGuru-Forum funktioniert bei mir leider nicht.

    Danke und Lg
    Kerberos



  • Hi,

    ich habs jetzt auch noch auf einem anderen Rechner probiert, um auszuschließen dass das Problem an der Konfiguration des PCs liegt.

    Sobald ich folgenden Code verwende reagiert mein Fenster nicht mehr richtig:

    - Ich kann es nicht mehr verschieben
    - Ich kann keine Buttons mehr betätigen
    - ...

    if( (nCode >= 0) && (PM_REMOVE == wParam) &&
        AfxGetApp()->PreTranslateMessage(lpMsg))
    {
      lpMsg->message = WM_NULL;
      lpMsg->lParam  = 0L;
      lpMsg->wParam  = 0;
    }
    

    Dann hab ich folgendes versucht, was mich zum selben resultat bringt

    if((nCode >= 0 && PM_REMOVE == wParam) && 
       ((lpMsg->message >= WM_KEYFIRST && lpMsg->message <= WM_KEYLAST) || WM_MOUSEMOVE) &&
       (lpMsg->wParam!= VK_ESCAPE) &&
       (AfxGetApp()->PreTranslateMessage((LPMSG)lParam)))
    {
      lpMsg->message = WM_NULL;
      lpMsg->lParam = 0;
      lpMsg->wParam = 0;
    }
    

    Weiss wirklich nicht wie ich das Problem nöch lösen soll...


  • Mod

    Verdienst Du Dein Geld mit so etwas?

    kerberos schrieb:

    if((nCode >= 0 && PM_REMOVE == wParam) && 
       ((lpMsg->message >= WM_KEYFIRST && lpMsg->message <= WM_KEYLAST) || WM_MOUSEMOVE) &&
       (lpMsg->wParam!= VK_ESCAPE) &&
       (AfxGetApp()->PreTranslateMessage((LPMSG)lParam)))
    {
      lpMsg->message = WM_NULL;
      lpMsg->lParam = 0;
      lpMsg->wParam = 0;
    }
    

    Dieser Code ist echt ein Knüller. Eigentlich müsstest Du selbst darauf kommen was hier falsch läuft.



  • Ich verdiene damit kein Geld (mal abgesehen von einem kleinen "Taschengeld")und das ist auch meine erste Anwendung die ich in C++ / MFC schreibe, also wenn die Frage zu dumm ist musst du ja nicht antworten, ansonsten könntest du mich auch einfach verbessern. Vielleicht sitze ich nur auf dem Schlauch und seh den Fehler nicht, aber ich weiss nicht was daran so "schlimm" sein soll:

    ((lpMsg->message >= WM_KEYFIRST && lpMsg->message <= WM_KEYLAST) || WM_MOUSEMOVE) && 
    // Überprüfen ob es sich um eine Dialog-Taste (Tab, Pfeil, Esc, ...) oder eine Mausbewegung handelt.
    
    (lpMsg->wParam!= VK_ESCAPE) && 
    // Escape-Taste darf nicht gedrückt werden, da sonst ein Assert ausgelöst wird -> Anwendung soll sowieso nicht mit escape beendet werden.
    
    (AfxGetApp()->PreTranslateMessage((LPMSG)lParam))) 
    // Wenn PreTranslateMessage TRUE zurückgibt nachricht verwerfen.
    

    Klar wäre es schöner die Prüfung auf Escape anders durchzuführen, aber ich wollte ja nur schnell darstellen, wie ich es auch versucht habe. Und im Übrigen erhalte ich das gleiche Problem wie mit dem anderen Block.


  • Mod

    Zuallererst für so etwas wie kompletten Code ansehen und programmieren für andere fehlt mir die Zeit.
    1. Ist die Lösung in dem Forum von Code Project Grundsätzlich nur für Tastatureingaben.
    2. Stimmt genau Dein erster Test nicht. || WM_MOUSEMOVE liefert immer wahr. Schau Dir mal bitte die Reihenfolge der Bindung von Operanden an.
    3. Du vermisst OnKeyDown? Wer sol das OnKeyDown bekommen? Dein Dialog? OnKeyDown bekommt nur wer auch den Focus hat. Der Dialog also nie.
    4. Wenn Du Tooltips vermisst, müsstest Du nur RelayEvent fürdie entsprechenden Mausnachrichten ausführen. PreTranslateMessage wäre dann überflüssig.
    5. Wenn dieser Code nicht funktioniert, dann wende Dich an den Author 😉 in dem Forum. Ich könnte mir denken, das evtl. die Erstezung auf WM_NULL nicht vollständig zum ignorieren der Nachricht führt.
    Setze lpMsg->hwnd = NULL



  • Jetzt weiss ich was du gemeint hast, sorry, habe es aus dem Kopf geschrieben. Im Code habe ich es wie folgt:

    if((nCode >= 0 && PM_REMOVE == wParam) && 
    	   ((lpMsg->message >= WM_KEYFIRST && lpMsg->message <= WM_KEYLAST) ||
    	   (lpMsg->message >= WM_MOUSEFIRST && lpMsg->message <= WM_MOUSELAST)) &&
    	   (lpMsg->wParam!= VK_ESCAPE) &&
    	   (AfxGetApp()->PreTranslateMessage((LPMSG)lParam)))
    	{
    		lpMsg->message = WM_NULL;
    		lpMsg->lParam = 0;
    		lpMsg->wParam = 0;
    	}
    

    1. Ist die Lösung in dem Forum von Code Project Grundsätzlich nur für Tastatureingaben.

    Aber Mauseingaben werden auch abgefangen -> Tooltips werden angezeigt, nur die Steuerung des Fensters funktioniert dann nicht mehr richtig.

    3. Du vermisst OnKeyDown? Wer sol das OnKeyDown bekommen? Dein Dialog? OnKeyDown bekommt nur wer auch den Focus hat. Der Dialog also nie.

    Das versteh ich nicht ganz, wenn mein Fenster aktiv ist (blaue Titelleiste) hab ich doch den Fokus und dann müsste mein Fenster doch darauf reagieren, wenn das nichts mit der PreTranslateMessage zu tun hat.

    Setze lpMsg->hwnd = NULL

    Hatte ich auch schon probiert, bringt leider auch nichts.


Anmelden zum Antworten