Exe Ausführen und Position und Größe ändern
-
Hallo,
habe folgenden Code:
void __fastcall TForm1::Button1Click(TObject *Sender) { SHELLEXECUTEINFO sei; ZeroMemory((PVOID)&sei, sizeof(sei)); // Infostruktur füllen sei.cbSize = sizeof(sei); sei.fMask = SEE_MASK_NOCLOSEPROCESS; sei.nShow = SW_SHOW; sei.lpVerb = TEXT("open"); sei.lpFile = TEXT("C:\\T40Progs\\X29_RC_RG\\x29.exe"); // Name der Applikation //sei.lpParameters = TEXT("para"); falls Parameter erforderlich sind ShellExecuteEx(&sei); // Test ob Aufruf erfolgreich, sei.hProcess ist dann das Handle der aufgerufenen Applikation if(sei.hProcess) { // Setzen von Position und Größe, Parameter müssen vorher belegt werden SetWindowPos(sei.hProcess, HWND_TOP, 500, 0, 200, 200, SWP_NOSIZE); } else ShowMessage("Fehler"); }Dieser Code öffnet zwar das Programm, ändert aber nicht die Größe und die Position. Was ist hier falsch?
-
sei.hProcess ist doch kein Fensterhandle.
-
Was dann? Sorry, bin noch Anfänger
-
FindWindow könnte dir helfen.
-
SHELLEXECUTEINFO sei; ZeroMemory((PVOID)&sei, sizeof(sei)); // Infostruktur füllen sei.cbSize = sizeof(sei); sei.hwnd = TEXT("Bla"); sei.fMask = SEE_MASK_NOCLOSEPROCESS; sei.nShow = SW_SHOW; sei.lpVerb = TEXT("open"); sei.lpFile = TEXT("C:\\T40Progs\\X29_RC_RG\\x29.exe"); // Name der Applikation //sei.lpParameters = TEXT("para"); falls Parameter erforderlich sind ShellExecuteEx(&sei); // Test ob Aufruf erfolgreich, sei.hProcess ist dann das Handle der aufgerufenen Applikation if(sei.hProcess) { // Setzen von Position und Größe, Parameter müssen vorher belegt werden SetWindowPos(FindWindow(sei.lpClass, NULL) , NULL, 500, 0, 200, 200, SWP_SHOWWINDOW); } else ShowMessage("Fehler");Habs so probiert, was muss ich da ändern?
-
Ich blicke den lpClass Parameter zwar auch nicht so ganz
- aber ich denke, dass der nicht dafür da ist (also du damit nicht den Namen der Fensterklasse bekommst). Diesen ermittelst du wohl am einfachsten mit Spy++ bzw. WinSpector 
-
@MartinN
du könntest vielleicht noch createprocess mit den entsprechenden infos starten
STARTF_USEPOSITION | STARTF_USESIZE | usw geht allerdings nur wenn default werte gesetzt sind.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createprocess.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/startupinfo_str.asp
ansonsten wie schon gesagt wurde mit
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/findwindow.asp@flenders
mit ging es ähnlich
sicher bin ich mir das man nicht den klassennamen bekommt.
-
die fensterposition eines anderen prozesses kann man normalerweise garnicht beeinflussen. die wird vom anderen prozess gesetzt. die fensterklassen sind prozesslokal und können auch nicht von anderen prozessen genutzt werden.
wenn du die fensterposition eines anderen prozesses beeinflussen willst, dann geht das nur, wenn der andere prozess dafür eine schnittstelle vorsieht. zB befehlszeilenparameter oder registry-einträge. eine methode, die mit allen prozessen funktioniert, gibt es nicht.
-
Konfusius schrieb:
die fensterposition eines anderen prozesses kann man normalerweise garnicht beeinflussen. die wird vom anderen prozess gesetzt. die fensterklassen sind prozesslokal und können auch nicht von anderen prozessen genutzt werden.
wenn du die fensterposition eines anderen prozesses beeinflussen willst, dann geht das nur, wenn der andere prozess dafür eine schnittstelle vorsieht. zB befehlszeilenparameter oder registry-einträge. eine methode, die mit allen prozessen funktioniert, gibt es nicht.
Alles falsch.
[edit]ah, halt: "die [Fensterposition] wird vom anderen prozess gesetzt", das stimmt[/edit]
-
Schon mal drann gedacht das hProcess die HInstance ist des processes ist und man darüber leicht alle fenster (elemente) Enumieren kann!
Ansonsten kenne ich son Typen der das gut erklären kann, MSDN heißt der glaub ich.
-
miller_m schrieb:
@MartinN
du könntest vielleicht noch createprocess mit den entsprechenden infos starten
STARTF_USEPOSITION | STARTF_USESIZE | usw geht allerdings nur wenn default werte gesetzt sind.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createprocess.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/startupinfo_str.aspAlso ich hab das jetzt so gemacht:
void StartApp(AnsiString ProgPfad) { stgStartupInfo.dwX = 500; stgStartupInfo.dwY = 10; stgStartupInfo.dwXSize = 1000; stgStartupInfo.dwYSize = 20; setmem(&stgStartupInfo, sizeof(TStartupInfo),0); stgStartupInfo.cb = sizeof(TStartupInfo); CreateProcess(NULL, ProgPfad.c_str(), NULL, NULL, true, NORMAL_PRIORITY_CLASS, NULL, ExtractFilePath(ProgPfad).c_str(), &stgStartupInfo, &stgProcessInfo); }Funktioniert leider nicht, vermutlich wegen den default werten.
Welche werte muss ich da noch setzen?
-
Du musst wohl zumindest in stgStartupInfo bei dwFlags noch STARTF_USEPOSITION und STARTF_USESIZE angeben...