版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C#寫(xiě)個(gè)類(lèi)操作窗口(句柄操作)實(shí)現(xiàn)過(guò)程:過(guò)程一:找到當(dāng)前鼠標(biāo)位置的句柄您的使用2個(gè)WinAPI(俺喜歡自己封裝下來(lái)用):田ViewCodeDllImport(user32.dll,EntryPoint=GetCursorPos)publicstaticexternboolGetCursorPos(outPointpt);DllImport(user32.dll,EntryPoint=WindowFromPoint)publicstaticexternIntPtrWindowFromPoint(Pointpt);/鼠標(biāo)位置的坐標(biāo)publicstaticPointGetCursorPosPoint
2、()Pointp=newPoint();if(GetCursorPos(outp)returnp;returndefault(Point);/找到句柄/坐標(biāo)/publicstaticIntPtrGetHandle(Pointp)returnWindowFromPoint(p);過(guò)程二:改變窗口的Text您的使用1個(gè)WinAPI:田ViewCodeDllImport(user32.dll,EntryPoint=SendMessage)lParam);privatestaticexternintSendMessage(IntPtrhWnd,intMsg,IntPtrwParam,string/lP
3、aram);/給窗口發(fā)送內(nèi)容/句柄/要發(fā)送的內(nèi)容publicstaticvoidSetText(IntPtrhWnd,stringlParam)SendMessage(hWnd,WM_SETTEXT,IntPtr.Zero,lParam);privateconstintWM_SETTEXT=OxOOOC;通過(guò)這個(gè)方法就能改變Text的值了。思考:如果俺把這個(gè)窗口的句柄記錄下來(lái),下次不用鼠標(biāo)獲取,直接就能改變值不蠻好的嘛。例如:我有個(gè)桌面系統(tǒng)老叫我輸入用戶(hù)名,密碼。我記錄用戶(hù)名和密碼的窗口句柄,然后改變他們的輸入值,這樣多省事。(只是舉例,不考慮安全性)問(wèn)題:你會(huì)告訴我,窗口句柄的每次重建會(huì)變的
4、呀,咋辦。回答:類(lèi)名不變呀。過(guò)程三:您的準(zhǔn)備一些工具吧,例如:句柄找類(lèi)名呀,類(lèi)名找句柄什么的等等,下面會(huì)用到一些WinAPI國(guó)ViewCodeDllImport(user32.dll,EntryPoint=FindWindow)privatestaticexternIntPtrFindWindow(stringIpClassName,stringIpWindowName);DllImport(user32.dll,EntryPoint=FindWindowEx)privatestaticexternIntPtrFindWindowEx(IntPtrhwndParent,IntPtrhwndCh
5、ildAfter,stringlpszClass,stringlpszWindow);DllImport(user32.dll,EntryPoint=GetParent)publicstaticexternIntPtrGetParent(IntPtrhWnd);nMaxCounDllImport(user32.dll,CharSet=CharSet.Auto)nMaxCount);publicstaticexternintGetClassName(IntPtrhWnd,StringBuilderlpClassName,intt);/找到句柄/類(lèi)名/publicstaticIntPtrGetHa
6、ndle(stringIpClassName)returnFindWindow(IpClassName,null);/子窗口句柄/父窗口句柄/前一個(gè)同目錄級(jí)同名窗口句柄/類(lèi)名/publicstaticIntPtrGetChildHandle(IntPtrhwndParent,IntPtrhwndChildAfter,stringlpszClass)returnFindWindowEx(hwndParent,hwndChildAfter,lpszClass,null);/全部子窗口句柄/父窗口句柄/類(lèi)名/publicstaticListGetChildHandles(IntPtrhwndPare
7、nt,stringclassName)ListresultList=newList();for(IntPtrhwndClient=GetChildHandle(hwndParent,IntPtr.Zero,className);hwndClient=IntPtr.Zero;hwndClient=GetChildHandle(hwndParent,hwndClient,className)resultList.Add(hwndClient);returnresultList;/找類(lèi)名/句柄/publicstaticstringGetClassName(IntPtrhWnd)StringBuild
8、erlpClassName=newStringBuilder(128);if(GetClassName(hWnd,lpClassName,lpClassName.Capacity)=0)thrownewException(notfoundIntPtr!);returnlpClassName.ToString();思考:遍歷桌面上所有的窗口,然后找類(lèi)名,然后改他的Text,扯淡嘛,相同的類(lèi)名太多了,找毛呀。實(shí)現(xiàn):不僅記錄類(lèi)名,而且記錄類(lèi)名在父窗口出現(xiàn)的位置,然后通過(guò)桌面一層層找下來(lái),最后找到這個(gè)句柄。(雖然不是太準(zhǔn),但是一般的還是能解決了,如果你有什么好方式一起研究)。過(guò)程四:實(shí)現(xiàn)一個(gè)WinHW
9、ND的類(lèi),可以把他的規(guī)則,他的父窗口類(lèi)名,以及在父窗口中同類(lèi)名出現(xiàn)的順序記錄下來(lái),然后通過(guò)這些記錄的信息還原句柄。田ViewCodepublicclassWinHWNDTOC o 1-5 h zpublicIntPtrHWNDget;set;publicstringClassNameget;set;publicWinHWNDParentget;set;publicintInParentSequenceget;set;privateWinHWND()publicWinHWND(IntPtrhWnd)this.HWND=hWnd;this.ClassName=GetClassName();this
10、.Parent=GetParent();this.InParentSequence=GetInParentSequence();privatestringGetClassName()returnWinAPI.GetClassName(this.HWND);privateWinHWNDGetParent()if(WinAPI.GetParent(this.HWND)=null)thrownewException(notfoundIntPtr!);if(WinAPI.GetParent(this.HWND)=IntPtr.Zero)returnnull;returnnewWinHWND(WinAP
11、I.GetParent(this.HWND);privateintGetInParentSequence()IntPtrIntprtParent=this.Parent=null?IntPtr.Zero:this.Parent.HWND;returnWinAPI.GetChildHandles(IntprtParent,this.ClassName).IndexOf(this.HWND);publicoverridestringToString()StringBuilderresult=newStringBuilder();for(WinHWNDwinHandle=this;winHandle
12、!=null;winHandle=winHandle.Parent)result.Append(string.Format(0:1;,Escape(winHandle.ClassName),winHandle.InParentSequence.ToString();if(winHandle.InParentSequence=-1)break;returnresult.ToString().TrimEnd(;);privatestaticstringGetBaseMark(stringsMark)stringsMarks=sMark.Split(;);returnsMarkssMarks.Len
13、gth-1.Split(:)0;privatestaticstringGetChildMarks(stringsMark)stringsMarks=sMark.Split(;);stringsChildMarks=newstringsMarks.Length-1;for(inti=0;isChildMarks.Length;i+)sChildMarksi=sMarksi;returnsChildMarks;/我一直覺(jué)得這段寫(xiě)很丑陋,誰(shuí)能幫幫我改改publicstaticWinHWNDGetWinHWND(stringsMark)ListbaseHwnds=WinAPI.GetChildHand
14、les(IntPtr.Zero,GetBaseMark(sMark);stringsChildMarks=GetChildMarks(sMark);/由于主窗口在桌面出現(xiàn)所以很可能同名,所以要看看他的兒子和孫子.是不是都匹配foreach(IntPtrbaseHwndinbaseHwnds)IntPtrhandle=baseHwnd;for(inti=sChildMarks.Length-1;i=0;i-)stringsChildMark=sChildMarksi.Split(:);tryhandle=WinAPI.GetChildHandles(handle,UnEscape(sChildM
15、ark0)int.Parse(sChildMark1);catchbreak;if(i=0)returnnewWinHWND(handle);continue;returnnull;#region轉(zhuǎn)義privatestaticstringEscape(stringarg)returnarg.Replace(:,:).Replace(;,;);privatestaticstringUnEscape(stringarg)returnarg.Replace(:,:).Replace(;,;);#endregionpublicstaticWinHWNDGetWinHWND()returnnewWinH
16、WND(WinAPI.GetHandle(WinAPI.GetCursorPosPoint();上全部代碼,里面加了窗口的部分屬性,擴(kuò)展其他的屬性,自己發(fā)揮吧,就是搞WinAPI田ViewCodeusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Runtime.InteropServices;usingSystem.Drawing;usingSystem.Collections;namespaceInformationCollectionDataFillpublic
17、classWinAPI#regionWinodwsAPIDllImport(user32.dll,EntryPoint=FindWindow)privatestaticexternIntPtrFindWindow(stringIpClassName,DllImport(user32.dll,EntryPoint=FindWindowEx)privatestaticexternIntPtrFindWindowEx(IntPtrhwndParentlpszClass,stringlpszWindow);DllImport(user32.dll,EntryPoint=SendMessage)priv
18、atestaticexternintSendMessage(IntPtrhWnd,intMsg,DllImport(user32.dll,EntryPoint=GetParent)publicstaticexternIntPtrGetParent(IntPtrhWnd);stringIpWindowName);IntPtrhwndChildAfter,stringIntPtrwParam,stringlParam);Out,MarshalAs(UnmanagedType.LPTStr)refRectanglerc);refRectanglerc);publicstaticexternintMo
19、veWindow(IntPtrhwnd,intx,inty,intnWidth,intnHeight,boolOut,MarshalAs(UnmanagedType.LPTStr)refRectanglerc);refRectanglerc);publicstaticexternintMoveWindow(IntPtrhwnd,intx,inty,intnWidth,intnHeight,boolDllImport(user32.dll,EntryPoint=GetCursorPos)publicstaticexternboolGetCursorPos(outPointpt);DllImpor
20、t(user32.dll,EntryPoint=WindowFromPoint,CharSet=CharSet.Auto,ExactSpelling=true)publicstaticexternIntPtrWindowFromPoint(Pointpt);DllImport(user32.dll,CharSet=CharSet.Auto)publicstaticexternintGetClassName(IntPtrhWnd,StringBuilderlpClassName,intnMaxCount);DllImport(user32.dll,CharSet=CharSet.Auto)pub
21、licstaticexternintGetWindowText(IntPtrhWnd,StringBuilderlpString,intnMaxCount);DllImport(user32.dll,CharSet=CharSet.Auto)publicstaticexternintGetWindowRect(IntPtrhwnd,DllImport(user32.dll,CharSet=CharSet.Auto)publicstaticexternintGetClientRect(IntPtrhwnd,DllImport(user32.dll,CharSet=CharSet.Auto)bRe
22、paint);DllImport(user32.dll,CharSet=CharSet.Auto,SetLastError=true,ExactSpelling=true)publicstaticexternintScreenToClient(IntPtrhWnd,refRectanglerect);#endregion#region封裝API方法/找到句柄/類(lèi)名/publicstaticIntPtrGetHandle(stringIpClassName)returnFindWindow(IpClassName,null);/找到句柄/坐標(biāo)/publicstaticIntPtrGetHandl
23、e(Pointp)returnWindowFromPoint(p);/鼠標(biāo)位置的坐標(biāo)publicstaticPointGetCursorPosPoint()Pointp=newPoint();if(GetCursorPos(outp)returnp;returndefault(Point);/子窗口句柄/父窗口句柄/前一個(gè)同目錄級(jí)同名窗口句柄/類(lèi)名/publicstaticIntPtrGetChildHandle(IntPtrhwndParent,IntPtrhwndChildAfter,stringlpszClass)returnFindWindowEx(hwndParent,hwndChi
24、ldAfter,lpszClass,null);/全部子窗口句柄/父窗口句柄/類(lèi)名/publicstaticListGetChildHandles(IntPtrhwndParent,stringclassName)ListresultList=newList();for(IntPtrhwndClient=GetChildHandle(hwndParent,IntPtr.Zero,className);hwndClient=IntPtr.Zero;hwndClient=GetChildHandle(hwndParent,hwndClient,className)resultList.Add(hw
25、ndClient);returnresultList;/給窗口發(fā)送內(nèi)容/句柄/要發(fā)送的內(nèi)容publicstaticvoidSetText(IntPtrhWnd,stringlParam)SendMessage(hWnd,WM_SETTEXT,IntPtr.Zero,lParam);privateconstintWM_SETTEXT=0 x000C;/獲得窗口內(nèi)容或標(biāo)題/句柄/publicstaticstringGetText(IntPtrhWnd)StringBuilderresult=newStringBuilder(128);GetWindowText(hWnd,result,result
26、.Capacity);returnresult.ToString();/找類(lèi)名/句柄/publicstaticstringGetClassName(IntPtrhWnd)StringBuilderlpClassName=newStringBuilder(128);if(GetClassName(hWnd,lpClassName,lpClassName.Capacity)=0)thrownewException(notfoundIntPtr!);returnlpClassName.ToString();/窗口在屏幕位置/句柄/publicstaticRectangleGetWindowRect(
27、IntPtrhWnd)Rectangleresult=default(Rectangle);GetWindowRect(hWnd,refresult);returnresult;/窗口相對(duì)屏幕位置轉(zhuǎn)換成父窗口位置/publicstaticRectangleScreenToClient(IntPtrhWnd,Rectanglerect)Rectangleresult=rect;ScreenToClient(hWnd,refresult);returnresult;/窗口大小/publicstaticRectangleGetClientRect(IntPtrRectangleresult=defa
28、ult(Rectangle);GetClientRect(hWnd,refresult);returnresult;#endregionpublicclassWinHWNDpublicpublicpublicpublicIntPtrHWNDget;set;stringClassNameget;set;WinHWNDParentget;set;intInParentSequenceget;set;privateprivateprivateprivateprivateprivateRectanglecurrentRect;stringText;intLeft;intTop;intWidth;int
29、Height;publicstringTexthWnd)getreturn_Text=default(string)?WinAPI.GetText(this.HWND):_Text;set_Text=value;WinAPI.SetText(this.HWND,value);publicintLeftgetreturn_Left=default(int)?_currentRect.Left:_Left;settrue);_Left=value;true);WinAPI.MoveWindow(this.HWND,value,this.Top,this.Width,this.Height,publ
30、icintTopgetcurrentRect.Top:_Top;return_Top=default(int)currentRect.Top:_Top;setset_Top=value;WinAPI.MoveWindow(this.HWND,this.Left,_Top=value;WinAPI.MoveWindow(this.HWND,this.Left,value,this.Width,this.Height,true);publicgetpublicgetsetintWidthreturn_Width=default(int)currentRect.Width:_Width;public
31、get_Width=value;WinAPI.MoveWindow(this.HWND,this.Left,this.Top,value,this.Height,true);intHeightreturn_Height=default(int)currentRect.Height:_Height;settrue);_Height=value;true);WinAPI.MoveWindow(this.HWND,this.Left,this.Top,this.Width,value,privateWinHWND()publicWinHWND(IntPtrhWnd)this.HWND=hWnd;th
32、is.ClassName=GetClassName();this.Parent=GetParent();this.InParentSequence=GetInParentSequence();this._currentRect=GetRect();privatestringGetClassName()returnWinAPI.GetClassName(this.HWND);privateWinHWNDGetParent()if(WinAPI.GetParent(this.HWND)=null)thrownewException(notfoundIntPtr!);if(WinAPI.GetPar
33、ent(this.HWND)=IntPtr.Zero)returnnull;returnnewWinHWND(WinAPI.GetParent(this.HWND);privateintGetInParentSequence()IntPtrIntprtParent=this.Parent=null?IntPtr.Zero:this.Parent.HWND;returnWinAPI.GetChildHandles(IntprtParent,this.ClassName).IndexOf(this.HWND);privateRectangleGetRect()if(this.Parent=null
34、)returndefault(Rectangle);RectangleclientSize=WinAPI.GetClientRect(this.HWND);RectangleclientPoint=WinAPI.ScreenToClient(this.Parent.HWND,WinAPI.GetWindowRect(this.HWND);returnnewRectangle(clientPoint.X,clientPoint.Y,clientSize.Width,clientSize.Height);publicstaticWinHWNDGetWinHWND()returnnewWinHWND
35、(WinAPI.GetHandle(WinAPI.GetCursorPosPoint();publicoverridestringToString()StringBuilderresult=newStringBuilder();for(WinHWNDwinHandle=this;winHandle!=null;winHandle=winHandle.Parent)result.Append(string.Format(0:1;,Escape(winHandle.ClassName),winHandle.InParentSequence.ToString();if(winHandle.InParentSequence=-1)break;returnresult.ToString().TrimEnd(;);privatestaticstringGetBaseMark(stringsMark)stri
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度農(nóng)產(chǎn)品市場(chǎng)調(diào)研與分析服務(wù)合同11篇
- 2025年度農(nóng)業(yè)合作社與農(nóng)產(chǎn)品加工企業(yè)合作合同4篇
- 2025年度南京市家庭裝修工程承包合同書(shū)4篇
- 2025年度醫(yī)療設(shè)施純勞務(wù)分包合同4篇
- 2025版寧夏糧食和物資儲(chǔ)備局糧食質(zhì)量安全監(jiān)測(cè)服務(wù)合同3篇
- 2025年度個(gè)人挖掘機(jī)械操作培訓(xùn)合同4篇
- 2025年度星級(jí)酒店餐飲承包與托管一體化合同4篇
- 二零二五年農(nóng)村信用社農(nóng)村扶貧貸款合同范本
- 二零二五年度拆除工程合同違約責(zé)任合同模板3篇
- 二零二五年度室內(nèi)墻面批白翻新施工合同
- 不同茶葉的沖泡方法
- 光伏發(fā)電并網(wǎng)申辦具體流程
- 建筑勞務(wù)專(zhuān)業(yè)分包合同范本(2025年)
- 企業(yè)融資報(bào)告特斯拉成功案例分享
- 五年(2020-2024)高考地理真題分類(lèi)匯編(全國(guó)版)專(zhuān)題12區(qū)域發(fā)展解析版
- 《阻燃材料與技術(shù)》課件 第8講 阻燃木質(zhì)材料
- 低空經(jīng)濟(jì)的社會(huì)接受度與倫理問(wèn)題分析
- GB/T 4732.1-2024壓力容器分析設(shè)計(jì)第1部分:通用要求
- 河北省保定市競(jìng)秀區(qū)2023-2024學(xué)年七年級(jí)下學(xué)期期末生物學(xué)試題(解析版)
- 運(yùn)動(dòng)技能學(xué)習(xí)與控制課件
- 六編元代文學(xué)
評(píng)論
0/150
提交評(píng)論