首页
社区
课程
招聘
[求助]如何根据进程ID获取窗口句柄
发表于: 2008-6-7 10:23 37968

[求助]如何根据进程ID获取窗口句柄

2008-6-7 10:23
37968
用CreateProcess创建进程后,只能获取进程的一些信息,无法获取窗口句柄.请问该怎么做?请大大给点思路,谢谢.

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zby
2
如果能知道线程ID的话, 可以试试
BOOL EnumThreadWindows(DWORD dwThreadId,
WNDENUMPROC lpfn,
LPARAM lParam
);

WNDENUMPROC 会带这个线程所属的窗口句柄:
BOOL CALLBACK EnumThreadWndProc(HWND hwnd, LPARAM lParam);
2008-6-7 10:58
0
雪    币: 22
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
//临时方案
hw := FindWindow('暴雪游戏窗体类名 ', nil);

//顺便插话题1,openGL这类直接操作端口的游戏[资料上说它不接受postmessage,为了时效性,逼真性],怎么实现后台模拟按键[非激活窗体],排除写call思路,那个人能给我吹吹。
//顺便插话题2,spy++不能入侵界面被封装后的窗体[该死的,openGL又作怪],有没医生,给他做个手术?
2008-6-7 11:10
0
雪    币: 22
活跃值: (443)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
以前也遇到过类似的程序

没找到好的办法 后来只能用枚举了

3楼的答非所问.
2008-6-7 11:22
0
雪    币: 22
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
//4楼=没说,玩笑,
//不是要获得窗体句柄?我写的没错啊,都说了是临时方案
//专[答非所问]兼职[插话题]
2008-6-7 11:29
0
雪    币: 22
活跃值: (443)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=许胜;463719]//4楼=没说,玩笑,
//不是要获得窗体句柄?我写的没错啊,都说了是临时方案
//专[答非所问]兼职[插话题][/QUOTE]

如果只是简单的找找窗体句柄 那方法就多了

现在楼主强调的是找 CreateProcess创建进程后的句柄

就是说窗体名称和类名事先是无法知道的..还有些程序的窗体名称可能每次运行都不一样的
2008-6-7 11:43
0
雪    币: 22
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
//set a new function
function GetHwndFromProcess(ProcessId: DWORD): HWND;
  function _EnumWindowsProc(P_HWND: Cardinal; lParam: Cardinal): Boolean; stdcall;
  var
    PID: DWORD;
  begin
    GetWindowThreadProcessId(P_HWND, @PID);
    if PCardinal(lParam)^ <> PID then
      Result := True
    else
    begin
      Result := False;
      PCardinal(lParam+4)^ := P_HWND;
    end;
  end;

var
  Buffer: array[0..1] of Cardinal;
begin
  Result := 0;
  Buffer[0] := ProcessId;
  Buffer[1] := 0;
  EnumWindows(@_EnumWindowsProc, Integer(@Buffer));
  if Buffer[1] > 0 then Result := Buffer[1];
end;
2008-6-7 12:01
0
雪    币: 440
活跃值: (737)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
8
这段代码好用
HWND GetWindowHandleByPID(DWORD dwProcessID)
{
    HWND h = GetTopWindow(0 );
    while ( h )
    {
        DWORD pid = 0;
        DWORD dwTheardId = GetWindowThreadProcessId( h,&pid);

        if (dwTheardId != 0)
        {
            if ( pid == dwProcessID/*your process id*/ )
            {
                // here h is the handle to the window
                return h;
            }
        }

        
        h = GetNextWindow( h , GW_HWNDNEXT);
    }

    return NULL;
}


在网上还找到上面那段代码,但结果不一样,不知是为什么。
ls的和winspy+获取的结果一样
2009-6-5 17:38
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
9
晕 ,这么老的帖子怎么翻出来了
2009-6-5 21:20
0
雪    币: 440
活跃值: (737)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
10
昨天搜索这样的函数,搜到了
哈哈
2009-6-6 09:53
0
游客
登录 | 注册 方可回帖
返回
//