(Gast)
n/a Beiträge
|
AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren
7. Jul 2016, 07:08
Zitat:
Wozu die ganzen Try-Except-Blöcke, wenn sie doch leer sind?
Die sollen doch leer sein. Mein Motto lautet: Geht was schief, dann bitte alles in den ErrorLog... Kann der nicht erstellt werden, dann bitte gar nichts machen.
Wenn etwas nicht so läuft wie ich es erwarte, dann habe ich alles an einer Stelle im ErrorLog, sehe ich keinen, dann konnte er wohl nicht erstellt werden. Jetzt noch 'ne Exception, die mir sagt, dass der Log nicht erstellt werden konnte ist mir zuviel... schließlich hab' ich's ja versucht... das reicht mir dann...
Ja.. ja, das ist das was ich im Moment mache... morgen oder übermorgen mache ich es vielleicht schon ganz anders...
Danke für den Blog-Link... kannte ich aber schon und benutze immer noch FreeAndNil... ist wohl die Gewohnheit...
Zitat:
..Mit SetForegroundWindow lässt sich der Windows Explorer nach vorne holen und dann mit folgendem Code links snappen (und rechts dann analog)..
Interessant, werd' ich nochmal ausprobieren... SetForegroundWindow holt beide Fenster immer wieder nach vorne... ist ja'n Ding... bei mir ging das nur mit "Minimieren" und anschließend "Restore" (ShowWindow).
@Erdbär
Man kann deine Procedure noch etwas verkleinern:
Delphi-Quellcode:
Procedure TForm1.Button3Click(Sender: TObject);
Begin
Keybd_event(VK_LWIN, 0, 0, 0);
Keybd_event(Byte('M'), 0, 0, 0);
Keybd_event(Byte('M'), 0, KEYEVENTF_KEYUP, 0);
Keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);
End;
Danke nochmal für den Tipp... ich hab's mal mit eingebaut... Außerdem war die FensterSuche wohl für diesen Zweck etwas überdimensioniert... hab' sie deutlich kleiner gemacht:
Delphi-Quellcode:
PROGRAM TwoWinEx;
USES
Windows, Messages, Classes, Forms, SysUtils, ShellApi;
VAR
slFoundWnd: TStringlist;
WndHandle : THandle;
I : Integer;
Procedure ErrorLog(ErrorInfo: String);
Var
slLoad : TStringlist;
slSave : TStringlist;
strErrorLog: String;
Procedure Free_slLoad;
Begin
Try
FreeAndNil(slLoad);
Except
End;
End;
Procedure Free_slSave;
Begin
Try
FreeAndNil(slSave);
Except
End;
End;
Function ErrorLogExists: Boolean;
Begin
Try
Result:= False;
If FileExists(' ErrorLog.txt')
Then
Begin
Try
slLoad:= TStringlist.Create;
slLoad.LoadFromFile(' ErrorLog.txt');
strErrorLog:= slLoad.Text;
Result:= True;
Finally
Free_slLoad;
End;
End;
Except
End;
End;
Begin
Try
Try
slSave:= TStringlist.Create;
slSave.Add(DateTimeToStr(Now));
slSave.Add(ErrorInfo);
If ErrorLogExists
Then
Begin
slSave.Add(' ');
slSave.Add(Trim(strErrorLog));
End;
slSave.SaveToFile(' ErrorLog.txt');
Finally
Free_slSave;
End;
Except
End;
End;
Function SearchCallback(Wnd: HWND; sl:TStringlist): BOOL; StdCall;
Var
ClassName: Array[0..255] Of Char;
Begin
Try
If GetClassName(Wnd, ClassName, 255) > 0
Then
Begin
If Pos(' CabinetWClass', String(ClassName)) <> 0
Then sl.Add(IntToStr(Wnd));
End;
Result:= True;
Except
On E: Exception
Do ErrorLog(' SearchCallback'+#13#10+E.ClassName+#13#10+E. Message);
End;
End;
Procedure SearchWnd;
Begin
Try
EnumWindows(@SearchCallback, lParam(slFoundWnd));
Except
On E: Exception
Do ErrorLog(' SearchWnd'+#13#10+E.ClassName+#13#10+E. Message);
End;
End;
Procedure MinAllWnds;
Begin
Try
Keybd_event(VK_LWIN, 0, 0, 0);
Keybd_event(Byte(' M'), 0, 0, 0);
Keybd_event(Byte(' M'), 0, KEYEVENTF_KEYUP, 0);
Keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);
Except
On E: Exception
Do ErrorLog(' MinAllWnds'+#13#10+E.ClassName+#13#10+E. Message);
End;
End;
Procedure StartTwoWinEx;
Begin
Try
If DirectoryExists(' I:\') And DirectoryExists(' I:\(DOWNLOADS)')
Then
Begin
ShellExecute(0, Nil, PChar(' I:\'), Nil, Nil, SW_SHOW);
ShellExecute(0, Nil, PChar(' I:\(DOWNLOADS)'), Nil, Nil, SW_SHOW);
Repeat
slFoundWnd.Clear;
SearchWnd;
Until slFoundWnd.Count >= 2;
MoveWindow(StrToInt(slFoundWnd[0]),
0,
0,
(Screen.WorkAreaWidth Div 2),
Screen.WorkAreaHeight,
True);
MoveWindow(StrToInt(slFoundWnd[1]),
(Screen.WorkAreaWidth Div 2),
0,
(Screen.WorkAreaWidth Div 2),
Screen.WorkAreaHeight,
True);
End
Else
Begin
ShellExecute(0, Nil, PChar(' C:\'), Nil, Nil, SW_SHOW);
ShellExecute(0, Nil, PChar(' D:\'), Nil, Nil, SW_SHOW);
Repeat
slFoundWnd.Clear;
SearchWnd;
Until slFoundWnd.Count >= 2;
MoveWindow(StrToInt(slFoundWnd[0]),
0,
0,
(Screen.WorkAreaWidth Div 2),
Screen.WorkAreaHeight,
True);
MoveWindow(StrToInt(slFoundWnd[1]),
(Screen.WorkAreaWidth Div 2),
0,
(Screen.WorkAreaWidth Div 2),
Screen.WorkAreaHeight,
True);
End;
Except
On E: Exception
Do ErrorLog(' StartTwoWinEx'+#13#10+E.ClassName+#13#10+E. Message);
End;
End;
Procedure Free_slFoundWnd;
Begin
Try
FreeAndNil(slFoundWnd);
Except
On E: Exception
Do ErrorLog(' Free_slFoundWnd'+#13#10+E.ClassName+#13#10+E. Message);
End;
End;
Begin
Try
slFoundWnd:= TStringlist.Create;
Try
SearchWnd;
If slFoundWnd.Count >= 1
Then
Begin
For I:= 0 To slFoundWnd.Count-1
Do
Begin
WndHandle:= StrToInt(slFoundWnd[I]);
SendMessage(WndHandle, WM_CLOSE, 0, 0);
End;
End;
MinAllWnds;
StartTwoWinEx;
Finally
Free_slFoundWnd;
End;
Except
On E: Exception
Do ErrorLog(' MAIN PRG'+#13#10+E.ClassName+#13#10+E. Message);
End;
End.
Noch'n bisschen mehr und das Ding wird richtig sexy.... (OK, nur wenn man sich das irre Exception-Handling wegdenkt... ).
|