zoukankan      html  css  js  c++  java
  • Delphi 实现获取其他程序的子窗体

    通过一个父窗体的句柄,递归的枚举它的子窗体,我们可以最终找到需要的子窗体。

    用法如下:

      nParentHandle: HWnd; 
    nChildHandle: HWnd;

      nParentHandle := FindWindow(nil, 'Notepad'); 
    if nParentHandle <> 0 then 
    nChildHandle := FindChildWindow(nParentHandle, 'SomeChildEditsClassName');

    ------函数代码------

    var 
    hwndFindChildWindow : HWND;

    function EnumWindowsForFindChildWindowProc(WHandle: HWND; lParam: LPARAM): BOOL; export; stdcall; 
    const 
    MAX_WINDOW_NAME_LEN = 80; 
    var 
    sTargetClassName: string; 
    nHandle: HWnd; 
    sCurrClassName: string; 
    bResult: Boolean; 
    begin 
    if (hwndFindChildWindow <> 0) then 
    exit; 
    sTargetClassName := PChar(lParam); 
    sCurrClassName := GetWindowClass(WHandle); 
    bResult := CompareText(sCurrClassName, sTargetClassName) = 0; 
    If (bResult) then 
    hwndFindChildWindow := WHandle 
    else 
    FindChildWindow(WHandle, PChar(lParam)); 
    end;

    function FindChildWindow(hwndParent: HWnd; ClassName: PChar) : HWnd; 
    begin 
    try 
    EnumChildWindows(hwndParent, @EnumWindowsForFindChildWindowProc, LongInt(PChar(ClassName))); 
    Result := hwndFindChildWindow; 
    except 
    on Exception do 
    Result := 0; 
    end; 
    end;

    //返回当前获得焦点的窗体
    function GetFocusedWindowFromParent(ParentWnd:HWnd):HWnd; 
    var 
    OtherThread, 
    Buffer : DWord; 
    idCurrThread: DWord; 
    begin 
    OtherThread := GetWindowThreadProcessID(ParentWnd, @Buffer); 
    idCurrThread := GetCurrentThreadID; 
    if AttachThreadInput(idCurrThread, OtherThread, true) then begin 
    Result := GetFocus; 
    AttachThreadInput(idCurrThread, OtherThread, false); 
    end 
    else 
    Result:= GetFocus; 
    end;

    //获得当前获得焦点的子窗体,即使它是其他应用程序的窗体
    function GetFocusedChildWindow: HWnd; 
    begin 
    Result := GetFocusedWindowFromParent(GetForegroundWindow); 
    end;

    //获得窗体的文本
    function EIGetWinText(nHandle: Integer): string; 
    var 
    pcText: array[0..32768] of char; 
    begin 
    SendMessage(nHandle, WM_GETTEXT, 32768, LongInt(@pcText)); 
    Result := pcText; 
    end;

    //设定窗体的文本
    procedure EISetWinText(nHandle: Integer; const sNewText: string); 
    begin 
    SendMessage(nHandle, WM_SETTEXT, Length(sNewText), LongInt(PChar(Trim(sNewText)))); 
    end;

    //返回窗体的类名
    function EIGetWindowClass(const nHandle: HWnd): string; 
    var 
    szClassName: array[0..255] of char; 
    begin 
    GetClassName(nHandle, szClassName, 255); 
    Result := szClassName; 
    end;

    ------函数代码------

  • 相关阅读:
    SRM 551 div2
    HDU_4390 Number Sequence (容斥原理)
    HDU 多校联合第五场
    HDU 多校联合第六场
    POJ 2057 The Lost House (经典树形dp)
    Lucas定理
    HDU 4385 Moving Bricks (状态dp+贪心)
    HDU 多校联合第三场
    当最短路变成二维 _!
    POJ 1848 (一道不错的树形dp)
  • 原文地址:https://www.cnblogs.com/jijm123/p/6487295.html
Copyright © 2011-2022 走看看