捕捉桌面上的視窗資訊

2022-05-10 15:07:37 字數 2966 閱讀 1527

今天我為大家帶來乙個有趣的例子,有點像spy++的功能,通過滑鼠在螢幕上移動,並實時捕捉指定座標點處的視窗資訊。

視窗資訊包括視窗標題,視窗控制代碼,視窗類名,以及呈現所捕捉視窗的縮圖。

現在我們不妨來思考一下,要實現這些功能,我們需要準備哪些技術要點?

1、獲取當前滑鼠指標的螢幕座標,這個用system.windows.forms命名空間下的cursor類的position屬性就可以知道當前滑鼠指標的位置,螢幕座標。

2、如何從指定座標處得到視窗,其實就是獲得對應視窗的控制代碼,這裡要使用乙個api函式windowfrompoint,它可以返回指定座標處的視窗的控制代碼。這個視窗不一定指的就是完整的視窗,在win32視窗中,乙個控制項也是乙個視窗,桌面也是乙個視窗。

3、獲取視窗的標題文字,使用api函式getwindowtext,根據視窗的控制代碼得到視窗的標題文字。

4、獲取視窗類名,使用api函式getclassname,得到對應視窗所屬的視窗類,這裡所指的視窗類就是我們在開發win32程式時,類似於在winmain函式中用registerclass函式註冊的類名。

5、把視窗內容繪製成縮圖,這個簡單,在system.drawing命名空間下的graphics類就有乙個copyfromscreen方法,可以從螢幕上覆制影象,效果是等效於用bitblt函式從桌面的dc複製到其他位置一樣。

6、我們並不是複製整個螢幕,而只是對應位置處的視窗,要獲得視窗的矩形區域,可以呼叫api函式getwindowrect。

好了,現在技術要點解決了,接下來就是真刀真槍幹了。

首先是匯入win32的api。

[csharp]view plain

copy

[dllimport("user32.dll",callingconvention = callingconvention.stdcall)]  

public extern static intptr windowfrompoint(int x, int y);  

[dllimport("user32.dll", callingconvention = callingconvention.stdcall)]  

public extern static int getclassname(  

[in] intptr hwnd,  

[out, marshalas(unmanagedtype.lpstr)] stringbuilder lpstring,  

[in] int nmaxcount);  

[dllimport("user32.dll", callingconvention = callingconvention.stdcall)]  

public extern static int getwindowtext(  

[in] intptr hwnd,  

[out, marshalas(unmanagedtype.lpstr)] stringbuilder lpstring,  

[in] int nmaxcount);  

[dllimport("user32.dll")]  

public extern static bool getwindowrect(intptr hwnd, out rect lprect);  

[csharp]view plain

copy

[structlayout(layoutkind.sequential)]  

public struct rect  

在整個桌面上處理滑鼠移動事件不容易,這裡我換一種思路,用timer元件,每隔300毫秒獲取一次資訊,這樣,當滑鼠在螢幕上移動時,也能實時更新座標資訊。

[csharp]view plain

copy

private void mytimer_tick(object sender, eventargs e)  

catch(exception ex)  

// 顯示資訊  

lblcurrentlocation.text = string.format(", ", cursor.position.x, cursor.position.y);  

lblcurrenthandle.text = hwnd.tostring();  

lblwindowtext.text = sbtext.tostring();  

lblclassname.text = sbclass.tostring();  

// 繪製螢幕影象  

drawtopicbox(hwnd);  

}  }  

bitmap bmp = null;  

private void drawtopicbox(intptr hwnd)  

rect rect;  

if (getwindowrect(hwnd, out rect))  

this.picturebox1.image = bmp;  

}  }  

private void btnstart_click(object sender, eventargs e)  

private void btnstop_click(object sender, eventargs e)  

執行後你能看到效果的。請看截圖。

好的,這個好玩的東東就到這裡,稍候我上傳源**到資源區。

飛鴿傳書 桌面上常見的視窗

飛鴿傳書桌面上常見的視窗 應用程式視窗 顯示程式名稱的標題列 選單甚至可能還有工具列和滾動條。對話方塊 它可以有標題列也可以沒有標題列。裝飾對話方塊表面的還有各式各樣的按鍵 單選按鈕 核取方塊 清單方塊 滾動條和文字輸入區域。其中每乙個小的視覺物件都是乙個視窗。更確切地說,這些都稱為 子視窗 或 控...

Android的桌面上的應用介紹

android的桌面上有三種型別的圖示分別為 快捷方式,實時資料夾,桌面外掛程式 一 快捷方式 在桌面上的快捷方式是應用程式的快捷方式,主要用於快速啟動應用程式。在桌面區域佔乙個單元格的大小。二 實時資料夾 提 用的實時更新,主要包括聯絡人實時資料夾 電子郵件實時資料夾。在桌面區域佔乙個單元格的大小...

程式設計師桌面上的EDO

what s the edo?edc系乜意思啊?every day carry的縮寫,即係每日便攜在身的意思,引申為每日便攜在身的一些物品,例如上班的揹包之類的。煥卵之,edo的意思就是every day open,每天都開啟,即為每天都應該開啟的應用,及經常會用到的應用。而每乙個程式猿都應該是一名...