2010-10-02 95 views
2

我想在後臺線程上設置鼠標鉤。LowLevelMouseProc在後臺線程

delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam); 
LowLevelMouseProc _proc = HookCallback; 
SetWindowsHookEx(PInvoke.WH_MOUSE_LL, _proc, IntPtr.Zero, 0); 

IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam){/**/} 

如果我把這個主窗口線程一切正常,直到窗口有做這會導致鼠標停止響應這項工作的持續時間更復雜的工作(更新多個孩子例如在面板中)。

如果我開始一個新的線程,並從那裏設置鉤子,問題是線程簡單地退出後設置鉤子和回調函數永遠不會被調用。

有沒有辦法讓線程活着? 或者,如果存在另一種方法來連接鼠標而不冒着不響應的行爲風險?

我不期而遇注意到,當工作線程執行

GetMessage(out msg, new IntPtr(0), 0, 0); 

沒有消息不斷收到,但線程被保持存活所需的目的。 另外我需要一個優雅的方式來關閉線程,但GetMessage永遠不會返回。

我不完全理解所有這些信息,我只是希望能夠連接鼠標並防止凍結。

任何幫助appriciated。

回答

0

在您的鉤子回調方法中,只需啓動一個新線程即可。事情是這樣的:

IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
{ 
    ThreadPool.QueueUserWorkItem(obj => 
    { 
     // do whatever ... 
    }); 
} 

不要忘記,如果你的處理需要訪問您的控件的形式在你的主線程調用。

編輯:

如果你做你的主要形式線程的東西是凝固起來的UI,你應該考慮這樣做的動作在後臺線程而非主線程。當您需要通過處理更新控件時,則可以調用。

this.WhateverControl.Invoke(/* ... /*);

0

低電平鼠標鉤子需要在其中稱爲SetWindowsHookEx函數的線程中運行的消息循環。這就是爲什麼它不能在簡單的後臺線程中工作,並在UI線程中工作。如果你想在後臺線程中使用這個鉤子,在SetWindowsHookEx之後調用Application.Run方法。線程保留在此循環中並處理低級別的掛鉤消息。