2012-02-29 31 views
4

我想在C#中創建「間諜++」的相同函數「查找窗口...」。 我嘗試用WINAPI的此功能:在C#中創建間諜++的函數「查找窗口...」

HWND WINAPI WindowFromPoint(__in POINT Point); 

http://msdn.microsoft.com/en-US/library/ms633558.aspx 但我不到貨讓所有元素與,因爲他們被禁用或隱藏。

例如在程序員模式下使用窗口7計算器時,如果他們被禁用,那麼我無法使用我的程序獲得「A B C D E F」 然後spy ++可以獲取它。

編輯: 我試試這個,但它不工作:

[DllImport("user32.dll")] 
public static extern ulong GetClassLongPtr(IntPtr hWnd, int nIndex); 

[DllImport("user32.dll")] 
public static extern IntPtr ChildWindowFromPointEx(IntPtr hWndParent, Win32Point pt, uint uFlags); 

IntPtr hWnd = WindowFromPoint(myPoint); 
hWnd= ChildWindowFromPointEx(hWnd , myPoint, 0x0000); 

myPoint是我的鼠標的位置。

我不熟悉WINAPI,我想你的解釋是對我缺乏理解。有可能有一個ChildWindowFromPointEx函數的小例子,或知道我的代碼不工作? thanx您的答案


我已經嘗試創建循環,但是,似乎手柄是另一個手柄下,但不是手柄的兒童,循環送送花兒給人同樣的手柄,沒有慾望的孩子時,鍵「abcdef」被禁用。你有另一個想法嗎?

+1

對於它的價值,你可能*應該*跳過不可見的窗口(只是沒有禁用的)。如果你打開Spy ++,你會發現桌面上堆滿了幾十個和幾十個不可見的窗口 - 主要是工具提示和菜單以及對話框,它們已被解散,但隨時可以再次顯示。你通常會想忽略這些,否則他們會干涉,你可能最終得到一個HWND,用戶根本看不到任何相應的東西! – BrendanMcK 2012-03-01 02:30:51

回答

5

WindowFromPoint返回窗口句柄。由於您正在處理禁用/隱藏窗口,因此您需要使用ChildWindowFromPointEx,並將hwndParent作爲從WindowFromPoint獲得的任何處理方式傳入。

您可能會發現下面的文章有所幫助: http://blogs.msdn.com/b/oldnewthing/archive/2010/12/30/10110077.aspx


在問候你添加的代碼,ChildWindowFromPointEx需要客戶座標,而鼠標的位置座標,你必須是屏幕座標。您可以使用ScreenToClient進行轉換。

注意:這是WinAPI的做事方式。我不知道是否或者什麼API C#提供。

+0

謝謝你,我已經嘗試過你的功能,但它不會爲我工作,如果它可以幫助你查看我的問題,我已經編輯了我的問題以添加信息。謝謝 – Gat 2012-03-01 00:21:35

+1

小澄清:WindowFromPoint實際上會返回子窗口;根據MSDN和Raymond Chen的文章,它將返回'最嵌套'的窗口。但是,您堅持忽略已禁用窗口的政策;這是這裏的問題,而不是頂級vs兒童窗口問題 - 最好的做法可能是在合適的循環中使用ChildWindowFromPointEx來推出自己的版本。 – BrendanMcK 2012-03-01 02:27:43

+0

是BrendanMcK和邁克關,你有理由對ChildWindowFromPointEx和ScreenToClient的combinaison,我終於到達,以獲得我的窗口的孩子,但我有需要的存取權限的孫子和其他,我將發佈的解決方案時,我會找到這 – Gat 2012-03-01 09:00:33