CreateProcess后得到HWND,为什么不成功,高手帮我看看,在线等

jarchild 2008-05-05 05:12:35
代码如下
HWND g_hwnd = 0;

BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
{
DWORD dwID;

GetWindowThreadProcessId(hwnd, &dwID);

if(dwID == (DWORD)lParam)
{
g_hwnd = hwnd;
MessageBox(0, "find", "find", 0);
return 0;
}

return 1;
}

STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
char path[50]="D:\\11.exe";
BOOL nRet = CreateProcess(NULL,path,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS, NULL,NULL, &si,&pi);

DWORD hProcessId = pi.dwProcessId;

EnumWindows((WNDENUMPROC)EnumProc, (LPARAM)hProcessId);

调试的时候,看到EnumProc中的hwnd一直是unused,一直都不成功,大家帮我看下,非常感谢。
...全文
309 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
shixinwenwu 2011-09-05
  • 打赏
  • 举报
回复
结贴了吗? 好几年前钱的帖子啦。

我今天做一个功能用到楼主的代码,发现就是 EmunProc的问题, 这个函数紧获得与目标进程ID相等的第一个窗口的句柄,如果进程有很多窗口, 你就会找到一个有效但是没用的窗口。 我测试的结果就是获得了一个tooltip的句柄,给他发消息当然没有反应了。
kingstarer 2008-05-10
  • 打赏
  • 举报
回复
LZ还在请教啊 到时研究出怎么往密码框发送密码麻烦通知我啊^_^

ps:后来我发现不用用这种笨方法登录,因为qq本身就提供了自动登录的接口,在启动时传一些参数(参数内容是登录信息,包括登录方式,帐号,密码等,其中密码是md5加密后用base64编码的字符串)
jarchild 2008-05-10
  • 打赏
  • 举报
回复
密码可以用WM_CHAR一个一个的写进去。
jarchild 2008-05-09
  • 打赏
  • 举报
回复
继续等!
jarchild 2008-05-06
  • 打赏
  • 举报
回复
FindWindow是可以的,但是我的应用程序是不确定窗口的标题和窗口类的。比如msn也能行。
星羽 2008-05-06
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include <windows.h>
#include <shellapi.h>


#pragma comment(lib, "user32")
#pragma comment(lib, "gdi32")
#pragma comment(lib, "shell32")



HWND g_hwnd = 0;

BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
{
DWORD dwID;

GetWindowThreadProcessId(hwnd, &dwID);

if(dwID == (DWORD)lParam)
{
g_hwnd = hwnd;
MessageBox(0, "find", "find", 0);
return 0;
}

return 1;
}

int main()
{

STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
char path[50]="D:\\Tencent\\QQ\\QQ.exe";
BOOL nRet = CreateProcess(NULL,path,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS, NULL,NULL, &si,&pi);

DWORD hProcessId = pi.dwProcessId;

while(0!=EnumWindows((WNDENUMPROC)EnumProc, (LPARAM)hProcessId))
{
}

g_hwnd = FindWindow(NULL, "QQ用户登录");
if (g_hwnd != NULL)
{
HWND hwndChild = 0;
if ((hwndChild = FindWindowEx(g_hwnd, NULL, "ComboBox", NULL)) != NULL)
{
SendMessage(hwndChild, WM_SETTEXT, NULL, LPARAM("6666666"));
}
}
return 0;

}


星羽 2008-05-06
  • 打赏
  • 举报
回复
我试了,用我15楼发的程序是可以的
我的qq 是 2008
jarchild 2008-05-06
  • 打赏
  • 举报
回复
谢谢各位的帮助。
回Chiyer:我看了,是不一样的。
回arong1234 :我说的unuesd就是非法的值。
问题还是没有解决,闷
arong1234 2008-05-05
  • 打赏
  • 举报
回复
你所说的unused是什么意思?是这段代码找不到对应窗口?还是啥意思?
如果紧紧是编译器提示信息,其实可以忽略
如果你真的找不到,先用spy++找找看看

[Quote=引用楼主 jarchild 的帖子:]
代码如下
HWND g_hwnd = 0;

BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
{
DWORD dwID;

GetWindowThreadProcessId(hwnd, &dwID);

if(dwID == (DWORD)lParam)
{
g_hwnd = hwnd;
MessageBox(0, "find", "find", 0);
return 0;
}

return 1;
}

STARTUPINFO si;
PROCESS_INFORMATION pi;

Ze…
[/Quote]
星羽 2008-05-05
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include <windows.h>
#include <shellapi.h>


#pragma comment(lib, "user32")
#pragma comment(lib, "gdi32")
#pragma comment(lib, "shell32")



HWND g_hwnd = 0;

BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
{
DWORD dwID;

GetWindowThreadProcessId(hwnd, &dwID);

if(dwID == (DWORD)lParam)
{
g_hwnd = hwnd;
MessageBox(0, "find", "find", 0);
return 0;
}

return 1;
}

int main()
{

STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
char path[50]="C:\\Program Files\\Tencent\\QQ\\QQ.exe";
BOOL nRet = CreateProcess(NULL,path,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS, NULL,NULL, &si,&pi);

DWORD hProcessId = pi.dwProcessId;

while(0!=EnumWindows((WNDENUMPROC)EnumProc, (LPARAM)hProcessId))
{
}

g_hwnd = FindWindow(NULL, "QQ用户登录");
if (g_hwnd != NULL)
{
HWND hwndChild = 0;
if ((hwndChild = FindWindowEx(g_hwnd, NULL, "ComboBox", NULL)) != NULL)
{
SendMessage(hwndChild, WM_SETTEXT, NULL, LPARAM("6666666"));
}
}
return 0;

}
星羽 2008-05-05
  • 打赏
  • 举报
回复
你看看用spy++抓到的handle和你得到的一样不?
guzhilei1986 2008-05-05
  • 打赏
  • 举报
回复
看不明白代码,高深哦。
用户 昵称 2008-05-05
  • 打赏
  • 举报
回复
你的enumproc没问题
过去的我 2008-05-05
  • 打赏
  • 举报
回复
qq的那个密码框是自绘的,不是ComboBox,还是别动那个脑经了..
kingstarer 2008-05-05
  • 打赏
  • 举报
回复
呵呵 我前段时间也做过 不过做到一半就放弃了 因为QQ的保护实在太厉害了 发送什么消息过去都是石沉大海

后来才发现,原来是瑞星在搞鬼 于是把瑞星关了 再发消息 虽然成功往密码框输入密码了 但是登录时总是提示密码不正确 所以很郁闷地放弃了

jarchild 2008-05-05
  • 打赏
  • 举报
回复
完整代码:
#include <windows.h>
#include <shellapi.h>
#include "WebRobert.h"
#include "AutoRun.h"

#pragma comment(lib, "user32")
#pragma comment(lib, "gdi32")
#pragma comment(lib, "shell32")

using namespace std;

HWND g_hwnd = 0;

BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
{
DWORD dwID;

GetWindowThreadProcessId(hwnd, &dwID);

if(dwID == (DWORD)lParam)
{
g_hwnd = hwnd;
MessageBox(0, "find", "find", 0);
return 0;
}

return 1;
}

int main()
{

STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
char path[50]="D:\\Tencent\\QQ\\QQ.exe";
BOOL nRet = CreateProcess(NULL,path,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS, NULL,NULL, &si,&pi);

DWORD hProcessId = pi.dwProcessId;

while(0!=EnumWindows((WNDENUMPROC)EnumProc, (LPARAM)hProcessId))
{
}

if (g_hwnd != NULL)
{
HWND hwndChild = 0;
if ((hwndChild = FindWindowEx(g_hwnd, NULL, "ComboBox", NULL)) != NULL)
{
SendMessage(hwndChild, WM_SETTEXT, NULL, LPARAM("6666666"));
}
}
return 0;

}


期待各位高手解答!!!
jarchild 2008-05-05
  • 打赏
  • 举报
回复
更恶心的是程序会弹出“find”的messagebox,但是调试或者做后续工作,句柄都是unused
jarchild 2008-05-05
  • 打赏
  • 举报
回复
多谢帮忙,但是还是不行啊。。。
晕死我了
过去的我 2008-05-05
  • 打赏
  • 举报
回复
加个while就能找到...

#include <windows.h>
HWND g_hwnd = 0;

BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
{
DWORD dwID;

GetWindowThreadProcessId(hwnd, &dwID);

if(dwID == (DWORD)lParam)
{
g_hwnd = hwnd;
MessageBox(0, "find", "find", 0);
return 0;
}

return 1;
}


int __stdcall WinMain(HINSTANCE,HINSTANCE,char *,int)
{

STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
char path[50]="notepad";
BOOL nRet = CreateProcess(NULL,path,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS, NULL,NULL, &si,&pi);

DWORD hProcessId = pi.dwProcessId;
//不过这里最好sleep个几秒
while(0!=EnumWindows((WNDENUMPROC)EnumProc, (LPARAM)hProcessId))
{
}
return 0;

}

jarchild 2008-05-05
  • 打赏
  • 举报
回复
大家帮我看下EnumWindows的用法对不对 我怀疑是那里的问题
加载更多回复(4)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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