У меня проблемы с получением 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();
Я отправляю событие Key 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 (согласно кодам ошибок, это успех). Есть ли что-то, что мне здесь не хватает? Ваше здоровье!