MFC中,如何获取一个已知窗口标题的窗口的句柄

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC中,如何获取一个已知窗口标题的窗口的句柄相关的知识,希望对你有一定的参考价值。

如题,比如说我现在打开了一个记事本程序,然后我想获取这个记事本程序的句柄,我该怎么做呢?最好能根据我说的情况举个例子,一个完整的例子,谢过各位了

使用windows API的FindWindow()函数;
函数原型为 :
HWND FindWindow
(
LPCSTR lpClassName,
LPCSTR lpWindowName
);
lpClassName
指向一个以null结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子。如果这个参数是一个原子,那么它必须是一个在调用此函数前已经通过GlobalAddAtom函数创建好的全局原子。这个原子(一个16bit的值),必须被放置在lpClassName的低位字节中,lpClassName的高位字节置零。
如果该参数为null时,将会寻找任何与lpWindowName参数匹配的窗口。
lpWindowName
指向一个以null结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名。
返回值:
如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。
如果函数执行失败,则返回值为 NULL 。可以通过调用GetLastError函数获得更加详细的错误信息。

可作如下使用:
HANDLE hDlg=::FindWindow(NULL,"")
if(hDlg!=NULL)

//Your operations

else

GetLastError();

如果您想熟悉使用API函数,可以下载一个MSDN帮助。里面介绍的是函数的使用方法以及参数的赋值操作
参考技术A FindWindow 查找指定窗口标题的窗口句柄. 得到了他的窗口句柄,就可以继续得到他窗体的子控件句柄. 然后setText 啥的 参考技术B 你用spy++这个工具VC上带的然后取到记事本的窗口名字和类名字

HWND hd=FindWindow("窗口名字","类名字");
if(hd)//这里已经取到
printf("%d\n",hd);
else
printf("error\n");
参考技术C HANDLE m_dlg=::FindWindow(NULL,"图片数据管理服务器");
if (m_dlg!=NULL)

::ShowWindow((HWND)m_dlg,SW_SHOW);
return TRUE;
参考技术D 调用Windows API
EnumWindows就可以枚举所有顶级窗口,所谓顶级窗口就是指没有父窗口的窗口。

函数定义:
BOOL WINAPI EnumWindows(
__in WNDENUMPROC lpEnumFunc,
__in LPARAM lParam
);

第一个参数是回调函数的指针,回调函数必须要是这样的形式
BOOL CALLBACK EnumWindowsProc(
__in HWND hwnd,
__in LPARAM lParam
);

调用EnumWindow之后,你自己的回调函数会被系统调用,没调用你的回调函数一次,他给你一个HWND的句柄,如果你的回调函数返回TRUE,那么系统继续给你下一个窗口的句柄,返回FALSE系统停止枚举窗口。

获得窗口的标题可以通过SendMessage来获得,然后可以对比窗口是否为你需要的窗口。本回答被提问者和网友采纳

如何使用子窗口中的句柄获取父窗口的调整大小事件?

【中文标题】如何使用子窗口中的句柄获取父窗口的调整大小事件?【英文标题】:How to get the resize event of a parent window using its handle in child window? 【发布时间】:2014-01-10 09:17:04 【问题描述】:

我已经使用 mfc 制作了浏览器窗口。 然后使用SetParent 将其添加为 VLC 播放器的子级。 我的子进程中有 VLC 播放器的句柄。

现在我想在调整 VLC 窗口大小时调整子窗口(浏览器)的大小。

有什么方法可以在子代码中使用父窗口的句柄来获取父窗口的调整大小事件,这样我也可以调整子对话框的大小?

【问题讨论】:

自从我使用 Windows SDK 以来已经有一段时间了,但是您能否不替换捕获 WM_SIZE 的窗口 proc(存储旧的),然后在您处理它之前或之后委托回原始 WndProc你自己? 消息处理似乎不起作用。 使用 SetParent() hack 非常很麻烦。您需要编写一个可以使用 SetWindowsHookEx() 注入 VLC 的 DLL,以便您可以监视消息。很难做对。不要这样做,而是创建一个插件。 【参考方案1】:

你想错了。

在 VLC 窗口中捕获事件并在处理程序中设置子(浏览器)窗口的新大小。

【讨论】:

我对 vlc 没有太多控制权。它只会启动我的(子)exe。 然后继承父句柄,这会通过新的 windows 对象路由消息并在那里处理它。 (msdn.microsoft.com/en-us/library/6wt95892.aspx) @Oakdale 你不能跨进程“子类化”! @manuell 非常正确 - 我在问题中错过了这一点,看起来他对我来说很无聊。

以上是关于MFC中,如何获取一个已知窗口标题的窗口的句柄的主要内容,如果未能解决你的问题,请参考以下文章

如何使用子窗口中的句柄获取父窗口的调整大小事件?

C++中如何获取当前窗口句柄?

如何通过 mfc 应用程序中的编辑控制框更改窗口句柄?

vb.net中如何获得某个窗口的句柄

如何取得桌面窗口矩形大小?mfc

vb中如何获得一个窗口的句柄