WPF窗口如何获得窗口句柄一个句柄

C#+API实现指定窗体激活 - 翠竹林 - 博客园
不熟悉API使得我为了实现一个简单的功能浪费了很长的时间,下面就把自己查阅的相关东西做个总结:
常用的处理窗体的API函数如下(注意:API函数必须放在窗体中...):
使用C#语言,要引用DllImport,必须要添加using System.Runtime.InteropServices命名空间
(1)获得当前前台窗体句柄
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]public static extern IntPtr GetForegroundWindow();
返回值类型是IntPtr,即为当前获得焦点窗口的句柄
使用方法 :&& IntPtr myPtr=GetForegroundWindow();
(2)枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数,利用该法可以获得所有当前打开的窗体的句柄信息&
[DllImport("user32.dll")]public static extern &bool&EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam);
其中lpEnumFunc指向一个应用程序定义的回调函数指针;
lparam指向一个传递给回调函数的应用程序的定义值;
回调函数原型
bool CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lparam);
其中hwnd是一个顶层窗口的句柄
lparam是一个应用程序定义的一个值(即EnumWindows中lParam)
下面用一个例子对该方法说明
程序中要实现一个功能:可以在当前打开的窗体中找到目标窗体,并在需要时将其激活,置为前台窗体
using System.Collections.G
using System.L
using System.T
using System.Runtime.InteropS//调用DLLIMPORT
namespace EmuWindowInfor
/// &summary&
/// 调用API的EnumWindows来枚举窗口
/// &/summary&
class Program
//定义句柄的全局变量
public int HANDLE;
//定义回调函数的委托
public delegate bool CALLBACK(int hwnd,int lparm);
//用于获取前台窗口句柄,设置当前窗口句柄
[DllImport("user32.dll")]
public static extern int EnumWindows(CALLBACK x, int y);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int GetWindowText(int hWnd, StringBuilder lpText, int nCount);
static void Main(string[] args)
CALLBACK myCallBack = new CALLBACK(Report);
EnumWindows(myCallBack, 0);
Console.ReadKey();
//实例化回调函数(可以在回调函数中根据窗体名称找到目标窗体句柄)
public static bool Report(int hwnd,int lparm)
//分配空间
var sb = new StringBuilder(50);
GetWindowText(hwnd, sb, sb.Capacity);
//注意某些窗口没有标题
if (sb.ToString() != String.Empty)
Console.WriteLine(sb.ToString());
//if (sb.ToString() == "Microsoft PowerPoint - [les_03_使用_rman [兼容模式]]")
Console.WriteLine(hwnd.ToString());
//回调函数有返回值
return true;
以上代码实现了通过窗体名称找到目标窗体的句柄,再利用API函数SetForegroundWindow来将该窗体激活并前置
[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(int hWnd);
其中hWnd就是目标窗体的句柄
(3)根据窗体的类名和窗口的名称获得目标窗体
[DllImport("coredll.dll", EntryPoint = "FindWindow")]private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
其中lpClassName是要找的窗口的类
lpWindowName是要找的窗口的标题,当然在搜索的时候不一定两者都要知道,但至少要知道一个。根据窗口标题查找的一般多用在多窗口的应用程序中,因为程序中的窗体标题固定,方便搜索。但要是对于系统中
的一些窗体,例如记事本窗体,PPT等,窗体的标题是不定的,所以用窗口类搜索更方便。当然有关常见的窗口类可以很方便找到,下面是一个搜索当前打开文本文档的窗口句柄的代码
IntPtr ParenthWnd = new IntPtr(0);
ParenthWnd = FindWindow(null,"Word Mobile");
//判断这个窗体是否有效
if (ParenthWnd != IntPtr.Zero)
MessageBox.Show("找到窗口");
MessageBox.Show("没有找到窗口");
如果用VC开发平台,可以使用其中的Spy快速的找到窗口的类型,在Spy++中有一个FindWindow工具,它允许你使用鼠标选择窗口,然后Spy++会显示这个窗口的类。
同时在微软的帮助文档中也给出了对微软常用OFFICE工具窗体句柄查找的方法,同样是用FindWindow()方法,链接:/kb/302295/zh-cn
(4)查找子窗体的方法
[DllImport("user32.dll", EntryPoint = "FindWindow")]private static extern IntPtr FindWindowEx( IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow )
其中hwndParent是要查找子窗口的父窗口句柄,如果hwndParent为Null,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口;如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口;
& & hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndPareRt窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。
&&&&lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。
&&&&lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。总之,这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。
下面通过一个简单的例子来说明对子窗口的查找。相信大家都有QQ号,那么就写一个简单的外挂:通过查找QQ登陆窗口并模拟按键实现QQ的自动登陆,以下只是介绍其中如何通过父窗体查找子窗体
const int BM_CLICK = 0xF5;
IntPtr maindHwnd = FindWindow(null, "QQ用户登录"); //获得QQ登陆框的句柄
if (maindHwnd != IntPtr.Zero)
IntPtr childHwnd = FindWindowEx(maindHwnd, IntPtr.Zero, null, "登录");
//获得按钮的句柄
if (childHwnd != IntPtr.Zero)
SendMessage(childHwnd, BM_CLICK, 0, 0);
//发送点击按钮的消息
MessageBox.Show("没有找到子窗口");
MessageBox.Show("没有找到窗口");
(5)找到窗体后对其的简单处理,比如开关,隐藏
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
其中ShowWindow(IntPtr hwnd, int nCmdShow);
nCmdShow的含义
0&&& 关闭窗口
1&&& 正常大小显示窗口
2&&& 最小化窗口
3&&& 最大化窗口
(6)获取窗口大小及位置
[DllImport("user32.dll")][return: MarshalAs(UnmanagedType.Bool)]static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
&&&&&&& [StructLayout(LayoutKind.Sequential)]&&&&&&& public struct RECT&&&&&&& {&&&&&&&&&&& public int L&&&&&&&&&&&&&&&&&&&&&&&&&&&& //最左坐标&&&&&&&&&&& public int T&&&&&&&&&&&&&&&&&&&&&&&&&&&& //最上坐标&&&&&&&&&&& public int R&&&&&&&&&&&&&&&&&&&&&&&&&& //最右坐标&&&&&&&&&&& public int B&&&&&&&&&&&&&&&&&&&&&&& //最下坐标&&&&&&& }
&&&&&&&&&&&&&&&&&&& InPtr awin = GetForegroundWindow();&&& //获取当前窗口句柄&&&&&&&&&&&&&&&&&&& RECT rect = new RECT();&&&&&&&&&&&&&&&&&&& GetWindowRect(awin, ref rect);&&&&&&&&&&&&&&&&&& int width = rc.Right - rc.L&&&&&&&&&&&&&&&&&&&&&&& //窗口的宽度&&&&&&&&&&&&&&&&&& int height = rc.Bottom - rc.T&&&&&&&&&&&&&&&&&& //窗口的高度&&&&&&&&&&&&&&&&&&& int x = rc.L&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& int y = rc.T
(7)常用操作:
GetClassName(& hWnd: HWND;&&&&&&&&&{指定窗口句柄}& lpClassName: PC&{缓冲区}& nMaxCount: Integer&&{缓冲区大小}): I&&&&&&&&&&&{返回类名大小; 失败返回 0}获取指定窗口的类名&GetNextWindow(& hWnd: HWND;&{指定的窗口句柄}& uCmd: UINT&&{指定的关系选项}): HWND;&&&&&&{失败返回0; 成功返回符合的窗口句柄}//uCmd 可选值:GW_HWNDNEXT& =&2;&{同级别 Z 序之下}GW_HWNDPREV& =&3;&{同级别 Z 序之上}获取指定窗口Z上或Z下的窗口的句柄&GetTopWindow(& hWnd: HWND;&{指定的窗口句柄}): HWND;&&&&&&{失败返回0; 成功返回最顶层的子窗口句柄}获取指定窗口的子窗口中最顶层的窗口句柄GetWindow(& hWnd: HWND;&{指定的窗口句柄}& uCmd: UINT&&{指定的关系选项}): HWND;&&&&&&{失败返回0; 成功返回符合的窗口句柄}//uCmd 可选值:GW_HWNDFIRST =&0;&{同级别第一个}GW_HWNDLAST& =&1;&{同级别最后一个}GW_HWNDNEXT& =&2;&{同级别下一个}GW_HWNDPREV& =&3;&{同级别上一个}GW_OWNER&&&& =&4;&{属主窗口}GW_CHILD&&&& =&5;&{子窗口}获取与指定窗口具有指定关系的窗口的句柄&GetWindowTextLength(& hWnd: HWND&{窗口句柄}): I&&{返回窗口标题长度}&获取窗口标题长度&SetWindowText(& hWnd: HWND;&&&& {窗口句柄}& lpString: PChar {新标题串指针}): BOOL;设置窗口标题&GetDesktopWindow: HWND; {无参数; 返回桌面窗口的句柄}
(8)还有个问题尚待解决
前面我们提到找到目标句柄后通过SetForeGroudWindow(int hwnd)方法可以将其激活并设置为前台窗口,但是如果只是想将其激活而不设置为前台的话就要用到函数SetActiveWindow()
但是使用该方法要特别注意,当在其他线程中对当前线程窗体进行激活使用该方法是没有作用的。具体解决以后再给出,先去吃饭去......&&&&c#查找窗口句柄并获得窗口图源码
&c#查找窗口句柄并获得窗口图源码
c#查找窗口句柄并获得窗口图源码
若举报审核通过,可奖励20下载分
被举报人:
andyhebear
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
Q.为什么我点的下载下不了,但积分却被扣了
A. 由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的。
Q.我的积分不多了,如何获取积分?
A. 获得积分,详细见。
完成任务获取积分。
论坛可用分兑换下载积分。
第一次绑定手机,将获得5个C币,C币可。
关注并绑定CSDNID,送10个下载分
下载资源意味着您已经同意遵守以下协议
资源的所有权益归上传用户所有
未经权益所有人同意,不得将资源中的内容挪作商业或盈利用途
CSDN下载频道仅提供交流平台,并不能对任何下载资源负责
下载资源中如有侵权或不适当内容,
本站不保证本站提供的资源的准确性,安全性和完整性,同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
开发技术下载排行
您当前C币:0&&&可兑换 0 下载积分
兑换下载分:&
消耗C币:0&
立即兑换&&
兑换成功你当前的下载分为 。前去下载资源
你下载资源过于频繁,请输入验证码
如何快速获得积分?
你已经下载过该资源,再次下载不需要扣除积分
c#查找窗口句柄并获得窗口图源码
所需积分:5
剩余积分:0
扫描微信二维码精彩活动、课程更新抢先知
VIP会员,免积分下载
会员到期时间:日
剩余下载次数:1000
c#查找窗口句柄并获得窗口图源码
剩余次数:&&&&有效期截止到:
你还不是VIP会员VIP会员享免积分 . 专属通道极速下载
VIP下载次数已满VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员
你的VIP会员已过期VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员.NET WinForm获取窗口句柄很方便,this.Handle搞定。
WPF就有些麻烦了,获取方法如下:
引入命名空间:using System.Windows.I
获取方法:new WindowInteropHelper(this).Handle
this是个Window类的实例
评论: 0  
最新新闻:& ( 22:22)& ( 22:19)& ( 21:19)& ( 21:11)& ( 20:50)
编辑推荐:
网站导航:&&&&&&&&&&&&
阅读(...) 评论()如何对外部WPF程序的控件进行操作?
在WinForm中可以通过遍历句柄获取该控件的句柄,通过句柄发送消息,可以控制该控件...但是在WPF中貌似只有一个主窗口句柄,控件是没有自己的句柄的...
不知道WPF中有什么对应的解决方案...
按投票排序
首先你要把自己的程序注入进目标进程。这个涉及到很多Win32 API的知识,不过开源软件 里面有个Managed Injector,是用C++/CLI写的,你可以直接拿来用。实际上,整个Snoop所做的事情就是操纵外部程序的Visual Tree,所以你可以完整地学习一下。这个工具用来调试WPF程序也非常好用。这个Injector会在注入成功后构造一个你指定的类,这个类的实例就在目标进程里面了,然后Injector会调用该实例的一个你指定的方法。接下来你就可以通过一些静态的对象(例如App.Current.MainWindow)来找到你所需要的控件,直接操纵它了。
用UIAutomation的那套COM接口。如果你只是想写测试的话,有一个更简单的方法,就是创建Coded UI Test工程。
已有帐号?
无法登录?
社交帐号登录C# winfrom 做出来的窗口 如何像wpf一样 只拥有一个句柄呢?_百度知道
C# winfrom 做出来的窗口 如何像wpf一样 只拥有一个句柄呢?
C# winfrom 做出来的窗口 如何像wpf一样 只拥有一个句柄呢?屏蔽winfrom窗体里面的所有控件举报 外部程序获取句柄的话 只能获取到主窗体句柄
提问者采纳
窗口里面的所有控件全部自绘 哈哈 就行了吧
有没有简单快巧的方式呢? 自绘太费功夫了
这个好像没有吧 要不用网页控件
提问者评价
其他类似问题
infrom貌似不太可能吧,它与wpf是两套不同的实现机制,除非你另造一套winform,有句柄是与上层父类相关的,这不是wpf了吗?咦
为您推荐:
wpf的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 如何获得窗口句柄 的文章

 

随机推荐