2010-12-28 2 views
1
uMsgNotify = WinApi.RegisterWindowMessage("SHELLHOOK"); 
    WinApi.RegisterShellHookWindow(this.Handle); 

в моей форме конструктореПочему мой WndProc не получает сообщения Shell Hook, если приложение установлено как стандартная Windows Desktop Shell?

и это в моей перекрытой 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 Form работает хорошо, когда окна по умолчанию оболочка explorer.exe. Я могу получить все события Все созданные и уничтоженные окна и их имена. Когда я устанавливаю свой app.exe как defaul windows Shell. Он не получает сообщений.

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

Любые идеи?

Благодаря

ответ

3

Документация WH_SHELL явно гласит:

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

+0

Спасибо, Франци, но потребовалось еще 3-4 часа для тестирования отладки, поиска в Интернете. Проблемы заключались в преобразовании структур и функций WinApi в C# и их активации в правильном порядке, установив структуру MINIMIZEDMETRICS. Во всяком случае теперь работает отлично. Я использовал Cairo Desktop Source Code и этот поток: http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/cfaa9f53-8bfd-4a0a-9e9a-4c2b7d47327a – nasko7

+0

@ nasko7 - Я надеюсь, вы использовали pinvoke .net, чтобы получить правильные определения C# для API и структур Win32, так? :-) –

+0

да я использовал pinvoke.net :) Еще раз спасибо. – nasko7

 Смежные вопросы

  • Нет связанных вопросов^_^