2013-08-04 72 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應用程序。那麼有什麼想法? –