




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C*寫個類操作窗口〔句柄操作〕實現過程:過程一:找到當前鼠標位置的句柄您的使用2個WinAPI〔俺喜歡自己封裝下來用〕:ViewCode[DllImport("user32.dll",EntryPoint="GetCursorPos")]
publicstatice*ternboolGetCursorPos(outPointpt);
[DllImport("user32.dll",EntryPoint="WindowFromPoint")]
publicstatice*ternIntPtrWindowFromPoint(Pointpt);
//鼠標位置的坐標
publicstaticPointGetCursorPosPoint()
{
Pointp=newPoint();
if(GetCursorPos(outp))
{
returnp;
}
returndefault(Point);
}
///<summary>///找到句柄
///</summary>///<paramname="p">坐標</param>///<returns></returns>
publicstaticIntPtrGetHandle(Pointp)
{
returnWindowFromPoint(p);
}過程二:改變窗口的Te*t您的使用1個WinAPI:ViewCode[DllImport("user32.dll",EntryPoint="SendMessage")]
privatestatice*ternintSendMessage(IntPtrhWnd,intMsg,IntPtrwParam,stringlParam);
///<summary>///給窗口發(fā)送容
///</summary>///<paramname="hWnd">句柄</param>///<paramname="lParam">要發(fā)送的容</param>
publicstaticvoidSetTe*t(IntPtrhWnd,stringlParam)
{
SendMessage(hWnd,WM_SETTE*T,IntPtr.Zero,lParam);
}
privateconstintWM_SETTE*T=0*000C;通過這個方法就能改變Te*t的值了。思考:如果俺把這個窗口的句柄記錄下來,下次不用鼠標獲取,直接就能改變值不蠻好的嘛。例如:我有個桌面系統(tǒng)老叫我輸入用戶名,密碼。我記錄用戶名和密碼的窗口句柄,然后改變他們的輸入值,這樣多省事?!仓皇桥e例,不考慮平安性〕問題:你會告訴我,窗口句柄的每次重建會變的呀,咋辦。答復:類名不變呀。過程三:您的準備一些工具吧,例如:句柄找類名呀,類名找句柄什么的等等,下面會用到一些WinAPIViewCode[DllImport("user32.dll",EntryPoint="FindWindow")]
privatestatice*ternIntPtrFindWindow(stringIpClassName,stringIpWindowName);
[DllImport("user32.dll",EntryPoint="FindWindowE*")]
privatestatice*ternIntPtrFindWindowE*(IntPtrhwndParent,IntPtrhwndChildAfter,stringlpszClass,stringlpszWindow);
[DllImport("user32.dll",EntryPoint="GetParent")]
publicstatice*ternIntPtrGetParent(IntPtrhWnd);
[DllImport("user32.dll",CharSet=CharSet.Auto)]
publicstatice*ternintGetClassName(IntPtrhWnd,StringBuilderlpClassName,intnMa*Count);
///<summary>///找到句柄
///</summary>///<paramname="IpClassName">類名</param>///<returns></returns>
publicstaticIntPtrGetHandle(stringIpClassName)
{
returnFindWindow(IpClassName,null);
}
///<summary>///子窗口句柄
///</summary>///<paramname="hwndParent">父窗口句柄</param>///<paramname="hwndChildAfter">前一個同目錄級同名窗口句柄</param>///<paramname="lpszClass">類名</param>///<returns></returns>
publicstaticIntPtrGetChildHandle(IntPtrhwndParent,IntPtrhwndChildAfter,stringlpszClass)
{
returnFindWindowE*(hwndParent,hwndChildAfter,lpszClass,null);
}
///<summary>///全部子窗口句柄
///</summary>///<paramname="hwndParent">父窗口句柄</param>///<paramname="className">類名</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>///<paramname="hWnd">句柄</param>///<returns></returns>
publicstaticstringGetClassName(IntPtrhWnd)
{
StringBuilderlpClassName=newStringBuilder(128);
if(GetClassName(hWnd,lpClassName,lpClassName.Capacity)==0)
{
thrownewE*ception("notfoundIntPtr!");
}
returnlpClassName.ToString();
}思考:遍歷桌面上所有的窗口,然后找類名,然后改他的Te*t,扯淡嘛,一樣的類名太多了,找毛呀。實現:不僅記錄類名,而且記錄類名在父窗口出現的位置,然后通過桌面一層層找下來,最后找到這個句柄。〔雖然不是太準,但是一般的還是能解決了,如果你有什么好方式一起研究〕。過程四:實現一個WinHWND的類,可以把他的規(guī)則,他的父窗口類名,以及在父窗口中同類名出現的順序記錄下來,然后通過這些記錄的信息復原句柄。ViewCodepublicclassWinHWND
{
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)
{
thrownewE*ception("notfoundIntPtr!");
}
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).Inde*Of(this.HWND);
}
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)
{
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);
//由于主窗口在桌面出現所以很可能同名,所以要看看他的兒子和子...是不是都匹配
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轉義
privatestaticstringEscape(stringarg)
{
returnarg.Replace(":","\\:").Replace(";","\\;");
}
privatestaticstringUnEscape(stringarg)
{
returnarg.Replace("\\:",":").Replace("\\;",";");
}
*endregionpublicstaticWinHWNDGetWinHWND()
{
returnnewWinHWND(WinAPI.GetHandle(WinAPI.GetCursorPosPoint()));
}
}上全部代碼,里面加了窗口的局部屬性,擴展其他的屬性,自己發(fā)揮吧,就是搞WinAPIViewCodeusingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Te*t;
usingSystem.Runtime.InteropServices;
usingSystem.Drawing;
usingSystem.Collections;
namespaceInformationCollectionDataFill
{
publicclassWinAPI
{
*regionWinodwsAPI
[DllImport("user32.dll",EntryPoint="FindWindow")]
privatestatice*ternIntPtrFindWindow(stringIpClassName,stringIpWindowName);
[DllImport("user32.dll",EntryPoint="FindWindowE*")]
privatestatice*ternIntPtrFindWindowE*(IntPtrhwndParent,IntPtrhwndChildAfter,stringlpszClass,stringlpszWindow);
[DllImport("user32.dll",EntryPoint="SendMessage")]
privatestatice*ternintSendMessage(IntPtrhWnd,intMsg,IntPtrwParam,stringlParam);
[DllImport("user32.dll",EntryPoint="GetParent")]
publicstatice*ternIntPtrGetParent(IntPtrhWnd);
[DllImport("user32.dll",EntryPoint="GetCursorPos")]
publicstatice*ternboolGetCursorPos(outPointpt);
[DllImport("user32.dll",EntryPoint="WindowFromPoint",CharSet=CharSet.Auto,E*actSpelling=true)]
publicstatice*ternIntPtrWindowFromPoint(Pointpt);
[DllImport("user32.dll",CharSet=CharSet.Auto)]
publicstatice*ternintGetClassName(IntPtrhWnd,StringBuilderlpClassName,intnMa*Count);
[DllImport("user32.dll",CharSet=CharSet.Auto)]
publicstatice*ternintGetWindowTe*t(IntPtrhWnd,[Out,MarshalAs(UnmanagedType.LPTStr)]StringBuilderlpString,intnMa*Count);
[DllImport("user32.dll",CharSet=CharSet.Auto)]
publicstatice*ternintGetWindowRect(IntPtrhwnd,refRectanglerc);
[DllImport("user32.dll",CharSet=CharSet.Auto)]
publicstatice*ternintGetClientRect(IntPtrhwnd,refRectanglerc);
[DllImport("user32.dll",CharSet=CharSet.Auto)]
publicstatice*ternintMoveWindow(IntPtrhwnd,int*,inty,intnWidth,intnHeight,boolbRepaint);
[DllImport("user32.dll",CharSet=CharSet.Auto,SetLastError=true,E*actSpelling=true)]
publicstatice*ternintScreenToClient(IntPtrhWnd,refRectanglerect);
*endregion*region封裝API方法
///<summary>///找到句柄
///</summary>///<paramname="IpClassName">類名</param>///<returns></returns>
publicstaticIntPtrGetHandle(stringIpClassName)
{
returnFindWindow(IpClassName,null);
}
///<summary>///找到句柄
///</summary>///<paramname="p">坐標</param>///<returns></returns>
publicstaticIntPtrGetHandle(Pointp)
{
returnWindowFromPoint(p);
}
//鼠標位置的坐標
publicstaticPointGetCursorPosPoint()
{
Pointp=newPoint();
if(GetCursorPos(outp))
{
returnp;
}
returndefault(Point);
}///<summary>///子窗口句柄
///</summary>///<paramname="hwndParent">父窗口句柄</param>///<paramname="hwndChildAfter">前一個同目錄級同名窗口句柄</param>///<paramname="lpszClass">類名</param>///<returns></returns>
publicstaticIntPtrGetChildHandle(IntPtrhwndParent,IntPtrhwndChildAfter,stringlpszClass)
{
returnFindWindowE*(hwndParent,hwndChildAfter,lpszClass,null);
}
///<summary>///全部子窗口句柄
///</summary>///<paramname="hwndParent">父窗口句柄</param>///<paramname="className">類名</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ā)送容
///</summary>///<paramname="hWnd">句柄</param>///<paramname="lParam">要發(fā)送的容</param>
publicstaticvoidSetTe*t(IntPtrhWnd,stringlParam)
{
SendMessage(hWnd,WM_SETTE*T,IntPtr.Zero,lParam);
}
privateconstintWM_SETTE*T=0*000C;
///<summary>///獲得窗口容或標題
///</summary>///<paramname="hWnd">句柄</param>///<returns></returns>
publicstaticstringGetTe*t(IntPtrhWnd)
{
StringBuilderresult=newStringBuilder(128);
GetWindowTe*t(hWnd,result,result.Capacity);
returnresult.ToString();
}
///<summary>///找類名
///</summary>///<paramname="hWnd">句柄</param>///<returns></returns>
publicstaticstringGetClassName(IntPtrhWnd)
{
StringBuilderlpClassName=newStringBuilder(128);
if(GetClassName(hWnd,lpClassName,lpClassName.Capacity)==0)
{
thrownewE*ception("notfoundIntPtr!");
}
returnlpClassName.ToString();
}
///<summary>///窗口在屏幕位置
///</summary>///<paramname="hWnd">句柄</param>///<returns></returns>
publicstaticRectangleGetWindowRect(IntPtrhWnd)
{
Rectangleresult=default(Rectangle);
GetWindowRect(hWnd,refresult);
returnresult;
}
///<summary>///窗口相對屏幕位置轉換成父窗口位置
///</summary>///<paramname="hWnd"></param>///<paramname="rect"></param>///<returns></returns>
publicstaticRectangleScreenToClient(IntPtrhWnd,Rectanglerect)
{
Rectangleresult=rect;
ScreenToClient(hWnd,refresult);
returnresult;
}
///<summary>///窗口大小
///</summary>///<paramname="hWnd"></param>///<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_Te*t;
privateint_Left;
privateint_Top;
privateint_Width;
privateint_Height;
publicstringTe*t
{
get
{
return_Te*t==default(string)"WinAPI.GetTe*t(this.HWND):_Te*t;
}
set
{
_Te*t=value;
WinAPI.SetTe*t(this.HWND,value);
}
}
publicintLeft
{
get
{
return_Left==default(int)"_currentRect.Left:_Left;
}
set
{
_Left=value;
WinAPI.MoveWindow(this.HWND,value,this.Top,this.Width,this.Height,true);
}
}
publicintTop
{
get
{
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
{
return_Height==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)
{
thrownewE*ception("notfoundIntPtr!");
}
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).Inde*Of(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.*,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("{0}:{1};",Escape(winHandle.ClassName),winHandle.InParentSequence.ToString()));
if(winHandle.InP
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 城市河道清淤施工方案
- 工地施工勞務用工合同
- 土地出讓合同補充協(xié)議
- 霓虹燈施工方案
- 合金網兜施工方案
- 配電線路施工方案
- 南通輕質混凝土施工方案
- 塑料管卡箍連接施工方案
- 臨朐立柱宣傳欄施工方案
- 建筑工程勞務用工協(xié)議
- 庫車縣“7.9”天山煉化油儲罐火災撲救戰(zhàn)評
- 金屬結構制造安全作業(yè)指導書
- 眼外傷-PPT課件
- 教學-主動脈夾層PPT課件
- 上海市企業(yè)投資項目核準、備案及建設審批流程指南
- 絕句遲日江山麗
- 船體開孔規(guī)則
- (精選)沸騰焙燒爐設計相關計算
- 多元化與專業(yè)化的利弊之爭
- ASMEB16.14-1991中文版鋼鐵管螺紋管堵、內外螺絲和鎖緊螺母
- 《雕塑工程工程量清單計價定額》
評論
0/150
提交評論