2013-07-29 23 views
2

在我的應用程序中,我構建了一個屏幕鍵盤,其中各個鍵將是WPF按鈕。我想發送相應的虛擬鍵碼(對於每個按鈕)到操作系統。WPF:將KeyCode發送到活動應用程序

例如我的應用程序中有一個按鈕,內容爲'A'。如果我點擊它,它應該將虛擬鍵碼'A'發送到操作系統,'A'應該被添加到活動應用程序的焦點文本框中,就像硬件鍵盤一樣。

我想有任何我可以用來做的類和方法。我試着用SendKeys.SendWait(「{A}」);但它在WPF中不起作用。

+0

SendKeys.SendWait應該工作,你如何改變你的重點,你的應用程序試圖發送輸入,您的WPF鍵盤將是您點擊某個鍵時的活動應用程序。 –

回答

4

說明我的意見SendKeys.SendWait將與WPF一起使用,而SendKeys.Send不會。你的問題之一是,如果你試圖將A發送給另一個應用程序,那麼你的格式不正確,大括號表示這是一個特殊的關鍵字,它對於字母A不存在。您需要改用SendKeys.SendWait("A")。另一個問題是,如果您將Wpf應用程序用作鍵盤,則它是您單擊該按鈕時的前臺應用程序。您需要深入研究WinApi和Pinvoke的幾項功能,即FindWindowSetForegroundWindow

從上SendKeys.Send鏈接:

因爲沒有激活另一個應用程序管理方法,你可以使用目前的應用程序中的這個類或使用本機Windows方法,如FindWindow函數和SetForegroundWindow,強調關注其他應用程序。

樣品展示如何切換到另一個應用程序(我使用記事本作爲一個例子

public partial class MainWindow : Window 
{ 
    [DllImport("user32.dll", EntryPoint="FindWindow", SetLastError = true)] 
    static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName); 
    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool SetForegroundWindow(IntPtr hWnd); 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     SetForegroundWindow(FindWindowByCaption(IntPtr.Zero, "Untitled - Notepad")); 
     SendKeys.SendWait("A"); 
    } 
} 
+0

我同意重新定位/聚焦窗口 - 但爲什麼與進行同步調用而不是異步調用的區別?另外,我不確定它是如何通過股票窗口的屏幕鍵盤來實現的,但它似乎避免了焦點而仍然是最重要的。我不確定是否在每個按鍵之後將焦點切換回來,或者有一些有趣的窗口標誌? – Basic

+0

@Basic不幸的是,發送方法在Wpf中不受支持,您可以在較低級別使用其他方法,例如WinApi的「PostMessage」和「SendMessage」 –

+0

@Mark Hall - 感謝這篇文章。我還有一個查詢。如果我想將鍵盤嵌入到應用程序中並使用鍵盤將鍵碼發送到該情況,我應該採取什麼方法。 現在,如果我嘗試在同一個應用程序的文本框中使用鍵盤,那麼在單擊按鈕後,文本框將失去焦點並且不會反映出來。請幫助。 – user2185985

相關問題