Hab' jetzt 3 Versionen:
TwoWinEx [FirstVersion]:
Funktioniert gut, kann aber in seltenen Fällen sein, dass ein Fenster im Hintergrund bleibt, obwohl das eigentlich bei "ShellExecute" und "Show" gar nicht sein dürfte.
TwoWinEx [MinAllWnds]:
100% stabil bei mir... sollte "Show" tatsächlich mal ein Fenster nicht nach vorne bringen spielt das keine Rolle, es werden ja vorher alle Fenster minimiert.
TwoWinEx [Restore]:
100% stabil bei mir... konnte ich aber noch nicht so lange ausprobieren.
Läuft mit "ShowWindow [SW_Minimize und SW_Restore]", alles andere funktionierte einmal mehr nicht.
"SetForegroundWindow" funktioniert für ein Fenster sehr gut, aber für zwei leider überhaupt nicht (Eins bleibt immer hinten).
"SetWindowPos" in Verbindung mit "HWND_NOTOPMOST" funktioniert ebenfalls überhaupt nicht. Wenn ich z.B. einige Editoren und einige Taschenrechner im Vordergrund habe und es sind schon 2 WinEx-Fenster geöffnet, dann bewegen sich die WinEx-Fenster kein Stück nach vorne... sehr komisch...
Das hier funzt bei mir sehr gut:
Delphi-Quellcode:
Procedure Bring2ToFront;
Var
WorkArea : TRect;
Wnd1, Wnd2: THandle;
Begin
Try
SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea,0) ;
Wnd1:= StrToInt(slFoundWnd[0]);
Wnd2:= StrToInt(slFoundWnd[1]);
If IsIconic(Wnd1)
Then
Begin
ShowWindow(Wnd1, SW_RESTORE);
MoveWindow(Wnd1,
WorkArea.Left,
WorkArea.Top,
((WorkArea.Right-WorkArea.Left)
Div 2),
(WorkArea.Bottom-WorkArea.Top),
True);
End
Else
Begin
ShowWindow(Wnd1, SW_MINIMIZE);
ShowWindow(Wnd1, SW_RESTORE);
MoveWindow(Wnd1,
WorkArea.Left,
WorkArea.Top,
((WorkArea.Right-WorkArea.Left)
Div 2),
(WorkArea.Bottom-WorkArea.Top),
True);
End;
If IsIconic(Wnd2)
Then
Begin
ShowWindow(Wnd2, SW_RESTORE);
MoveWindow(Wnd2,
((WorkArea.Right-WorkArea.Left)
Div 2),
WorkArea.Top,
((WorkArea.Right-WorkArea.Left)
Div 2),
(WorkArea.Bottom-WorkArea.Top),
True);
End
Else
Begin
ShowWindow(Wnd2, SW_MINIMIZE);
ShowWindow(Wnd2, SW_RESTORE);
MoveWindow(Wnd2,
((WorkArea.Right-WorkArea.Left)
Div 2),
WorkArea.Top,
((WorkArea.Right-WorkArea.Left)
Div 2),
(WorkArea.Bottom-WorkArea.Top),
True);
End;
Except
On E:
Exception
Do ErrorLog('
Bring2ToFront'+#13#10+E.ClassName+#13#10+E.
Message);
End;
End;
Was der Restore-Version noch fehlt wäre eine Pfad-Anpassung. Das ist erstmal in Einzelschritten betrachtet sehr leicht:
1. Fenster nach vorne holen (passiert ja schon...)
2. VK_F4 und VK_ESC senden
z.B. so:
Delphi-Quellcode:
Procedure SendF4_ESC;
Var
KeyInputs:
Array Of TInput;
Procedure KeybdInput(VKey: BYTE; Flags: DWORD);
Begin
SetLength(KeyInputs, Length(KeyInputs)+1);
KeyInputs[High(KeyInputs)].Itype:= INPUT_KEYBOARD;
With KeyInputs[High(KeyInputs)].Ki
Do
Begin
wVk := VKey;
wScan := MapVirtualKey(wVk, 0);
dwFlags:= Flags;
End;
End;
Begin
Try
KeybdInput(VK_F4, 0);
KeybdInput(VK_F4, KEYEVENTF_KEYUP);
KeybdInput(VK_ESCAPE, 0);
KeybdInput(VK_ESCAPE, KEYEVENTF_KEYUP);
SendInput(Length(KeyInputs), KeyInputs[0], SizeOf(KeyInputs[0]));
Except
On E:
Exception
Do ErrorLog('
SendF4_ESC'+#13#10+E.ClassName+#13#10+E.
Message);
End;
End;
3. Edit-Feld des Windows-Explorer-Fensters suchen bzw. finden:
z.B. so:
Delphi-Quellcode:
Function ChildWndCallback(Wnd: HWND; lParam: LongInt): BOOL;
StdCall;
Var
ClassName:
Array[0..255]
Of Char;
Begin
Try
If GetClassName(Wnd, ClassName, 255) <> 0
Then
Begin
If Pos('
Edit',
String(ClassName)) <> 0
Then
Begin
slChildWnd.Add(IntToStr(Wnd));
Result:= False;
End;
Result:= True;
End
Except
On E:
Exception
Do ErrorLog('
ChildWndCallback'+#13#10+E.ClassName+#13#10+E.
Message);
End;
End;
4. Pfad senden:
SendMessage(hChildWnd, WM_SETTEXT, 0, Integer(PChar('C:\')));
5. VK_RETURN senden
Allerdings wenn man alles zusammen schnell hintereinander haben möchte, dann braucht man wohl ein spezielles Timing. Also ein Delay oder Sleep oder Timer .... Ich hab' s ohne Sleep noch nie hinbekommen und außerdem ist das Ganze ein ziemlicher Overhead wenn ich das vergleiche mit den schon funktionierenden Versionen.
Hätte nie gedacht, das einen sowas Kleines 'ne ganze Weile beschäftigen kann...
Vielleicht hab' ich das auch einfach verkehrt gemacht und deshalb nicht hinbekommen... Ich mußte bis jetzt noch nie an anderen Programmen herumfummeln...