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

下载本文档

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

文档简介

1、C# 写个类操作窗口(句柄操作)实现过程:过程一:找到当前鼠标位置的句柄您的使用2 个 WinAPI(俺喜欢自己封装下来用):View CodeDllImport("user32.dll", EntryPoint ="GetCursorPos")publicstaticexternboolGetCursorPos(outPoint pt);DllImport("user32.dll", EntryPoint ="WindowFromPoint")publicstaticexternIntPtr WindowFrom

2、Point(Point pt);/ 鼠标位置的坐标publicstaticPoint GetCursorPosPoint()Point p =new Point();if(GetCursorPos(out p)returnp;returndefault(Point);/ <summary>./ 找到句柄/ </summary>/<param name="p">坐标 </param>/ <returns></returns>publicstaticIntPtr GetHandle(Point p)retu

3、rnWindowFromPoint(p);过程二:改变窗口的Text您的使用1 个 WinAPI:View CodeDllImport("user32.dll", EntryPoint ="SendMessage")privatestaticexternintSendMessage(IntPtr hWnd,intMsg, IntPtr wParam,stringlParam);/ <summary>/ 给窗口发送内容/ </summary>/<param name="hWnd">句柄 </pa

4、ram>/<param name="lParam">要发送的内容 </param>publicstaticvoidSetText(IntPtr hWnd,stringlParam).SendMessage(hWnd, WM_SETTEXT, IntPtr.Zero, lParam);privateconstintWM_SETTEXT = 0x000C ;通过这个方法就能改变Text的值了。思考:如果俺把这个窗口的句柄记录下来,下次不用鼠标获取,直接就能改变值不蛮好的嘛。例如:我有个桌面系统老叫我输入用户名,密码。我记录用户名和密码的窗口句柄,然

5、后改变他们的输入值,这样多省事。(只是举例,不考虑安全性)问题:你会告诉我,窗口句柄的每次重建会变的呀,咋办。回答:类名不变呀。过程三:您的准备一些工具吧,例如:句柄找类名呀,类名找句柄什么的等等,下面会用到一些WinAPIView CodeDllImport("user32.dll", EntryPoint ="FindWindow")privatestaticexternIntPtr FindWindow(stringIpClassName,stringIpWindowName);DllImport("user32.dll", E

6、ntryPoint ="FindWindowEx")privatestaticexternIntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter,stringlpszClass,stringlpszWindow);DllImport("user32.dll", EntryPoint ="GetParent")publicstaticexternIntPtr GetParent(IntPtr hWnd);DllImport("user32.dll",

7、CharSet = CharSet.Auto)publicstaticexternint GetClassName(IntPtr hWnd, StringBuilder lpClassName,int nMaxCount);./ <summary>/ 找到句柄/ </summary>/<param name="IpClassName">类名 </param>/ <returns></returns>publicstaticIntPtr GetHandle(stringIpClassName)return

8、FindWindow(IpClassName,null);/ <summary>/ 子窗口句柄/ </summary>/<param name="hwndParent">父窗口句柄 </param>/<param name="hwndChildAfter">前一个同目录级同名窗口句柄</param>/<param name="lpszClass">类名 </param>/ <returns></returns>pub

9、licstaticIntPtr GetChildHandle(IntPtr hwndParent, IntPtr hwndChildAfter,stringlpszClass).returnFindWindowEx(hwndParent, hwndChildAfter, lpszClass,null);/ <summary>/ 全部子窗口句柄/ </summary>/<param name="hwndParent">父窗口句柄 </param>/<param name="className">类

10、名 </param>/ <returns></returns>publicstaticList<IntPtr> GetChildHandles(IntPtr hwndParent,stringclassName)List<IntPtr> resultList =new List<IntPtr>();for(IntPtr hwndClient = GetChildHandle(hwndParent, IntPtr.Zero, className); hwndClient != IntPtr.Zero; hwndClient

11、= GetChildHandle(hwndParent, hwndClient, className)resultList.Add(hwndClient);returnresultList;/ <summary>/ 找类名./ </summary>/<param name="hWnd">句柄 </param>/ <returns></returns>publicstaticstringGetClassName(IntPtr hWnd)StringBuilder lpClassName =new Stri

12、ngBuilder(128 );if(GetClassName(hWnd, lpClassName, lpClassName.Capacity) =0)thrownew Exception("not found IntPtr!");returnlpClassName.ToString();思考:遍历桌面上所有的窗口,然后找类名,然后改他的Text ,扯淡嘛 , 相同的类名太多了,找毛呀。实现:不仅记录类名,而且记录类名在父窗口出现的位置,然后通过桌面一层层找下来,最后找到这个句柄。(虽然不是太准,但是一般的还是能解决了,如果你有什么好方式一起研究)。过程四:实现一个 Win

13、HWND 的类,可以把他的规则,他的父窗口类名,以及在父窗口中同类名出现的顺序记录下来,然后通过这些记录的信息还原句柄。View CodepublicclassWinHWNDpublicIntPtr HWND get ;set ; publicstringClassName get ;set ; publicWinHWND Parent get ;set ; publicintInParentSequence get ;set ; .privateWinHWND() publicWinHWND(IntPtr hWnd)this.HWND = hWnd;this.ClassName = GetC

14、lassName();this.Parent = GetParent();this.InParentSequence = GetInParentSequence();privatestringGetClassName()return WinAPI.GetClassName(this .HWND);privateWinHWND GetParent()if(WinAPI.GetParent(this.HWND) = null)thrownew Exception("not found IntPtr!");if(WinAPI.GetParent(this.HWND) = IntP

15、tr.Zero)returnnull ;.returnnew WinHWND(WinAPI.GetParent(this.HWND);privateintGetInParentSequence()IntPtr IntprtParent =this.Parent =null? IntPtr.Zero :this.Parent.HWND;returnWinAPI.GetChildHandles(IntprtParent,this.ClassName).IndexOf(this.HWND);publicoverridestringToString()StringBuilder result =new

16、 StringBuilder();for(WinHWND winHandle =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('');privates

17、taticstringGetBaseMark(stringsMark)string sMarks = sMark.Split('');returnsMarkssMarks.Length -1.Split(':') 0;.privatestaticstring GetChildMarks(stringsMark)string sMarks = sMark.Split('');string sChildMarks =new stringsMarks.Length -1;for (int i =0; i < sChildMarks.Length;

18、 i + )sChildMarksi = sMarksi ;returnsChildMarks;/ 我一直觉得这段写很丑陋,谁能帮帮我改改publicstaticWinHWND GetWinHWND( stringsMark)List<IntPtr> baseHwnds = WinAPI.GetChildHandles(IntPtr.Zero, GetBaseMark(sMark); string sChildMarks = GetChildMarks(sMark);/ 由于主窗口在桌面出现所以很可能同名,所以要看看他的儿子和孙子.是不是都匹配foreach(IntPtr base

19、HwndinbaseHwnds)IntPtr handle = baseHwnd;for( inti = sChildMarks.Length -1; i >=0; i-)string sChildMark = sChildMarksi.Split(':');.tryhandle = WinAPI.GetChildHandles(handle, UnEscape(sChildMark0)int.Parse(sChildMark1);catchbreak ;if(i =0)returnnew WinHWND(handle);continue;returnnull;#regi

20、on转义privatestaticstringEscape(stringarg)returnarg.Replace(":",":").Replace("", "");privatestaticstringUnEscape(stringarg).returnarg.Replace(":",":").Replace("","");#endregionpublicstaticWinHWND GetWinHWND()returnnew WinH

21、WND(WinAPI.GetHandle(WinAPI.GetCursorPosPoint();上全部代码,里面加了窗口的部分属性,扩展其他的属性,自己发挥吧,就是搞WinAPIView CodeusingSystem;usingSystem.Linq;usingSystem.Text;usingSystem.Drawing;usingSystem.Collections;namespaceInformationCollectionDataFillpublicclassWinAPI#regionWinodwsAPIDllImport("user32.dll", EntryP

22、oint ="FindWindow").privatestaticexternIntPtr FindWindow(stringIpClassName,stringIpWindowName);DllImport("user32.dll", EntryPoint ="FindWindowEx")privatestaticexternIntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter,stringlpszClass,stringlpszWindow);DllImport(

23、"user32.dll", EntryPoint ="SendMessage")privatestaticexternintSendMessage(IntPtr hWnd,intMsg, IntPtr wParam,stringlParam);DllImport("user32.dll", EntryPoint ="GetParent")publicstaticexternIntPtr GetParent(IntPtr hWnd);DllImport("user32.dll", EntryPoi

24、nt ="GetCursorPos")publicstaticexternboolGetCursorPos(out Point pt);DllImport("user32.dll", EntryPoint ="WindowFromPoint", CharSet = CharSet.Auto, ExactSpelling = true)publicstaticexternIntPtr WindowFromPoint(Point pt);DllImport("user32.dll", CharSet = CharSet

25、.Auto)publicstaticexternintGetClassName(IntPtr hWnd, StringBuilder lpClassName,intnMaxCount);DllImport("user32.dll", CharSet = CharSet.Auto)publicstaticexternintGetWindowText(IntPtr hWnd, Out, MarshalAs(UnmanagedType.LPTStr)StringBuilder lpString,intnMaxCount);.DllImport("user32.dll&q

26、uot;, CharSet = CharSet.Auto)publicstaticexternintGetWindowRect(IntPtr hwnd,refRectangle rc);DllImport("user32.dll", CharSet = CharSet.Auto)publicstaticexternintGetClientRect(IntPtr hwnd,refRectangle rc);DllImport("user32.dll", CharSet = CharSet.Auto)publicstaticexternintMoveWind

27、ow(IntPtr hwnd,int x,int y, int nWidth,int nHeight,boolbRepaint);DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError =true , ExactSpelling =true )publicstaticexternintScreenToClient(IntPtr hWnd,refRectangle rect);#endregion#region封装 API 方法/ <summary>/ 找到句柄/ </summary>/

28、<param name="IpClassName">类名 </param>/ <returns></returns>publicstaticIntPtr GetHandle(stringIpClassName).returnFindWindow(IpClassName,null);/ <summary>/ 找到句柄/ </summary>/<param name="p">坐标 </param>/ <returns></returns>p

29、ublicstaticIntPtr GetHandle(Point p)returnWindowFromPoint(p);/ 鼠标位置的坐标publicstaticPoint GetCursorPosPoint()Point p =new Point();if(GetCursorPos(outp)returnp;returndefault(Point);./ <summary>/ 子窗口句柄/ </summary>/<param name="hwndParent">父窗口句柄 </param>/<param name=&

30、quot;hwndChildAfter">前一个同目录级同名窗口句柄</param>/<param name="lpszClass">类名 </param>/ <returns></returns>publicstaticIntPtr GetChildHandle(IntPtr hwndParent, IntPtr hwndChildAfter,stringlpszClass)returnFindWindowEx(hwndParent, hwndChildAfter, lpszClass,null)

31、;/ <summary>/ 全部子窗口句柄/ </summary>/<param name="hwndParent">父窗口句柄 </param>/<param name="className">类名 </param>./ <returns></returns>publicstaticList<IntPtr> GetChildHandles(IntPtr hwndParent,stringclassName)List<IntPtr> r

32、esultList =new List<IntPtr>();for(IntPtr hwndClient = GetChildHandle(hwndParent, IntPtr.Zero, className); hwndClient != IntPtr.Zero; hwndClient = GetChildHandle(hwndParent, hwndClient, className)resultList.Add(hwndClient);returnresultList;/ <summary>/ 给窗口发送内容/ </summary>/<param

33、name="hWnd">句柄 </param>/<param name="lParam">要发送的内容 </param>publicstaticvoidSetText(IntPtr hWnd,stringlParam)SendMessage(hWnd, WM_SETTEXT, IntPtr.Zero, lParam);privateconstintWM_SETTEXT = 0x000C ;./ <summary>/ 获得窗口内容或标题/ </summary>/<param name=

34、"hWnd">句柄 </param>/ <returns></returns>publicstaticstringGetText(IntPtr hWnd)StringBuilder result =new StringBuilder(128 );GetWindowText(hWnd, result, result.Capacity);returnresult.ToString();/ <summary>/ 找类名/ </summary>/<param name="hWnd">句

35、柄 </param>/ <returns></returns>publicstaticstringGetClassName(IntPtr hWnd)StringBuilder lpClassName =new StringBuilder(128 );if(GetClassName(hWnd, lpClassName, lpClassName.Capacity) =0).thrownew Exception("not found IntPtr!");returnlpClassName.ToString();/ <summary>

36、/ 窗口在屏幕位置/ </summary>/<param name="hWnd">句柄 </param>/ <returns></returns>publicstaticRectangle GetWindowRect(IntPtr hWnd)Rectangle result =default(Rectangle);GetWindowRect(hWnd,refresult);returnresult;/ <summary>/ 窗口相对屏幕位置转换成父窗口位置/ </summary>/ <

37、param name="hWnd"></param>/ <param name="rect"></param>./ <returns></returns>publicstaticRectangle ScreenToClient(IntPtr hWnd, Rectangle rect)Rectangle result = rect;ScreenToClient(hWnd,refresult);returnresult;/ <summary>/ 窗口大小/ </summary

38、>/ <param name="hWnd"></param>/ <returns></returns>publicstaticRectangle GetClientRect(IntPtr hWnd)Rectangle result =default(Rectangle);GetClientRect(hWnd,refresult);returnresult;#endregionpublicclassWinHWNDpublicIntPtr HWND get ;set ; .publicstringClassName get

39、;set ; publicWinHWND Parent get ;set ; publicintInParentSequence get ;set ; privateRectangle _currentRect;privatestring_Text;privateint_Left;privateint_Top;privateint_Width;privateint_Height;publicstringTextgetreturn_Text =default( string) ? WinAPI.GetText(this.HWND) : _Text;set_Text = value;WinAPI.

40、SetText(this.HWND, value);publicintLeftget.return_Left =default( int) ? _currentRect.Left : _Left;set_Left = value;WinAPI.MoveWindow(this.HWND, value,this.Top,this.Width,this.Height,true);publicintTopgetreturn_Top =default( int) ? _currentRect.Top : _Top;set_Top = value;WinAPI.MoveWindow(this.HWND,

41、this.Left, value,this.Width,this.Height,true);publicintWidthgetreturn_Width =default( int) ? _currentRect.Width : _Width;.set_Width = value;WinAPI.MoveWindow(this.HWND, this.Left,this.Top, value,this.Height,true);publicintHeightgetreturn_Height =default( int) ? _currentRect.Height : _Height;set_Heig

42、ht = value;WinAPI.MoveWindow(this.HWND, this.Left,this.Top,this.Width, value,true);privateWinHWND() publicWinHWND(IntPtr hWnd)this.HWND = hWnd;this.ClassName = GetClassName();this.Parent = GetParent();.this.InParentSequence = GetInParentSequence();this._currentRect = GetRect();privatestringGetClassN

43、ame()returnWinAPI.GetClassName(this.HWND);privateWinHWND GetParent()if(WinAPI.GetParent(this.HWND) =null)thrownew Exception("not found IntPtr!");if(WinAPI.GetParent(this.HWND) = IntPtr.Zero)returnnull;returnnew WinHWND(WinAPI.GetParent(this.HWND);privateintGetInParentSequence()IntPtr Intpr

44、tParent =this.Parent =null? IntPtr.Zero :this.Parent.HWND;returnWinAPI.GetChildHandles(IntprtParent,this.ClassName).IndexOf(this.HWND);.privateRectangle GetRect()if( this.Parent =null)returndefault(Rectangle);Rectangle clientSize = WinAPI.GetClientRect(this.HWND);Rectangle clientPoint = WinAPI.ScreenToClient(this.Parent.HWND, WinAPI.GetWindowRect(this .HWND);returnnew Rectangle(clientPoint.X, clientPoint.Y, clientSize.Width, clientSize.Height);publicstaticWinHWND GetWinHWND()returnnew WinHWND(WinAPI.GetHandle(WinAPI.GetCursorPosPoint();publicoverridestringToStr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论