根据窗口句柄获取应用程序实例句柄失败

狐帝 2021-05-04 12:43:25
如题,调用GetWindowLongPtr(hWnd, GWLP_HINSTANCE)时返回0,通用GetLastError获取错误代码,竟然也是0。完整代码如下:

#include <windows.h>
#include <iostream>

using namespace std;

void testGetInstance()
{
const char *className = "TaskSwitcherWnd";
const char *windName = "任务切换";
HWND hWnd = FindWindow(className, windName);
cout << "window handle: " << hWnd << endl;
uint64_t tempHandle = GetWindowLongPtr(hWnd, GWLP_HWNDPARENT);
HWND hpWnd = *(HWND *)(&tempHandle);
cout << "parent window handle(from GetWindowLongPtr): " << hpWnd << endl;
hpWnd = GetParent(hWnd);
cout << "parent window handle(from GetParent): " << hpWnd << endl;
tempHandle = GetWindowLongPtr(hWnd, GWLP_HINSTANCE);
if (tempHandle == 0)
{
DWORD errorCode = GetLastError();
cout << "get instance handle error: " << errorCode << endl;
}
else
{
HINSTANCE hInst = *(HINSTANCE *)(&tempHandle);
cout << "instance handle: " << hInst << endl;
}
}

int main(int argc, char **argv)
{
testGetInstance();
}

这里还有个问题,就是调用GetParent(hWnd);和GetWindowLongPtr(hWnd, GWLP_HWNDPARENT);获得的父窗口句柄与Visual Studio 2017所带的Spy++工具看到的不一样。
请大神们指点迷津。谢谢!
...全文
3161 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2021-05-08
  • 打赏
  • 举报
回复
任务切换窗口所属应用程序不是一般的应用程序;而是系统进程。
狐帝 2021-05-07
  • 打赏
  • 举报
回复
通过Spy++找到了一部分答案:原来当窗口具有WS_POPUP风格时,GetParent(hWnd)和GetWindowLongPtr(hWnd, GWLP_HWNDPARENT)返回的都是其owner窗口的句柄,而不是其父窗口句柄。若要获得父窗口句柄,普适的办法是调用GetAncestor(hWnd, GA_PARENT)。 但是本帖标题中提及的无法获得窗口所属应用程序实例句柄的问题还没解决。
狐帝 2021-05-07
  • 打赏
  • 举报
回复
引用 9 楼 赵4老师 的回复:
“使用inspect” 没看见吗?
inspect看到的父窗口跟Spy++一样,跟我的程序不同。Inspect也看不到指定窗口对应的应用程序的实例句柄。 而且对于查找我这个程序的问题,用Spy++足够了。
赵4老师 2021-05-07
  • 打赏
  • 举报
回复
别用cout<<handle,用printf("%p",handle)
qzjhjxj 2021-05-07
  • 打赏
  • 举报
回复
获取窗口句柄的这句改下试试:
 const char *className = "TaskSwitcherWnd";
 const char *windName = "任务切换";
 HWND hWnd = FindWindow(NULL, windName);
赵4老师 2021-05-07
  • 打赏
  • 举报
回复
使用inspect
赵4老师 2021-05-07
  • 打赏
  • 举报
回复
“使用inspect” 没看见吗?
狐帝 2021-05-07
  • 打赏
  • 举报
回复
引用 5 楼 赵4老师 的回复:
别用cout<<handle,用printf("%p",handle)
cout会认得handle是指针,会自动按照指针格式输出。而且用cout还是用printf跟解决我提出的问题没啥关系吧?
狐帝 2021-05-07
  • 打赏
  • 举报
回复
引用 4 楼 qzjhjxj 的回复:
获取窗口句柄的这句改下试试:
 const char *className = "TaskSwitcherWnd";
 const char *windName = "任务切换";
 HWND hWnd = FindWindow(NULL, windName);
问题依旧,得到的父窗口句柄仍旧是一个名为"AltTab"的窗口,而不是Spy++得到的“桌面”,仍旧无法获得“任务切换”这个窗口所属程序的HINSTANCE。
狐帝 2021-05-06
  • 打赏
  • 举报
回复
引用 1 楼 赵4老师 的回复:
在VS中运行和在资源管理器中运行父窗口本来就不一样。 新建项目时,应该选用Windows窗口程序而不是控制台程序。
我的程序并不是在VC里运行,而是直接从命令行提示符下运行。我提及VC是说用了VC附带的工具Spy++,这是个查看各窗口的详细信息的程序。我查看的也不是我的程序的父窗口,而是一个名为“任务切换”的窗口,这个窗口是Windows 7默认Shell中的一个窗口,并不是由我的程序创建,而是由操作系统在启动shell时创建,所以其父窗口是什么跟我的程序在哪里运行没什么关系。 我这个程序是用来访问别的窗口的信息,跟我的程序是控制台程序还是GUI程序应该没啥关系吧?
赵4老师 2021-05-06
  • 打赏
  • 举报
回复
在VS中运行和在资源管理器中运行父窗口本来就不一样。 新建项目时,应该选用Windows窗口程序而不是控制台程序。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧