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...