[英]Overriding MS Office Hotkeys
我該如何在MS Office中以編程方式覆蓋熱鍵?
我的應用程序有一個全局熱鍵( CTRL + SHIFT + 1 ),可以在其他應用程序中使用,但是在任何MS Office應用程序中嘗試使用它時似乎都會迷路。 當我關閉我的應用程序時,熱鍵將再次按預期工作在MS Office中。
如果有人要查看其他答案,請放在此處。 這也說明了一個鈎子。
可以使用鍵盤掛鈎執行此操作。 可以在此CodeProject文章上找到一個很好的鈎子類。
使用下面的代碼將防止WIN + LEFT或WIN + RIGHT發生。 您可以使用它來覆蓋您想要的任何鍵。
這甚至會覆蓋通過RegisterHotKey
Win API添加的熱鍵。
在項目中擁有這些類之后,可以將處理程序添加到靜態HookManager
類中,如下所示。
//It's worth noting here that if you subscribe to the Key_Press event then it will break the international accent keys.
HookManager.KeyPress += HookManager_KeyPress;
HookManager.KeyDown += HookManager_KeyDown;
HookManager.KeyUp += HookManager_KeyUp;
您也可以添加鼠標事件,但為簡單起見,我僅顯示鍵盤掛鈎。
我還創建了一個通用列表,以便了解當前哪些鍵已關閉,並在KeyUp
事件上從列表中刪除這些鍵。
public static List<Keys> keysDown = new List<Keys>();
private static void HookManager_KeyDown(object sender, KeyEventArgs e)
{
//Used for overriding the Windows default hotkeys
if(keysDown.Contains(e.KeyCode) == false)
{
keysDown.Add(e.KeyCode);
}
if (e.KeyCode == Keys.Right && WIN())
{
e.Handled = true;
//Do what you want when this key combination is pressed
}
else if (e.KeyCode == Keys.Left && WIN())
{
e.Handled = true;
//Do what you want when this key combination is pressed
}
}
private static void HookManager_KeyUp(object sender, KeyEventArgs e)
{
//Used for overriding the Windows default hotkeys
while(keysDown.Contains(e.KeyCode))
{
keysDown.Remove(e.KeyCode);
}
}
private static void HookManager_KeyPress(object sender, KeyPressEventArgs e)
{
//Used for overriding the Windows default hotkeys
}
public static bool CTRL()
{
//return keysDown.Contains(Keys.LShiftKey)
if (keysDown.Contains(Keys.LControlKey) ||
keysDown.Contains(Keys.RControlKey) ||
keysDown.Contains(Keys.Control) ||
keysDown.Contains(Keys.ControlKey))
{
return true;
}
else
{
return false;
}
}
public static bool SHIFT()
{
//return keysDown.Contains(Keys.LShiftKey)
if (keysDown.Contains(Keys.LShiftKey) ||
keysDown.Contains(Keys.RShiftKey) ||
keysDown.Contains(Keys.Shift) ||
keysDown.Contains(Keys.ShiftKey))
{
return true;
}
else
{
return false;
}
}
public static bool WIN()
{
//return keysDown.Contains(Keys.LShiftKey)
if (keysDown.Contains(Keys.LWin) ||
keysDown.Contains(Keys.RWin))
{
return true;
}
else
{
return false;
}
}
public static bool ALT()
{
//return keysDown.Contains(Keys.LShiftKey)
if (keysDown.Contains(Keys.Alt))
{
return true;
}
else
{
return false;
}
}
您必須使用SetWindowsHookEx並將dwThreadId設置為0。
因此,您可以掛鈎所有線程的所有鍵輸入(通過這種方式,您可以創建一個鍵盤記錄器。)
請閱讀http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx
和
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.