Button-Release Event
-
Hallo,
Ich möchte unsere Spracherkennungsanwendung mit einer UI versehen. Die UI soll über einen Knopf verfügen mit dem der Bentuzer die Spracherkennung aktivieren oder de-aktivieren kann: So lange der Benutzer auf dem Knopf drückt, ist die Spracherkennung aktiv; lässt er Benutzer den Button wieder los, wird die Spracherkennung deaktiviert (ähnlich Push-To-Talk).
Meine Kenntnisse in C++/MVC sind leider sehr begrenzt. Ich habe zwar herausgefunden, wie ich Messages/Events abfangen kann, wenn das „Button“-Widget vom Benutzer gedrückt wurde. Ich konnte aber nicht herausfinden, wie ich ein Unterschied zwischen „Button-Pressed“ und „Button-Released“ Event machen kann.
Könnte mir hier jemand weiter helfen?
Hier noch der Code:
BOOL CALLBACK DlgProcMain( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam ){ switch( nMsg ) { case WM_COMMAND: { switch( GET_WM_COMMAND_ID( wParam, lParam ) ) { case IDC_BUTTON_RECOG: { // hier startet der Spracherkennungsthread } } } }Danke und schönes Wochenende
Daniel
-
Das ist nicht so einfach, und die Weg wird nie zum Erfolg führen
weil es keine Release-Envent gibt.Ich hab das so gelöst:
1.) In deiner Dialog-Klasse folgende Variable einfügen:
WNDPROC pOldButton;2.) Dann die Fensterfunktion deiner Taste ändern:
CMyDlg::OnInitDialog() { ... SetWindowLong(GetDlgItem(IDC_BUTTON1)->m_hWnd,GWL_USERDATA,this); pOldButton= (WNDPROC)GetWindowLong(GetDlgItem(IDC_BUTTON1)->m_hWnd,GWL_WNDPROC); SetWindowLong(GetDlgItem(IDC_BUTTON1)->m_hWnd,GWL_WNDPROC,(LPARAM)PushProc); ... }3.) Jetzt die neue Fensterfunktion erzeugen:
LRESULT CALLBACK CMyDlg::PushProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { CMyDlg *pThis; pThis = (CLyricsDlg*)GetWindowLong(hWnd,GWL_USERDATA); if(uMsg==WM_KEYUP) { // Taste wurde losgelassen pThis->OnReleaseEvent(); // Beliebige Klassenfunktion } if(uMsg==WM_KEYDOWN) { // Taste wurde gedrückt pThis->OnPressEvent(); // Beliebige Klassenfunktion } return CallWindowProc(pThis->pOldPush,hWnd,uMsg,wParam,lParam); }
-
Hä? Noch nie etwas von BN_CLICKED gehört?
-
BN_CLICKED ist in diesem Fall zu spät, da erst beim loslassen ausgelöst. Wenn es reicht das ganze mit der Maus bedienen zu können ist WM_LBUTTONDOWN/-UP und Set-/ReleaseCapture wohl die einfachere Methode.
-
Hallo AZ, hallo Connan,
vielen Dank für Eure Antworten. Die Adresse der Windows Prozedur mit GWL_WNDPROC neu zu setzen hat funktionniert - jetzt kann ich sowohl WM_LBUTTONDOWN- als auch WM_LBUTTONUP-Messages abfangen.
Vielen Dank!
Daniel
-
Da Du scheinbar erst mit MFC beginnt solltest Du aber einge Dinge beachten.
Das wichtigste:
Die MFC regaiert so wie die komplette WinAPI auf Events. Dh: wenn ein Button geklickt wird dann wird ein Event ausgelöst den Dein Programm empfängt und verarbeitet.
Hast Du nun einen Fensterthread (Standard der erste) und du machst in diesem dann die Spracherkennung wenn ein Button gedrückt wird dann reagiert deine GUI nicht mehr das Du die Messageloop nnicht mehr abarbeitest.
Fazit: Hoffentlich hast Du die Spracherkennung in eigene Threads.