Почему мой wndproc не получает сообщения крючками для оболочки, если приложение установлено как оболочка настольного компьютера по умолчанию?

StackOverflow https://stackoverflow.com/questions/4544468

Вопрос

    uMsgNotify = WinApi.RegisterWindowMessage("SHELLHOOK");
    WinApi.RegisterShellHookWindow(this.Handle);

В моей форме конструктор

И это в моем упроизводимом wndproc:

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    IntPtr handle;
    if (m.Msg == uMsgNotify)
    {
        switch (m.WParam.ToInt32())
        {
            case WinApi.HSHELL_WINDOWCREATED:
                handle = m.LParam;
                string windowName = GetWindowName(handle);
                MessageBox.Show(windowName+" "+handle.ToString());
                break;
            case WinApi.HSHELL_WINDOWDESTROYED:
                handle = m.LParam;
                MessageBox.Show(handle.ToString());
                break;
        }
    }
    base.WndProc(ref m);
}

Таким образом, эта форма победы работает нормально, когда Windows Shell по умолчанию является Explorer.exe. Я могу создать все события все созданные и уничтоженные окна и их имена. Когда я устанавливаю свое приложение. Он не получает сообщения.

Должен ли я использовать впрыск функции DLL, отдельный файл DLL для зацепления? Я пытался получить более простое и более простое решение.

Любые идеи?

Спасибо

Это было полезно?

Решение

А WH_SHELL В документации явно говорится:

Обратите внимание, что пользовательские приложения оболочки не надоПолучать WH_SHELL Сообщения. Следовательно, любое приложение, которое регистрируется как оболочка по умолчанию, должно вызвать SystemParametersInfoфункция перед ним (или любое другое приложение) может получить WH_SHELLСообщения. Эта функция должна быть вызвана с SPI_SETMINIMIZEDMETRICS и MINIMIZEDMETRICS структура. Установить Ярранж член этой структуры в ARW_HIDE.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top