Почему мой WndProc не получает сообщения перехвата оболочки, если приложение установлено как оболочка рабочего стола Windows по умолчанию? - PullRequest
1 голос
/ 28 декабря 2010
    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);
}

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

Нужно ли использовать инъекцию функции dll, отдельный файл dll для перехвата?Я пытался найти более простое и простое решение.

Есть идеи?

Спасибо

1 Ответ

3 голосов
/ 28 декабря 2010

Документация WH_SHELL прямо заявляет:

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

...