我用下面这个函数得到HWND对应的可执行文件名
CString CMainApp::GetFileName(HWND hWnd)
{
DWORD dwProcessID;
GetWindowThreadProcessId(hWnd,&dwProcessID);
HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    PROCESSENTRY32W pe;     pe.dwSize = sizeof(pe); 
    BOOL bNext=Process32FirstW(hSnap, &pe); 
    while(bNext)
{
if(pe.th32ProcessID == dwProcessID) return pe.szExeFile;
bNext=Process32NextW(hSnap, &pe); 
    } 
    CloseHandle(hSnap);
return "";
}我用的是win2000,如果HWND对应的是英文可执行文件例如kaoqin.exe,返回正确,但是如果HWND对应的是中文可执行文件名例如 考勤管理系统.exe得到的好像是空,但是察看pe.szExeFile的字节分别是3,228,161,6,251,223,46,101,120,101问题出现在哪里,请执教怎样才能得到正确的“考勤管理系统.exe”字符串

解决方案 »

  1.   

    把你用到的Unicode版本的函数都改成Ansi的,试一试!
      

  2.   

    是不是把
    PROCESSENTRY32W pe;
    Process32FirstW
    Process32NextW
    都去掉W?我现在程序却省是ANSI我没有定义Unicode
      

  3.   

    我把上面的函数改成Ansi的
    pe.szExeFile的字节变成了3,63,63,6,63,63,46,101,120,101仍然不符合“考勤管理系统.exe”字符串
      

  4.   

    Unicode版本的函数都改成Ansi的
      

  5.   

    我已经该过了,是不是这样
    CString CChaoDunApp::GetGrabFileName(HWND hWnd)
    {
    DWORD dwProcessID;
    GetWindowThreadProcessId(hWnd,&dwProcessID);
    HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    PROCESSENTRY32 pe; pe.dwSize =sizeof(PROCESSENTRY32W); 
    BOOL bNext=Process32First(hSnap, &pe);
    while(bNext)
    {
        if(pe.th32ProcessID == dwProcessID)
        {
    CloseHandle(hSnap);
    return pe.szExeFile;
        }
    bNext=Process32Next(hSnap, &pe); 

    CloseHandle(hSnap);
    return "";
    }
      

  6.   

    //改成如下的试试
    记得#include <TCHAR.h>
    CString CMainApp::GetFileName(HWND hWnd)
    {
    DWORD dwProcessID;
    GetWindowThreadProcessId(hWnd,&dwProcessID);
    HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
        PROCESSENTRY32W pe;     pe.dwSize = sizeof(pe); 
        BOOL bNext=Process32First(hSnap, &pe); 
        while(bNext)
    {
    if(pe.th32ProcessID == dwProcessID) 
                           return CString(pe.szExeFile);
    bNext=Process32Next(hSnap, &pe); 
        } 
        CloseHandle(hSnap);
    return _T("");
    }hWnd
    其实你可以通过GetModuleFile取得当前hwnd对应的文件名
      

  7.   

    楼上的上面PROCESSENTRY32W pe; 是不是要把W去掉,否则编译不成功
    去掉之后返回的是"????.exe",好像是乱码。