![C#操作窗口類(句柄操作)_第1頁](http://file4.renrendoc.com/view/19990b24d0173a94e43c7a4074e2f7f6/19990b24d0173a94e43c7a4074e2f7f61.gif)
![C#操作窗口類(句柄操作)_第2頁](http://file4.renrendoc.com/view/19990b24d0173a94e43c7a4074e2f7f6/19990b24d0173a94e43c7a4074e2f7f62.gif)
![C#操作窗口類(句柄操作)_第3頁](http://file4.renrendoc.com/view/19990b24d0173a94e43c7a4074e2f7f6/19990b24d0173a94e43c7a4074e2f7f63.gif)
![C#操作窗口類(句柄操作)_第4頁](http://file4.renrendoc.com/view/19990b24d0173a94e43c7a4074e2f7f6/19990b24d0173a94e43c7a4074e2f7f64.gif)
![C#操作窗口類(句柄操作)_第5頁](http://file4.renrendoc.com/view/19990b24d0173a94e43c7a4074e2f7f6/19990b24d0173a94e43c7a4074e2f7f65.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
C#寫個類操作窗口(句柄操作)實現(xiàn)過程:過程一:找到當(dāng)前鼠標位置的句柄您的使用2個WinAPI(俺喜歡自己封裝下來用):ViewCode[DllImport(
publicstaticextern,boolEntryPoint= )]GetCUrsorPos(outPointpt);[DllImport(
publicstaticextern,EntryPoint=IntPtrWindowFromPoint(Pointpt);)]//鼠標位置的坐標publicstaticPointGetCUrsorPosPoint(){PointP=newPoint();if(GetCursorPos(outp)){returnp;}returndefault(Point);}///<summary>///找到句柄///<∕summary>/// 坐標</param>///<returnsx/returns>publicstaticIntPtrGetHandle(PointP)
{returnWindowFromPoint(p);
}過程二:改變窗口的Text您的使用1個WinAPI:田日V■ C7ViewCode[DllImport( ,EntryPoint= )]privatestaticexternintSendMessage(IntPtrhWnd,intMsg,IntPtrWParam,string///<summary>///給窗口發(fā)送內(nèi)容///</summary>lParam);///句柄</param>/// 要發(fā)送的內(nèi)容<∕param>publicstaticvoidSetText(IntPtrhWnd,stringlParam){SendMessage(hWnd,WM_SETTEXT,IntPtr.Zero,lParam);}privateconstintWM_SETTEXT=0x000C;通過這個方法就能改變Text的值了。思考:如果俺把這個窗口的句柄記錄下來,下次不用鼠標獲取,直接就能改變值不蠻好的嘛。例如:我有個桌面系統(tǒng)老叫我輸入用戶名,密碼。我記錄用戶名和密碼的窗口句柄,然后改變他們的輸入值,這樣多省事。(只是舉例,不考慮安全性)問題:你會告訴我,窗口句柄的每次重建會變的呀,咋辦?;卮穑侯惷蛔冄?。過程三:您的準備一些工具吧,例如:句柄找類名呀,類名找句柄什么的等等,下面會用到一些WinAPIViewCode[DllImport( ,EntryPoint= )]privatestaticexternIntPtrFindWindow(stringIpClassName,stringIpWindowName);[DllImport( ,EntryPoint= )]privatestaticexternIntPtrFindWindoWEx(IntPtrhwndParent,IntPtrhwndChildAfter,stringIpszClass,stringIpszWindow);[DllImport(publicstaticextern,EntryPoint=)]IntPtrGetParent(IntPtrhWnd);t);[DllImport(publicstaticextern,CharSet=CharSet.Auto)]intGetClaSSName(IntPtrhWnd,StringBuilderlpClassName,intnMaxCoun///<summary>〃/找到句柄///</summary>/// 類名</param>///<returns></returns>publicstaticIntPtrGetHandle(stringIpClassName){returnFindWindow(IPCIaSSName,null);}///<summary>///子窗口句柄///</summary>///父窗口句柄</param>///前一個同目錄級同名窗口句柄<∕param>/// 類名<∕param>///<returnsx/returns>publicstaticIntPtrGetChildHandle(IntPtrhwndParent,IntPtrhwndChildAfter,stringIpszClass){returnFindWindowEx(hwndParent,hwndChildAfter,lpszClass,null);}///<summary>///全部子窗口句柄///</summary>/// 父窗口句柄</param>/// 類名</param>///<returns></returns>publicstaticList<IntPtr>GetChildHandleS(IntPtrhwndParent,stringClaSSName){List<IntPtr>resultList=newList<IntPtr>();for(IntPtrhwndClient=GetChildHandle(hwndParent,IntPtr.Zero,className);hwndClient=IntPtr.Zero;hwndClient=GetChildHandle(hwndParent,hwndClient,className)){resultList.Add(hwndClient);}returnresultList;}///<summary>///找類名///</summary>/// 句柄</param>///<returnsx/returns>publicstaticstringGetClassName(IntPtrhWnd){StringBuilderlpClassName=newStringBuilder(128);if(GetClassName(hWnd,IpClassName,IpClassName.Capacity)==0){thrownewException( );}returnlpClassName.ToString();}思考:遍歷桌面上所有的窗口,然后找類名,然后改他的Text,扯淡嘛,相同的類名太多了,找毛呀。實現(xiàn):不僅記錄類名,而且記錄類名在父窗口出現(xiàn)的位置,然后通過桌面一層層找下來,最后找到這個句柄。(雖然不是太準,但是一般的還是能解決了,如果你有什么好方式一起研究)。過程四:實現(xiàn)一個WinHWND的類,可以把他的規(guī)則,他的父窗口類名,以及在父窗口中同類名出現(xiàn)的順序記錄下來,然后通過這些記錄的信息還原句柄。[+IEIt7'CJViewCodepublicclassWinHWND{publicIntPtrHWND{get;set;}publicstringClassName{get;set;}publicWinHWNDParent{get;set;}publicintInParentSequence{get;set;}privateWinHWND(){}publicWinHWND(IntPtrhWnd){this.HWND=hWnd;this.ClassName=GetClaSSName();this.Parent=GetParent();this.InParentSequence=GetInParentSeqUenCe();}privatestringGetClassName(){returnWinAPI.GetClassName(this.HWND);}privateWinHWNDGetParent(){if(WinAPI.GetParent(this.HWND)==null){thrownewException( );}if(WinAPI.GetParent(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);}publicoverridestringToString(){StringBuilderresult=newStringBUilder();for(WinHWNDwinHandle=this;winHandle!=null;winHandle=WinHandle.Parent){result.Append(String.Format( ,Escape(WinHandle.ClassName),WinHandle.InParentSequence.ToString()));if(WinHandle.InParentSequence==-1)break;}returnresult.ToString().TrimEnd(';');}privatestaticstringGetBaSeMark(StringSMark){string[]sMarks=sMark.Split(';');returnSMarkS[sMarks.Length-1].Split(':')[0];}privatestaticstring[]GetChildMarkS(StringsMark){string[]sMarks=sMark.Split(';');string[]SChildMarks=newstring[sMarks.Length-1];for(inti=0;i<SChildMarkS.Length;i++){SChildMarks[i]=sMarks[i];}returnSChildMarks;}//我一直覺得這段寫很丑陋,誰能幫幫我改改publicstaticWinHWNDGetWinHWND(StringSMark){List<IntPtr>baseHwnds=WinAPI.GetChildHandles(IntPtr.Zero,GetBaseMark(SMark));string[]SChildMarkS=GetChildMarkS(SMark);//由于主窗口在桌面出現(xiàn)所以很可能同名,所以要看看他的兒子和孫子 ...是不是都匹配foreach(IntPtrbaseHwndinbaseHwnds){IntPtrhandle=baseHwnd;for(inti=SChildMarkS.Length-1;i>=0;i--){string[]SChildMark=SChildMarkS[i].Split(':');try{handle=WinAPI.GetChildHandles(handle,UnEScape(SChildMark[0]))[int.Parse(sChildMark[1])];}catch{break;}if(i==0)returnnewWinHWND(handle);}continue;}returnnull;}#region轉(zhuǎn)義privatestaticstringEscape(Stringarg){returnarg.Replace(, ).Replace(, );}privatestaticstringUnEscape(Stringarg){returnarg.Replace(,).Replace(, );}#endregionpublicstaticWinHWNDGetWinHWND(){returnnewWinHWND(WinAPI.GetHandle(WinAPI.GetCursorPosPoint()));}}上全部代碼,里面加了窗口的部分屬性,擴展其他的屬性,自己發(fā)揮吧,就是搞WinAPIViewCodeusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSyStem.Text;usingSyStem.Runtime.InteropServices;usingSyStem.Drawing;usingSyStem.Collections;namespaceInformationCollectionDataFill{publicclassWinAPI{#regionWinodwsAPI[DllImport(privatestaticextern,EntryPoint=)]IntPtrFindWindow(stringIpClaSSName,stringIpWindowName);[DllImport( ,EntryPoint= )]privatestaticexternIntPtrFindWindOWEx(IntPtrhwndParentlpszClass,stringlpszWindow);[DllImport( , EntryPoint= )]privatestaticexternintSendMessage(IntPtrhWnd,intMsg,[DllImport( , EntryPoint= )]publicstatic extern IntPtrGetParent(IntPtr hWnd);IntPtrhwndChildAfter,stringIntPtrwParam,stringlParam);[DllImport(
publicstaticextern[DllImport(
ing=true)]publicstaticextern[DllImport(publicstaticextern
t);[DllImport(
publicstaticextern
StringBuilderIPString,int[DllImport(
publicstaticextern[DllImport(
publicstaticextern[DllImport(
publicstaticextern
bRepaint);,EntryPoint= )]boolGetCUrSorPos(outPointpt);,EntryPoint= ,CharSet=CharSet.Auto,ExactSpellIntPtrWindowFromPoint(Pointpt);,CharSet=CharSet.Auto)]
intGetCIaSSName(IntPtrhWnd,StringBuilderlpClassName,intnMaxCoun,CharSet=CharSet.Auto)]
intGetWindOwTeXt(IntPtrhWnd,[Out,MarShaIAS(UnmanagedTyPe.LPTStr)]
nMaxCount);,CharSet=CharSet.Auto)]
intGetWindOwReCt(IntPtrhwnd,refRectanglerc);,CharSet=CharSet.Auto)]
intGetClientRect(IntPtrhwnd,refRectanglerc);,CharSet=CharSet.Auto)]
intMOveWindow(IntPtrhwnd,intx,inty,intnWidth,intnHeight,bool[DllImport(publicstaticextern#endregion,CharSet=CharSet.Auto,SetLastError=true,ExactSpelling=true)]
intScreenToClient(IntPtrhWnd,refRectanglerect);#region封裝API方法///<summary>〃/找到句柄///</summary>/// 類名</param>///<returns></returns>publicstaticIntPtrGetHandle(stringIpCIassName){returnFindWindow(IpCIassName,null);}///<summary>///找到句柄///</summary>/// 坐標</param>///<returnsx/returns>publicstaticIntPtrGetHandle(Pointp)returnWindowFromPoint(p);//鼠標位置的坐標publicstaticPointGetCursorPosPoint()PointP=newPoint();if(GetCursorPos(outp))returnp;returndefault(Point);/…〃/子窗口句柄///</summary>/// 父窗口句柄</param>/// 前一個同目錄級同名窗口句柄</param>/// 類名</param>///<returns><∕returns>publicstaticIntPtrGetChildHandle(IntPtrhwndParent,IntPtrhwndChildAfter,stringIpszClass){returnFindWindowEx(hwndParent,hwndChildAfter,lpszClass,null);}///<summary>///全部子窗口句柄///</summary>/// 父窗口句柄</param>/// 類名</param>///<returns></returns>publicstaticList<IntPtr>GetChildHandleS(IntPtrhwndParent,stringClaSSName){List<IntPtr>resultList=newList<IntPtr>();for(IntPtrhwndClient=GetChildHandle(hwndParent,IntPtr.Zero,className);hwndClient=IntPtr.Zero;hwndClient=GetChildHandle(hwndParent,hwndClient,className)){resultList.Add(hwndClient);}returnresultList;}///<summary>〃/給窗口發(fā)送內(nèi)容///</summary>/// 句柄</param>/// 要發(fā)送的內(nèi)容</param>publicstaticvoidSetText(IntPtrhWnd,stringlParam){SendMessage(hWnd,WM_SETTEXT,IntPtr.Zero,lParam);}privateconstintWM_SETTEXT=0x000C;///<summary>///獲得窗口內(nèi)容或標題///</summary>/// 句柄</param>///<returns></returns>publicstaticstringGetText(IntPtrhWnd){StringBuilderresult=newStringBUilder(128);GetWindowText(hWnd,result,result.Capacity);returnresult.ToString();}///<summary>〃/找類名///</summary>/// 句柄</param>///<returns></returns>publicstaticstringGetClassName(IntPtrhWnd){StringBuilderlpClassName=newStringBUilder(128);if(GetClaSSName(hWnd,lpClassName,lpClassName.Capacity)==0){thrownewException( );}returnlpClassName.ToString();}///<summary>///窗口在屏幕位置///</summary>///句柄</param>///<returns><∕returns>publicstaticRectangleGetWindowRect(IntPtrhWnd){Rectangleresult=default(Rectangle);GetWindowRect(hWnd,refresult);returnresult;}///<summary>///窗口相對屏幕位置轉(zhuǎn)換成父窗口位置///</summary>/////////<returns></returns>publicstaticRectangleSCreenToCIient(IntPtrhWnd,Rectanglerect){Rectangleresult=rect;SCreenToClient(hWnd,refresult);returnresult;}///<summary>///窗口大小///</summary>//////<returns><∕returns>publicstaticRectangleGetClientRect(IntPtrhWnd){Rectangleresult=default(Rectangle);GetClientRect(hWnd,refresult);returnresult;}#endregion}publicclassWinHWND{publicIntPtrHWND{get;set;}publicstringClassName{get;set;}publicWinHWNDParent{get;set;}publicintInParentSequence{get;set;}privateRectangle_CUrrentRect;privatestring_Text;privateint_Left;privateint_Top;privateint_Width;privateintHeight;publicstringTextgetreturn_Text==default(String)?WinAPI.GetText(this.HWND):_Text;set_Text=value;WinAPI.SetText(this.HWND,value);publicintLeftgetreturn_Left==default(int)?_CUrrentRect.Left:_Left;set_Left=value;WinAPI.MoveWindow(this.HWND,value,this.Top,this.Width,this.Height,true)publicintTopget{return_Top==default(int)?_CurrentRect.Top:_Top;}set{_Top=value;WinAPI.MoveWindow(this.HWND,this.Left,value,this.Width,this.Height,true);}}publicintWidth{get{return_Width==default(int)?_currentRect.Width:_Width;}set{_Width=value;WinAPI.MoveWindow(this.HWND,this.Left,this.Top,value,this.Height,true);}}publicintHeight{get{returnHeight==default(int)?currentRect.Height:Height;}set{_Height=value;WinAPI.MoveWindow(this.HWND,this.Left,this.Top,this.Width,value,true);}}privateWinHWND(){}publicWinHWND(IntPtrhWnd){this.HWND=hWnd;this.ClassName=GetClaSSName();this.Parent=GetParent();this.InParentSequence=GetInParentSeqUence();this._currentRect=GetRect();}privatestringGetClassName(){returnWinAPI.GetClassName(this.HWND);}privateWinHWNDGetParent(){if(WinAPI.GetParent(this.HWND)==null){}thrownewException();if(WinAPI.GetParent(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)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(WinAPI.GetHandle(WinAPI.GetCursorPosPoint()));}publicoverridestringToString(){StringBuilderresult=newStringBuilder();for(WinHWNDWinHandle=this;WinHandle!=null;WinHandle=WinHandle.Parent){result.Append(string.Format( ,Escape(WinHandle.ClassName),WinHandle.InParentSequence.ToString()));if(WinHandle.I
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代中藥藥物分析方法的創(chuàng)新與應(yīng)用
- 光棍低保申請書
- 少先隊員申請書怎么畫
- 蘇書2025年度離婚協(xié)議書中關(guān)于婚后財產(chǎn)分割的特別約定
- 電子競技文化的國際傳播與接受度分析
- 現(xiàn)代企業(yè)智能供應(yīng)鏈建設(shè)的策略分析
- 2025年度智能家居安防系統(tǒng)安裝合同
- 2025年度國際供應(yīng)鏈合作合同范本
- 電子商務(wù)的物流配送優(yōu)化與管理
- 2025年度新型環(huán)保動力船舶租賃合作協(xié)議
- 2025年汽車零部件項目可行性研究報告
- (一診)畢節(jié)市2025屆高三第一次診斷性考試 英語試卷(含答案)
- 油氣長輸管道檢查標準清單
- 《酸棗營銷戰(zhàn)略》課件
- 小學(xué)二年級100以內(nèi)連加連減豎式計算練習(xí)題
- 圖像敘事的跨學(xué)科視野-洞察分析
- 2025年天津市政集團公司招聘筆試參考題庫含答案解析
- 急性缺血性卒中再灌注治療指南2024解讀
- 醫(yī)院醫(yī)用織物洗滌(租賃)服務(wù)方案投標文件
- 2022年濰坊工程職業(yè)學(xué)院單招英語題庫及答案解析
- 中建醫(yī)院幕墻工程專項方案
評論
0/150
提交評論