VC怎么通过进程ID得到窗口句柄

来源:百度知道 编辑:UC知道 时间:2024/05/29 18:00:44
我试过网上的好多办法,到我这都不管用,气之又气..
我通过CreateToolhelp32Snapshot 来枚举所有进程,接下来再通过Process32First以及Process32Next查看我想要的进程名,进程ID,得到进程ID后再通过OpenProcess函数得到了一个句柄,是HANDEL的,我想要的是HWND窗口句柄,进行强制转换是不可以的,用强制转换后的句柄去操作另外一个进程调用GetWindowText和SetWindowText失败,Get的是空,在GetLastError中的提示是无效句柄,我试过好多办法了都不行(包括SendMessage)..
先说一下我的目的 我是想通过进程句得到窗口句柄,然后改窗口标题名的,条件,在本进程内操作的是其他的进程...

下面是我代码,请大家帮帮忙,看该怎么弄,这里先谢谢了....

HANDLE hProcessSnap = NULL;
HWND h_test;
PROCESSENTRY32 pe32 = {0};
BOOL exist = false;

// Take a snapshot of all processes in the system.
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

// Fill in the size of the structure before using it
pe32.dwSize = sizeof(PROCESSENTRY32);

if (Process32First(hProcessSnap,&pe32))
{
do
{
if(strcmp("notepad.exe",pe32.szExeFile)==0)
{
//这里这样强制转换后下面的句柄好像都是错的,不知道得到窗口句柄这步该怎么弄了...
h_test =

强制转换是肯定不行的,我想了个笨方法。在获得某进程的Id后,获取桌面上每个窗口的进程Id,再与先获得的进程Id进行比较,然后就能知道哪个窗口属于哪个进程的了。

另外网上找的一篇文章:http://www.vckbase.com/document/viewdoc/?id=404

下面是我弄的笨方法,将记事本的标题改为123,在MFC下编译通过:

void ChangeTitle()
{
// 需要修改的进程名
CString strFind = L"notepad.exe";

// 替换的文字
CString strReplace = L"123";
HANDLE hProcessSnap = NULL;
PROCESSENTRY32 pe32 = {0};
DWORD m_dwProcessId;

// 获得句柄
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == (HANDLE)-1)
{
printf("\nCreateToolhelp32Snapshot()failed:%d",GetLastError());
return;
}
pe32.dwSize = sizeof(PROCESSENTRY32);

// 列举所有进程名称
if (Process32First(hProcessSnap, &pe32))
{