2010-05-08 77 views
3

我想使用虛擬鍵盤組裝在這裏找到http://www.codeproject.com/KB/miscctrl/touchscreenkeyboard.aspx像在Windows中的屏幕鍵盤(OSK.exe)。有人可以告訴我如何使用它,以便它始終保持在最佳狀態,但用戶可以在鍵盤輸入上選擇其他窗口作爲鍵盤輸入,就像Windows中的「屏幕鍵盤」一樣,具體我不知道如何選擇最後選擇的窗口(不能僅使用GetForegroundWindow或GetFocus,因爲當用戶點擊虛擬鍵盤時,它會變得焦點,我得到鍵盤窗口本身的句柄)? 這對我來說非常緊迫,所以任何建議將不勝感激。C# - 發送鍵盤事件到(上一個)選擇的窗口

在此先感謝。

回答

4

你需要做的是使你的窗口,它不能被激活。這很容易通過重寫CreataParams來完成。然後,您可以使用SendKey.Send將按鍵發送到當前活動窗口,您的窗口永遠不會變爲活動狀態。

下面是一個簡單的例子,你會發現

public partial class Form1 : Form 
    { 
    const int WS_EX_NOACTIVATE = 0x08000000; 

    public Form1() 
    {  
     InitializeComponent();  
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
     CreateParams param = base.CreateParams; 
     param.ExStyle |= WS_EX_NOACTIVATE; 
     return param; 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     SendKeys.Send("A"); 
    } 
    } 

一個奇怪的是,因爲你的窗口永遠不會被激活,當你拖動窗口它不反應,而斯特朗。基本上拖動的作品,它只是不會在拖動過程中給視覺反饋。你可以通過覆蓋WndProc和處理WM_NCLBUTTONDOWN和WM_MOUSEMOVE消息來解決這個問題。

+0

非常感謝Chris!你說得對,這是我需要的代碼。在此之前,我在我所謂的「設計」中發現我錯過了非常重要的事情,我不需要僅僅是活動的窗口句柄,而是它的控制也是我關注的焦點,我記不得在網上找到如何做到這一點。這解決了完整的問題。在應用程序代碼後,您在第一個程序窗口中寫入的代碼不會像應該那樣保持頂層,但隨後刪除了現在對「SetFocus()」和「SetForegroundWindow()」的不必要的調用,並且它像魅力一樣工作。 是的,我注意到拖動時奇怪的窗口行爲:) 再次感謝。乾杯! – Maks 2010-05-09 04:38:45

+0

@Maks,我很高興幫助。要將窗口置於頂部,可以將TopMost屬性設置爲true。 – 2010-05-09 16:02:48

+0

@Maks:如果你喜歡這個答案,你可以點擊旁邊的複選框將其標記爲正確的答案。 :) – 2010-05-09 17:07:12

0

擊鍵發送到另一個應用程序在C#
http://www.codeproject.com/KB/cs/SendKeys.aspx

然後,所有你需要的是一種方法來選擇虛擬鍵盤的另一個窗口。要做到這一點,你只需要目標窗口的標題。

+0

感謝您的鏈接羅伯特,但我不知道用戶可以選擇的窗口的名稱。儘管鏈接不錯,但我發現了一些關於實際代碼的說明,但不是解決方案。 – Maks 2010-05-09 04:29:02

1

當您獲得輸入焦點時,窗口消息WM_SETFOCUS被髮送到您的窗口,並且.net將其轉換爲您收到的窗體事件。 windows消息包含前一個輸入焦點窗口的句柄。

如果此信息在您的C#Form.Activated或Control.Enter/Control.GotFocus事件中不可用,那麼您可能需要重寫Form.WndProc以捕獲原始Windows消息並檢索句柄 - 您可以然後用於激活或發送WM_KEYDOWN消息到以前的輸入焦點窗口。

+0

謝謝你努力回覆Jason,但是儘管我現在在使用Win32 API之前做了很多工作,但我選擇了更簡單的方法。我註冊了每秒觸發的計時器,它會調用獲取活動窗口句柄的方法並將其保存。可能不太乾淨,但現在我不能花更多時間重新訪問原始API。 – Maks 2010-05-09 04:27:21

+0

沒問題。這不是「優雅」,但它會工作,這往往是最重要的:-) – 2010-05-09 18:14:44