C 自己動手實現Spy (一)

2021-06-18 04:32:10 字數 2824 閱讀 8755

intptr hwnd = win32.windowfrompoint(cursor.position);   //最關鍵的一句

if (oldwnd != intptr.zero && oldwnd != hwnd)

if (hwnd == intptr.zero)

else

", hwnd.toint32().tostring());

textbox3.text = this.getclassname(hwnd);

textbox2.text = this.getwindowtext(hwnd);

win32.getwindowinfo (hwnd,ref win);

textbox4.text =win.exstyle .tostring ();

win32.rect rc = new win32.rect();

win32.getwindowrect(hwnd, ref rc);

textbox5.text = string.format("[ x ], (,)-(,)", rc.right - rc.left, rc.bottom - rc.top, rc.left, rc.top, rc.right, rc.bottom);

this.highlight(hwnd);

}其中第一句最重要:

ntptr hwnd = win32.windowfrompoint(cursor.position); 

,找到了控制代碼就可以根據控制代碼找到相關的視窗標題、類名、大小、座標等資訊。

發現他是引用了乙個dll:"win32gdi.dll",然後上網搜尋並沒有找到這個dll,估計是作者自己封裝的,然後就再找windowfrompoint這個函式,這個函式根據名字就很好理解它的功能,就是根據座標獲取視窗,在網上找到了這個是windows的api函式,直接引用即可,只不過這個函式的原型為:

[dllimport("user32.dll", entrypoint = "windowfrompoint")]//指定座標處窗體控制代碼       

public static extern intptr windowfrompoint(int xpoint, int ypoint);

這裡面有兩個引數,即x,y座標,作者那裡把它改為乙個引數point型別。

同理找到其他api函式原型:

[dllimport("user32.dll", entrypoint = "windowfrompoint")]//指定座標處窗體控制代碼       

public static extern intptr windowfrompoint(int xpoint, int ypoint);

[dllimport("user32.dll")]

public extern static int getwindowtext(intptr hwnd, stringbuilder lpstring, int nmaxcount);

[dllimport("user32.dll", setlasterror = true, charset = charset.auto)]

public static extern int getclassname(intptr hwnd, stringbuilder lpclassname, int nmaxcount);

[dllimport("user32.dll")]

private static extern int getwindowrect(intptr hwnd, ref  rectangle lprect);

[dllimport("user32.dll")]

private static extern intptr getwindowdc(intptr hwnd);

[dllimport("user32.dll", charset = charset.auto, exactspelling = true)]

public static extern bool redrawwindow(intptr hwnd, comrect rcupdate, intptr hrgnupdate, int flags);

[dllimport("user32.dll", charset = charset.auto, exactspelling = true)]

public static extern bool updatewindow(intptr hwnd);

[dllimport("user32.dll", charset = charset.auto, exactspelling = true)]

public static extern bool invalidaterect(intptr hwnd, comrect rect, bool erase);

通過以上函式就可以實現獲取視窗的控制代碼、標題、型別、大小、座標等。然而實現高亮的時候**還是有點問題:

public void highlight(intptr hwnd)  //高亮其實就是用pen繪製乙個和視窗大小一樣的紅色框}}

win32.releasedc(hwnd, hdc);

}public void highlight2(intptr hwnd)  //我的**,尚有問題}}

win32.releasedc(hwnd, hdc);

}public void refresh(intptr hwnd)

public void refresh2(intptr hwnd)  //我的**,尚有問題

今天就暫時到這裡,基本上實現了獲取視窗的控制代碼、標題、型別、大小、座標等功能,高亮功能留待後續研究。

開發環境:vs2008

自己動手實現redux 一

訂閱事件,返回乙個取消訂閱函式 let subscribe cb let dispatch action return export default createstore 當我們使用redux時,首先需要使用redux的createstore並且傳入reducer來建立我們的store impor...

自己動手實現vector

有了實現string的基礎,在加上一點點模板的知識,就可以自己動手實現乙個vector了。下面是我實現的 比較簡單。有點犯懶了,講解以後再寫吧!ifndef my vector h define my vectoe h include typedef unsigned int size t temp...

envoy實現 自己動手實現乙個envoy限流器

envoy ratelimit envoy 可以繼承乙個全域性grpc ratelimit 服務,稱之為為rate limit service,go control plane 是乙個官方實現的golang 庫github.com envoyproxy go control plane go con...