2015-10-18 28 views
0

我試圖將this example轉換爲Rust 1.3,並且winapi-rs 0.2.4。如何使用winapi的SendInput發送密鑰?

我:

error: mismatched types: 
expected `winapi::winuser::MOUSEINPUT`, 
    found `winapi::winuser::KEYBDINPUT` 
(expected struct `winapi::winuser::MOUSEINPUT`, 
    found struct `winapi::winuser::KEYBDINPUT`) [E0308] 

唧唧我發送擊鍵到活動窗口:

fn send_key_event(vk: u16, flags: u32) { 
    let mut input = winapi::INPUT { 
     type_: winapi::INPUT_KEYBOARD, 
     union_: winapi::KEYBDINPUT { 
      wVk: vk, 
      wScan: 0, 
      dwFlags: flags, 
      time: 0, 
      dwExtraInfo: 0, 
     } 
    }; 
    unsafe { 
     user32::SendInput(1, &mut input, mem::size_of::<winapi::INPUT>() as i32); 
    } 
} 

不與編譯?

+0

自動化UI的正確方法是[UI自動化](https://msdn.microsoft.com/en-us/library/windows/desktop/ee684009.aspx)。你正在嘗試的是一個脆弱的黑客。例如,如果指定的接收器不是前景窗口,它將失敗。另外,活動窗口是沒有關聯的。輸入進入前臺窗口。前景窗口恰好是前景線程的活動窗口。 – IInspectable

+0

@IInspectable謝謝你的鏈接!你有沒有生鏽的例子? – Jacob

回答

2

您使用的winapi-rs版本中winapi::INPUT的定義不正確。 It appears to have been fixed today(或昨天,取決於你在哪裏)。

+0

所以當下一個版本出來時,什麼代碼可以使這個工作起作用? – Jacob

+1

最簡單的方法是對u成員進行零初始化,然後使用ki_mut方法獲得對'winapi :: KEYBDINPUT'的可變引用,然後賦值給它:'let mut input = winapi :: INPUT {type_:winapi :: INPUT_KEYBOARD,u:Default :: default()}; * input.ki_mut()= winapi :: KEYBDINPUT {...};' –