Tag: sendinput

VkKeyScan返回相同的代码,没有用于重音和非重音字母的修饰符

背景: 我正在使用非托管函数SendInput( https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310 ( v= vs.85).aspx)模拟击键。 调用此函数有3种方法: 指定键盘扫描码 指定字符unicode 指定虚拟密钥代码 所有工作,但能够模拟CTRL + PI等快捷方式想要使用虚拟键码。 我目前手动将字符映射到虚拟键码,但这不是一个好方法,因为它对用户的OS键盘布局不敏感。 例如,在英语(英国)键盘上的“。” 字符可以映射到VirtualKeyCode.OEM_PERIOD,但如果操作系统键盘布局是法语,那么“。” 是VirtualKeyCode.OEM_PERIOD + SHIFT。 为了使我的代码更健壮,我想调用方法VkKeyScan( https://msdn.microsoft.com/en-us/library/windows/desktop/ms646329 ( v= vs.85).aspx)传入一个字符到获取虚拟键码(加上shift / ctrl / alt)。 从理论上讲,这种方法可以解决所有问题。 问题: 宣言: [DllImport(“user32.dll”, CharSet = CharSet.Unicode)] static extern short VkKeyScan(char ch); 用法: var vkKeyScanResult = PInvoke.VkKeyScan(character); var vk = vkKeyScanResult & 0xff; var shift = (vkKeyScanResult […]

如何使用SendInput发送斯堪的纳维亚字母

我正在尝试创建一个虚拟键盘,它使用SendInput方法模拟键盘,如下所示: public static void SendKeyDown(System.Windows.Forms.Keys key) { INPUT k = new INPUT(); k.type = (int)InputType.INPUT_KEYBOARD; k.ki.wVk = (short)key; k.ki.dwFlags = (int)KEYEVENTF.KEYDOWN; k.ki.dwExtraInfo = GetMessageExtraInfo(); SendInput(1, new INPUT[] { k }, Marshal.SizeOf(k)); } 但我无法从Keys -enumeration中找到斯堪的纳维亚字母Ä,Ö和Å。 如何使用SendInput方法发送这些字母?

模拟单击进入隐藏窗口

我有一个C#问题, 我能够模拟到当前窗口的单击,但是如果窗口被最小化或隐藏,我想这样做。 有任何想法吗?

使用SendInput自动化按键

当我尝试使用SendInput发送单键按键和组合按键时,我无法让程序按住键盘按钮直到命令被释放。 使用下面的代码,我可以通过首先按下shift来发送字符’a’和’A’ 。 但是,我不能永久地拿着’a’按钮。 public static void KeyDown() { SwitchWindow(Process.GetProcessesByName(“notepad”).FirstOrDefault().MainWindowHandle); INPUT[] inputs = new INPUT[1]; KEYBDINPUT kb = new KEYBDINPUT(); //Set up generic keyboard event inputs[0].type = INPUT_KEYBOARD; kb.wScan = 0; // hardware scan code for key kb.time = 0; kb.dwExtraInfo = IntPtr.Zero; kb.dwFlags = 0; // 0 for key press //Press shift kb.wVk = […]

使用SendInput发送超出U + FFFF的unicode字符

我正在编写类似于Windows 8中的屏幕键盘。使用Win32的SendInput发送我需要的大多数字符都没有问题。 问题在于新的Windows 8表情符号。 它们使用Segoe UI Symbol字体从U + 1F600开始。 在Windows 8屏幕键盘上使用Spy ++,我得到所有表情符号字形的以下输出。 000C064A P WM_KEYDOWN nVirtKey:VK_PACKET cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 000C064A P WM_CHAR chCharCode:’63’ (63) cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 000C064A P WM_KEYUP nVirtKey:VK_PACKET cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:1 fUp:1 000C064A P WM_KEYDOWN nVirtKey:VK_PACKET cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 000C064A P […]

在DirectInput应用程序中使用SendInput API模拟键盘

我正在尝试为自定义游戏控制器应用程序模拟键盘命令。 因为我需要在DirectInput环境中模拟命令,所以大多数常用方法都不起作用。 我知道使用一个钩子可以100%工作,但我正在努力找到一个更简单的实现。 我已经做了很多搜索,发现通过使用带有Scancodes而不是虚拟键的SendInput API应该可以工作,但它似乎表现得像键是“坚持”。 我已经发送了KEYDOWN和KEYUP事件,但是当我尝试在DirectInput环境中发送消息时,游戏就像按下键一样。 例如,如果我模拟“W”按键并将该键映射到第一人称射击游戏中以“向前移动”动作,一旦我在游戏中,下面的函数将使角色向前移动。 但是,只需发出一次命令,它就会无限期地移动角色。 这是我正在调用的SendInput函数的代码片段(在C#中): [DllImport(“user32.dll”)] static extern UInt32 SendInput(UInt32 nInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs, Int32 cbSize); public static void Test_KeyDown() { INPUT[] InputData = new INPUT[2]; Key ScanCode = Microsoft.DirectX.DirectInput.Key.W; InputData[0].type = 1; //INPUT_KEYBOARD InputData[0].wScan = (ushort)ScanCode; InputData[0].dwFlags = (uint)SendInputFlags.KEYEVENTF_SCANCODE; InputData[1].type = 1; //INPUT_KEYBOARD InputData[1].wScan = (ushort)ScanCode; InputData[1].dwFlags […]