Winapi 如何使用父进程查找MFC的主HWND句柄
我有一个DLL文件,它在父软件下运行。父软件使用MFC并显示一个主GUI窗口。我想做的是创建我自己的小无模式对话框,在屏幕上弹出,并坐在主窗口旁边。要做到这一点,我想我需要父窗口的HWND,这样我就可以找到它的矩形,然后将我的DLL窗口移动到我想要的地方 如果可能的话,我不想更改父对象的源。我怎么能这样做Winapi 如何使用父进程查找MFC的主HWND句柄,winapi,dll,mfc,hwnd,Winapi,Dll,Mfc,Hwnd,我有一个DLL文件,它在父软件下运行。父软件使用MFC并显示一个主GUI窗口。我想做的是创建我自己的小无模式对话框,在屏幕上弹出,并坐在主窗口旁边。要做到这一点,我想我需要父窗口的HWND,这样我就可以找到它的矩形,然后将我的DLL窗口移动到我想要的地方 如果可能的话,我不想更改父对象的源。我怎么能这样做 第二个可能相关的问题是,我是否应该使用MFC或普通windows API来创建DLL对话框。我想要一种更容易使用的方法,我在MSDN上读到,我可能需要父MFC应用程序向我发送消息,让我的MFC
第二个可能相关的问题是,我是否应该使用MFC或普通windows API来创建DLL对话框。我想要一种更容易使用的方法,我在MSDN上读到,我可能需要父MFC应用程序向我发送消息,让我的MFC工作,我不想这样做。我不知道你是否可以创建一个MFC dll来查找在另一个模块中创建的MFC对象。我很确定MFC可以用于从DLL创建对话框,而不管应用程序中是否使用MFC 这就是说,如果您还不是MFC专家,也没有成为MFC专家的真正愿望,那么从dll创建对话框是非常容易的。MFC的CDialog实际上是一个薄薄的包装,所以您不会获得太多 如果app/dll接口没有移交应用程序窗口,我可以想出至少两种方法来查找它:
- 用于根据窗口标题或类名查找窗口。像MFC这样的框架有时会动态生成窗口类名,这可能会有问题
- 用于枚举所有顶级窗口。可以测试它是否属于当前进程
- 调用主线程。这会给你带来很多麻烦。选择任何有效的一个(并非所有值都可以填充),并使用
get祖先(GA_ROOT)
查找其顶级祖先。与EnumWindows
不同,这不需要枚举,与FindWindow
不同,这不需要专门知识来获取父级的PID(而不是HWND),请看我在
可能重复的
DWORD GetParentProcessID(DWORD dwProcessID)
{
DWORD dwParentProcessID = -1 ;
HANDLE hProcessSnapshot ;
PROCESSENTRY32 processEntry32 ;
hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) ;
if(hProcessSnapshot != INVALID_HANDLE_VALUE)
{
processEntry32.dwSize = sizeof(PROCESSENTRY32) ;
if(Process32First(hProcessSnapshot, &processEntry32))
{
do
{
if (dwProcessID == processEntry32.th32ProcessID)
{
dwParentProcessID = processEntry32.th32ParentProcessID ;
break ;
}
}
while(Process32Next(hProcessSnapshot, &processEntry32)) ;
CloseHandle(hProcessSnapshot) ;
}
}
return dwParentProcessID ;
}