菜鸟交个作业,关于窗口控件信息的
按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;
# 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;
# 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;
# GetClassName(hwndChild, className, 256);
# wchar_t title;
# 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)
}
}
页:
[1]