Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Programmfokus setzen per Process-ID (https://www.delphipraxis.net/128125-programmfokus-setzen-per-process-id.html)

64Jabor 24. Jan 2009 17:52


Programmfokus setzen per Process-ID
 
Hallo DP,

ich möchte aus meinem Programm Werte in ein externes Programm eintragen.
Dazu rufe ich es mit ShellExecute auf, falls es nicht bereits läuft.
Wenn es allerdings läuft, soll das Programm den Fokus erhalten.

Das versuche ich hier mit SetForegroundWindow.

Wie bekomme ich mit dieser Prozedur den Fokus auf dieses Program :gruebel:
Ich meine ich könnte ja CreateProcess verwenden und damit die Process-ID in eine Variable schreiben - die passende Funktion habe ich hier schon rumfliegen gesehen, von Luckie, aber ich finde keine Prozedur mit der ich die Process-ID in ein Handle o.ä. umwandeln kann...

Mein Problem ist auch dass meine Delphi-Hilfe nicht funktioniert, 64-BIT Vista sei Dank :angel2:
Kann mir da jemand auf die Sprünge helfen?

Danke schonmal,
greetZ 64Jabor

DeddyH 24. Jan 2009 18:08

Re: Programmfokus setzen per Process-ID
 
Ich weiß nicht, ob es so funktioniert, aber mir fällt spontan folgende Vorgehensweise ein:
mit EnumWindows (oder EnumThreadWindows, wenn Du die ThreadID hast) die Fenster durchgehen, mit GetWindowThreadProcessID die ProzessID ermitteln und mit Deiner vergleichen. Wenn gleich, mit SetForegroundWindow nach vorne holen. Das Problem hierbei ist, dass das Programm ja mehrere Fenster haben kann.

64Jabor 24. Jan 2009 18:13

Re: Programmfokus setzen per Process-ID
 
Hey DeddyH,

da ich selbst ja verhindere dass das Programm mehrmals ausgeführt wird zur Laufzeit MEINES Programmes und ich nicht davon ausgehe, dass dieses Programm jemand von selbst öfter startet, werde ich dieses Problem vorerst nicht beachten.
Ich werde mir besagte Funktionen mal ansehn und hoffe zu einem Ergebnis zu kommen :thumb:

Vielen Dank!

greetZ

ryLIX 24. Jan 2009 20:21

Re: Programmfokus setzen per Process-ID
 
Wenn wir grad bei Spontan sind :)

Mir fällt spontan SEND_MESSAGE ein.
Sende dem Process ein WM_ACTIVATE.
Oder du importierst direkt die SetActiveWindow Prozedur aus der User32.

Apollonius 24. Jan 2009 20:29

Re: Programmfokus setzen per Process-ID
 
Das Problem ist doch, überhaupt ein Fensterhandle zu erhalten.

Luckie 24. Jan 2009 21:06

Re: Programmfokus setzen per Process-ID
 
Zitat:

Zitat von ryLIX
Wenn wir grad bei Spontan sind :)

Mir fällt spontan SEND_MESSAGE ein.
Sende dem Process ein WM_ACTIVATE.
Oder du importierst direkt die SetActiveWindow Prozedur aus der User32.

Aber auch dafür braucht er das Fensterhandle, da man Nachrichten nur an Fenster senden kann.

ryLIX 24. Jan 2009 21:47

Re: Programmfokus setzen per Process-ID
 
Hmm irre ich mich da oder lässt sich das nicht über die ProcessID holen?

64Jabor 24. Jan 2009 22:37

Re: Programmfokus setzen per Process-ID
 
Joa ich versuche ja per Process-ID das Fensterhandle zu bekommen, so wie DeddyH es vorgeschlagen hat.

Leider komme ich nicht wirklich weiter...
Ich hab mir jetzt eine Unit runtergeladen:
EnumWindowUtil

Die habe ich eingebunden und sie ist auch fähig jedes Fenster aufzulisten sowie das Handle zu bekommen, aber leider weiß ich nicht wie ich nun die Process-ID aus Luckies Funktion function RunProcess(...) mit den Process-IDs der TWindowList-Objekte vergleichen kann.

Ich dachte ja egtl an etwas wie:
Delphi-Quellcode:
i:=0;
while ( (i < MyWNDList.Count-1) AND (ProcID <> MyWNDList.Objects[i].ProcessID) ) do i:=i+1;
SetForegroundWindow(MyWNDList.GetHandle(i));
Nur leider existiert nichts deartiges wie Objects[].ProcessID...
Oder habe ich etwas übersehen?

Luckie 24. Jan 2009 22:48

Re: Programmfokus setzen per Process-ID
 
Zitat:

Zitat von ryLIX
Hmm irre ich mich da oder lässt sich das nicht über die ProcessID holen?

Richtig, und wie man das Fensterhandle zu einer ProzessID bekommen kann, hat DeddyH schon beschrieben.

himitsu 24. Jan 2009 23:12

Re: Programmfokus setzen per Process-ID
 
Zitat:

Zitat von Apollonius
Das Problem ist doch, überhaupt ein Fensterhandle zu erhalten.

man könnte auch eine Thread-Nachricht an den Hauptthread senden.

OK, diese müßte dann in diesem Programm ausgewertet weden und das Programm holt sich dann z.B. selbst in den Vordergrund.

(aber man muß es ja nicht übertreiben :roll: )


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr.
Seite 1 von 2  1 2      

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