获取窗口句柄问题

xukongshui 2010-04-08 09:06:48
写了段根据程序名称获取窗口句柄的程序,单次运行正常。多次运行就有问题了。

type
PEnumInfo = ^TEnumInfo;
TEnumInfo = record
ProcessID: DWORD;
HWND: THandle;
end;

function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall;
var
PID: DWORD;
begin
GetWindowThreadProcessID(Wnd, @PID);

Result := (PID <> EI.ProcessID) or (not IsWindowVisible(WND)) or (not IsWindowEnabled(WND));

if not Result then
EI.HWND := WND;
end;

function TUpdateFrm.FindMainWindow(PID: DWORD): DWORD;
var
EI: TEnumInfo;
begin
EI.ProcessID := PID;

EI.HWND := 0;

EnumWindows(@EnumWindowsProc, Integer(@EI));

Result := EI.HWND;
end;

//跟据ProcessId获取进程的窗口句柄
function TUpdateFrm.GetHWndByPID(const hPID: THandle): THandle;
begin
if hPID <> 0 then
Result := FindMainWindow(hPID)
else
Result := 0;
end;


GetHWndByPID为根据进程ID号获取窗口句柄的函数。
现在我需要依次检查进程中是否有A.exe,B.exe两个个程序。

加入A.exe进程中存在,那么B的检测正常

加入A.exe进程中不存在,那么B的检测就不正常了。

如何解决。
...全文
203 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xukongshui 2010-04-08
  • 打赏
  • 举报
回复
我要获取的A,B程序 都只有一个窗口

现在是这样的,我需要通过A,B程序的名称,判断两个程序是否已经打开,并获取其窗口句柄。

楼上的,会的话 请告知下。

谢谢!
无条件为你 2010-04-08
  • 打赏
  • 举报
回复
由窗口句柄获取进程句柄,很好实现,唯一性。

由进程句柄获取窗口句柄,不唯一。因为可能某个exe有多个窗口的情况。还有一种情况是具有相同名字的两个exe运行时,他们都有各自的窗口句柄,这就更多了。

楼主要实现什么功能?如果单纯的实现由exe随便获取一个窗口句柄,那可以实现,但由exe获取唯一的窗口,那就要针对窗口的特性再做过滤。
xukongshui 2010-04-08
  • 打赏
  • 举报
回复
A程序 我就没启动。
B程序 我启动了。

上面的源码 也是我从网上查到的。

SQLDebug_Fan 2010-04-08
  • 打赏
  • 举报
回复
你有用IsWindowVisible和IsWindowEnabled来检测窗口是否可用,是否是窗口Hide了?
xukongshui 2010-04-08
  • 打赏
  • 举报
回复
两个进程没有关系,传入的ID号 正常
SQLDebug_Fan 2010-04-08
  • 打赏
  • 举报
回复
A和B进程有什么关系吗?检查一下传入的进程句柄是否为0?

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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