我正在尝试复制CTRL +向上箭头消息,但这就像忽略了CTRL键,结果就像只发送向上箭头,而不发送CTRL
这是Spy++结果的外观:

CTRL键值:

上箭头键向下:

向上箭头键:

CTRL键:

这是我使用的代码:
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, uint lParam);
SendMessage(whandle, 0x100, 0x00000011, 0x011D0001);
SendMessage(whandle, 0x100, 0x00000026, 0x01480001);
SendMessage(whandle, 0x101, 0x00000026, 0xC1480001);
SendMessage(whandle, 0x101, 0x00000011, 0xC11D0001);我已经将此SendMessage签名更改为接受KEYUP lParams:
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, uint lParam);
也许签名是错的?我真的不知道我错过了什么
我不能使用SendKeys或任何需要在前面设置窗口的方法,它必须在后台工作,SetKeyBoardState也不能影响其他正在运行的程序
编辑:
用PostMessage测试和我得到相同的结果,CTRL键被忽略
PostMessage(whandle, 0x100, 0x00000011, 0x011D0001);
PostMessage(whandle, 0x100, 0x00000026, 0x01480001);
PostMessage(whandle, 0x101, 0x00000026, 0xC1480001);
PostMessage(whandle, 0x101, 0x00000011, 0xC11D0001);发布于 2020-04-01 17:16:04
使用SendMessage (或PostMessage)无法模拟修改器关键点的状态,例如按CTRL键。您必须改用SendInput。1
但是,使用SendInput只能将关键点发送到活动窗口。因此,如果发送到最小化/背景窗口是一个严格的要求,我担心您正在尝试做的事情是不可能的。2
如果您可以更改要求,将击键发送到活动窗口就足够了,或者可以临时将要向其发送击键的窗口拉到前台,则可以考虑使用Input Simulator库。
资料来源:
发布于 2020-04-01 12:35:16
我刚刚解决了类似的问题(使用非托管C++),但是我发送击键到DOS窗口,同时按一个键而不是2个或更多键,你可以在这里看到原始问题:How to send keyboard input to dos application running in window mode in Windows98
我使用了很多方法: SendMessage,SendInput和VxD驱动,我还解决了在发送击键之前激活窗口的问题,你可以在github - https://github.com/MossbauerLab/Sm2201Autosave上找到项目。在MossbauerLab.Sm2201.ExtSaveUtility/src/saveManager中,你可以找到方法:
void activateWindow(HWND窗口);
我正在使用可执行文件名称和窗口名称来搜索HWND (请参阅MossbauerLab.Sm2201.ExtSaveUtility/src/utils/windows/windowsInfo.h)大多数类已使用MS测试(托管C++)进行测试),测试项目也在以下存储库中: MossbauerLab.Sm2201.ExtSaveUtility.Tests
也许它能对你有所帮助
https://stackoverflow.com/questions/60812295
复制相似问题