2011-10-11 63 views
4

我有一個彈出對話框作爲錯誤條件的結果。我希望對話框至少保持打開30秒,並在收到最後一次用戶輸入(鼠標或鍵盤)30秒後關閉。以編程方式模擬用戶輸入的簡單方法是什麼?

我可以通過檢查GetLastInputInfo返回的值來實現此功能,並在超過30秒前關閉對話框,但如果用戶在30秒內沒有進入鼠標或鍵盤時彈出對話框, GetLastInputInfo測試立即通過,對話框立即再次關閉。我可以用另一個計時器來做到這一點,但我認爲在對話框打開之前模擬鼠標移動一點,或者發出一個(無害的)按鍵就簡單多了。它也可能具有將系統踢出屏幕保護程序的優勢。

什麼是最簡單的一行Delphi代碼片段來實現這一點?

+1

我建議你應該stic k簡單。使用計時器,顯示倒計時,關閉對話框。不要亂用鼠標 - 我有一個系統,顯示從上午9點到下午5點的顯示,並且屏幕在數小時後自動關閉。如果你「晃動」鼠標,你會擊敗我的工具。你爲什麼干涉其他系統來完成這麼簡單的任務? (只是我的想法 - 隨時拒絕!) – mj2008

回答

6

最簡單的使用功能keybd_event(一行代碼)

keybd_event(Ord('A'), 0, 0, 0); 

您也可以使用SendInput功能,但需要多行:)

Var 
    pInputs : TInput; 
begin 
    pInputs.Itype := INPUT_KEYBOARD; 
    pInputs.ki.wVk := Ord('A'); 
    pInputs.ki.dwFlags := KEYEVENTF_KEYUP; 
    SendInput(1, pInputs, SizeOf(pInputs)); 
end; 
+0

完美。謝謝。 – rossmcm

0

輸入多字節字符與keybd_event:

procedure InsertText(text:string); 
var i:integer; 
    j:integer; 
    ch:byte; 
    str:string; 
begin 
    i:=1; 
    while i<=Length(text) do 
    begin 
    ch:=byte(text[i]); 
    if Windows.IsDBCSLeadByte(ch) then 
     begin 
     Inc(i); 
     str:=inttostr(MakeWord(byte(text[i]), ch)); 
     keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0); 
     j:=1; 
     while j<=Length(str) do 
     begin 
       keybd_event(96+strtoint(str[j]), MapVirtualKey(96+strtoint(str[j]), 0), 0, 0); 
       keybd_event(96+strtoint(str[j]), MapVirtualKey(96+strtoint(str[j]), 0), 2, 0); 
       j:=j+1; 
     end; 
     keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0); 
     end 
    else begin 
      keybd_event(VkKeyScan(text[i]),0,0,0); 
      keybd_event(VkKeyScan(text[i]),0,2,0); 
     end; 
    Inc(i); 
    end; 
end; 
+0

範圍檢查錯誤。 –

相關問題