Hallo!
Ich weiß, der Titel ist etwas komisch, handelt es sich bei SetForegroundWindow doch um eine WinAPI-Funktion. Da ich momentan kein Delphi installiert habe und mir schnell in C# etwas basteln wollte, weiß ich nicht, ob es ein C#- oder ein WinAPI- oder ein Code-Problem ist, wobei ich auf eines der letzten beiden tippe.
Es geht konkret darum, das Programm "foobar" in den Vordergrund zu holen, einen Tastendruck ("Play/Pause") zu simulieren und danach das alte Foreground-Window wiederherzustellen. Das klappt soweit auch - es ist nur so, dass ich SetForegroundWindow zweimal aufrufen muss (im Code mit ??? gekennzeichnet), damit der Rest funktioniert und ich wüsste gerne warum. Hier einmal der Code-Ausschnitt:
C#-Quelltext
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:
| IntPtr foobarHandle = FindWindow("{97E27FAA-C0B3-4b8e-A693-ED7881E99FC1}", null); if (foobarHandle == IntPtr.Zero) { Console.WriteLine("foobar is not running"); } else { if (!_SendingKey) { _SendingKey = true; IntPtr OldForegroundWindow = GetForegroundWindow(); SetForegroundWindow(foobarHandle); Thread.Sleep(500); if (!SetForegroundWindow(foobarHandle)) Console.WriteLine("Warning: foobar's main window could not be brought into the foreground, keys sent may not have any effect");
Thread.Sleep(500); keybd_event((byte)Key, 0, 0, 0); Thread.Sleep(500); Console.WriteLine("Key \"" + Key + "\" sent to foobar's main window"); if (!SetForegroundWindow(OldForegroundWindow)) Console.WriteLine("Warning: The old foreground (" + OldForegroundWindow.ToString() + ") window could not be restored");
_SendingKey = false; } } |
Get- und SetForegroundWindow sind über DllImport eingebunden und funktionieren wie gesagt auch. Falls ihr euch über die drei Sleeps und deren wundert: wenn ich sie entferne oder deutlich kürzer mache funktioniert das Senden des Tastendrucks ebenfalls nicht. Habe ich vielleicht einen konzeptbedingten Fehler im Code?
AXMD