菜单(标准菜单#32768) 窗口主菜单可用GetMenu获得 然后用EnableMenuItem激活菜单项 上下文菜单获取比较麻烦 可以给目标窗口装载钩子 截获它的WM_INITMENUPOPUP 工具条(标准工具条ToolbarWindow32) 发送TB_GETBUTTON消息获取工具条按钮信息包含按钮ID等 发送TB_ENABLEBUTTON激活工具条按钮 但是TB_GETBUTTON有一个参数是结构体 需要在目标窗口的进程内开辟空间 可参考下面的代码 HANDLE handle, buf; HWND hwnd = (HWND)/* 工具条句柄 */; DWORD pid; TBBUTTON btn; GetWindowThreadProcessId(hwnd, &pid); handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); buf = VirtualAllocEx(handle, NULL, 1, MEM_COMMIT, PAGE_READWRITE); SendMessage(hwnd, TB_GETBUTTON, 1, (LPARAM)buf); ReadProcessMemory(handle, buf, &btn, sizeof(TBBUTTON), NULL); SendMessage(hwnd, TB_ENABLEBUTTON, btn.idCommand, MAKELPARAM(TRUE, 0)); SendMessage(hwnd, TB_INDETERMINATE, btn.idCommand, MAKELPARAM(FALSE, 0)); VirtualFreeEx(handle, buf, 0, MEM_RELEASE); CloseHandle(handle); 状态栏(标准状态栏msctls_statusbar32) 发送SB_GETTEXT消息来获取某部分的文本 同样需要到目标窗口的进程内开辟空间 不过有些状态栏是自绘的 可能没有文本 参考下面的代码 TCHAR szText[256]; HANDLE handle, buf; HWND hwnd = (HWND)/* 状态栏句柄 */; DWORD pid; GetWindowThreadProcessId(hwnd, &pid); handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); buf = VirtualAllocEx(handle, NULL, 1, MEM_COMMIT, PAGE_READWRITE); SendMessage(hwnd, SB_GETTEXT, 1/* 需要获取文本的部分 */, (LPARAM)buf); ReadProcessMemory(handle, buf, szText, sizeof(szText), NULL); VirtualFreeEx(handle, buf, 0, MEM_RELEASE); CloseHandle(handle);
vc中如何激活其他程序菜单项和工具条按钮
最新推荐文章于 2020-07-02 15:56:49 发布