DLL中获取主程序句柄

一、问题由来及说明

在实际编程中遇到一些系统模块(或API)调用初始化需要窗口句柄,在主程序中(MFC或者win32)都可以很容易获得,比如mfc中可以直接调用AfxGetMainWnd()、GetSafeHwnd()获取窗口句柄。但是如果跨DLL调用就很难拿到主程序的窗口句柄,那么如何获取呢?

二、可用的方法介绍

1. FindWindow/FindWindowEx函数

如果知道主调程序的进程名称,可以用FindWindow枚举并查找系统运行的所有窗口函数。

该函数之所以可以运行,是因为windows下HWND是全局的,在系统中是唯一的。

有一个缺点,如果主调程序运行多个实例的话,FindWindow基本上是无能为力的,是无法区分那个实例的。

2. EnumWindows函数

如果能够获取当前的进程pid(通常调用GetCurrentProcessId函数),可以通过EnumWindows枚举当前系统中所有的窗口函数,然后遍历。调用GetWindowThreadProcessId函数,可以将EnumWindows的回调的HWND转换为进程pid。这样就可以精确定位了。

当然,也可以使用FindWindow函数。

3. GetGUIThreadInfo函数

上面两个方法都是i需要遍历系统中所有窗口的,这个函数可以直接通过线程pid获取主窗口句柄,感兴趣的可以查看下msdn。

https://msdn.microsoft.com/en-us/library/ms633506(v=vs.85).aspx

说明下:博客很久没写了。还是比较倾向于解答问题的方式,直观,也认识到自己成长的脚步。所以以后有什么问题都会及时记录与更新。内容可能会很短,只有基本的思路。实际编码可以后续深入探讨下。

------------------------

成长的路,披荆斩棘,无所畏惧。

本文是由Tocy撰写整理,有问题欢迎评论及邮件。转载请注明原文地址。

时间: 2024-08-09 02:31:09

DLL中获取主程序句柄的相关文章

VC中获取窗体句柄的各种方法

AfxGetMainWnd AfxGetMainWnd获取自身窗体句柄HWND hWnd = AfxGetMainWnd()->m_hWnd; GetTopWindow函数功能:该函数检查与特定父窗体相联的子窗体z序(Z序:垂直屏幕的方向,即叠放次序),并返回在z序顶部的子窗体的句柄. 函数原型:HWND GetTopWindow(HWND hWnd):參数: hWnd:被查序的父窗体的句柄.假设该參数为NULL,函数返回Z序顶部的窗体句柄.返回值:    假设函数成功,返回值为在Z序顶部的子窗

DLL中如何获取自身的句柄

问题:DLL中如何获取DLL自身所在的文件夹,而不是主调程序的.用GetCurrentDirectory获取的是exe主调程序所在的目录,不符合我的要求:用GetModuleFileName只能在DllMain中才能获取到,因为DllMain第一个参数hInstance就是DLL模块局并,而GetModuleFileName()只有传入DLL模块句柄才能获取DLL路径. 但是,如果不是DllMain项目,而是Win32 DLL勾选MFC选项的项目,入口函数是int _tmain(int argc

C#获取C# DLL中的指定接口的所有实现实例 - qq_19759475的博客 - CSDN博客

原文:C#获取C# DLL中的指定接口的所有实现实例 - qq_19759475的博客 - CSDN博客 public static List<T> CreateTarInterface<T>(string dllpath) { List<T> rs = new List<T>(); var dlllll = Assembly.Load(dllpath); foreach (var item in dlllll.GetTypes()) { object ob

在 Target 中获取项目引用的所有依赖(dll/NuGet/Project)的路径

原文:在 Target 中获取项目引用的所有依赖(dll/NuGet/Project)的路径 在项目编译成 dll 之前,如何分析项目的所有依赖呢?可以在在项目的 Target 中去收集项目的依赖. 本文将说明如何在 Target 中收集项目依赖的所有 dll 的文件路径. 本文内容 编写 Target 以上 Target 的输出 Reference 的输出 ReferencePath 的输出 解读原因 编写 Target <Target Name="WalterlvDemoTarget&

JCEF3——谷歌浏览器内核Java版实现(一):使用jawt获取窗体句柄

前言 最近一段时间研究谷歌浏览器内核.谷歌浏览器内核一直开源,并维护更新,它的开源项目中内核更新速度和Chrome浏览器版本更新进度一样!而且它不同于WebKit(值得一题的是谷歌浏览器已不使用WebKit内核了),它提供的不仅仅是页面渲染,而是提供一整浏览器解决方案和插件规则. 使用方便:我们给它一个“窗体”(操作系统或系统资源管理器中的本地窗体,本系列都使用Win32平台作为示例)和一些配置参数,它就能将你需要渲染的页面在给定窗口中完美地展示. 插件支持:Adobe和Google联合开发的p

Winform API &quot;user32.dll&quot;中的函数

命名空间:System.Runtime.InteropServices 1 /// <summary> 2 /// 该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图.hWnd:设备上下文环境被检索的窗口的句柄 3 /// </summary> 4 [DllImport("user32.dll", CharSet = CharSet.Auto)] 5 public static exter

C#实现获取鼠标句柄的方法

本文实例讲述了C#实现获取鼠标句柄的方法,分享给大家供大家参考.具体实现方法如下: 一.调用user32.dll (1)引用 using System.Runtime.InteropServices; (2)调用方法 1.获取窗口标题 [DllImport( "user32.dll" )] public static extern int GetWindowText( IntPtr hWnd, StringBuilder lpString,int nMaxCount ); 注:hWnd

在C++中调用DLL中的函数(2)

转自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html 应用程序使用DLL可以采用两种方式: 一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息. Visual C++6.0在VC\bin目录下提供了一个名为Dumpbin.exe的小程序,用它可以查看DLL文件中的函数结构.另外,Windows系统将遵循下面的搜索顺序来定位DLL: 1.包含EXE文件的目录, 2.进程的当前工作目录, 3.Windows系统

获取指定句柄的类型号.

目录 一丶简介 二丶原理与代码. 2.1原理 2.2原理伪代码讲解 3.代码实现 4.用到的结构 5.代码演示截图. 6.附加 一丶简介 在windows系统下.句柄是很常用的. 骚操作的方法可以通过句柄拷贝方式拷贝到另一个进程让其占用句柄.比如独占文件. 但是有时候比如驱动想删除文件.强删文件的时候就会用到句柄类型. 但是此时一般都是写死的.网上也很少相关资料.这里就介绍一下.怎么通过句柄获取指定句柄类型(任何内核对象 句柄都可以使用) 下面以文件举例 二丶原理与代码. 2.1原理 原理还是使