aeszyl 发表于 2025-1-4 16:46:51

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

按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]
查看完整版本: 菜鸟交个作业,关于窗口控件信息的