如何由窗口句柄得到对应的进程ID

Yanbin_Q 2004-07-16 01:28:18
已得到窗口的句柄hwnd

怎么得到hwnd相对应的进程ID
如果用
DWORD GetWindowThreadProcessId(
HWND hWnd,
LPDWORD lpdwProcessId );
得到的是本窗口的父窗口的进程ID,即创建本窗口的窗口的进程ID

如打开了多个IE浏览器,可以获得每一个窗口的hwnd,所有的IE窗口通过GetWindowThreadProcessId方法获得的lpdwProcessId 是同一个值

这样我就不能指定的根据进程ID来杀死特定的某一个IE浏览器
我希望是得到窗口本身的进程ID

以下是GetWindowThreadProcessId方法在MSDN中的说明:
The GetWindowThreadProcessId function retrieves the identifier of the thread that created the specified window and, optionally, the identifier of the process that created the window.

Return Values
The return value is the identifier of the thread that created the window.
...全文
782 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yanbin_Q 2004-07-16
  • 打赏
  • 举报
回复
那关闭窗口只有通过hwnd来关闭吗?
不能通过进程ID来关闭,否则会把所有的IE窗口关掉?
handwolf 2004-07-16
  • 打赏
  • 举报
回复
当然了,因为IE打开多个连接窗口后,还是只有一个进程的,其它窗口都是创建的线程!不信你就用任务管理器看看
Yanbin_Q 2004-07-16
  • 打赏
  • 举报
回复
我加了
#include <TLHELP32.H>
#include <psapi.h>
啊,但不知道m_strSoft是什么啊

能告诉我吗?最好能帮我写出完整的方法实现来

谢谢!
longlong1129 2004-07-16
  • 打赏
  • 举报
回复
自己找一个MSDN,需要加头的,要不你编译不了
Yanbin_Q 2004-07-16
  • 打赏
  • 举报
回复
m_strSoft是什么啊?

to coolaka(zhengyb)

能不能帮我实现下面这个方法,直接能用的

DWORD FindAppProcessID(HWND)
coolaka 2004-07-16
  • 打赏
  • 举报
回复
DWORD CUpdateDlg::FindAppProcessID()
{
HANDLE handle=::CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
PROCESSENTRY32 Info;
Info.dwSize = sizeof(PROCESSENTRY32);
if(::Process32First(handle,&Info))
{
do{
CString ss=Info.szExeFile;
if(!ss.CompareNoCase(m_strSoft+".exe"))
{
::CloseHandle(handle);
return Info.th32ProcessID;
}
}
while(::Process32Next(handle,&Info));
::CloseHandle(handle);
}
return -1;
}
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. 主窗口一般都有子窗口(这个不是一定的,但是具有普遍性)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧