2012-10-01 121 views
0

我需要編程一個鍵盤,進行一些配置和自定義。 如果任何文本區域在鍵盤前聚焦,我需要將其配置爲啓用。主要我需要知道選擇了哪個控件。如何判斷文本框是否專注於操作系統?

鍵盤是一個獨立的應用程序,所以它不能直接處理控件,只需訪問操作系統。

更多的解釋,我要告訴你的情景:

  1. 用戶運行該鍵盤應用程序,其「最頂層的」設置,並ShowInTaskBar沒有設置,並且鍵盤被禁用。
  2. 用戶單擊窗口中的任何文本控件,如記事本或Microsoft Word或Paint中的TextBox,然後在單擊鍵盤應用程序後啓用。

  3. 用戶單擊鍵盤應用程序及其鍵可以在第2步之前選擇的文本框上寫入文本,請注意,以前的文本框會鬆開焦點,但鍵盤仍將啓用。

+0

聽起來也許你想成爲['UI Automation']客戶端(HTTP:// MSDN .microsoft.com/EN-US /庫/ ms753326.aspx)。不幸的是,這是一個相當大的話題,不適合深入研究SO。但它可以讓你傾聽焦點事件,詢問控制類型等。 –

+0

@Damien_The_Unbeliever,感謝你爲我提供我需要的東西,但是,正如你所說,這是一個巨大的話題,而且真的我的頭開始被吹走..我會在UI自動化上進行更多的搜索。由msdn提供的例子工作正常,所以我可以在焦點改變時得到通知,但仍然|我無法獲得越來越多的信息 非常感謝,一旦完成,我將發佈它 –

+0

你不'不用擔心太多。雖然它是UI自動化的主題,但您需要的卻是一件非常簡單的事情,而且您應該可以通過一點點努力來做到這一點。 –

回答

0

它是通過搜索插入位置容易,因爲它應該是大於0

GUITHREADINFO lpgui = new GUITHREADINFO(); 
    IntPtr fore = GetForegroundWindow(); 
    uint tpid = GetWindowThreadProcessId(fore, IntPtr.Zero); 
    lpgui.cbSize = Marshal.SizeOf(lpgui.GetType()); 
    bool flag = GetGUIThreadInfo(tpid, out lpgui); 
    WINDOWINFO pwi = new WINDOWINFO(); 
    pwi.cbSize = (uint)Marshal.SizeOf(pwi.GetType()); 
    GetWindowInfo((IntPtr)lpgui.hwndCaret, ref pwi); 

    if (flag) 
    { 
     if (!(lpgui.rcCaret.Location.X == 0 && lpgui.rcCaret.Location.Y == 0)) 
     { 


      //TODO 

     } 
    } 
0

您將需要兩個Windows API函數的

GetActiveWindow(無效); GetWindowClass()

首先會給你活動窗口(焦點窗口),第二個會讓你知道它是否是文本窗口。

您將需要更多的函數sendmessage(...)來獲取窗口的當前文本並設置文本。

這是關於Windows API的更多信息。

+0

感謝您的回覆,我用這個 '[DllImport(「user32.dll」)] static extern IntPtr GetActiveWindow();' 但GetActiveWindow總是返回一個零值, 我不知道如何處理這些東西,我很熟悉API和鉤子。 非常感謝 –

+0

你不需要使用掛鉤,只需要apis。我建議你去pinvoke.net並找出適當的函數聲明。由於.net類型和api類型是不同的,因此您可能會遇到很多與api有關的問題。此外,API採用不同的方法來處理事情。你會發現api函數有輸入和輸出參數,大多數情況下,返回值會指示成功或失敗。 - 所以繼續嘗試。 –