Entwickler-Ecke

Windows API - problem mit ForceForegroundWindow (fenster wird nicht aktiv)


lukkee - Do 07.08.08 10:32
Titel: problem mit ForceForegroundWindow (fenster wird nicht aktiv)
Hallo
ich hab ein problem

ich werfe mittels ForceForegroundWindow(GetWindowHandleByExeName('notepad.exe')); den notepad in den Vordergrund. Funktioniert wunderbar jedoch wird das fenster nicht aktiv.. erst wenn ich in das Fenster klicke wird es Aktiv .. es sollte aber gleich nachdem ich die Funktion aufrufe aktiv werden!!

Ich habe es auch schon mit folgenden funktionen probiert:

Delphi-Quelltext
1:
2:
3:
SetForegroundWindow(GetWindowHandleByExeName('notepad.exe')); 
SetActiveWindow(GetWindowHandleByExeName('notepad.exe'));
Windows.ShowWindow(GetWindowHandleByExeName('notepad.exe'), SW_Normal);


Der notepad erscheint zwar aber er wird nicht aktiv bekommt den focus nicht

Die postmesage funktion geht überhaupt nicht :(

Delphi-Quelltext
1:
postmessage(GetWindowHandleByExeName('notepad.exe'),WM_SYSCOMMAND,SC_RESTORE,0);                    



Kann mir jemand helfen?
hab schon das ganze forum durchsucht!

danke


GTA-Place - Do 07.08.08 11:11

Das liegt eindeutig an der Funktion GetWindowHandleByExeName. Geht es dir nur um Notepad? Dann würde nämlich das hier funktionieren:


Delphi-Quelltext
1:
SetForegroundWindow(FindWindow('notepad', nil));                    


Eventuell hat das Fenster, das du aufrufen willst einen Klassennamen, den du verwenden kannst. Oder aber du weißt ein Wort, welches immer im Titel vorkommt, dann gäbs nämlich auch noch eine Möglichkeit.


lukkee - Do 07.08.08 12:17

hi k das funktioniert..
Leider ist der Titel des Fensters nicht bekannt (unterschiedlich) kann man nicht anhand des prozessnamen an den fenstertitel kommen ?
danke erstmal für deine Antwort

greetz


GTA-Place - Do 07.08.08 12:22

Ich hab mal folgendes ausprobiert Suche bei Google GETWINDOWHANDLEBYPROCESSID und wurde sogar fündig (1 von 1 Ergebnis :-P). Vielleicht hilft der Thread.


lukkee - Do 07.08.08 14:19

Hey funktioniert..danke
den weg über die processid hab ich noch nicht versucht!

Lösung:
Ich hol mir zuerst die Processid mittels Processnamen:


Delphi-Quelltext
1:
GetProcessID('process.exe')                    


dannach das handle mithilfe der ausgelesenen processid:


Delphi-Quelltext
1:
2:
3:
4:
var
myHwnd :HWND;

myHwnd:= FindMainWindow(GetProcessID('process.exe'));


und dannach diese funktion um das fenster in den vordergrund werfen und aktiv zusetzen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure SwitchToThisWindow(h1: hWnd; x: bool); stdcall;
  external user32 Name 'SwitchToThisWindow';
         {x = false: Size unchanged, x = true: normal size}



SwitchToThisWindow(myHwnd,True);


_:) danke nochmal