C#学习教程:将Ctrl+Up发送到一个窗口我已经掌握了基础知识,我可以发送记录空间键的按键。但我似乎无法让ctrl+↑工作。所选片段:[DllImport("user32.dll",CharSet=CharSet.Auto,SetLastError=false)]staticexternIntPtrSendMessage(IntPtrhWnd,intMsg,intwParam,intlParam);现在这适用于发送空间:publicstaticvoidSendKeyPress(IntPtrhandle,VKeyskey){SendMessage(handle,(int)WMessages.WM_KEYDOWN,(int)key,0);SendMessage(句柄,(int)WMessages.WM_KEYUP,(int)key,0);但这不适用于将Ctrl+↑发送到VLC以增加音量:publicstaticvoidSendKeyPress(IntPtrhandle,VKeyskey,boolcontrol){intlParamKeyDown=0;lParamKeyDown|=1;lParamKeyDown|=1<<24;intlParamKeyUp=lParamKeyDown;lParamKeyUp|=1<<30;lParamKeyUp|=1<<31;//它在intlParamCtrlDown=lParamKeyDown之前被关闭了;intlParamCtrlUp=lParamKeyUp;lParamKeyDown|=(int)MapVirtualKey((uint)key,0)<<16;lParamKeyUp|=(int)MapVirtualKey((uint)key,0)<<16;lParamCtrlDown|=(int)MapVirtualKey((uint)VKeys.VK_CONTROL,0)<<16;lParamCtrlUp|=(int)MapVirtualKey((uint)VKeys.VK_CONTROL,0)<<16;IntPtrcontrolPtr=newIntPtr((int)VKeys.VK_CONTROL);IntPtrlParamCtrlDownPtr=newIntPtr(lParamCtrlDown);IntPtrlParamCtrlUpPtr=newIntPtr(lParamCtrlUp);IntPtr=ParamKeyDownPtrlParamKeyDown);IntPtrlParamKeyUpPtr=newIntPtr(lParamKeyUp);IntPtrkeyPtr=newIntPtr((int)key);对象o=新对象();HandleRefwndRef=newHandleRef(o,handle);PostMessage(wndRef,(uint)WMessages.WM_KEYDOWN,controlPtr,lParamCtrlDownPtr);PostMessage(wndRef,(uint)WMessages.WM_KEYDOWN,keyPtr,lParamKeyDownPtr);PostMessage(wndRef,(uint)WMessages.WM_KEYUP,controlPtr,WParamCtrlUpMessPtrage(wndRef,lParamCtrlUpMessPtrage);WM_KEYUP,keyPtr,lParamKeyUpPtr);我错过了什么?编辑3:消息完全相同,因为我切换到PostMessage没有额外的消息,但VLC仍然不会增加或减少音量它不仅仅是VLC,Spotify不会接受相同的消息,即使消息看起来完全一样同样在Spy++命令中。我没有测试它的好方法,但如果这两行的顺序有效:SendMessage(handle,(int)WMessages.WM_KEYDOWN,(int)key,0);SendMessage(句柄,(int)WMessages.WM_KEYDOWN,(int)VKeys.VK_CONTROL,0);改为:SendMessage(handle,(int)WMessages.WM_KEYDOWN,(int)VKeys.VK_CONTROL,0);SendMessage(句柄,(int)WMessages.WM_KEYDOWN,(int)键,0);这样控制键的下降基本上就包裹了另一个键的压力?我现在找到了一种将Ctrl+Right(例如)发送到另一个进程窗口的方法。如果hEdit是窗口的句柄,则以下代码有效。AttachThreadInput(GetCurrentThreadID,GetWindowThreadProcessId(hEdit,0),true);hEdit:=SetFocus(hEdit);keybd_event(VK_CONTROL,0,0,0);keybd_event(VK_RIGHT,0,0,0);keybd_event(VK_RIGHT,0,KEYEVENTF_KEYUP,0);keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);设置焦点(hEdit);//恢复焦点AttachThreadInput(GetCurrentThreadID,GetWindowThreadProcessId(hEdit,0),false);//"Disconnect"更新这个方法的缺点是焦点改变的时间很短。事实上,我认为最好的解决方案是结合我之前的文章和这篇文章:vars:TKeyboardState;上一个状态:字节;AttachThreadInput(GetCurrentThreadID,GetWindowThreadProcessId(hEdit,0),true);获取键盘状态;PrevState:=s[VK_CONTROL];s[VK_CONTROL]:=128;设置键盘状态;SendMessage(hEdit,WM_KEYDOWN,VK_RIGHT,0);s[VK_CONTROL]:=PrevState;设置键盘状态;,0),假);我找到了一个可行的解决方案您使用SetKeyboardState函数按下控制键,然后您可以发送任何您想要的键。此Delphi代码将Ctrl+Right发送到Memo组件。以上就是C#学习教程:发送Ctrl+Up到窗口分享全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——vars:TKeyboardState;上一个状态:字节;开始GetKeyboardState(s);PrevState:=s[VK_CONTROL];s[VK_CONTROL]:=128;设置键盘状态;SendMessage(Memo1.Handle,WM_KEYDOWN,VK_RIGHT,0);s[VK_CONTROL]:=PrevState;SetKeyboardState(s)结束;本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
