2012-10-01 2 views
0

몇 가지 구성과 사용자 정의로 키보드를 프로그래밍해야합니다. 키보드 앞에 텍스트 영역이있는 경우 활성화되도록 구성해야합니다. 주로 어떤 컨트롤이 선택되었는지 알아야합니다.텍스트 상자가 OS에 포커스가 있는지 여부를 확인하는 방법은 무엇입니까?

키보드는 독립 실행 형 응용 프로그램이므로 OS에 액세스하여 컨트롤을 직접 처리 할 수 ​​없습니다.

더 설명을 위해, 나는 당신에게 시나리오를 말할 거 오전 :

  1. 사용자는 '최상위'설정 키보드 응용 프로그램을 실행하고, ShowInTaskBar은 해제하고, 키보드를 사용할 수 없습니다.
  2. 메모장이나 Microsoft Word 또는 그림판의 TextBox처럼 사용자가 창에서 텍스트 컨트롤을 클릭하면 키보드 응용 프로그램이 활성화 된 상태로 클릭됩니다.

  3. 사용자가 키보드 응용 프로그램과 해당 키를 클릭하여 2 단계에서 선택한 TextBox에 텍스트를 쓰면 이전 TextBox에서 포커스가 느슨해 지지만 키보드는 계속 활성화된다는 점에 유의하십시오.

+0

(HTTP : // MSDN Microsoft.com/ko-kr/library/ms753326.aspx). 불행히도, 그것은 매우 중요한 주제이며, SO에 깊이 들어가기에는 부적합합니다. 하지만 포커스 이벤트를 청취하고 컨트롤 유형을 조사 할 수 있습니다. –

+0

@Damien_The_Unbeliever, 내가 필요한 것을 제공 해줘서 고마워요. 그러나 당신이 말한대로, 그것은 거대한 주제입니다. 내 머리가 날아 가기 시작했다. UI 자동화에 대한 자세한 내용을 살펴 보겠다. msdn에서 제공하는 예제가 제대로 작동하므로 초점이 변경되었을 때 알림을받을 수 있습니다. 그러나 더 많은 정보를 얻을 수는 없습니다. 감사합니다. 한 번 완료되면 다시 게시합니다. –

+0

' 그것에 대해 너무 많이 걱정할 필요가 없다. UI 자동화의 주제이기는하지만 필요한 것은 아주 간단한 것이므로 조금만 더 노력하면 될 것입니다. –

답변

0

그것이 있어야하기 때문에 그것은, caret의 위치를 ​​검색하여 쉽게보다 큰 공 어쩌면 당신이 [`UI Automation`]에 대한 클라이언트가되고 싶어요처럼 소리

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

당신은 Focused property

foreach (var control in this.Controls) 
{ 
    if (control.Focused) 
    { 
      .... 
     } 
} 

링크로 시도 할 수 있습니다 : http://msdn.microsoft.com/fr-fr/library/system.windows.forms.control.focused.aspx

+1

동일한 응용 프로그램 내에서 실행중인 경우 작동합니다 OP는 응용 프로그램이 Word 또는 Paint 등의 내부에서 발생하는 포커스를 찾고 있음을 나타냅니다. –

0

당신은 윈도우 API 함수의 두 가지가 필요합니다

GetActiveWindow (무효); GetWindowClass()

먼저 활성 창 (초점 창)을 표시하고 두 번째 창은 활성 창 (텍스트 창)인지 알려줍니다.

윈도우의 현재 텍스트를 가져오고 텍스트를 설정하려면 sendmessage (...) 함수가 더 필요합니다.

Windows API에 대해 자세히 설명합니다.

+0

답장을 보내 주셔서 감사합니다. '[DllImport ("user32.dll")] static extern IntPtr GetActiveWindow();' 하지만 GetActiveWindow는 항상 0 값을 반환합니다. 이러한 것들을 잘 처리하는 방법을 모르겠습니다. API 및 후크에 익숙하지 않습니다. 고마워요 –

+0

후크는 사용할 필요가 없습니다. 나는 당신이 pinvoke.net에 가서 함수의 적절한 선언을 찾아 볼 것을 제안 할 것이다. .net 유형과 api 유형이 다르므로 API를 사용하여 문제가 발생할 수 있습니다. 또한 API는 사물을 다루기 위해 다른 접근 방식을 취합니다. API 함수에는 입력 매개 변수와 출력 매개 변수가 있으며 대부분의 경우 반환 값은 성공 또는 실패를 나타냅니다. - 계속 노력해. –

관련 문제