Ich weiß, dass eine Schaltfläche, wenn geklickt wird, die WM_COMMAND-Nachricht an die übergeordnete sendet, aber welche Nachricht erhält sie, die es diese Nachricht sendet? Ich überschreibe das Standard-WndProc einer Schaltfläche, und die Schaltfläche empfängt die WM_COMMAND-Nachricht nicht, daher muss ich wissen, welche Nachricht eine Schaltfläche verursacht, um die WM_COMMAND-Nachricht zu senden, damit ich diese Funktionalität replizieren kann.Welche Nachricht verursacht eine Schaltfläche zum Senden einer WM_COMMAND-Nachricht
Antwort
Ich fand, dass es tatsächlich eine Kombination von WM_LBUTTONDOWN, WM_MOUSELEAVE und ein paar andere Dinge ist. Zum Beispiel wird der WM_COMMAND nur ausgelöst, wenn die Maus auf der Schaltfläche gedrückt wurde und immer noch auf der Schaltfläche ist, wenn WM_LBUTTONUP ausgelöst wird. Wie für Leerzeichen, geben Sie ein, etc, ich glaube, es behandelt nur die VK_ENTER Nachricht und so.
Ich erinnere mich, dass es WM_LBUTTONUP ist, aber verwenden Sie ein Spy-Programm, um sicher herauszufinden.
Was ist, wenn Sie Klicken Sie darauf mit der Leertaste? Oder die Eingabetaste? Oder mit einem Gaspedal? –
Es ist nicht möglich, die Nachricht WM_COMMAND
zu überschreiben, weil die Nachricht WM_LBUTTONDOWN
als WM_COMMAND
Nachricht konvertiert und an die übergeordnete Steuerung gesendet wird. Dies ist der Mechanismus, der im Hintergrund ausgeführt wird.
Sie fragten nach Raum und geben Sie key.This können durch virtuelle Tastencodes wie vk_enter
, vk_tab
... etc., Ist
WM_COMMAND Nachricht immer von Kontrollen Eltern empfangen gesteuert werden. Wenn Sie Schaltfläche klicken möchten programmatisch können Sie dies tun:
::SendMessage(button_handle, BM_CLICK, 0, 0);
LPARAM von WM_COMMAND button_handle hält. So können Sie Informationen über Sie Taste extrahieren Aufruf
::GetWindowLongPtr(HWND(lParam), GWL_USERDATA);
Sie müssen früher diese Informationen eingestellt wurden ähnliche
::SetWindowLongPtr(button_handle, GWL_USERDATA, reinterpret_cast<LONG_PTR>(some_info));
zum Beispiel some_info können durch Zeiger auf Schaltfläche Wrapper-Objekt
Sie könnten den alten WndProc für die Schaltfläche für alle Nachrichten aufrufen, die Sie nicht explizit abfangen möchten. (Aus dem Speicher, ich denke, es ist 'GetWindowLongPtr (hWnd, GWL_WNDPROC)', um es abzurufen ...) Das sollte Ihre neue Schaltfläche senden die 'WM_COMMAND'-Nachricht als normal, während Sie einhaken, um zu tun, was Sie versuchen zu tun machen. Kann nicht wirklich sagen, ob das für Ihre Situation gut ist ... –
@brone nein es ist nicht, ich muss in der Lage sein zu sagen, ob der Knopf tatsächlich "geklickt" wurde (nach den Regeln eines Knopfes) abgesehen von das originale WndProc, damit ich meine eigenen Sachen machen kann. Das Abfangen von WM_COMMAND im übergeordneten Fenster ist nicht das, was ich brauche. –