2012-02-14 242 views
1

可能重複:
Create an On-screen KeyboardGET描述符

我試圖寫一個虛擬鍵盤。你能告訴我如何獲得關注窗口的描述符hWnd? (它可以用於Word,Excel,Skype等)

我使用的是findWindow(),但爲此我必須知道窗口的名稱。

IntPtr hWnd = FindWindow("Notepad", null); 

     if (!hWnd.Equals(IntPtr.Zero)) 
     { 
      MessageBox.Show("Tagil"); 
      IntPtr edithWnd = FindWindowEx(hWnd, IntPtr.Zero, "Edit", null); 
      if (!edithWnd.Equals(IntPtr.Zero)) 
       SendMessage(hWnd, WM_SETTEXT, IntPtr.Zero, new StringBuilder("Hello World")); 
     } 
+0

你想獲得前景窗口的名稱/句柄..? – MethodMan 2012-02-14 19:00:46

+0

是的,但我認爲不是前景,因爲前景是我的Apllictation。我想獲取名稱或交付其他窗口 – Abbath 2012-02-15 08:35:17

+0

最好使用Windows [Accessability API](http://msdn.microsoft.com/en-us/library/windows/desktop/gg712214.aspx)提供額外的鍵盤? – Deanna 2012-08-09 08:32:09

回答

0

HWND WINAPI GetForegroundWindow(void);

檢索的句柄前臺窗口(與該用戶當前工作的窗口)。系統爲創建前景窗口的線程分配比其他線程稍高的優先級。

HWND WINAPI GetActiveWindow(void);

檢索窗口句柄連接到調用線程的消息隊列中的活動窗口。

其中一個可能會這樣做。

+0

'GetActiveWindow'在這裏沒有用,因爲窗口將駐留在不同的進程中。 – 2012-02-14 21:37:01

+0

GetForegroundWindow和GetActiveWindow它們返回Form1 – Abbath 2012-02-15 06:56:44

0

,如果你想在這裏更復雜的例子,你可以看看這個問題,以及

示例見你如何能做到這一點了完整的源代碼在這裏:

http://www.csharphelp.com/2006/08/get-current-window-handle-and-caption-with-windows-api-in-c/

[DllImport("user32.dll")] 
static extern IntPtr GetForegroundWindow(); 

[DllImport("user32.dll")] 
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); 

private string GetActiveWindowTitle() 
{ 
    const int nChars = 256; 
    IntPtr handle = IntPtr.Zero; 
    StringBuilder Buff = new StringBuilder(nChars); 
    handle = GetForegroundWindow(); 

    if (GetWindowText(handle, Buff, nChars) > 0) 
    { 
     return Buff.ToString(); 
    } 
    return null; 
} 
+0

http://www.csharphelp.com/archives2/archive301.html在這個鏈接空白頁 – Abbath 2012-02-15 06:57:31

+0

更新到更新後的鏈接 – BrianH 2012-08-08 16:07:39

2

對於這是值得的,這很可能是編寫虛擬鍵盤的錯誤方法;您最好使用SendInput來注入按鍵,並讓Windows/USER32處理將輸入路由到當前聚焦窗口本身 - 這樣,您甚至不需要首先知道當前聚焦的窗口。

一個問題是,雖然Edit/Richedit控件將使用WM_SETTEXT,但許多其他實際可編輯控件(如Word,Excel等)不會。此外,您不能使用WM_SETTEXT來發送箭頭鍵或其他非文本內容。

如果您仍然確實需要查找當前關注的HWND,則可以使用GetGUIThreadInfo,將idThread傳遞爲0,然後使用返回的GUITHREADINFO結構的hwndFocus成員。