SendInput() 按 6 不对
SendInput() press 6 and not right
我正在尝试使用 SendInput 发送击键。例如,如果我尝试发送键 A,该代码有效,但如果我尝试向右箭头键,它会键入 6。不知道为什么。
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName,
string lpWindowName);
[DllImport("user32.dll")]
internal static extern uint SendInput(
uint nInputs,
[MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs,
int cbSize);
private void button1_Click(object sender, EventArgs e)
{
SetForegroundWindow(FindWindow("Notepad", "Untitled - Notepad"));
SendInputWithAPI();
}
void SendInputWithAPI()
{
INPUT[] Inputs = new INPUT[1];
INPUT Input = new INPUT();
Input.type = 1; // 1 = Keyboard Input
Input.U.ki.wScan = ScanCodeShort.RIGHT;
Input.U.ki.dwFlags = KEYEVENTF.SCANCODE;
Inputs[0] = Input;
SendInput(1, Inputs, INPUT.Size);
}
顺便说一句 ScanCodeShort.RIGHT returns 77.
谢谢
扫码代表物理按键。在不同的键盘布局和状态下,同一个物理键可能有不同的含义,但它的扫描码总是相同的。 IE。物理 "numpad 6" 键可能表示向右箭头或数字 6,具体取决于 Num Lock 的状态。
如果您的目标是 "press" 逻辑 "right arrow",而不是物理键盘上的某个物理键,无论其当前含义如何,您应该改用虚拟键代码。它们代表物理键的当前含义。假设您的 INPUT
structure declaration is correct:
private const int INPUT_KEYBOARD = 1;
private const int VK_RIGHT = 0x27;
Input.type = INPUT_KEYBOARD;
Input.U.ki.wVk = VK_RIGHT;
Inputs[0] = Input;
我正在尝试使用 SendInput 发送击键。例如,如果我尝试发送键 A,该代码有效,但如果我尝试向右箭头键,它会键入 6。不知道为什么。
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName,
string lpWindowName);
[DllImport("user32.dll")]
internal static extern uint SendInput(
uint nInputs,
[MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs,
int cbSize);
private void button1_Click(object sender, EventArgs e)
{
SetForegroundWindow(FindWindow("Notepad", "Untitled - Notepad"));
SendInputWithAPI();
}
void SendInputWithAPI()
{
INPUT[] Inputs = new INPUT[1];
INPUT Input = new INPUT();
Input.type = 1; // 1 = Keyboard Input
Input.U.ki.wScan = ScanCodeShort.RIGHT;
Input.U.ki.dwFlags = KEYEVENTF.SCANCODE;
Inputs[0] = Input;
SendInput(1, Inputs, INPUT.Size);
}
顺便说一句 ScanCodeShort.RIGHT returns 77. 谢谢
扫码代表物理按键。在不同的键盘布局和状态下,同一个物理键可能有不同的含义,但它的扫描码总是相同的。 IE。物理 "numpad 6" 键可能表示向右箭头或数字 6,具体取决于 Num Lock 的状态。
如果您的目标是 "press" 逻辑 "right arrow",而不是物理键盘上的某个物理键,无论其当前含义如何,您应该改用虚拟键代码。它们代表物理键的当前含义。假设您的 INPUT
structure declaration is correct:
private const int INPUT_KEYBOARD = 1;
private const int VK_RIGHT = 0x27;
Input.type = INPUT_KEYBOARD;
Input.U.ki.wVk = VK_RIGHT;
Inputs[0] = Input;