Hallo miteinander,
alle hier bisher vorgeschlagenen Lösungen sowie die in den ALASKA-Newsgroups, funktionien nur eingeschränkt:
- entweder blinkt in der Taskleiste der Bottom für die eigene Anwendung ohne das das Fenster angezeigt wird,
wenn ein anderes Programm den Fokus hat oder,
- das Fenster wird nur in den Vordergund geholt, wenn es minimiert ist oder
- oder das eigene Programmfenster hatte den Fokus, bevor über die Schnellstartleiste zum Desktop gewechselt wurde
- oder es funktioniert gar nichts
Wie auch immer, ich habe eine Lösung gefunden, die die eigene Anwendung in den Vordergrund holt, unabhängig davon, ob sie
minimiert ist, ein anderes Programm den Fokus hat oder zum Desktop gewechselt wurde.
Ich bedanke mich bei allen für die Anregungen.
Gruß, Olaf
Hier nun ein Beispiel mit den dazugehörigen API-Funktionen
************************************************************************************************************
Code: Alles auswählen
Func main()
Local nHandle := SetAppWindow():GetHWND() // Fenster-Handle der eigenen Anwendung
Local nMyThread // Thread-Id der eigenen Anwendung
Local nAktThread // Thread-Id des aktuellen Fensters
nMyThread := apiGetWindowThreadProcessId(nHandle)
msgbox("Nach OK 3 sec. Pause ....")
sleep(300) // In dieser Zeit kann zum Test in eine andere Anwendung gewechselt werden
nAktThread := apiGetWindowThreadProcessId( apiGetForegroundWindow() )
IF nMyThread == nAktThread // Wenn aktuelles Fenster die eigene Anwendung ist, reicht ein SetForeGroundWindow
apiSetForeGroundWindow( nHandle )
else
apiAttachThreadInput( nAktThread, nMyThread, TRUE ) // Setzt den Input-Focus auf die eigene Anwendung
apiSetForeGroundWindow( nHandle ) // Fenster in den Fordergrund holen
apiShowWindow( nHandle ) // Fenster Anzeigen (falls minimiert, wird es maximiert)
ENDIF
MsgBox("End of program")
Return ( NIL )
/************************************************************************
// API-Funktion zur Ermittlung des Fenster Handles der aktuellen Fensters
*************************************************************************/
FUNCTION apiGetForegroundWindow( nHandle)
LOCAL nDll := DllLoad("USER32.DLL")
LOCAL xRet := DllCall(nDll,32,"GetForegroundWindow", nHandle)
DllUnLoad(nDll)
RETURN ( xRet )
/***************************************************************************************
// API-Funktion, um ein Fenster (nHandle) in den Fordergrund zu bringen ( Top of Z_order)
***************************************************************************************/
FUNCTION apiSetForeGroundWindow( nHandle)
LOCAL nDll := DllLoad("USER32.DLL")
LOCAL xRet := DllCall(nDll,32,"SetForegroundWindow", nHandle)
DllUnLoad(nDll)
RETURN ( xRet )
/****************************************************************************************
// API-Funktion zur Anzeige eines Fenster. SW_RESTORE ist in diesem Zusammenhang wichtig
// damit auch ein minimiertes Fenster expandiert wird
****************************************************************************************/
FUNCTION apiShowWindow( nHandle)
LOCAL nDll := DllLoad("USER32.DLL")
LOCAL xRet := DllCall(nDll,32,"ShowWindow", nHandle, SW_RESTORE)
DllUnLoad(nDll)
RETURN ( xRet )
/****************************************************************************
// API-Funktion zur Ermittlung der Prozess-ID des übergebenen Fenster-Handles
****************************************************************************/
Function apiGetWindowThreadProcessId( nHandle)
Local nDll :=DllLoad("USER32.DLL")
Local xRet
Local nPid := NIL // wird hier nicht gebraucht
xRet :=DllCall(nDll,32,"GetWindowThreadProcessId", nHandle, nPid)
DllUnLoad(nDll)
Return ( xRet )
/************************************************************
// API-Funktion um die Eingabeverarbeitung von dem aktuellem Prozess
// (nAttach) auf einen anderen Prozess ( nAttachTo [hier die eigene
// Anwendung] ) zu setzen. Dies ist erforderlich, damit
// SetForeGroundWindow ab Windows 95 /NT 4.0 korrekt arbeitet. Wird
// diese Funktion nicht in Verbindung mit SetForegroundWindow
// aufgerufen , blinkt nur der Bottom der eigenen Anwendung innerhalb
// der Funktionsleiste.
************************************************************/
Function apiAttachThreadInput( nAttach, nAttachTo, lSet )
LOCAL nDll := DllLoad("USER32.DLL")
Local xRet := DllCall(nDll,32,"AttachThreadInput", nAttach, nAttachto, lSet )
DllUnLoad(nDll)
Return ( xRet )