2014-07-22 83 views
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(根據錯誤代碼,它是成功的)。我在這裏錯過了什麼?乾杯!

+0

您的SetForegroundWindow()調用是borken。 *永遠不會忽略winapi函數的返回值。它需要一個窗口句柄,而不是一個進程句柄。 –

+0

@HansPassant這是如果一個不好的調用變量,我猜。我使用FindWindow(null,WINDOW_HEADER_NAME)得到它,它是一個窗口句柄,而不是別的。它按預期工作,返回True。我應該重新命名該變量。 – AlexanderM

+0

@LambdaλMouseInput,KeyboardInput,HardwareInput是一個聯合。看看這裏 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms646270%28v=vs.85%29.aspx – AlexanderM

回答

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建議的一樣,我也將鼠標/鍵盤/硬件聯合放置在它自己的獨立結構中。現在它按預期工作。

相關問題