2013-08-04 43 views
1

我使用RegisterWindowMessage(“SHELLHOOK”)注册窗口创建和销毁事件。我的代码是用C#编写的。代码在我调试代码时完美工作。但是当我不经调试运行该程序时,我没有像调试时那样获取WndProc消息。 Windows阻止挂钩?挂钩接收窗口创建和销毁通知

class ShellHook:NativeWindow 
{ 
    public ShellHook(IntPtr hWnd) 
    { 
     if (Win32.RegisterShellHookWindow(this.Handle)) 
     { 
      WM_ShellHook = Win32.RegisterWindowMessage("SHELLHOOK"); 
     } 
    } 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_ShellHook) 
     { 
      switch((ShellEvents)m.WParam) 
      { 
        //m.lparam 
       case ShellEvents.HSHELL_WINDOWCREATED: 
        if (windowCreatedEvent != null) 
        { 
         windowCreatedEvent(m.LParam); 
        } 
        break; 

       case ShellEvents.HSHELL_WINDOWDESTROYED: 
        if (windowDestroyedEvent != null) 
        { 
         windowDestroyedEvent(m.LParam); 
        } 
        break; 
      } 
     } 
     base.WndProc(ref m); 
    } 
} 

这是我如何启动我的wpf应用程序。

public partial class App : Application 
{ 
    MainWindow mainWindowView; 

    public App() 
    { 
     Startup += new StartupEventHandler(App_Startup); 
    } 

    void App_Startup(object sender, StartupEventArgs e) 
    { 
     mainWindowView = new MainWindow(); 
     MainWindowViewModel mainWindowViewModel = new MainWindowViewModel(); 
     mainWindowView.DataContext = mainWindowViewModel; 
     mainWindowView.ShowDialog(); 
    } 
} 

我MainWindowViewModel构造如下:

public MainWindowViewModel() 
    { 
     EnumWindows(new EnumWindowsProc(EnumTheWindows), IntPtr.Zero); 
     System.Windows.Forms.Form f = new System.Windows.Forms.Form(); 
     ShellHook shellHookObject = new ShellHook(f.Handle); 
     shellHookObject.windowCreatedEvent += shellHookObject_windowCreatedEvent; 
     shellHookObject.windowDestroyedEvent += shellHookObject_windowDestroyedEvent; 
    } 
+0

邮政编码,这将有帮助 –

+0

您是否正在创建一个外壳扩展?你在调用'RegisterShellHookWindow'函数吗?你是否检查所有你要求出错的函数的返回码? –

+0

我没有创建一个shell扩展。我只是想做一个任务栏,因为我需要窗口创建和销毁的通知,所以我调用了RegisterShellHookWindow函数。但有趣的部分是,我在调试时收到通知,但没有在没有调试的情况下运行应用程序时收到通知。 –

回答

1

我改变了的NativeWindow形式和它看起来像它现在的工作。伙计们请让我知道你的想法。

+2

您使用的API本质上是私有API,不适用于公共用途。该文档在顶部明确指出了这一点。如果您考虑函数的名称和描述,这也是相当清楚的:它用于* shell * windows。你是壳窗户吗?不,因为你不在Windows Shell团队中。事实上,你甚至不写一个shell扩展。所以你根本不应该使用API​​。当然,如果你必须的话,你将不得不给它一个实际的窗口,至少可以假装成一个shell窗口。 –

+0

这个程序是一个测试。但我的主要应用程序是一个shell窗口科迪灰色 –

+0

但我的shell应用程序应该有能力在窗口创建和窗口销毁不是吗?截至目前,我的应用程序并不是一个完整的shell应用程序。那么有什么想法? –