版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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>///给窗口发送容
///</summary>///<paramname="hWnd">句柄</param>///<paramname="lParam">要发送的容</param>
publicstaticvoidSetTe*t(IntPtrhWnd,stringlParam)
{
SendMessage(hWnd,WM_SETTE*T,IntPtr.Zero,lParam);
}
privateconstintWM_SETTE*T=0*000C;通过这个方法就能改变Te*t的值了。思考:如果俺把这个窗口的句柄记录下来,下次不用鼠标获取,直接就能改变值不蛮好的嘛。例如:我有个桌面系统老叫我输入用户名,密码。我记录用户名和密码的窗口句柄,然后改变他们的输入值,这样多省事。〔只是举例,不考虑平安性〕问题:你会告诉我,窗口句柄的每次重建会变的呀,咋办。答复:类名不变呀。过程三:您的准备一些工具吧,例如:句柄找类名呀,类名找句柄什么的等等,下面会用到一些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的类,可以把他的规则,他的父窗口类名,以及在父窗口中同类名出现的顺序记录下来,然后通过这些记录的信息复原句柄。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()));
}
}上全部代码,里面加了窗口的局部属性,扩展其他的属性,自己发挥吧,就是搞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>///给窗口发送容
///</summary>///<paramname="hWnd">句柄</param>///<paramname="lParam">要发送的容</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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年竞选班干部演讲稿模板参考
- 牵引过程中的观察与护理
- 母婴护理中的服务趋势分析
- 2026年高端装备再制造技术攻关与产业化
- 2026年低空空域综合管理改革试点省份申报条件与福建建议解析
- 2026年日发精机丝杆 螺母内螺纹磨床机器人领域精密加工应用
- 2025年前台服务考核模拟
- 2025年前台服务规范考核测试
- 混凝土道路施工方案
- 2026年长三角经济总量占全国近1 4后的发展新格局分析
- 2026 年山东春季高考车辆维修类专业知识(理论)模拟试题(二)
- 1.2 利用自然物辨别方向 课件(内嵌视频)-2025-2026学年科学三年级下册教科版
- 2026春季浙江嘉兴市平湖农商银行招聘考试参考题库及答案解析
- 五年级数学(小数乘除法)计算题及答案
- 军事高科技知识教程
- 中药材山茱萸种植与炭疽病防治和治疗技术
- 【SA8000内审完整内容】SA8000-2014社会责任内部审核记录
- 口腔科医务人员职业暴露
- 电动气动调节阀课件
- 立论有为才有位辩论材料
- 人教版新课标二年级语文下册全册教案(表格式)
评论
0/150
提交评论