Как получить дескриптор главного окна процесса в C#?
цель состоит в том, чтобы программно запустить форму Windows, получить ее дескриптор и отправить информацию в ее функцию wndProc() с помощью функции SendMessage() Win Api.
Я позаботился о части SendMessage (), но теперь проблема заключается в получении дескриптора формы после запуска процесса.
мое первое предположение, что свойство процесса MainWindowHandle даст мне дескриптор, который я ищу, но после запуска процесса MainWindowHandle остается равным 0 и следующий код не показывает дескриптор процесса, который я только что начал:
foreach (Process p in Process.GetProcesses())
{
Console.WriteLine(p.MainWindowHandle);
}
может кто-нибудь сказать мне, как это сделать и действительно ли это можно сделать?
1 ответов
иногда процесс занимает секунду, чтобы настроить все, но объект возвращается немедленно.
по этой причине вы должны немного подождать,чтобы позволить процессу действительно начать его, а затем он будет установлен соответствующим образом, готовый к потреблению.
var proc = Process.Start("notepad");
Thread.Sleep(1000); // This will wait 1 second
var handle = proc.MainWindowHandle;
другой способ сделать это более умным способом:
var proc = Process.Start("notepad");
try
{
while (proc.MainWindowHandle == IntPtr.Zero)
{
// Discard cached information about the process
// because MainWindowHandle might be cached.
proc.Refresh();
Thread.Sleep(10);
}
var handle = proc.MainWindowHandle;
}
catch
{
// The process has probably exited,
// so accessing MainWindowHandle threw an exception
}
это приведет к запуску процесса и подождет, пока MainWindowHandle не будет пустой.