标签: sendinput

键盘的SendInput() - 仅小写

我有以下代码:

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'.如何强制它生成大写?

谢谢.

keyboard winapi sendinput

6
推荐指数
1
解决办法
7585
查看次数

以编程方式按Win + X,Alt-Tab

我正在尝试在Windows 8上模拟Win + X的按键事件,这应该会弹出一个小菜单,但是我无法通过使用SendInput来实现这一点.对于任何其他键组合(例如Win + R,Win + E,Win + D),它可以工作但不适用于Win + X. 我注意到Synergy +有同样的问题,但Windows屏幕键盘没有.我还查看了屏幕键盘使用的SendInput参数,但如果我在我的应用程序中使用完全相同的参数,我仍然没有得到菜单.

所以我的问题是,如何使这个工作?或者是否有另一种显示此菜单的方法?

c++ keyboard sendinput windows-8

6
推荐指数
1
解决办法
1672
查看次数

SendInput()不等于在C++中用键盘手动按键?

我想编写一个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"没有手动按下的.

我确定我想对我的代码作出反应的窗口是前台,接收并阻止我的密钥(因此它可以决定该事件不是来自用户而是来自程序).

c++ keyboard hook winapi sendinput

6
推荐指数
2
解决办法
2万
查看次数

SendInput 不适用于游戏

我正在使用以下标准 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 这样的游戏中尝试它时,它不起作用.. 这种行为有什么可能的原因吗?

keystroke sendinput

5
推荐指数
1
解决办法
2804
查看次数

C#InputSimulator包装器-如何使用?

我想模拟外部程序的键盘单击。我尝试了SendMessage,PostMessage,SendKeys,但它们没有将键发送到一个特定程序。因此,我想尝试使用SendInput,并为SendInput下载了一个很好的包装器-http : //inputsimulator.codeplex.com/

我已经将程序集添加到我的项目中,但是我仍无法开始使用任何功能...

我该怎么办?我应该添加什么“使用”?

c# simulator wrapper sendinput

5
推荐指数
1
解决办法
1万
查看次数

如何将unicode字符发送到活动应用程序?

我在Windows API中需要类似SendInput的东西.

我看到这个方法,我不知道无论如何都要将unicode字符转换为虚拟Key代码.

CGEventRef CGEventCreateKeyboardEvent (
   CGEventSourceRef source,
   CGKeyCode virtualKey,
   bool keyDown
);
Run Code Online (Sandbox Code Playgroud)

macos sendinput

5
推荐指数
1
解决办法
694
查看次数

SendInput 不适用于按住键 C++

我有一段代码,它使用 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

c++ simulator keydown sendinput

5
推荐指数
1
解决办法
4125
查看次数

C#DirectInput SendInput不影响游戏

我需要一些关于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时,它不会按下游戏上的任何按钮.但在桌面上(我的意思是任何其他应用程序而不是游戏)它按下键.

c# directinput sendinput

5
推荐指数
1
解决办法
4669
查看次数

为什么SendInput Ctrl + V在Outlook中不起作用?

我有一个使用全系统热键程序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)

delphi outlook hotkeys sendinput delphi-xe

5
推荐指数
1
解决办法
786
查看次数

SendInput与keybd_event

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)

delphi keyboard-events sendinput

4
推荐指数
1
解决办法
1万
查看次数