2013-05-26 14 views
0

我做這在我的Form1的頂部:我如何使Select();在每個應用程序上鼠標在屏幕上?

globalKeyboardHook gkh; 

在Load事件:

private void Form1_Load(object sender, EventArgs e) 
{ 
    gkh = new globalKeyboardHook(); 
    gkh.HookedKeys.Add(Keys.M); 
    gkh.KeyDown += new KeyEventHandler(gkh_KeyDown); 
    gkh.KeyUp += new KeyEventHandler(gkh_KeyUp); 
} 

然後在底部:

void gkh_KeyDown(object sender, KeyEventArgs e) 
{ 
    // e.KeyCode.ToString() is the KeyCode of the pressed key 
    e.Handled = true; 
    if ((e.KeyCode == System.Windows.Forms.Keys.LControlKey) || (e.KeyCode == System.Windows.Forms.Keys.RControlKey)) 
    { 
     controlDown = true; 
    } 

    if (e.KeyCode == System.Windows.Forms.Keys.M && controlDown) 
    { 
     // Do CTRL-M action 
     if (mf == null) 
     { 
      //mf = new MagnifierMainForm(); 
      mf = new MagnifierMainForm(false); 
      mf.StartPosition = FormStartPosition.Manual; 
      mf.Location = Control.MousePosition; 
      //mf.Show(); 

      this.Select(); 
     } 
     else if (mf.IsDisposed) 
     { 
      mf = new MagnifierMainForm(false); 
      mf.StartPosition = FormStartPosition.Manual; 
      mf.Location = Control.MousePosition; 
      //mf.Show(); 
     } 
     else 
     { 
      mf.Close(); 
      mf = null; 
     } 
    } 
} 

     void gkh_KeyUp(object sender, KeyEventArgs e) 
     { 
      controlDown = false; 
     } 

當我跑步時我的應用程序然後點擊提示命令窗口,然後點擊CTRL + M,甚至在幾秒後沒有點擊任何東西,我得到一個異常:

CallbackOnCollectedDelegate 對'ScreenVideoRecorder!Utilities.globalKeyboardHook + keyboardHookProc :: Invoke'類型的垃圾收集代理進行了回調。這可能會導致應用程序崩潰,損壞和數據丟失。當通過委託給非託管代碼,它們必須由管理應用程序,直到可以保證他們永遠

CallbackOnCollectedDelegate檢測 消息更讓:回調是對類型ScreenVideoRecorder的」垃圾回收委託製作工具.globalKeyboardHook + keyboardHookProc ::調用」。這可能會導致應用程序崩潰,損壞和數據丟失。在將代理傳遞給非託管代碼時,它們必須由託管應用程序保持活動狀態,直到確保它們永遠不會被調用。

回答

1

我相信你正在尋找全球鍵盤掛鉤。 這裏是一個simple C# example of usage

如果從上面的例子中使用globalKeyboardHook類,你需要做4兩件事:

首先加自己名字命名的.cs文件到您的項目(和因爲有在代碼中的錯誤,至少從零七年五月三十零日版本修改它通過以下方式 - 根據會員4120854)註釋:下面的線

public delegate int keyboardHookProc(int code, int wParam, ref keyboardHookStruct lParam); 

加入這一行

private keyboardHookProc _keyboardHookProc; 

並更改掛鉤的方法是這樣的:

public void hook() 
{ 
    IntPtr hInstance = LoadLibrary("User32"); 
    _keyboardHookProc = new keyboardHookProc(hookProc); 
    hhook = SetWindowsHookEx(WH_KEYBOARD_LL, _keyboardHookProc, hInstance, 0); 
} 

,在你的窗體類添加一個私有成員變量這樣

globalKeyboardHook gkh = new globalKeyboardHook(); 

第三個,在你的Form_Load(或其他你想開始連接的地方YS)你想要的鍵(S)添加到GKH類的HookedKeys集合屬性和訂閱GKH類的KeyDown和/或KEYUP事件,就像這樣:

​​

,那麼你可以在你的KeyUp或KeyDown處理程序中做你想要的,設置e。處理,以真正停止在系統中傳播的鍵事件,像這樣:

空隙gkh_KeyUp(對象發件人,KeyEventArgs E){// e.KeyCode.ToString()是被釋放的鍵 e的密鑰號碼。 Handled = true; }

void gkh_KeyDown(object sender, KeyEventArgs e) { 
     // e.KeyCode.ToString() is the KeyCode of the pressed key 
     e.Handled = true; 
    } 

要做些事情上特定的組合鍵,你需要記錄在一個變量,在檢查的KeyDown鍵的狀態如果兩個(或全部)按鍵下降。因此,對於「CTRL-M」,你會增加可變成員

bool controlDown = false; 

那麼你會將此代碼添加到您的KeyDown事件處理程序

if ((e.KeyCode == System.Windows.Forms.Keys.LControlKey) || (e.KeyCode == System.Windows.Forms.Keys.RControlKey)) 
{ 
    controlDown = true; 
} 

if (e.KeyCode == System.Windows.Forms.Keys.M && controlDown) 
{ 
    // Do CTRL-M action 
} 

,並在KeyUp事件處理程序,你需要添加此

if ((e.KeyCode == System.Windows.Forms.Keys.LControlKey) || (e.KeyCode == System.Windows.Forms.Keys.RControlKey)) 
{ 
    controlDown = false; 
} 
+0

Bikonja確定我看着鏈接,並將其添加到我的代碼。但我不知道如何使它工作試圖將其添加到我的代碼。你能再次看我的問題嗎?我編輯它? –

+0

你應該把重點處理這些事件的一個(或兩個): 'gkh.KeyDown + =新KeyEventHandler(gkh_KeyDown); gkh.KeyUp + =新KeyEventHandler(gkh_KeyUp);' – Bikonja

+0

@Bikonja - 請示例代碼添加到您的答案。它將更加可見並且格式正確。 – ChrisF

相關問題