2009-05-06 23 views
1

我有這個問題。我有一個特定應用程序的mainWindow的處理程序,我想模擬該應用程序的按鍵...如何獲取應用程序的活動ChildWindow?

我正在使用sendMessage/postMessage API調用來做到這一點。我不使用.Net SendKeys函數或win32 API的keybd_event的原因是他們模擬了全局級別的按鍵。在我的情況下,我可能會將應用程序最小化,並仍然希望按鍵被模擬。

sendMessage和postMessage的問題是,您必須通過確切的子窗口的處理程序,您希望按下按鍵。例如,在記事本中,如果我將密鑰發送到mainWindow,則什麼都不會發生,我必須將密鑰發送到子窗口,該子窗口基本上由可以寫入的白色畫布組成。

以msPaint爲例,如果用戶創建一個新文檔並在該圖形中打開一個文本框,並且我想在那裏模擬一個按鍵,那麼我必須獲取主窗口的子窗口的子窗口才能工作。

所以我發現了一種似乎適用於每種情況的方式,基本上,我使用帶參數GW_CHILD的getWindow來獲取具有最高z值的子窗口。然後,我再次爲子窗口做,並繼續這樣做,直到某個childWindow沒有更多的childWindows ..

而且它似乎工作,我很高興!

但是...我發現這種情況無效。 Firefox是其中之一。 Firefox有mainWindow,然後有一個與mainWindow非常相似的childWindow,然後它有另一個childWindow,它是網站區域,即地址欄和菜單下的區域。例如,如果我在www.google.com上,並且想要在關注的搜索框中模擬按鍵,它就會起作用,因此獲取子窗口的子窗口會爲我提供正確的childWindow。但是,例如,如果用戶點擊地址欄,則getWindow的工作方式不會改變。它仍然會最終得到地址欄下面的子窗口,什麼都不做,而不是模擬地址欄上的按鍵。

事情是,我還沒有找到一種獲得某個應用程序的活動子窗口的方法。我只能使用GetWindow方法獲取某個窗口的子窗口,直到找到沒有子窗口的子窗口。但是,正如你在Firefox中看到的那樣,活動窗口實際上是我最終得到的子窗口的父窗口。

我試過其他的API調用像getTopWindow但我沒有運氣..

任何人都可以放一些輕看這個問題? 謝謝!

回答

0

如果應用程序違反了windows的窗口規則,則需要一個例外。

在Mozilla中,是這樣的(IIRC):

  • 有類MozillaUIWindowClass的這個「神」窗口,並用「 - Mozilla Firefox瀏覽器」,在其窗口文本字符串。
  • 如果你知道你可以用下面的函數地址欄的位置:

,併爲其提供了「神」窗口HWND和地址欄的位置。

HWND ChildWindowFromPoint(HWND, POINT); 

可能有更好的解決方案,我想出了這個,因爲我需要自動化鼠標,這是基於位置的。

欲瞭解更多信息,你可能需要諮詢特定軟件的sources,或花一整天在Spy +上。 :>

0

您可以使用GetGUIThreadInfo獲取有關特定進程的UI的信息。

如果您有主窗口,您可以撥打GetWindowThreadProcessId來獲取進程線程ID。然後你可以撥打GetGUIThreadInfo來獲得有關活動/聚焦窗口的信息等。

我還必須指出,某些應用程序只有一個窗口,其所有控件都是無窗口的(如Windows Live Messenger)。

相關問題