写了段根据程序名称获取窗口句柄的程序,单次运行正常。多次运行就有问题了。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的检测就不正常了。如何解决。

解决方案 »

  1.   

    你有用IsWindowVisible和IsWindowEnabled来检测窗口是否可用,是否是窗口Hide了?
      

  2.   

    由窗口句柄获取进程句柄,很好实现,唯一性。由进程句柄获取窗口句柄,不唯一。因为可能某个exe有多个窗口的情况。还有一种情况是具有相同名字的两个exe运行时,他们都有各自的窗口句柄,这就更多了。楼主要实现什么功能?如果单纯的实现由exe随便获取一个窗口句柄,那可以实现,但由exe获取唯一的窗口,那就要针对窗口的特性再做过滤。
      

  3.   

       我要获取的A,B程序 都只有一个窗口
       
       现在是这样的,我需要通过A,B程序的名称,判断两个程序是否已经打开,并获取其窗口句柄。
      
       楼上的,会的话  请告知下。
      
       谢谢!