2009-05-06 6 views
1

이 문제가 있습니다. 특정 응용 프로그램의 mainWindow에 대한 처리기가 있고 해당 응용 프로그램의 keypress를 시뮬레이트하고 싶습니다. ...응용 프로그램의 활성 ChildWindow를 가져 오는 방법은 무엇입니까?

이 작업을 수행하려면 sendMessage/postMessage API 호출을 사용하고 있습니다. .Net SendKeys 함수 또는 win32 API의 keybd_event를 사용하지 않는 이유는 전역 수준에서 키 누르기를 시뮬레이트하기 때문입니다. 필자의 경우에는 응용 프로그램을 최소화하고 키 누르기를 시뮬레이션 할 수 있습니다.

sendMessage 및 postMessage의 문제점은 키를 누를 정확한 자식 창 핸들러를 전달해야한다는 것입니다. 예를 들어 메모장에서 주 윈도우로 키를 보내면 아무 일도 일어나지 않습니다. 자식 창에 키를 보내야합니다. 자식 창은 기본적으로 쓸 수있는 흰색 캔버스로 구성되어 있습니다.

예를 들어, 사용자가 새 문서를 만들고 해당 그림에 텍스트 상자를 열고 거기에서 키 누르기를 시뮬레이트하려면 주 창 자식 창의 childwindow를 가져와야합니다 .

모든 상황에서 작동하는 것으로 보이는 방법을 찾았습니다. 기본적으로 GW_CHILD 매개 변수와 함께 getWindow를 사용하여 z- 값이 가장 높은 하위 창을 가져 왔습니다. 그런 다음 다시 하위 창에 대해 특정 작업을 수행 할 때까지 계속합니다 .Window에 더 이상 자식 창이 없을 때까지 계속합니다.

그리고 나는 매우 행복했습니다!

그러나 ... 작동하지 않는 경우를 발견했습니다. Firefox가 그 중 하나입니다. Firefox에는 mainWindow가 있으며, mainWindow와 거의 같은 childWindow를가집니다. 그러면 웹 사이트 영역 인 다른 childWindow, 즉 주소 표시 줄과 메뉴 아래 영역이 있습니다. 예를 들어 www.google.com을 사용하고 있는데 집중 검색 상자에서 키 누르기를 시뮬레이트하고 싶다면 작동합니다. 하위 창을 가져 오면 올바른 childWindow가 표시됩니다. 그러나 예를 들어 사용자가 주소 표시 줄을 클릭하면 getWindow가 작동하는 방식이 변경되지 않습니다. 주소 표시 줄에있는 키 누르기를 시뮬레이트하는 대신 주소 표시 줄 아래에 자식 창을 가져오고 아무것도하지 않습니다.

특정 응용 프로그램의 활성 자식 창을 가져 오는 방법을 찾지 못했습니다. GetWindow 메서드를 사용하여 특정 윈도우의 자식 윈도우를 가져오고 자식 윈도우가없는 자식 윈도우를 찾을 때까지 수행 할 수 있습니다. 그러나 파이어 폭스의 경우에서 보았 듯이 실제로 활성 창은 내가 결국 가져 오는 자식 창의 부모입니다.

사람은이 문제에 대한 몇 가지 빛을 넣을 수 있습니다 .. 내가 getTopWindow 같은 다른 API 호출을 시도했다하지만 난 운이 없었다? 감사합니다.

답변

0

응용 프로그램이 윈도우의 윈도우 기준을 위반하는 경우 예외가 필요합니다. 모질라에서

은,이 (IIRC)처럼 :

  • 이 클래스 MozillaUIWindowClass의 '신'창의와 함께 "- 모질라 파이어 폭스"의 창 텍스트 문자열입니다.
  • 당신은 다음과 같은 기능을 사용할 수있는 주소 표시 줄의 위치를 ​​알고있는 경우 :

를 그리고 '신'창의 HWND 및 주소 표시 줄의 위치와 함께 제공합니다.

HWND ChildWindowFromPoint(HWND, POINT); 

위치 기반 마우스를 자동화해야하므로 더 나은 해결책이있을 수 있습니다.

자세한 내용을 보려면 특정 소프트웨어의 sources을 참조하거나 Spy +에서 하루 종일 보내야 할 수 있습니다. :>

0

GetGUIThreadInfo을 사용하면 특정 프로세스의 UI에 대한 정보를 얻을 수 있습니다.

메인 창이있는 경우 GetWindowThreadProcessId으로 전화하여 프로세스 스레드 ID를 얻을 수 있습니다. 그런 다음 GetGUIThreadInfo으로 전화하여 활성/포커스 창에 대한 정보를 얻을 수 있습니다.

일부 응용 프로그램에는 하나의 창만 있고 모든 컨트롤에는 창없는 (Windows Live Messenger와 같은) 점이 있습니다.