我有以下代码:
INPUT Input = { 0 };
Input.type = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk = 'A'; // tried 0x41, ( UCHAR )VkKeyScan( 'A' )
SendInput( 1, &Input, sizeof( INPUT ) );
Run Code Online (Sandbox Code Playgroud)
但它只会产生'a'.如何强制它生成大写?
谢谢.
我正在尝试在Windows 8上模拟Win + X的按键事件,这应该会弹出一个小菜单,但是我无法通过使用SendInput来实现这一点.对于任何其他键组合(例如Win + R,Win + E,Win + D),它可以工作但不适用于Win + X. 我注意到Synergy +有同样的问题,但Windows屏幕键盘没有.我还查看了屏幕键盘使用的SendInput参数,但如果我在我的应用程序中使用完全相同的参数,我仍然没有得到菜单.
所以我的问题是,如何使这个工作?或者是否有另一种显示此菜单的方法?
我想编写一个c ++代码来模拟按键盘键"A":
// Set up a generic keyboard event.
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0; // hardware scan code for key
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
// Press the "..." key
ip.ki.wVk = code; // virtual-key code for the "a" key
ip.ki.dwFlags = 0; // 0 for key press
SendInput(1, &ip, sizeof(INPUT));
// Release the "..." key
ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
SendInput(1, &ip, sizeof(INPUT));
Run Code Online (Sandbox Code Playgroud)
当我启动其他程序并等待我的程序执行时,它工作正常,单击"A"并且第一个程序对它做出反应.但是我发现在另一个应用程序中,我的动作以某种方式被阻止了(我可以在键盘上手动按"A",但使用我的程序不会导致任何动作).
那么,我能做些什么来使程序中的"A"与手动按下的"A"更相同(所以第二个程序不会识别它是从程序中调用的)?
我没有第二个程序的源代码,也不知道它是如何识别"A"没有手动按下的.
我确定我想对我的代码作出反应的窗口是前台,接收并阻止我的密钥(因此它可以决定该事件不是来自用户而是来自程序).
我正在使用以下标准 GenerateKey 代码:
void GenerateKey ( int vk , BOOL bExtended)
{
KEYBDINPUT kb={0};
INPUT Input={0};
// generate down
if ( bExtended )
kb.dwFlags = KEYEVENTF_EXTENDEDKEY;
kb.wVk = vk;
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
::SendInput(1,&Input,sizeof(Input));
// generate up
::ZeroMemory(&kb,sizeof(KEYBDINPUT));
::ZeroMemory(&Input,sizeof(INPUT));
kb.dwFlags = KEYEVENTF_KEYUP;
if ( bExtended )
kb.dwFlags |= KEYEVENTF_EXTENDEDKEY;
kb.wVk = vk;
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
::SendInput(1,&Input,sizeof(Input));
}
Run Code Online (Sandbox Code Playgroud)
我调用这个函数来模拟箭头键(上、下、左、右)。但是,这适用于普通的资源管理器窗口和小型 Flash 游戏。但是,当我在像极品飞车或 Roadrash 这样的游戏中尝试它时,它不起作用.. 这种行为有什么可能的原因吗?
我想模拟外部程序的键盘单击。我尝试了SendMessage,PostMessage,SendKeys,但它们没有将键发送到一个特定程序。因此,我想尝试使用SendInput,并为SendInput下载了一个很好的包装器-http : //inputsimulator.codeplex.com/
我已经将程序集添加到我的项目中,但是我仍无法开始使用任何功能...
我该怎么办?我应该添加什么“使用”?
我在Windows API中需要类似SendInput的东西.
我看到这个方法,我不知道无论如何都要将unicode字符转换为虚拟Key代码.
CGEventRef CGEventCreateKeyboardEvent (
CGEventSourceRef source,
CGKeyCode virtualKey,
bool keyDown
);
Run Code Online (Sandbox Code Playgroud) 我有一段代码,它使用 SendInput 发送按键,但当我想长时间按住某个键时它不起作用(例如,长时间按住“a”会在记事本中返回“aaaaaaaaa”)。
现在我已经查遍了谷歌,我能看到解决这个问题的唯一方法是如果我想要长时间保留,则继续发送输入。我不想这样做,因为这只会模拟“a”被一遍又一遍地按下。
keyboard.wVk = 0;
keyboard.wScan = MapVirtualKey(key, 0);
keyboard.dwFlags = KEYEVENTF_SCANCODE;
if (index_vector_no)
pressed[index_vector_no] = true;
keyboard.dwExtraInfo = 0;
input.type = INPUT_KEYBOARD;
input.ki = keyboard;
SendInput(1, &input, sizeof (input));
Run Code Online (Sandbox Code Playgroud)
所以我想知道以下问题的一些答案:
A)我是否正确地认为使用 SendInput 没有办法解决这个问题,为什么它不能长时间保持?
B) 成功发送按键按下和按键抬起信号的替代方法是什么?最好将密钥发送到窗口,而不仅仅是发送到特定的应用程序。
C) 是否有一个好的轻量级 C++ 库可以用来处理全局键盘和鼠标模拟?
提前致谢!=)
编辑:看看这篇文章以了解我的问题的更多详细信息:http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_20833788.html
我需要一些关于DirectInput的帮助,我会告诉我想要做什么.当我只按一个键时,我想让我的程序向游戏发送键组合.例子:我将按"r",它将按"1","3","2","4"键.我从这里找到了一些代码.但他们并没有完全奏效.
public static void Send_Key_Hold(short Keycode)
{
INPUT[] InputData = new INPUT[1];
InputData[0].type = 1;
InputData[0].ki.wScan = Keycode;
InputData[0].ki.dwFlags = (int)(KEYEVENTF_SCANCODE);
SendInput(1, InputData, Marshal.SizeOf(InputData[0]));
}
public static void Send_Key_Release(short Keycode)
{
INPUT[] InputData = new INPUT[1];
InputData[0].type = 1;
InputData[0].ki.wScan = Keycode;
InputData[0].ki.dwFlags = (int)(KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE);
SendInput(1, InputData, Marshal.SizeOf(InputData[0]));
}
Run Code Online (Sandbox Code Playgroud)
这是我的代码和我的问题:当我使用Send_Key_Hold时,它只按下游戏中的一个键并且没有按下其他组合键,因为我认为第一个键是持久的.当我一起使用Send_Key_Hold和Send_Key_Release时,它不会按下游戏上的任何按钮.但在桌面上(我的意思是任何其他应用程序而不是游戏)它按下键.
我有一个使用全系统热键程序Ctrl+ Shift+ a key of the user's choice通过发送到剪贴板中的文本粘贴Ctrl+ V使用SendInput所使用组合在这里。这在大多数程序中都可以正常工作。但是在Outlook的新电子邮件的“收件人”字段中,我尝试使用的每个键最终都会弹出“将项目移到文件夹” Outlook对话框,该对话框应该是Ctrl+ Shift+ V组合键。在“身体”字段中没有任何反应。任何想法在这里发生了什么?请参见下面的代码重现:
procedure TForm1.FormCreate(Sender: TObject);
begin
If not RegisterHotkey( Handle, 1, MOD_SHIFT or MOD_CONTROL, Ord('P') ) Then
ShowMessage('Error');
end;
Procedure TForm1.WMHotkey( Var msg: TWMHotkey );
var
KeyInputs: array of TInput;
procedure KeybdInput(VKey: Byte; Flags: DWORD);
begin
SetLength(KeyInputs, Length(KeyInputs)+1);
KeyInputs[high(KeyInputs)].Itype := INPUT_KEYBOARD;
with KeyInputs[high(KeyInputs)].ki do
begin
wVk := VKey;
wScan := MapVirtualKey(wVk, 0);
dwFlags := Flags;
end;
end; …Run Code Online (Sandbox Code Playgroud) MSDN声明keybd_event已被SendInput取代.在重写期间,我切换到使用SendInput ... 除了尝试发送Alt-key组合时,这很好.在Win7 64位系统上(尚未在其他地方尝试过),在目标应用程序中显示击键之前,发送Alt键会导致长时间延迟.
有什么想法吗?或者我做错了什么?现在,我已经回到了keybd_event - 下面的第二个版本.
//Keyboard input from this version appears only after a ~4-5 second
//time lag...
procedure SendAltM;
var
KeyInputs: array of TInput;
KeyInputCount: Integer;
//--------------------------------------------
procedure KeybdInput(VKey: Byte; Flags: DWORD);
begin
Inc(KeyInputCount);
SetLength(KeyInputs, KeyInputCount);
KeyInputs[KeyInputCount - 1].Itype := INPUT_KEYBOARD;
with KeyInputs[KeyInputCount - 1].ki do
begin
wVk := VKey;
wScan := MapVirtualKey(wVk, 0);
dwFlags := KEYEVENTF_EXTENDEDKEY;
dwFlags := Flags or dwFlags;
time := 0;
dwExtraInfo := 0;
end;
end;
begin
KeybdInput(VK_MENU, 0); // Alt
KeybdInput(Ord('M'), …Run Code Online (Sandbox Code Playgroud)