2010-02-05 60 views
4

我與SendKeys.Send發生奇怪的問題SendKeys的雙鍵鍵入

基本上會發生這樣的事情。我在google.com上關注了Internet Explorer,並且我調用了SendKeys.Send(「TestSample \ n」);它有時會以不可預知的方式發送一些密鑰兩次(如TeestSample或TestSSSample)。它發生在大約20%的時間。

此外,當我在字符串SendKeys.Send(「Test Sample \ n」)中包含空格時,除了一點之外,它同樣是不可預測的。每次我這樣做,它都會輸入測試樣本,進行谷歌搜索,但也滾動結果頁面,因爲我輸入文本後按空格鍵。

有沒有其他人看到過這種行爲。它似乎沒有以記事本的重點執行這種方式。

(這裏要舉例說明一些示例代碼,將它放入一個窗體中的秒鐘計時器中,DllImport定義位於類的頂部附近。)此應用程序在Google.com上大約20%的時間內失敗的Internet Explorer(8.0)

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); 
    [DllImport("user32.dll")] 
    public static extern IntPtr GetForegroundWindow(); 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     IntPtr foreground = GetForegroundWindow(); 
     if (foreground != _currentForeground) 
     { 
      _currentForeground = foreground; 
      var titleBuilder = new StringBuilder(200); 
      GetWindowText(foreground, titleBuilder, 200); 
      string title = titleBuilder.ToString(); 
      Debug.WriteLine("Title of " + title); 
      if (title == "Google - Windows Internet Explorer") 
      { 
       Debug.WriteLine("Sending keys"); 
       SendKeys.Send("Test Sample\n"); 
      } 
      if (title == "Untitled - Notepad") 
       SendKeys.Send("Test notpad sample\n"); 
      Thread.Sleep(2000); 
     } 
    } 
    private IntPtr _currentForeground = IntPtr.Zero; 
+0

只是一個觀察,但一般而言,您應該只使用的SendKeys作爲一個絕對的最後一招,如果你不能通過某種 – 2010-02-05 21:00:13

+1

的自動化庫實現你的目標你有沒有找到解決這個問題呢?我還有一個問題,SendKeys有時會發送兩次,但很難重現。 – 2011-12-21 18:44:03

+1

此問題可能是http://stackoverflow.com/questions/2346281/vb-net-sendkeys-letters-duplicate – 2014-03-17 00:34:17

回答

-1

您可以得到更好的服務找到的hWnd你想在新的數據寫入,然後調用SetWindowTextW

[DllImport("user32.dll")] 
public static extern int SetWindowTextW(HandleRef hWnd, [MarshalAs(UnmanagedType.LPWStr)] string text); 

之後,發現該按鈕的hWnd和發送WM_LBUTTONDOWN和WM_LBUTTONUP使用

[DllImport("user32.dll")] 
public static extern int PostMessage(HandleRef hWnd, WM msg, int wParam, int lParam); 

    WM_LBUTTONDOWN = 0x0201 
    WM_LBUTTONUP = 0x0202