递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 353|回复: 0
打印 上一主题 下一主题

[视窗] 菜鸟交个作业,关于窗口控件信息的

[复制链接]

20

主题

68

帖子

637

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
637
跳转到指定楼层
楼主
发表于 2025-1-4 16:46:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
按F4键,取鼠标光标处窗口控件信息,显示在编辑框里;按F5键,枚举鼠标光标处窗口内所有控件信息,显示在记事本中。创意要求和效果验收是我干的,具体实施是训练Ai完成的,请看效果。


  1. <火山程序 类型 = "通常" 版本 = 1 />

  2. 包 火山.程序 <@视窗.外部头文件 = "<windows.h>\r\n<string>\r\n<vector>">

  3. 类 代码嵌入 <公开 @强制输出 = 真>
  4. {

  5.     # @begin
  6.     # HHOOK g_hKeyboardHook = nullptr; // 全局变量声明
  7.     # int g_hotkeyF4 = VK_F4;
  8.     # int g_hotkeyF5 = VK_F5;
  9.     # void 提取窗口控件信息();
  10.     # void EnumChildControlsAndWriteToNotepad(HWND hwndTarget);
  11.     # BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam); // 提前声明
  12.     # LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
  13.     # {
  14.     # if (nCode == HC_ACTION && wParam == WM_KEYDOWN)
  15.     # {
  16.     # KBDLLHOOKSTRUCT* pKbdStruct = (KBDLLHOOKSTRUCT*)lParam;
  17.     # if (pKbdStruct->vkCode == g_hotkeyF4)
  18.     # {
  19.     # 提取窗口控件信息();
  20.     # }
  21.     # else if (pKbdStruct->vkCode == g_hotkeyF5)
  22.     # {
  23.     # POINT pt;
  24.     # GetCursorPos(&pt);
  25.     # HWND hwndTarget = WindowFromPoint(pt);
  26.     # if (hwndTarget)
  27.     # {
  28.     # EnumChildControlsAndWriteToNotepad(hwndTarget);
  29.     # }
  30.     # }
  31.     # }
  32.     # return CallNextHookEx(g_hKeyboardHook, nCode, wParam, lParam);
  33.     # }
  34.     # void GetWindowInfo(HWND hwnd, std::wstring& title, std::wstring& className)
  35.     # {
  36.     # wchar_t buffer[256];
  37.     # GetWindowText(hwnd, buffer, 256);
  38.     # title = buffer;
  39.     # GetClassName(hwnd, buffer, 256);
  40.     # className = buffer;
  41.     # }
  42.     # void 提取窗口控件信息()
  43.     # {
  44.     # POINT pt;
  45.     # GetCursorPos(&pt);
  46.     # HWND hwnd = WindowFromPoint(pt);
  47.     # if (hwnd)
  48.     # {
  49.     # std::wstring controlTitle, controlClassName;
  50.     # GetWindowInfo(hwnd, controlTitle, controlClassName);
  51.     # HWND parentHwnd = GetParent(hwnd);
  52.     # std::wstring parentTitle, parentClassName;
  53.     # if (parentHwnd)
  54.     # {
  55.     # GetWindowInfo(parentHwnd, parentTitle, parentClassName);
  56.     # }
  57.     # std::wstring info = L"控件--句柄:" + std::to_wstring(reinterpret_cast<ULONG_PTR>(hwnd)) + L"\r\n" +
  58.     #  L"控件--标题:" + controlTitle + L"\r\n" +
  59.     #  L"控件--类名:" + controlClassName + L"\r\n" +
  60.     #  L"父窗口句柄:" + std::to_wstring(reinterpret_cast<ULONG_PTR>(parentHwnd)) + L"\r\n" +
  61.     #  L"父窗口标题:" + parentTitle + L"\r\n" +
  62.     #  L"父窗口类名:" + parentClassName;
  63.     # @<全局变量.全局变量1> = info.c_str();
  64.     # }
  65.     # }
  66.     # void EnumChildControlsAndWriteToNotepad(HWND hwndTarget)
  67.     # {
  68.     # std::vector<std::wstring> controlsInfo;
  69.     # EnumChildWindows(hwndTarget, EnumChildProc, reinterpret_cast<LPARAM>(&controlsInfo));
  70.     # std::wstring resultText;
  71.     # for (const auto& info : controlsInfo)
  72.     # {
  73.     # resultText += info + L"\r\n";
  74.     # }
  75.     # // 添加 UTF-16 LE BOM
  76.     # const wchar_t BOM = 0xFEFF;
  77.     # resultText.insert(resultText.begin(), BOM);
  78.     # // 获取系统临时目录路径
  79.     # wchar_t tempPath[MAX_PATH];
  80.     # GetTempPath(MAX_PATH, tempPath);
  81.     # // 拼接完整的文件路径
  82.     # std::wstring filePath = std::wstring(tempPath) + L"枚举鼠标光标处窗口内控件信息.txt";
  83.     # // 打开记事本并写入内容
  84.     # HANDLE hFile = CreateFile(filePath.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  85.     # if (hFile != INVALID_HANDLE_VALUE)
  86.     # {
  87.     # DWORD bytesWritten;
  88.     # WriteFile(hFile, resultText.c_str(), static_cast<DWORD>(resultText.size() * sizeof(wchar_t)), &bytesWritten, NULL);
  89.     # CloseHandle(hFile);
  90.     # ShellExecute(NULL, L"open", L"notepad.exe", filePath.c_str(), NULL, SW_SHOWNORMAL);
  91.     # }
  92.     # }
  93.     # BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam)
  94.     # {
  95.     # std::vector<std::wstring>* pControlsInfo = reinterpret_cast<std::vector<std::wstring>*>(lParam);
  96.     # ULONG_PTR hwndInt = reinterpret_cast<ULONG_PTR>(hwndChild);
  97.     # wchar_t className[256];
  98.     # GetClassName(hwndChild, className, 256);
  99.     # wchar_t title[256];
  100.     # GetWindowText(hwndChild, title, 256);
  101.     # // 去掉控件内容的获取
  102.     # std::wstring info = L"[句柄] " + std::to_wstring(hwndInt) + L"  [标题] " + title + L"  [类名] " + className;
  103.     # pControlsInfo->push_back(info);
  104.     # return TRUE;
  105.     # }
  106.     # @end
  107. }

  108. 类 全局变量 <公开 折叠>
  109. {
  110.     变量 全局变量1 <公开 静态 类型 = 文本型>
  111. }

  112. 类 启动类 <公开 基础类 = 窗口程序类 折叠>
  113. {
  114.     变量 主窗口对象 <类型 = 启动窗口>

  115.     方法 启动方法 <公开 类型 = 整数>
  116.     {
  117.         主窗口对象.创建主窗口 ()
  118.         返回 (1)
  119.     }
  120. }

  121. # ===

  122. 类 启动窗口 <基础类 = 窗口 注释 = "样例主窗口" 折叠 折叠2 @视窗.布局 = "client_size = "717, 215""
  123.         标题 = " 按F4键,取光标处窗口控件信息;按F5键,枚举光标处窗口内控件信息。" 最大化按钮 = 假 可否移动 = 真 随意移动 = 真 总在最前 = 真 保持标题条激活 = 真>
  124. {
  125.     变量 编辑框1 <类型 = 编辑框 折叠 隐藏值属性 = "0" @视窗.布局 = "id = 101\r\npos = "1, 3, 716, 211"" 滚动条 = 无
  126.             字体 = "宋体, 12, 0, 0, 0, 0, 0" 对齐方式 = 左边 是否允许多行 = 真 输入方式 = 通常方式>
  127.     变量 热键1 <类型 = 系统热键类>

  128.     方法 窗口_将被销毁 <接收事件 类型 = 整数 注释 = "当本组件被销毁前发送此事件">
  129.     参数 来源对象 <类型 = 窗口 注释 = "提供事件产生的具体来源对象" 折叠>
  130.     参数 标记值 <类型 = 整数 注释 = "用户调用"挂接事件"命令时所提供的"标记值"参数值,非此方式挂接事件则本参数值固定为0.">
  131.     {
  132.         @ if (g_hKeyboardHook)
  133.         @ {
  134.         @ UnhookWindowsHookEx(g_hKeyboardHook);
  135.         @ g_hKeyboardHook = nullptr;
  136.         @ }
  137.         @ PostQuitMessage(0);
  138.         返回 (0)
  139.     }

  140.     方法 启动窗口_创建完毕 <接收事件 类型 = 整数 注释 = "当本组件及其中所有子组件均被创建完毕后发送此事件."
  141.             @视窗.外部头文件 = "<windows.h>\r\n<string>\r\n<vector>">
  142.     参数 来源对象 <类型 = 启动窗口 注释 = "提供事件产生的具体来源对象">
  143.     参数 标记值 <类型 = 整数 注释 = "用户调用"挂接事件"命令时所提供的"标记值"参数值,非此方式挂接事件则本参数值固定为0.">
  144.     {
  145.         左边 = 0
  146.         顶边 = 0
  147.         热键1.热键 = 按键码.F4键
  148.         @ g_hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, GetModuleHandle(nullptr), 0);
  149.         返回 (0)
  150.     }

  151.     方法 系统热键类_热键被按下 <接收事件 类型 = 整数 注释 = "当所登记的热键按下后本事件被发送">
  152.     参数 来源对象 <类型 = 系统热键类 注释 = "提供事件产生的具体来源对象">
  153.     参数 标记值 <类型 = 整数 注释 = "用户调用"挂接事件"命令时所提供的"标记值"参数值,非此方式挂接事件则本参数值固定为0.">
  154.     {
  155.         @ 提取窗口控件信息();
  156.         编辑框1.内容 = 全局变量.全局变量1
  157.         返回 (0)
  158.     }
  159. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2025-1-30 14:28 , Processed in 0.091731 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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