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-4 часа для тестирования отладки, поиска в Интернете. Проблемы заключались в преобразовании структур и функций WinApi в C# и их активации в правильном порядке, установив структуру MINIMIZEDMETRICS. Во всяком случае теперь работает отлично. Я использовал Cairo Desktop Source Code и этот поток: http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/cfaa9f53-8bfd-4a0a-9e9a-4c2b7d47327a – nasko7
@ nasko7 - Я надеюсь, вы использовали pinvoke .net, чтобы получить правильные определения C# для API и структур Win32, так? :-) –
да я использовал pinvoke.net :) Еще раз спасибо. – nasko7