今天我為大家帶來乙個有趣的例子,有點像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,每天都開啟,即為每天都應該開啟的應用,及經常會用到的應用。而每乙個程式猿都應該是一名...