Hallo,
gibt es unter Windows die Möglichkeit, sich irgendwie (über einen Hook o.ä.) benachrichtigen zu lassen, wenn ein bestimmter Prozess ein neues Fenster erzeugt?
Aktuell durchsuche ich die Fensterhandles eines Prozesses nach einer bestimmten Klasse in einer Schleife und führe weitere Aktionen aus, wenn ein Ergebnis gefunden wird:
private void Run(object state)
{
while (_running)
{
foreach (var handle in EnumerateProcessWindowHandles(Process.GetProcessesByName("process").First().Id))
{
var classname = new StringBuilder(256);
Native.GetClassName(handle, classname, classname.Capacity);
if (classname.ToString() == "zuSuchendeKlasse")
{
//...
}
}
Thread.Sleep(100);
}
}
private IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processId)
{
var handles = new List<IntPtr>();
foreach (ProcessThread thread in Process.GetProcessById(processId).Threads)
Native.EnumThreadWindows(thread.Id,
(hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero);
return handles;
}
Jetzt würde ich gern die Schleife eliminieren wenn es geht. 🙂
Gruß mabo
Hallo,
hier ein passender Artikel dazu: How to Write a Managed Global Hook for Window Creation and Destruction
Ups: sehe gerade, daß dies auch nur mittels einer Poll-Loop realisiert ist - gibt wohl in C# (d.h. Managed Code) keinen anderen Weg...
Direkt mit C (bzw. C++) geht es so: How to create a global (system) windows hook ?
Hi,
danke für die Infos, das hat mich auf die richtige Spur gebracht.
Der Artikel Using hooks from C# und der darin verlinkte Artikel Windows Hooks in the .NET Framework sehen vielversprechend aus.
Das werde ich mal ausprobieren.
Gruß mabo