捕获键盘快捷键并转发我需要做的事情:我需要捕获特定应用程序的所有快捷键,例如Ctrl+S。任何组合键即使不是应用程序的快捷方式。然后我捕获这些键的中途应用程序需要验证这些键组合,并检查我们正在运行的另一个应用程序是否可以响应该键,并可以向它发送命令。到目前为止我所拥有的:由于我们编写了其他应用程序,我们可以轻松发送要处理的密钥,这不是问题。我可以获得应用程序的窗口句柄。我需要捕获快捷键。我知道这个应用程序是用C++构建的。我希望找到一种方法来捕获Winforms中的以下事件的等效项:我只是错过了抓住那个手柄上的钥匙。我真的不想冒险连接整个键盘并检测是否在我的应用程序中完成了击键,我是否需要取消该键或继续该过程。我也只想获得组合键事件。我宁愿不接收那个人在文本框或其他任何地方输入时按下的所有字母。我真的在寻找以CTRL、ALT、SHIFT或它们的任意组合开头的任何内容我想做的事情的示例:不受控制的应用程序:Notepad.exe我的中途应用程序:ShortcutHandler.exe我的目标应用程序:A.exe,B.exeShortcutHandler.exe将侦听Notepad.Exe快捷方式,然后将它们转发给A.exe和B.exe情况:1-在Notepad.exe中按CTRL+H进行替换2-ShortcutHandler。exe检测Notepad.exe上按下的CTRL+H3-ShortcutHandler.exe分析CTRL+H并知道它需要执行某些任务4-ShortcutHandler.exe在A.exe上调用Save以响应Notepad.exe中的CTRL+H5-ShortcutHandler.exe调用B.exe中的Printreport以响应Notepad.exe中的CTRL+H前段时间我不得不做类似你的事情,所以我找到了这篇文章:一个简单的C#键盘挂钩,有了这个我能够做我需要的。但这是一个复杂的代码,正如您所说,您不想获得所有密钥。对于我的程序,我创建了一个KeyboardHook类,可以轻松使用上一篇文章中获得的代码。所以你可以用KeyboardHook类制作一个代码片段://把它放在你的表单的开头(就像FormLoad上的构造函数).varhook=newKeyboardHook();hook.KeyDown+=(sender,e)=>{//如果trueControl被按下,e.Control是一个bool属性。//如果按下Shift为真,则e.Shift是布尔属性。//e.Key有一个被按下的键。//这个if忽略任何不以Control或Shift开头的内容。如果(!e.Control&&!e.Shift)返回;//您的代码如下:if(e.Control&&e.Key==Keys.H){//在这里执行您的代码。//like:分析CTRL+H并知道它需要做一些任务。}};钩子。开始();//直到这里进入你的表单的开头。//将它放在表单的末尾(就像在Dispose或FormClose中一样).hook.Release();钩子.处置();PS:如果你把这个放在你的ShortcutHandler应用程序上,应用程序仍然会得到密钥。以下为KeyboardHook代码:以上为C#学习教程:捕捉键盘快捷键,转发所有分享内容。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——usingSystem.Runtime.InteropServices;使用System.Windows.Forms;公共类KeyboardHook:IDisposable{#regionFieldsprivatebool_lControlKeyIsDown;私人布尔_rControlKeyIsDown;私人布尔_lShiftKeyIsDown;私人布尔_rShiftKeyIsDown;#endregion#region属性privateboolControlIsDown{get{return_lControlKeyIsDown||_rControlKeyIsDown;}}privateboolShiftIsDown{get{返回_lShiftKeyIsDown||_rShiftKeyIsDown;}}#endregion#region构造函数publicKeyboardHook(){_proc=HookCallback;}#endregion#regionEvents公共事件HookKeyDownHandlerKeyDown;#endregionSt#region方法public(voart){_hookID=SetHook(_proc);}privatestaticIntPtrSetHook(LowLevelKeyboardProcproc){使用(varcurProcess=Process.GetCurrentProcess())使用(varcurModule=curProcess.MainModule){returnSetWindowsHookEx(WH_KEYBOARD_LL,proc,GetModuleHandle(curModule.ModuleName),0);}}privateIntPtrHookCallback(intnCode,IntPtrwParam,IntPtrlParam){if(nCode>=0){varvkCode=Marshal.ReadInt32(lParam);varkey=(Keys)vkCode;if(wParam==(IntPtr)WM_KEYDOWN){switch(key){caseKeys.LControlKey:_lControlKeyIsDown=true;休息;案例Keys.RControlKey:_rControlKeyIsDown=true;休息;案例Keys.LShiftKey:_lShiftKeyIsDown=true;休息;案例Keys.RShiftKey:_rShiftKeyIsDown=true;休息;默认值:if(KeyDown!=null){varargs=newHookKeyDownEventArgs((Keys)vkCode,ShiftIsDown,ControlIsDown);KeyDown(这个,参数);}休息;}}if(wParam==(IntPtr)WM_KEYUP){switch(key){caseKeys.LControlKey:_lControlKeyIsDown=false;休息;案例Keys.RControlKey:_rControlKeyIsDown=false;休息;案例Keys.LShiftKey:_lShiftKeyIsDown=false;休息;案例Keys.RShiftKey:_rShiftKeyIsDown=false;休息;}}}返回CallNextHookEx(_hookID,nCode,wParam,lParam);}publicvoidRelease(){UnhookWindowsHookEx(_hookID);}publicvoidDispose(){释放();}#endregion#region互操作性privateconstintWH_KEYBOARD_LL=13;私人常量intWM_KEYDOWN=0x0100;私人常量intWM_KEYUP=0x0101;私人只读LowLevelKeyboardProc_proc;私人IntPtr_hookID=IntPtr.Zero;私人委托IntPtrLowLevelKeyboardProc(intnCode,IntPtrwParam,IntPtrlParam);[DllImport("user32.dll",CharSet=CharSet.Auto,SetLastError=true)]privatestaticexternIntPtrSetWindowsHookEx(intidHook,LowLevelKeyboardProclpfn,IntPtrhMod,uintdwThreadId);[DllImport("user32.dll",CharSet=CharSet.Auto,SetLastError=true)][返回:MarshalAs(UnmanagedType.Bool)]privatestaticexternboolUnhookWindowsHookEx(IntPtrhhk);[DllImport("user32.dll",CharSet=CharSet.Auto,SetLastError=true)]privatestaticexternIntPtrCallNextHookEx(IntPtrhhk,intnCode,IntPtrwParam,IntPtrlParam);[DllImport("kernel32.dll",CharSet=CharSet.Auto,SetLastError=true)]privatestaticexternIntPtrGetModuleHandle(stringlpModuleName);#endregion}publicclassHookKeyDownEventArgs:EventArgs{#region字段privatereadonlyKeys_key;privatereadonlyreadonlyboolreadft;bool_control;#endregion#region属性publicKeysKey{get{return_key;}}publicboolShift{get{return_shift;}}publicboolControl{get{return_control;}}#endregion#regionConstructorspublicHookKeyDownEventArgs(Keyskey,boolshift,boolcontrol){_key=key;_shift=shift;_control=control;}#endregion}publicdelegatevoidHookKeyDownHandler(objectsender,HookKeyDownEventArgse);点击右侧联系管理员删除,如有转载,请注明出处:
