2011-09-24 37 views
2

我正在寫一個C#WPF程序,它將文本消息發送到另一個程序的窗口。我有一個宏程序作爲我的鍵盤驅動程序(Logitech g15)的一部分,它已經這樣做了,儘管它不直接將鍵擊發送到進程,而是發送到當前聚焦的窗口。它運行良好,但我需要能夠從我的程序發送輸入。還有其他人使用這個過程,所以我的程序中輸入的文本消息需要足夠快,以便我的文本不會干擾他們的輸入。 問題是,當我嘗試用c#程序來做到這一點時,我得到了太多的延遲。宏程序(Logitech G-Series Profiler)立即發送命令。我嘗試了以下三條命令來發送消息進行處理。 (按順序列出的最慢到最快)發送快速textinput到另一個進程(窗口)

SetForegroundWindow(_hWnd); 
SendKeys.SendWait("{Enter}This is a keystroke input.{Enter}"); 

這大概是這個名字,但這個執行命令,所以慢慢地,我其實可以用我的眼睛跟隨文字,因爲它是由字母輸入字母。我已經使用「SendKeys.Send」的方法試過,但我得到一個錯誤說:「的SendKeys不能在此應用程序內運行,因爲該應用程序不處理Windows消息」

PostMessage((IntPtr)_hWnd, (uint)WMessages.WM_KEYUP, (int)key, (int)key); 

PostMessage的有點快,但仍然沒有對於我的程序來說足夠快。除了在進程讀取消息之前返回方法,這意味着兩個連續的PostMessage調用可能不會發送順序消息。

SendMessage(_hWnd, 0x100, (int) VKeys.VK_2, (int) VKeys.VK_2); 

這比PostMessage快,但幾乎沒有Logitech的宏程序那麼快。另外,接收程序奇怪地處理輸入,顯然不是以與從鍵盤「真正」輸入相同的方式處理輸入。

SetForegroundWindow(_hWnd); 

const string text = "This is a keystroke input."; 
IInputElement target = Keyboard.FocusedElement; 

IInputElement target = InputManager.Current.PrimaryKeyboardDevice.FocusedElement; 

var routedEvent = TextCompositionManager.TextInputEvent; 

target.RaiseEvent(new TextCompositionEventArgs(InputManager.Current.PrimaryKeyboardDevice, new TextComposition(InputManager.Current, target, text)) { RoutedEvent = routedEvent }); 

這是我試過的最後一件事。在文本發送到流程的過程中,它似乎是即時的。但是,我只能將這個發送給我自己的程序,因爲當我將另一個程序設置爲前景窗口時,Keyboard.FocusedElement返回null。 如果有人能告訴我如何獲得另一個窗口的IInputElement,我一定會想知道。或者,如果有人提出更好的方法來發送輸入,我會非常喜歡聽到它。

規格:Windows 7中,64位 Visual Studio 2010中,框架4

回答

1

首先,你故意使用WM_KEYDOWN (0x0100)代替WM_KEYUP (0x0101)SendMessage例子嗎?這隻會按下按鍵,而不會釋放它們,所以應用程序不會正確處理它們。

另一種值得嘗試的方法是發送WM_SETTEXT,假設控件正確解釋它(如編輯控件或組合框)。

最後一個選項是使用SendInput,它在非常低的水平上合成鍵盤和鼠標輸入,但與鍵盤的宏程序類似,這需要您激活正確的窗口並設置焦點,這可能會非常痛苦。

+0

謝謝。我搜索SendInput並發現這個:「http://inputsimulator.codeplex.com/」這真的有竅門。 – Krusager

相關問題