VC获取进程ID 线程ID 窗口句柄

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. 主窗口一般都有子窗口(这个不是一定的,但是具有普遍性)

    原文作者:wuqiyinglang
    原文地址: https://blog.csdn.net/u013678464/article/details/39938341
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞