AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Fremdanwendung starten und neben Programm positionieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fremdanwendung starten und neben Programm positionieren

Ein Thema von mschaefer · begonnen am 8. Mai 2009 · letzter Beitrag vom 10. Mai 2009
Antwort Antwort
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#1

Fremdanwendung starten und neben Programm positionieren

  Alt 8. Mai 2009, 16:30
Ja wie kann ich eine Fremdanwendung (notepad.exe) starten und direkt neben meiner mit der selben Höhe und Breite positionieren. Bei Shellexecute habe ich ja nicht das Handle der Fremdanwendung. Gibt es da eine Aufrufmöglichkeit, die das Handle liefert?

Grüße // Martin
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Fremdanwendung starten und neben Programm positionieren

  Alt 8. Mai 2009, 16:35
Zum Positionieren brauchst du ein Fensterhandle, kein Prozesshandle. Am besten startest du den Prozess mit CreateProcess (da erhältst du das Handle des ersten Threads), wartest mit WaitForInputIdle darauf, dass die Initialisierung abgeschlossen ist und holst dir dann mit EnumThreadWindows alle Top-Level-Fenster des ersten Threads. Dabei solltest du lediglich ein Fenster finden, welches du dann neu positionieren kannst.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#3

Re: Fremdanwendung starten und neben Programm positionieren

  Alt 8. Mai 2009, 17:19
Zitat:
Am besten startest du den Prozess mit CreateProcess
Na gut erstmal wieder CreateProcess anschauen . . .

Delphi-Quellcode:
function ExecNewProcess
( ProgramName : String;
          Wait : Boolean
   var LProcInfo : Dword) : Dword;
var
    StartInfo : TStartupInfo;
    ProcInfo : TProcessInformation;
    CreateOK : Boolean;
begin
    FillChar(StartInfo,SizeOf(TStartupInfo),#0);
    FillChar(ProcInfo,SizeOf(TProcessInformation),#0);
    StartInfo.cb := SizeOf(TStartupInfo);
    CreateOK := CreateProcess(nil, PChar(ProgramName), nil, nil,False,
              CREATE_NEW_PROCESS_GROUP+NORMAL_PRIORITY_CLASS,
              nil, nil, StartInfo, ProcInfo);
    { na wirklich gestartet ? } 
    if CreateOK then
    begin
        //may or may not be needed. Usually wait for child processes
       if Wait then WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    end
    else
    begin
         ShowMessage('Läuft nicht: '+ProgramName);
     end;
     CloseHandle(ProcInfo.hProcess);
     CloseHandle(ProcInfo.hThread);

     LProcInfo := ProcInfo.hProcess;
     GetExitCodeProcess(ProcInfo.hProcess, Result ) {ProcInfo ist ErrorCode};
     
end;
Version 2: Ohne das 'ProcessMessage' gehts dann auch und jetzt habe ich die ProcessId....

Grüße
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Fremdanwendung starten und neben Programm positionieren

  Alt 8. Mai 2009, 17:24
Zitat:
Delphi-Quellcode:
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
Wo liegt der Fehler? Dein ProcessMessage scheint mir übrigens unklug zu sein. WM_QUIT-Nachrichten solltest du als Aufforderung zum Abbrechen verstehen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#5

Re: Fremdanwendung starten und neben Programm positionieren

  Alt 8. Mai 2009, 19:26
EnumThreadWindows oder EnumWindows das ist die Frage ... // Martin
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Fremdanwendung starten und neben Programm positionieren

  Alt 8. Mai 2009, 19:34
Ich würde eher EnumThreadWindows statt EnumWindows nehmen. Dann erhältst du auch nur die Fenster von Notepad. Die Position kannst du recht einfach mit SetWindowPos in deiner Callback-Funktion setzen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#7

Re: Fremdanwendung starten und neben Programm positionieren

  Alt 8. Mai 2009, 20:43
Naja so im Groben... // Grüße
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#8

Re: Fremdanwendung starten und neben Programm positionieren

  Alt 9. Mai 2009, 23:59
Das mit EnumThreadWindows war wohl keine ausgetestete Idee.

Denn die EnumThreadWindows Callbackfunktion bietet keine Möglichkeit eine Liste zu übergeben. Und bei der Datenübergabe aus der Funktion zum Beispiel in eine Listbox kommt es zu einer Zugriffsverletzung.
Mit EnumWindows kann man als Funktionsrückgabewert eine Liste bekommen. Weiterhin scheint nur das Shell-Try-Wind vor dem gesuchten Programm zu liegen, was dann als zweites in der Liste zu finden ist.

Grüße // Martin
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Fremdanwendung starten und neben Programm positionieren

  Alt 10. Mai 2009, 10:18
Hm? Der Callback für EnumThreadWindows sieht doch exakt so aus wie jener für EnumWindows. Also kannst du durch den LParam auch eine Liste übergeben.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz