Почему мой wndproc не получает сообщения крючками для оболочки, если приложение установлено как оболочка настольного компьютера по умолчанию?
-
13-10-2019 - |
Вопрос
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.