如何通过进程名获得窗口句柄

时间:2022-09-28 09:07:41
RT

HWND CSample3Dlg::GetXHwnd(LPCWSTR procName)//procName 被调用进程名称
{
    DWORD iProcID=0;
    PROCESSENTRY32 pEntry={sizeof(PROCESSENTRY32)};

    HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
    if(hSnapshot!=INVALID_HANDLE_VALUE)
    {
        if(Process32First(hSnapshot,&pEntry))
        {
            while (Process32Next(hSnapshot, &pEntry))
            {
strtemp=pEntry.szExeFile;
                if(procName==strtemp)
                {
                    iProcID=pEntry.th32ProcessID;
                    CloseHandle(hSnapshot);
                    break;
                }
            }
        }
    }

    HWND hwnd=::GetTopWindow(NULL);
    while(hwnd)
    {
        DWORD pid=0;
        DWORD dwProcessId=GetWindowThreadProcessId(hwnd,&pid);

        if(dwProcessId!=0)
        {
            if(pid==iProcID)
            {
                return hwnd;
            }
        }

        hwnd=::GetNextWindow(hwnd,GW_HWNDNEXT);
    }
    return NULL;
}


上面一段程序是通过进程名获得进程ID
下面一段程序是通过进程ID获得窗口句柄

网上很多都是这种办法,但是我总是得不到想要的那个窗口句柄
因为我用
::SendMessage(hwnd,WM_GETTEXT,(sizeof(path))/sizeof(char),(LPARAM)(path));


这个获得窗口内容,得到的结果不是那个窗口的标题???
而且输入不同的进程名得到的窗口句柄,通过
::SendMessage(hwnd,WM_GETTEXT,(sizeof(path))/sizeof(char),(LPARAM)(path));
都是得到一样的结果:
MSCTFIME UI  
这个

7 个解决方案

#1


看一下hwnd获得到的句柄和spy++获得到的一样不,先确定正确获得到窗口的句柄

#2


你的HWND窗口句柄获取的正确吗?

#3


你的方法有2个缺陷
1.无法获取隐藏窗体
2.得到的窗体不是主窗体

解决办法 用EnumWindows函数枚举
然后匹配到pid时 根据HAND获取父窗体 父窗体为NULL或者父窗体是其他进程就说明找到主窗体了

#4


仅供参考:
HWND MyFindStatusWindow() {
    const int MyMaxParentWinCount = 3;
    // 父窗口类名数组
    char *A_szClassName[MyMaxParentWinCount] = {
        "ThunderRT6FormDC",
        "ThunderRT6Frame",
        "ThunderRT6OptionButton"
    };
    // 父窗口标题数组
    char *A_szWinName[MyMaxParentWinCount] = {
        Title,
        "",
        NULL
    };
    // 首先求得*父窗口
    HWND hMainWin = FindWindow(A_szClassName[0], A_szWinName[0]);
    if (NULL==hMainWin) {
        return NULL;
    }
    // 逐次用FindWindowEx函数求出各级子窗口
    HWND hNextChildWin=NULL;

    HWND hLastWin=NULL;
    for (int i=1; i<MyMaxParentWinCount; i++) {
        if (1==i) {
            hNextChildWin = FindWindowEx(hMainWin,hNextChildWin,A_szClassName[i],A_szWinName[i]);
            if (NULL==hNextChildWin) break;//
            hNextChildWin = FindWindowEx(hMainWin,hNextChildWin,A_szClassName[i],A_szWinName[i]);
            hLastWin=hNextChildWin;
        } else {
            hLastWin = FindWindowEx(hLastWin,NULL         ,A_szClassName[i],A_szWinName[i]);
        }
    }
    return hLastWin;
}

#5


不奇怪,MSCTFIME UI 是那个进程的窗口
枚举的时候把MSCTFIME UI 过滤掉

#6


知道问题在哪了

#7


是怎么解决的,想问下,谢谢了,

#1


看一下hwnd获得到的句柄和spy++获得到的一样不,先确定正确获得到窗口的句柄

#2


你的HWND窗口句柄获取的正确吗?

#3


你的方法有2个缺陷
1.无法获取隐藏窗体
2.得到的窗体不是主窗体

解决办法 用EnumWindows函数枚举
然后匹配到pid时 根据HAND获取父窗体 父窗体为NULL或者父窗体是其他进程就说明找到主窗体了

#4


仅供参考:
HWND MyFindStatusWindow() {
    const int MyMaxParentWinCount = 3;
    // 父窗口类名数组
    char *A_szClassName[MyMaxParentWinCount] = {
        "ThunderRT6FormDC",
        "ThunderRT6Frame",
        "ThunderRT6OptionButton"
    };
    // 父窗口标题数组
    char *A_szWinName[MyMaxParentWinCount] = {
        Title,
        "",
        NULL
    };
    // 首先求得*父窗口
    HWND hMainWin = FindWindow(A_szClassName[0], A_szWinName[0]);
    if (NULL==hMainWin) {
        return NULL;
    }
    // 逐次用FindWindowEx函数求出各级子窗口
    HWND hNextChildWin=NULL;

    HWND hLastWin=NULL;
    for (int i=1; i<MyMaxParentWinCount; i++) {
        if (1==i) {
            hNextChildWin = FindWindowEx(hMainWin,hNextChildWin,A_szClassName[i],A_szWinName[i]);
            if (NULL==hNextChildWin) break;//
            hNextChildWin = FindWindowEx(hMainWin,hNextChildWin,A_szClassName[i],A_szWinName[i]);
            hLastWin=hNextChildWin;
        } else {
            hLastWin = FindWindowEx(hLastWin,NULL         ,A_szClassName[i],A_szWinName[i]);
        }
    }
    return hLastWin;
}

#5


不奇怪,MSCTFIME UI 是那个进程的窗口
枚举的时候把MSCTFIME UI 过滤掉

#6


知道问题在哪了

#7


是怎么解决的,想问下,谢谢了,