Как получить дескриптор главного окна процесса в 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 не будет пустой.