C#操作窗口类句柄操作_第1页
C#操作窗口类句柄操作_第2页
C#操作窗口类句柄操作_第3页
C#操作窗口类句柄操作_第4页
C#操作窗口类句柄操作_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论