|
按F4键,取鼠标光标处窗口控件信息,显示在编辑框里;按F5键,枚举鼠标光标处窗口内所有控件信息,显示在记事本中。创意要求和效果验收是我干的,具体实施是训练Ai完成的,请看效果。
- <火山程序 类型 = "通常" 版本 = 1 />
- 包 火山.程序 <@视窗.外部头文件 = "<windows.h>\r\n<string>\r\n<vector>">
- 类 代码嵌入 <公开 @强制输出 = 真>
- {
- # @begin
- # HHOOK g_hKeyboardHook = nullptr; // 全局变量声明
- # int g_hotkeyF4 = VK_F4;
- # int g_hotkeyF5 = VK_F5;
- # void 提取窗口控件信息();
- # void EnumChildControlsAndWriteToNotepad(HWND hwndTarget);
- # BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam); // 提前声明
- # LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
- # {
- # if (nCode == HC_ACTION && wParam == WM_KEYDOWN)
- # {
- # KBDLLHOOKSTRUCT* pKbdStruct = (KBDLLHOOKSTRUCT*)lParam;
- # if (pKbdStruct->vkCode == g_hotkeyF4)
- # {
- # 提取窗口控件信息();
- # }
- # else if (pKbdStruct->vkCode == g_hotkeyF5)
- # {
- # POINT pt;
- # GetCursorPos(&pt);
- # HWND hwndTarget = WindowFromPoint(pt);
- # if (hwndTarget)
- # {
- # EnumChildControlsAndWriteToNotepad(hwndTarget);
- # }
- # }
- # }
- # return CallNextHookEx(g_hKeyboardHook, nCode, wParam, lParam);
- # }
- # void GetWindowInfo(HWND hwnd, std::wstring& title, std::wstring& className)
- # {
- # wchar_t buffer[256];
- # GetWindowText(hwnd, buffer, 256);
- # title = buffer;
- # GetClassName(hwnd, buffer, 256);
- # className = buffer;
- # }
- # void 提取窗口控件信息()
- # {
- # POINT pt;
- # GetCursorPos(&pt);
- # HWND hwnd = WindowFromPoint(pt);
- # if (hwnd)
- # {
- # std::wstring controlTitle, controlClassName;
- # GetWindowInfo(hwnd, controlTitle, controlClassName);
- # HWND parentHwnd = GetParent(hwnd);
- # std::wstring parentTitle, parentClassName;
- # if (parentHwnd)
- # {
- # GetWindowInfo(parentHwnd, parentTitle, parentClassName);
- # }
- # std::wstring info = L"控件--句柄:" + std::to_wstring(reinterpret_cast<ULONG_PTR>(hwnd)) + L"\r\n" +
- # L"控件--标题:" + controlTitle + L"\r\n" +
- # L"控件--类名:" + controlClassName + L"\r\n" +
- # L"父窗口句柄:" + std::to_wstring(reinterpret_cast<ULONG_PTR>(parentHwnd)) + L"\r\n" +
- # L"父窗口标题:" + parentTitle + L"\r\n" +
- # L"父窗口类名:" + parentClassName;
- # @<全局变量.全局变量1> = info.c_str();
- # }
- # }
- # void EnumChildControlsAndWriteToNotepad(HWND hwndTarget)
- # {
- # std::vector<std::wstring> controlsInfo;
- # EnumChildWindows(hwndTarget, EnumChildProc, reinterpret_cast<LPARAM>(&controlsInfo));
- # std::wstring resultText;
- # for (const auto& info : controlsInfo)
- # {
- # resultText += info + L"\r\n";
- # }
- # // 添加 UTF-16 LE BOM
- # const wchar_t BOM = 0xFEFF;
- # resultText.insert(resultText.begin(), BOM);
- # // 获取系统临时目录路径
- # wchar_t tempPath[MAX_PATH];
- # GetTempPath(MAX_PATH, tempPath);
- # // 拼接完整的文件路径
- # std::wstring filePath = std::wstring(tempPath) + L"枚举鼠标光标处窗口内控件信息.txt";
- # // 打开记事本并写入内容
- # HANDLE hFile = CreateFile(filePath.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- # if (hFile != INVALID_HANDLE_VALUE)
- # {
- # DWORD bytesWritten;
- # WriteFile(hFile, resultText.c_str(), static_cast<DWORD>(resultText.size() * sizeof(wchar_t)), &bytesWritten, NULL);
- # CloseHandle(hFile);
- # ShellExecute(NULL, L"open", L"notepad.exe", filePath.c_str(), NULL, SW_SHOWNORMAL);
- # }
- # }
- # BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam)
- # {
- # std::vector<std::wstring>* pControlsInfo = reinterpret_cast<std::vector<std::wstring>*>(lParam);
- # ULONG_PTR hwndInt = reinterpret_cast<ULONG_PTR>(hwndChild);
- # wchar_t className[256];
- # GetClassName(hwndChild, className, 256);
- # wchar_t title[256];
- # GetWindowText(hwndChild, title, 256);
- # // 去掉控件内容的获取
- # std::wstring info = L"[句柄] " + std::to_wstring(hwndInt) + L" [标题] " + title + L" [类名] " + className;
- # pControlsInfo->push_back(info);
- # return TRUE;
- # }
- # @end
- }
- 类 全局变量 <公开 折叠>
- {
- 变量 全局变量1 <公开 静态 类型 = 文本型>
- }
- 类 启动类 <公开 基础类 = 窗口程序类 折叠>
- {
- 变量 主窗口对象 <类型 = 启动窗口>
- 方法 启动方法 <公开 类型 = 整数>
- {
- 主窗口对象.创建主窗口 ()
- 返回 (1)
- }
- }
- # ===
- 类 启动窗口 <基础类 = 窗口 注释 = "样例主窗口" 折叠 折叠2 @视窗.布局 = "client_size = "717, 215""
- 标题 = " 按F4键,取光标处窗口控件信息;按F5键,枚举光标处窗口内控件信息。" 最大化按钮 = 假 可否移动 = 真 随意移动 = 真 总在最前 = 真 保持标题条激活 = 真>
- {
- 变量 编辑框1 <类型 = 编辑框 折叠 隐藏值属性 = "0" @视窗.布局 = "id = 101\r\npos = "1, 3, 716, 211"" 滚动条 = 无
- 字体 = "宋体, 12, 0, 0, 0, 0, 0" 对齐方式 = 左边 是否允许多行 = 真 输入方式 = 通常方式>
- 变量 热键1 <类型 = 系统热键类>
- 方法 窗口_将被销毁 <接收事件 类型 = 整数 注释 = "当本组件被销毁前发送此事件">
- 参数 来源对象 <类型 = 窗口 注释 = "提供事件产生的具体来源对象" 折叠>
- 参数 标记值 <类型 = 整数 注释 = "用户调用"挂接事件"命令时所提供的"标记值"参数值,非此方式挂接事件则本参数值固定为0.">
- {
- @ if (g_hKeyboardHook)
- @ {
- @ UnhookWindowsHookEx(g_hKeyboardHook);
- @ g_hKeyboardHook = nullptr;
- @ }
- @ PostQuitMessage(0);
- 返回 (0)
- }
- 方法 启动窗口_创建完毕 <接收事件 类型 = 整数 注释 = "当本组件及其中所有子组件均被创建完毕后发送此事件."
- @视窗.外部头文件 = "<windows.h>\r\n<string>\r\n<vector>">
- 参数 来源对象 <类型 = 启动窗口 注释 = "提供事件产生的具体来源对象">
- 参数 标记值 <类型 = 整数 注释 = "用户调用"挂接事件"命令时所提供的"标记值"参数值,非此方式挂接事件则本参数值固定为0.">
- {
- 左边 = 0
- 顶边 = 0
- 热键1.热键 = 按键码.F4键
- @ g_hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, GetModuleHandle(nullptr), 0);
- 返回 (0)
- }
- 方法 系统热键类_热键被按下 <接收事件 类型 = 整数 注释 = "当所登记的热键按下后本事件被发送">
- 参数 来源对象 <类型 = 系统热键类 注释 = "提供事件产生的具体来源对象">
- 参数 标记值 <类型 = 整数 注释 = "用户调用"挂接事件"命令时所提供的"标记值"参数值,非此方式挂接事件则本参数值固定为0.">
- {
- @ 提取窗口控件信息();
- 编辑框1.内容 = 全局变量.全局变量1
- 返回 (0)
- }
- }
复制代码
|
|