Für Tastatureingaben dem Programm den Eingabefokus erteilen.
-
Guten Tag
Ich habe ein dialogfeldbasierendes Programm, dass sich TopMost in einer Bildschirmecke befindet.
Ich möchte, dass dieses Programm sich selbst den Eingabefokus holt, sobald ein bestimmtes Ereignis eintritt.
Ein Ereignis ist unter anderem OnNcHitTest, mit dem ich ermittle, ob sich die Maus über dem Dialogfenster befindet.Ich habe es schon mit SetActiveWindow() und SetForegroundWindow() versucht, aber das Dialogfenster hat weiterhin nicht den Eingabefokus.
Weis jemand wie ich für das Programm den Eingabefokus holen kann?
-
Lies die Dokumentation zu SetForegroundWindow.
Das darf nicht jeder. Wen Du das erzwingen wilst musst Du AttachThreadInput verwenden und dann SetForegroundWindow ausführen.Auch das wurde hier schon x-Mal gefragt.
-
Danke für die Information.
Ich habe dank deines Hinweise hier im Forum folgenden Code gefunden:
CMyClass::ForceForegroundWindow(GetSafeHwnd());
BOOL CMyClass::ForceForegroundWindow(HWND hWnd) { if(!hWnd || !::IsWindow(hWnd)) return FALSE; HWND hWndCurrentWindow = ::GetForegroundWindow(); if(hWndCurrentWindow == NULL) { return ::SetForegroundWindow(hWnd); } DWORD dwCurProcId, dwCurThreadId = ::GetWindowThreadProcessId(hWndCurrentWindow, &dwCurProcId); DWORD dwHWndProcId; ::GetWindowThreadProcessId(hWnd, &dwHWndProcId); BOOL bReturn = FALSE; if(dwHWndProcId == dwCurProcId) { bReturn = ::SetForegroundWindow(hWnd); } else { DWORD dwMyThreadId = ::GetCurrentThreadId(); if(::AttachThreadInput(dwMyThreadId, dwCurThreadId, TRUE)) { bReturn = ::SetForegroundWindow(hWnd); ::AttachThreadInput(dwMyThreadId, dwCurThreadId, FALSE); } else { bReturn = ::SetForegroundWindow(hWnd); } } return bReturn; }
Kann es sein, dass duch diese Funktion nicht mehr alle OnActivate Nachrichten abgearbeitet werden?