从CWnd*的EXE名称

介绍 最近,我们公司决定生产时间管理应用程序。这是不够的我们只知道当人们以亡,我们想知道他们做了什么,他们在那里。我们决定将产生一个计时应用程序,它将使我们能够跟踪用户做什么,同时登录。起初,我们以为我们会每秒钟记录活动窗口的标题。这为我们提供了更多的信息比我们想知道以及这繁琐的报告数据。然后,我们决定最好记录就可执行文件的名称。我环顾四周,我以前看到过一篇关于如何做到这一点,但它不是为了运行一次。所以我写了这个函数允许您轻松CWnd *转换成EXE名称。 使用的代码 要使用的代码很简单。传递函数GetWindowModuleName CWnd *,它返回可执行文件的名称。隐藏,收缩,复制Code

#include "Psapi.h"

CString GetWindowModuleName(CWnd *pWnd)
{
    HMODULE* lphModule;
    char FileName[1024];
    DWORD procid = 0;
    DWORD modulesize = 0;
    BOOL bInheritHandle = false;

    if(pWnd != NULL){
        GetWindowThreadProcessId(pWnd->m_hWnd,&procid);
        HANDLE process = OpenProcess(PROCESS_ALL_ACCESS | 
           PROCESS_QUERY_INFORMATION, bInheritHandle,procid);
        if(process != NULL){
            lphModule = new HMODULE[1];
            if(EnumProcessModules(process,lphModule, 
                      (sizeof(HMODULE)),&modulesize) != 0){
                GetModuleBaseName(process,lphModule[0],FileName,1024);
                CloseHandle(process);
                delete lphModule;
                return FileName;
            }
            delete lphModule;
        }
        CloseHandle(process);
    }
    return "";
}

它是如何工作的呢? 函数首先调用GetWindowThreadProcessId当前进程ID。从那时起,我们打开过程和枚举过程模块。技巧在于发送HMODULE EnumProcessModules函数数组的长度。这只会把第一个模块流程的可执行文件。不要忘记包括“Psapi。h”或Psapi.Lib链接。 本文转载于:http://www.diyabc.com/frontweb/news10914.html

posted @ 2020-08-11 02:32  Dincat  阅读(117)  评论(0编辑  收藏  举报