我现在有一个窗口的句柄(HWND),那如何获取该窗口的进程ID呢
需要什么函数,GetCurrentProcessId()是获取当前的进程ID,但是我想通过那个窗口的句柄获取那个窗口的进程,怎么弄
handle=getwindowthreadprocessid(hwnd)
就用GetWindowThreadProcessId,这个函数是获取指定窗口的线程ID和进程ID
C/C++ code
HWND hWnd; // 窗口的句柄DWORD dwPID;DWORD dwThreadID = ::GetWindowThreadProcessId(hWnd, &dwPID);
执行成功后,dwPID便是获取到的进程ID
应该可以用:
HWND GetForegroundWindow(void);
MSDN里的解释:
GetForegroundWindow
This function returns the handle to the foreground window—the window with which the user is currently working
HWND GetForegroundWindow(void);
Return Values
The handle to the foreground window indicates success
百度百科里的解释:
GetForegroundWindow
函数功能:该函数返回前台窗口(用户当前工作的窗口)。系统分配给产生前台窗口的线程一个稍高一点的优先级。
函数原型:HWND GetForegroundWindow(VOID)
参数:无。 返回值:函数返回前台窗回的句柄。
速查:Windows NT:31以上版本;Windows:95以上版本:Windows CE:10以上版本:头文件:Winuserh;库文件:user32lib。
HWND FindWindowA(类名,标题);返回HWND句柄
HWND FindWindowExA(HWND hwndParent,//要查找子窗口的父窗口句柄。
//如果hwndParent为0,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。
HWND hwndChildAfter,//子窗口句柄。如果HwndChildAfter为0,查找从hwndParent的第一个子窗口开始。
LPCTSTR lpszClass, //指向一个指定了类名
LPCTSTR lpszWindow);//指向一个指定了窗口标题
其中一个应用程序的类名和标题,可以由vs自带的spy++工具来获得
pe LongWord;
windowspas中THandle定义:THandle = SystemTHandle;
而在system单元中,定义THandle = LongWord;
windowspas中 HDC = type LongWord;
也就是说delphi中这三个实际上都是longword,定义出这么三个东西来, 是为了与 windows api配合,因为程序是在windows的平台上开发的,要调用windows 的API,而在windowsAPI中定义了这么个类型。
在windows系统中,
HDC Handle to a device context (DC) 即指向一个设备上下文。
HWND Handle to a window 是一个窗口句柄
thandle是delphi的东西,windows自己没有定义。
vb中得到窗口句柄(HANDLE)了可以对窗口进行那些 *** 作???当然可以得到其它参数信息,比如按钮。 关闭是可以播放歌曲的话,你得找到按钮的句柄。希望对你有帮助 本答案由 >
已知进程名称或PID,是无法准确定位窗体句柄的。
这是因为:一旦程序启动后,系统只分配给它一个PID,而一个程序往往有多个窗口。所以,要想从PID反向查找对应的窗口不具有唯一性,并已经过实践证明,往这方面研究只能走入死胡同。
解决此问题办法是:先枚举所有窗口句柄,然后取得对应的进程名称或PID,如果该进程或PID满足你的条件,则可以进行相应处理。
HANDLE GetProcessHandle(int nID)
{
return OpenProcess(PROCESS_ALL_ACCESS, FALSE, nID);
}
HANDLE GetProcessHandle(LPCTSTR pName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapshot) {
return NULL;
}
PROCESSENTRY32 pe = { sizeof(pe) };
BOOL fOk;
for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)) {
if (!_tcscmp(peszExeFile, pName)) {
CloseHandle(hSnapshot);
return GetProcessHandle(peth32ProcessID);
}
}
return NULL;
}
PS你的代码不够精炼,所以重新写了一个。你看下这个能用不,不能用再帮你找找你的错误。主要你的代码太长了,所以没细看,你的Pn酱紫初始化啊,还有既然是DLL的,那就应该分别做LPCWSTR和LPCSTR两个版本,看你在LPCSTR版本里还用Process32FirstW,是不是有些混乱了?Pn被填充了UNICODE字符集再去和LPCSTR做比较,怎么能得出正确结果呢? 还有那个那个连COM的东西也出来了,完全被雷倒了,休克中
===================================
贴上来的代码都已很负责任的运行通过,不会有错你再检查看看是由于什么引起编译错误可以把出错信息贴上来然后帮你分析看看
另外,workingroy说要提权,DLL是不是应该自作主张提权有待商榷,提权完全可以由客户程序负责决定可以在调用函数前提权,函数调用完恢复原来的权限另外就是提权 *** 作也有消耗,对于系统管理员身份运行(通常我们都是系统管理员身份登陆WINDOWS),不需要提权当然,有高手指出,VISTA和7对系统管理员的权限已经有了修改,既是是系统管理员,权限也受到了某些限制这个我没研究过持保留意见当然楼主的函数应该在提供一个参数,用来传递要打开的进程句柄的权限一般不需要PROCESS_ALL_ACCESS的
以上就是关于如何通过进程句柄得到进程id全部的内容,包括:如何通过进程句柄得到进程id、怎么根据DLL的HMODULE获取宿主应用程序的窗口句柄、C++ 怎么在程序中获得 另外一个程序的句柄等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)