【发布时间】:2010-11-04 12:06:40
【问题描述】:
我正在尝试使用 SendInput() 向另一个应用程序(记事本)发送一个句子,然后按 Enter 键发送它。
任何代码sn-ps?或者帮忙
【问题讨论】:
我正在尝试使用 SendInput() 向另一个应用程序(记事本)发送一个句子,然后按 Enter 键发送它。
任何代码sn-ps?或者帮忙
【问题讨论】:
INPUT input;
WORD vkey = VK_F12; // see link below
input.type = INPUT_KEYBOARD;
input.ki.wScan = MapVirtualKey(vkey, MAPVK_VK_TO_VSC);
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
input.ki.wVk = vkey;
input.ki.dwFlags = 0; // there is no KEYEVENTF_KEYDOWN
SendInput(1, &input, sizeof(INPUT));
input.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &input, sizeof(INPUT));
【讨论】:
VkKeyScanEx( char, KeyboardLayout )把你的“普通”chars放到这个例子中:) ...input.ki.wVk = VkKeyScanEx('a',kbl);对于KeyboardLayout,最简单的方法是加载当前窗口的keyboardLayout:HKL kbl = GetKeyboardLayout(0);
我在阅读@Nathan 的代码this reference 并结合@jave.web 的建议后进行了修改。此代码可用于输入字符(大写和小写)。
#define WINVER 0x0500
#include<windows.h>
void pressKeyB(char mK)
{
HKL kbl = GetKeyboardLayout(0);
INPUT ip;
ip.type = INPUT_KEYBOARD;
ip.ki.time = 0;
ip.ki.dwFlags = KEYEVENTF_UNICODE;
if ((int)mK<65 || (int)mK>90) //for lowercase
{
ip.ki.wScan = 0;
ip.ki.wVk = VkKeyScanEx( mK, kbl );
}
else //for uppercase
{
ip.ki.wScan = mK;
ip.ki.wVk = 0;
}
ip.ki.dwExtraInfo = 0;
SendInput(1, &ip, sizeof(INPUT));
}
下面是按回车键的功能:
void pressEnter()
{
INPUT ip;
ip.type = INPUT_KEYBOARD;
ip.ki.time = 0;
ip.ki.dwFlags = KEYEVENTF_UNICODE;
ip.ki.wScan = VK_RETURN; //VK_RETURN is the code of Return key
ip.ki.wVk = 0;
ip.ki.dwExtraInfo = 0;
SendInput(1, &ip, sizeof(INPUT));
}
【讨论】:
if ((int)mK<65 && (int)mK>90),即转换为 int 的 char 代码必须同时小于 65 和大于 90。我假设这必须是一个或,即if ((int)mK<65 || (int)mK>90),以匹配ASCII表中的特殊字符和小字符,否则条件是互斥的,永远无法满足
SendInput 函数接受一个 INPUT 结构数组。 INPUT 结构可以是鼠标或键盘事件。 keyboard event structure 有一个名为 wVk 的成员,它可以是键盘上的任何键。 Winuser.h 头文件为每个键提供宏定义 (VK_*)。
【讨论】:
这里有一个简单的 C++ 示例http://nibuthomas.wordpress.com/2009/08/04/how-to-use-sendinput/
还有一个更完整的 VB 示例在这里http://vb.mvps.org/samples/SendInput/
【讨论】: