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或者父窗体是其他进程就说明找到主窗体了
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 过滤掉
枚举的时候把MSCTFIME UI 过滤掉
#6
知道问题在哪了
#7
是怎么解决的,想问下,谢谢了,
#1
看一下hwnd获得到的句柄和spy++获得到的一样不,先确定正确获得到窗口的句柄
#2
你的HWND窗口句柄获取的正确吗?
#3
你的方法有2个缺陷
1.无法获取隐藏窗体
2.得到的窗体不是主窗体
解决办法 用EnumWindows函数枚举
然后匹配到pid时 根据HAND获取父窗体 父窗体为NULL或者父窗体是其他进程就说明找到主窗体了
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 过滤掉
枚举的时候把MSCTFIME UI 过滤掉
#6
知道问题在哪了
#7
是怎么解决的,想问下,谢谢了,