2014-02-27 60 views
2

我想打一個程序來模擬文本輸入,如果用戶按下按鍵「D1 - D0」,如果用戶按下功能鍵模擬一些號碼..防止KeyDown事件確定的SendKeys

這裏是我試過的代碼。

if (e.KeyData == Keys.D1){ 
    SendKeys.Send("simulate this text entry"); 
} 
if (e.KeyData == Keys.F12){ 
    SendKeys.Send("123"); 
} 

但問題是當我按下F12按鈕,KeyDown事件識別第一個「1」作爲「D1」鍵,併發送這兩個「123」和「模擬這種文本輸入」

我怎樣才能防止這個問題?

+0

@ Okuma.Scott號我不同時按下這些鍵。 e.KeyData識別用戶是否按下了D1鍵(僅D1。不是D1,有Shift或任何其他鍵,如ctrl或alt)。你的意思是我的事件的結構?我沒有明白。 – Astro

+0

向自己發送擊鍵毫無意義,您可以簡單地更新任何控件是預期目標的Text屬性。 –

回答

1

終於解決了問題.. :)下面是代碼..在這項任務中使用「SendKeys.Flush()」 ......

private bool IgnoreKeys = false; 

    private void Form1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if ((e.KeyData == Keys.D1) && (!IgnoreKeys)) 
     { 

      SendKeys.Send("Simulate this text" + "{ENTER}"); 

     } 
     if (e.KeyData == Keys.F12) 
     { 
      IgnoreKeys = true; 

      SendKeys.Send("123"); 
      SendKeys.Flush(); 

      IgnoreKeys = false; 
     } 

這可以防止KeyDown事件考慮「1」在文本「123」爲重點,「D1」

理念是Idle_Mind的:)謝謝。

1

當您發送密鑰時,您必須設置一個標誌,以便您知道忽略要發送的字符。此外,您需要知道何時再打開該標誌。這可以通過將變量設置爲發送值的長度來完成,然後使用每個檢測到的密鑰遞增計數器。這並非萬無一失,因爲用戶可以快速連續敲擊按鍵(或按住按鍵),並且您不知道按鍵是用戶交互還是仿真結果。

這裏的基本思想是:

public partial class Form1 : Form 
{ 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private bool IgnoreKeys = false; 
    private int target = 0; 
    private int counter = 0; 

    private void Form1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (!IgnoreKeys) 
     { 
      if (e.KeyData == Keys.D1) 
      { 
       Send("simulate this text entry"); 
      } 
      if (e.KeyData == Keys.F12) 
      { 
       Send("123"); 
      } 
     } 
     else 
     { 
      counter++; 
      if (counter == target) 
      { 
       IgnoreKeys = false; 
      } 
     } 
    } 

    private void Send(string entry) 
    { 
     IgnoreKeys = true; 
     counter = 0; 
     target = entry.Length; 
     SendKeys.Send(entry); 
    } 

} 
1

的問題是,使用SendKeys.Send(...)沒有辦法你的程序可以告訴你的發送鍵和用戶的鍵盤輸入之間的差異。

當您發送按鍵「123」時,它與用戶按下1,2和3按鍵相同。 由於您正在偵聽1鍵,該事件觸發並捕獲由sendkeys發送的'1'。

如果可能,請嘗試將文本附加到您嘗試「模擬textentry」並避免使用sendkeys的內容。 否則,考慮讓一些熱鍵ALT/CTRL組合像這樣:

 if (e.Control && e.KeyCode == Keys.D1) 
     { 
      SendKeys.Send("simulate this text entry"); 
      e.Handled = true;   
     } 

當你按下F12這將阻止觸發此事件,併發送「123」(因爲Ctrl爲未按下)。

+0

抱歉:(無法追加文本,我會將文本輸入到遊戲聊天中,遊戲甚至不支持複製粘貼命令,SendKeys是唯一的方法..密鑰必須是發送消息的單個密鑰順便說一句,我認爲@Idle_Mind的答案可以幫助我解決問題..仍然在想.. ..謝謝你的迴應。 – Astro