解决使用easytrader进行股票自动化交易时报SendInput() inserted only 0 out of 2 keyboard events错误

1.错误现象:

在使用easytrader进行股票自动化交易时,系统报RuntimeError: SendInput() inserted only 0 out of 2 keyboard events错误,如下图:

 2.原因分析

因为easytrader使用了pywinauto库模拟键盘进行输入操作,如果电脑安装了360安全卫士的话,会被拦截,所以导致SendInput()方法失效。

3.解决办法

解决办法非常简单,关闭360安全卫士!关闭360安全卫士!关闭360安全卫士!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
void NotifyKBEvent(wchar_t ch) { SHORT vks = VkKeyScanW(ch); BYTE vk = LOBYTE(vks); BYTE Shift = HIBYTE(vks); if (vk == (BYTE)-1/* || Shift == (BYTE)-1*/) {//UNICODE 字符 INPUT input[2]; input[0].type = INPUT_KEYBOARD; input[0].ki.wVk = 0; input[0].ki.wScan = ch; input[0].ki.dwFlags = 0x4;//KEYEVENTF_UNICODE; input[1].type = INPUT_KEYBOARD; input[1].ki.wVk = 0; input[1].ki.wScan = ch; input[1].ki.dwFlags = KEYEVENTF_KEYUP | 0x4;//KEYEVENTF_UNICODE; SendInput(2, input, sizeof(INPUT)); } else {// if (Shift) { INPUT input[4] = {0}; input[0].type = INPUT_KEYBOARD; input[0].ki.wVk = Shift;//VK_SHIFT; input[1].type = INPUT_KEYBOARD; input[1].ki.wVk = ch; input[2].type = INPUT_KEYBOARD; input[2].ki.wVk = ch; input[2].ki.dwFlags = KEYEVENTF_KEYUP; input[3].type = INPUT_KEYBOARD; input[3].ki.wVk = Shift;//VK_SHIFT; input[3].ki.dwFlags = KEYEVENTF_KEYUP; SendInput(4, input, sizeof(INPUT)); } else { INPUT input[2] = {0}; input[0].type = INPUT_KEYBOARD; input[0].ki.wVk = vks; input[1].type = INPUT_KEYBOARD; input[1].ki.wVk = vks; input[1].ki.dwFlags = KEYEVENTF_KEYUP; SendInput(2, input, sizeof(INPUT)); } } } void NotifyKBEvent(wchar_t* chs) { if (chs == NULL) return ; while(*chs) NotifyKBEvent(*chs++); } void SendKBEvent(WORD wVk, DWORD dwFlags = 0, DWORD dwExtraInfo = 0) { INPUT input[1] = {0}; input[0].type = INPUT_KEYBOARD; input[0].ki.wVk = wVk; input[0].ki.wScan = MapVirtualKey(wVk, 0); input[0].ki.dwFlags = dwFlags; input[0].ki.dwExtraInfo = dwExtraInfo; input[0].ki.time = GetTickCount(); SendInput(1, input, sizeof(INPUT)); } //去掉任务栏图标 和 始终不处于活动状态 ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW | 0x08000000); //初始不活动 SetWindowPos(&CWnd;::wndTopMost, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
SendInput 是一个 Windows API 函数,它可以模拟用户输入设备的输入,例如鼠标、键盘等。这个函数可以用来自动化一些任务,例如模拟用户按键、鼠标点击等。 SendInput 函数的声明如下: ```C++ UINT SendInput( UINT nInputs, // 输入事件个数 LPINPUT pInputs, // 输入事件数组 int cbSize // 输入事件的大小 ); ``` 其中,参数 nInputs 是输入事件的个数,pInputs 是输入事件数组的指针,cbSize 是输入事件的大小。输入事件的类型是 INPUT 结构体,它包含了输入事件的类型、输入事件的数据等。例如,以下是一个模拟按下键盘上的 A 键的示例: ```C++ // 定义一个 INPUT 结构体数组 INPUT input[1]; // 设置输入事件的类型为键盘输入 input[0].type = INPUT_KEYBOARD; // 设置键盘输入的数据 input[0].ki.wVk = 'A'; // 发送输入事件 SendInput(1, input, sizeof(INPUT)); ``` 上面的代码将会模拟一个键盘按下 A 键的操作。如果要模拟键盘松开 A 键的操作,可以将 ki.dwFlags 设置为 KEYEVENTF_KEYUP: ```C++ // 定义一个 INPUT 结构体数组 INPUT input[1]; // 设置输入事件的类型为键盘输入 input[0].type = INPUT_KEYBOARD; // 设置键盘输入的数据 input[0].ki.wVk = 'A'; input[0].ki.dwFlags = KEYEVENTF_KEYUP; // 设置为键盘松开 // 发送输入事件 SendInput(1, input, sizeof(INPUT)); ``` 需要注意的是,模拟输入事件是需要管理员权限的。同时,模拟输入事件也可能会对系统造成一定的安全风险,所以在使用 SendInput 函数时需要谨慎操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值