Laden...

SetForegroundWindow(IntPtr hWnd): ProcessId vs. Window Handle

Erstellt von macke_a vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.113 Views
M
macke_a Themenstarter:in
291 Beiträge seit 2007
vor 13 Jahren
SetForegroundWindow(IntPtr hWnd): ProcessId vs. Window Handle

Hi !

Ich will den Handler meiner Software play.exe herausfinden, um das Programm wieder in den Vordergrund zu holen.

Mit ProcessEntry erfrage ich die aktuell laufende Prozesse auf meinem Betriebssystem. Sobald ich meinen Prozess gefunden habe, möchte ich den SetForegroundWindow aufrufen. Leider bekomme ich eine Exception Meldung, da die Umwandlung (IntPtr)p_.ProcessID nicht korrekt ist. Kann mir jemand helfen, damit ich die Umwandlung ohne Fehlermeldung ans laufen bekomme..?

Hier mal mein Sourcecode:

ProcessEntry[] p = ProcessEntry.GetProcesses();
for (int i = 0; i < p.Length; i++)
{
     if (p[i].ExeFile == "play.exe")
       {

          SetForegroundWindow((IntPtr)p[i].ProcessID);
       }
}

Gruss macke_a

3.511 Beiträge seit 2005
vor 13 Jahren

SetForegroundWindow erwartet als Parameter ein Handle zu einem Fenster. Da kannst du nicht einfach die Process ID reinschmeißen. Besser ist Process.MainWindowHandle.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

1.820 Beiträge seit 2005
vor 13 Jahren

Hallo!

SetForegroundWindow erwartet ein WindowHandle, du übergibst jedch eine ProcessID. Du musst also zuerst das Handle des Hauptfensters des Prozesses abfragen, die WinApi bietet dafür eine Methode, weis aber den Namen nicht auswendig, einfach mal auf www.pinvoke.net suchen.

EDIT: Khalids Lösung ist einfacher 😉

Nobody is perfect. I'm sad, i'm not nobody 🙁

M
macke_a Themenstarter:in
291 Beiträge seit 2007
vor 13 Jahren

Hallo !

Jetzt habe ich das folgende Problem

  Process TestSoftware = new Process();
  TestSoftware.StartInfo.FileName = SDCard/play.exe;
  TestSoftware.Start();
            
  int GetProgID = TestSoftware.Id;

  IntPtr MainHandle = Process.GetProcessById(GetProgID).MainWindowHandle;

Die Software startet und funktioniert. Der Rückgabewert vom MainHandle ist allerdings 0. Ich vermute das der Rückgabewert 0 nichts gutes bedeutet, oder?

Gruss macke_a

C
252 Beiträge seit 2007
vor 13 Jahren

Ist das genau der Code den du verwendest, weil so kompiliert der nicht.
Warum gehst du den Umweg über die Id? Du kannst ja gleich folgendes machen:

IntPtr MainHandle = TestSoftware.MainWindowHandle;

Startet das Programm überhaupt? Wenn du kein Fenster hast, dann gibts auch kein Handle.

1.820 Beiträge seit 2005
vor 13 Jahren

Hallo!

Ggf. ist dein Programm zu schnell bei der Abfrage.
Warte nach starten des Prozesses mit "WaitInputIdle" (oder so ähnlich), bis das Programm gestartet ist, ein Fenster generiert hat und für Eingaben bereit ist, dann sollte auch die FensterHandle-Abfrage erfolgreich sein.

Nobody is perfect. I'm sad, i'm not nobody 🙁

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo macke_a,

außerdem haben nicht alle Anwendungen überhaupt ein MainWindow (manche Anwendungen haben überhaupt kein Fenster). Bei Nicht-Haupt-Fenstern kann man sich mit der Win32-Funktion EnumWindows behelfen. Aber auch da gilt natürlich, dass man solange warten muss, bis das Fenster geöffnet wurde.

herbivore