Autor |
Beitrag |
SQLException
      
Beiträge: 89
WinXP + D5 Enterprise
Win2k + D6 Personal
|
Verfasst: Di 03.05.05 21:28
hi,
möchte aus meiner anwendung (800 x 600) raus das hier starten, und zwar maximiert bzw. 800 x 600. meine answendung ist für einen rechner bestimmt der selbst eine bildschirmauflösung von 800 x 600 fährt, also ob ich den divx player maximiere (was nicht möglich zu sein scheint) oder auf 800 x 600 vergrössere ist egal. und der divx player soll nun auch 800 x 600, vollbild, laufen. ein maximieren-button sucht man in der titelleiste ja vergeblich.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| ShellExecute(Application.Handle, 'open', PChar(divxplayerLink), nil, nil, SW_SHOW); win := FindWindow(nil,'DivX Player 2.6'); SetWindowPos( win, HWND_NOTOPMOST, -4, -23, Screen.Width - ((Screen.Width - Form1.Width) div 2), Screen.Height - ((Screen.Height - Form1.Height) div 2), SWP_NOSIZE); end; |
-4 links und -23 oben deswegen, weil das fenster des divx player (siehe screenshot oben) einen transparenten rand hat.
ich meine ja, obiger code führt dazu, den divx player nicht nur zu starten, sondern gleich noch oben links zu platzieren und auf bildschirmgrösse zu vergrössern. macht es aber nicht.
der player braucht ca. 5 sekunden um zu laden, es scheint, er muss also erst vollständig geladen sein, und dann funktioniert das SetWindowPos. nur ein sleep(5000) will ich nach dem shellexecute nicht einbauen, schliesslich ist diese ladezeit auf anderen rechnern länger oder kürzer.
wer weiss rat?
Moderiert von Christian S.: Code- durch Delphi-Tags ersetzt.
Zuletzt bearbeitet von SQLException am Di 03.05.05 21:33, insgesamt 1-mal bearbeitet
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Di 03.05.05 21:31
Delphi-Quelltext 1:
| ShellExecute(Handle, 'open', PChar(divxplayerLink), nil, nil, SW_MAXIMIZE); |
ist aber gut möglich dass man das programm gar nicht maximieren kann...
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
SQLException 
      
Beiträge: 89
WinXP + D5 Enterprise
Win2k + D6 Personal
|
Verfasst: Di 03.05.05 21:38
deshalb meinte ich auch es reicht, den player auf 800 x 600 zu vergrössern, was auf dem zielrechner ja vollbild entspricht. mit der maus kann ich eine ecke vom player ja auch packen und damit vergrössern, also dachte ich das muss dann auch aus meiner anwendung heraus anzustellen sein...
die frage ist primär was ich noch ausprobieren kann, da
Delphi-Quelltext 1: 2:
| Screen.Width - ((Screen.Width - Form1.Width) div 2), Screen.Height - ((Screen.Height - Form1.Height) div 2), |
im SetWindowPos ja nicht funktioniert, und sekundär wie ich es anstelle, das erst der player fertig geladen wird, und dann das SetWindowPos ausführe (um den player zumindest schonmal zu verschieben um ihn anschliessend zu vergrössern).
Moderiert von raziel: Code- durch Delphi-Tags ersetzt.
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Di 03.05.05 21:53
Starte den DivX Player mit CreateProcess. Warte mit WaitForInputIdle. Suche das Fenster mit EnumWindows und GetWindowThreadProcessId. Setze die neue Position mit MoveWindow.
_________________ Ciao, Sprint.
|
|
SQLException 
      
Beiträge: 89
WinXP + D5 Enterprise
Win2k + D6 Personal
|
Verfasst: Di 03.05.05 23:01
sorry, kann ich ne kleine erläuterung zu dem enumwindows haben? suche jetzt 30 mins hier auf dem board und bei google. wie ich den processID mit getWindowThreadProcessId krieg weiss ich, über das handle des fensters. und das krieg ich mit enumwindows, nur wie geht man damit um?
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Di 03.05.05 23:18
Hier mal ein Beispiel von mir, mit Notepad:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| procedure TForm1.Button1Click(Sender: TObject);
function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall; begin TList(lParam).Add(Pointer(hWnd)); Result := True; end;
var SI: TStartupInfo; PI: TProcessInformation; List: TList; I: Integer; ProcessId: DWORD; begin
FillChar(SI, SizeOf(TStartupInfo), 0); SI.cb := SizeOf(TStartupInfo); if CreateProcess(nil, 'C:\WINDOWS\SYSTEM32\NOTEPAD.EXE', nil, nil, False, 0, nil, nil, SI, PI) then begin WaitForInputIdle(PI.hProcess, INFINITE); List := TList.Create; if EnumWindows(@EnumWindowsProc, LPARAM(List)) then begin for I := 0 to List.Count - 1 do begin if GetWindowThreadProcessId(HWND(List.Items[I]), @ProcessId) <> 0 then begin if ProcessId = PI.dwProcessId then begin MoveWindow(HWND(List.Items[I]), 0, 0, Screen.Width, Screen.Height, True); Break; end; end; end; end; List.Free; CloseHandle(PI.hProcess); CloseHandle(PI.hThread); end;
end; |
_________________ Ciao, Sprint.
|
|
SQLException 
      
Beiträge: 89
WinXP + D5 Enterprise
Win2k + D6 Personal
|
Verfasst: Di 03.05.05 23:47
DANKE! da wär ich lange nicht drauf gekommen. ich übernehm das einfach mal so, wenn du nichts dagegen hast. wenn ich das richtig seh ersetz ich nur noch den zweiten parameter für CreateProcess. mit diversen programmen funktioniert das (notepad, wordpad, ftp-client) funktioniert das auch, mit dem divx player leider nicht  . weder wird das fenster verschoben, noch die grösse verändert.
|
|
|