VC获得进程ID获得主线程ID获得窗口句柄获得主窗口获得进程名
1.窗口类名 —–> 窗口句柄 窗口标题——–> 窗口句柄
HWND FindWindow(
LPCTSTR lpClassName, //窗口类名 可用 VC或者VS自带的Spy++查看
LPCTSTR lpWindowName //窗口标题
);
举例:
以 记事本为例, 记事本 窗口类名 为:NotePad, 窗口标题 视按具体情况而定,假设为”新建 文本文档.txt – 记事本”
窗口类名 —–> 窗口句柄
TCHAR lpClassName[]=TEXT(“NotePad”);
HWND hWnd=::FindWindow(lpClassName,NULL);
if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE);
窗口标题——–> 窗口句柄
TCHAR lpWindowName[]=TEXT(“新建 文本文档.txt – 记事本”);
HWND hWnd=::FindWindow(NULL,lpWindowName);
if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE);
2.窗口句柄——-> 进程ID 窗口句柄——-> 主线程ID
要使用到的函数:
DWORD GetWindowThreadProcessId(
HWND hWnd, //目标窗口句柄
LPDWORD lpdwProcessId //返回目标窗口对应进程ID
);
例子:
DWORD dwProcId=0;//存放返回的进程ID
DWORD dwThreadId=0;//存放返回的主线程ID
HWND hWnd=XXXX;//这里省略,可能用任务方式得到一个窗口的句柄.比如用1中的方法.
dwThreadId=GetWindowThreadProcessId(hWnd,&dwProcId);//同时得到进程ID和主线程ID.
3.窗口HAND —> CWnd
用CWnd::FromHandle(HWND hWnd)函数.很多类都有这个函数.
4.进程名 ——> 进程ID
(注:进程名,即在”任务管理器”中看到的名字)
用CCheckObject类(详细实现源文件);
例子:
以记事本为例,进程名为 NOTEPAD.EXE (不一定是大写哦,得到任务管理器是显示而定);
CCheckObject ch;
TCHAR Name[]=TEXT(“NOTEPAD.EXE”);
DWORD dwProcId=ch.GetProcessId(Name);
5. 进程名 ——–> 主线程ID
例子:
CCheckObject ch;
TCHAR Name[]=TEXT(“NOTEPAD.EXE”);
DWORD dwThreadId=ch.GetThreadId(Name);
6. 进程名 ——–> 主窗口句柄
CCheckObject ch;
TCHAR Name[]=TEXT(“NOTEPAD.EXE”);
HWND hWnd=ch.GetTargetWindowHanle(Name);
7. 其它说明
从CCheckObject类和上面的源码中,不难写出从 进程ID—>主线程ID 进程ID—->主窗口句柄 主线程ID—>主窗口句柄 等等其它类似转换.
对于主窗口,特点如下:
A. 不能用进程ID,要用线程ID,因为一个进程可能有多个线程,每个线程都可能会有主窗口.
B. 主窗口不会有WS_CHILD属性
C. 主窗口没有父窗口
D. 主窗口一般都有子窗口(这个不是一定的,但是具有普遍性)