吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 495|回复: 5
收起左侧

[求助] Delphi咋编程:按下热键得到目标窗口 焦点处的 控件名?

[复制链接]
冥界3大法王 发表于 2024-12-21 10:23
本帖最后由 冥界3大法王 于 2024-12-21 10:54 编辑

直接在热键代码中使用下面
ShowMessage(ActiveControl.Name);

这个不行。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

msold5 发表于 2024-12-21 10:41
下载Winformation试试
pzx521521 发表于 2024-12-21 11:15
如果想delphi程序自己本身:
ActiveControl 当前窗体内的控件 如果不在当前窗口不行, 比如有两个窗体  ActiveControl是窗体的属性
对于多窗体用 WndProc 和  GetFocus

如果想获取到其他程序的,
通过windows的api
先GetForegroundWindow 获取到焦点窗口的handle
然后通过handle GetClassName/GetWindowText
 楼主| 冥界3大法王 发表于 2024-12-21 12:28
pzx521521 发表于 2024-12-21 11:15
如果想delphi程序自己本身:
ActiveControl 当前窗体内的控件 如果不在当前窗口不行, 比如有两个窗体  Acti ...

就是其他外部程序的
GetClassName这个类名已经成功得到
GetWindowText这个不太会用。
 楼主| 冥界3大法王 发表于 2024-12-21 21:50
pzx521521 发表于 2024-12-21 11:15
如果想delphi程序自己本身:
ActiveControl 当前窗体内的控件 如果不在当前窗口不行, 比如有两个窗体  Acti ...

@pzx521521

procedure TWinTitle.hotykey(var msg: TMessage);
var
  pid: Cardinal;
  pHandle: THandle;
  buf: array[0..MAX_PATH] of Char;
  ps: array[0..254] of Char;       // 这个是定义激活的窗口的控件名
  path: string;                         // 激活窗口的路径
  arr: array[0..254] of Char;
  h: HWND;
  pt: TPoint;
  c: TColor;
  Point: TPoint;
  类名: array[0..255] of Char;
  Buffer: array[0..1023] of Char;
  AHandle: THandle;
begin
  if (GetAsyncKeyState(VK_LWIN) and (GetAsyncKeyState(Ord('A'))) < 0) then        // Win+A
  begin
    h := GetForegroundWindow; // 这个是句柄
    GetWindowThreadProcessId(h, @pid);
    pHandle := OpenProcess(PROCESS_ALL_ACCESS, false, pid);
    GetModuleFileNameEx(pHandle, 0, buf, Length(buf));
    CloseHandle(pHandle);
    GetWindowText(h, @arr, SizeOf(arr));
    GetClassName(h, ps, 255);
    // aWnd := WindowFromPoint(Mouse.CursorPos);
    path := GetProcessExePath(h);
    WinTitle.窗口标题Edit1.Text := arr;
    WinTitle.窗口类名_Edit2.Text := ps;
    WinTitle.窗口句柄_Edit4.Text := '0x' + PChar(IntToHex(StrToInt(IntToStr(h))));
    WinTitle.完整路径_Edit5.Text := PChar(path);
    WinTitle.窗口PID_Edit6.Text := Format('%u', [pid]);
//ShowMessage('当前激活的窗口标题是:' + arr + #13#10 + '得到激活的窗口类名是:' + ps + #13#10 + '得到激活窗口的完整路径是:' + PChar(path) + #13#10 + '当前窗口的句柄是:' + PChar(IntToHex(StrToInt(IntToStr(h)))));
//ShowMessage(Format('%u', [pid]));       //得到激活窗口的pid可行
    WinTitle.进程名_Edit7.Text := TRegEx.Replace(WinTitle.完整路径_Edit5.Text, '.*\\', '');

    GetCursorPos(pt);           //取得鼠标位置
    WinTitle.KJ_Edit8.Text := IntToStr(pt.X) + ',' + IntToStr(pt.Y);

    c := GetPixel(GetDC(0), pt.X, pt.Y);
    WinTitle.KJ_Edit3.Color := c;
    WinTitle.KJ_Edit3.Text := Format('#%.6x', [c]);

    AHandle := WindowFromPoint(Point);   // 取得当前窗口句柄
    GetClassName(AHandle, 类名, Length(类名));
    if AHandle = Self.Handle then
      Exit;
    SendMessage(AHandle, WM_GETTEXT, 1023, Integer(@Buffer));
    WinTitle.KJ_Edit9.Text := StrPas(类名);
    WinTitle.kj_Memo1.Lines.Text := StrPas(Buffer);    //得到类名

===>>> 到这里!不知如何取得那个其他外部程序中类名对应的当前光标下的那个控件的名称了。
  @pzx521521 不明白如何套用了,搞了好久没成功。
   
  end;
end;
pzx521521 发表于 2024-12-22 10:30
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-2 19:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表