截取鼠标指针的图片
Windows下的鼠標經常會顯示出不同的樣子以提示當前的操作,所以對于很多程序來說截取鼠標指針當前的圖片并進行分析是很有用處的,下面分析兩種截取鼠標指針的圖片的方法并給出一個示范程序。
截取鼠標指針的圖片首先要取得鼠標的句柄,然后用API函數DrawIconEx將其繪制在畫布上,注意在Windows下鼠標指針(Cursor)和圖標(Icon)是沒有區別的,利用DrawIconEx的第七個參數istepIfAniCur可以將動態光標的不同幀繪制在畫布上,具體的應用可以查看MSDN。
取得鼠標的句柄的第一種方法是利用API函數GetCursorInfo,很奇怪在MSDN6.0中查不到這個函數, 無論鼠標是否停留在本進程的窗口上,利用這個函數都可以取得鼠標的信息,示范代碼如下:
//方案1function?Fun1:?HCURSOR;
var
????hCur?:?TCursorInfo;
begin
????ZeroMemory(@hCur,sizeof(hCur));
????hCur.cbSize:=SizeOf(hCur);
????GetCursorInfo(hCur);
????result:=hCur.hCursor;
end;
?取得鼠標的句柄的第二種方法是利用API函數GetCursor,一般情況下,只有當鼠標停留在本進程的窗口上,這個函數才返回正確的鼠標句柄,否則只返回默認的鼠標句柄,也就是小箭的樣子,不過可以利用API函數AttachThreadInput將兩個進程進行輸入綁定,這樣當鼠標停留在其它進程的窗口上,就或以返回正確的鼠標句柄,示范代碼如下:
//方案2function?Fun2:?HCURSOR;
var
????wid?:?HWND;
????tid?:?DWORD;
begin
????wid:=GetForegroundWindow;?//獲取最前面的窗口
????tid:=GetWindowThreadProcessId(wid,nil);?//獲取窗口所在的進程
????AttachThreadInput(GetCurrentThreadId,tid,true);
????result:=GetCursor;
????AttachThreadInput(GetCurrentThreadId,tid,false);
end;
?顯然第一種方法要優于第二種方法。獲得鼠標句柄后的繪制就簡單了,繪制后的分析屬于圖片分析技術這里就不討論了。我做的示范程序如下:
例程下載:/Files/rogee/截取鼠標指針的圖片.zip
轉載于:https://www.cnblogs.com/rogee/archive/2010/09/16/1827782.html
總結
- 上一篇: 如何查询硬盘序列号?百度基本都是错的,其
- 下一篇: java实现QQ登录