微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

VC++ 如何获取窗口所属的主程序的名称?

如何解决VC++ 如何获取窗口所属的主程序的名称?

示例测试环境:

我在 Windows 桌面上放置了两个文件夹,每个文件夹都有自己的文件内容和子文件夹。其中一个文件夹名为 ALPHA,另一个名为 BRAVO。我双击了这些文件夹中的每一个,所以我在屏幕上打开了这两个 Windows 资源管理器窗口。

我还启动了 Microsoft Word 并创建了一个新的空文档(名为 Document1)。然后按 Ctrl+N 创建另一个空文档(名为 Document2)。所以我也打开了两个 Word 窗口。

我启动了 Firefox 并导航到 bluepaint.com,然后打开另一个浏览器窗口并导航到 Yellowsand.org,因此我的屏幕上也有两个 Firefox 窗口。

代码

然后在我的 Windows 应用程序(VS2019 社区)中,我捕获鼠标按钮 UP 事件并执行如下操作...

TCHAR msg_tchar[256];
HWND wh_parent_window;  // parent_window or owner_window
const unsigned int max_wintitle_length = 256;
TCHAR window_title_string[max_wintitle_length];
HWND wh_current_window = GetForegroundWindow();
GetwindowText(wh_current_window,window_title_string,(max_wintitle_length-1));
StringCchPrintf(msg_tchar,255,_T("--NewWindow: \"%s\"\r\n"),window_title_string);
printToLogfile(msg_tchar);
if ((wh_parent_window = Getwindow(wh_current_window,GW_OWNER)) != NULL) {
    GetwindowText(wh_parent_window,(max_wintitle_length-1));
    StringCchPrintf(msg_tchar,_T("ownerWindow: \"%s\"\r\n"),window_title_string);
    printToLogfile(msg_tchar);
} //// if getownerWindow
if ((wh_parent_window = GetAncestor(wh_current_window,GA_PARENT)) != NULL) {
    GetwindowText(wh_parent_window,_T("parentwindow: \"%s\"\r\n"),window_title_string);
    printToLogfile(msg_tchar);
} //// if getParendWindow

它编译并运行良好,并按照我的要求执行。点击屏幕上的窗口,我得到以下输出

--NewWindow: "Yellow Sand Beach informational portal - Mozilla Firefox"
parentwindow: ""
--NewWindow: "Categories of blue paints - Mozilla Firefox"
parentwindow: ""
--NewWindow: "Document2 - Word"
parentwindow: ""
--NewWindow: "Document1 - Word"
parentwindow: ""
--NewWindow: "ALPHA"
parentwindow: ""
--NewWindow: "BRAVO"
parentwindow: ""

显然,没有 OwnerWindow 行。我不太关心。 但我关心的是这些窗口属于什么应用程序。似乎我在这方面走错了路,因为我希望获得每个窗口的主应用程序名称。因此,对于 ALPHA 和 BRAVO,我希望获得类似“Windows Explorer”或“explorer.exe”之类的内容,对于我希望获得类似“ >Microsoft Office 2019”或“Microsoft Word”或“word.exe”,对于网页窗口,我想得到类似“firefox.exe”或“Firefox”或“Mozilla Firefox”。 是的,我可以看到 Firefox 和 Word 可以从它们的窗口标题提取出来,但这不适用于 ALPHA 和 BRAVO 以及其他应用程序的窗口。 那么插入窗口标题,我如何获得父应用程序名称或拥有的可执行文件名称

我很高兴阅读文档,只是不知道要查找什么函数名称。我们将不胜感激。

解决方法

感谢 Igor 在正确方向上的推动,我编写了以下函数并且它达到了我想要的目的。

bool queryEXEnameOfWindow(HWND p_window_handle,std::wstring& p_exe_path) {
    TCHAR tmp_path_str[MAX_PATH] = {0};
    DWORD tmp_processID = 0;
    DWORD tmp_length = MAX_PATH-1;
    GetWindowThreadProcessId(p_window_handle,&tmp_processID);
    HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,tmp_processID);
    BOOL tmp_result = QueryFullProcessImageName(processHandle,tmp_path_str,&tmp_length);
    CloseHandle(processHandle);
    if (tmp_result) {
        p_exe_path = tmp_path_str;
        return true;
    } //// if
    return false;
} //// funcDef

wstring 中返回的结果如下:

C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE
C:\Program Files\Firefox\firefox.exe
C:\Windows\explorer.exe
C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE
C:\Program Files\LibreOffice\program\soffice.bin

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。