0
我在使用SendInput函数产生任何输出方面存在问题。所有的结构被定义为如下(我已经离开鼠标和硬件的了):SendInput()不会产生任何可见的输出
[StructLayout(LayoutKind.Explicit)]
public struct INPUT
{
[FieldOffset(0)]
public int type;
[FieldOffset(8)]
public MOUSEINPUT mi;
[FieldOffset(8)]
public KEYBDINPUT ki;
[FieldOffset(8)]
public HARDWAREINPUT hi;
}
[StructLayout(LayoutKind.Sequential)]
public struct KEYBDINPUT
{
public ushort wVk;
public ushort wScan;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}
我发在下面的方向键:
SetForegroundWindow(hProc); // using user32.dll switch to desired process
// send keydown
INPUT iKeyDown = new INPUT();
KEYBDINPUT sKeysDown = new KEYBDINPUT();
iKeyDown.type = KEYBD_INPUT_TYPE;
iKeyDown.ki = sKeysDown;
sKeysDown.wVk = 0;
sKeysDown.wScan = (ushort)0x1E;
sKeysDown.dwFlags = 0x0008 ;
sKeysDown.time = 0;
sKeysDown.dwExtraInfo = GetMessageExtraInfo();
我在完全相同的方式发送键Up事件,除了dwFlags中属性:
sKeysUp.dwFlags = 0x0008 | 0x0002;
最后,
INPUT[] aInputs = new INPUT[] { iKeyDown, iKeyUp };
uint result = SendInput(2, aInputs, Marshal.SizeOf(iKeyDown)); // when dll importing, SetLastError = true
int error = Marshal.GetLastWin32Error();
Debug.WriteLine(result.ToString() + " " + error.ToString());
这样做的结果是,没有可见的输出,结果变量总是等于2(成功输入的数量),并且GetLastWin32Error()返回0(根据错误代码,它是成功的)。我在这里错过了什么?干杯!
您的SetForegroundWindow()调用是borken。 *永远不会忽略winapi函数的返回值。它需要一个窗口句柄,而不是一个进程句柄。 –
@HansPassant这是如果一个不好的调用变量,我猜。我使用FindWindow(null,WINDOW_HEADER_NAME)得到它,它是一个窗口句柄,而不是别的。它按预期工作,返回True。我应该重新命名该变量。 – AlexanderM
@LambdaλMouseInput,KeyboardInput,HardwareInput是一个联合。看看这里 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms646270%28v=vs.85%29.aspx – AlexanderM