簡體   English   中英

SendInput()不會產生任何可見的輸出

[英]SendInput() does not produce any visible output

我在獲取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();

除了dwFlags屬性,我以完全相同的方式發送Key Up事件:

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(根據錯誤代碼,這是成功的)。 我在這里想念什么嗎? 干杯!

我已經回答了自己的問題-我輸入的結構不正確。 代替

INPUT iKeyDown = new INPUT();
KEYBDINPUT sKeysDown = new KEYBDINPUT();
iKeyDown.type = KEYBD_INPUT_TYPE;
iKeyDown.ki = sKeysDown;
sKeysDown.wVk = 0; // etc

我應該一直在做

INPUT iKeyDown = new INPUT();
iKeyDown.type = KEYBD_INPUT_TYPE;
iKeyDown.ki.wvK = 0; // etc

代替。 新的KEYBDINPUT()搞砸了。 我確實也按照GSerg的建議將Mouse / Keyboard / Hardware聯合放在了自己的單獨結構中。 現在它正在按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM