- 论坛徽章:
- 2
|
- /* domenu.c */
- #include <windows.h>
- #include <stdio.h>
- struct enum_window_param
- {
- DWORD thread_id;
- HWND h_wnd;
- };
- BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
- {
- struct enum_window_param *param;
- param = (struct enum_window_param *)lParam;
- param->h_wnd = hwnd;
- return FALSE;
- }
- int get_thread_window(DWORD thread_id, HWND *o_wnd)
- {
- struct enum_window_param param;
- param.thread_id = thread_id;
- param.h_wnd = NULL;
- EnumThreadWindows(thread_id, EnumWindowsProc, (LPARAM)¶m);
- if (param.h_wnd != NULL) {
- *o_wnd = param.h_wnd;
- return 0;
- }
- return -1;
- }
- int load_app(char *cmd, HANDLE *o_process, HANDLE *o_thread, HWND *o_wnd)
- {
- STARTUPINFO startup_info;
- PROCESS_INFORMATION process_info;
- HWND hwnd;
- ZeroMemory(&startup_info, sizeof(startup_info));
- startup_info.cb = sizeof(startup_info);
- startup_info.dwFlags = STARTF_USESHOWWINDOW;
- startup_info.wShowWindow = SW_SHOW;
- if (CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &startup_info, &process_info)) {
- if (o_process != NULL) {
- *o_process = process_info.hProcess;
- }else {
- CloseHandle(process_info.hProcess);
- }
- if (o_thread != NULL) {
- *o_thread = process_info.hThread;
- }else {
- CloseHandle(process_info.hThread);
- }
- if (o_wnd != NULL) {
- WaitForInputIdle(process_info.hProcess, INFINITE);
- while (get_thread_window(process_info.dwThreadId, &hwnd) != 0) {
- }
- *o_wnd = hwnd;
- }
- return 0;
- }
- return -1;
- }
- int main(void)
- {
- HANDLE process;
- HWND wnd;
- HMENU menu;
- MENUITEMINFO menu_info;
- if (load_app("notepad domenu.c", &process, NULL, &wnd) == 0) {
- menu = GetMenu(wnd);
- menu = GetSubMenu(menu, 0);
- ZeroMemory(&menu_info, sizeof(menu_info));
- menu_info.cbSize = sizeof(menu_info);
- menu_info.fMask = MIIM_STATE;
- GetMenuItemInfo(menu, 2, TRUE, &menu_info);
- menu_info.fState |= MFS_DISABLED;
- SetMenuItemInfo(menu, 2, TRUE, &menu_info);
- ZeroMemory(&menu_info, sizeof(menu_info));
- menu_info.cbSize = sizeof(menu_info);
- menu_info.fMask = MIIM_STATE;
- GetMenuItemInfo(menu, 3, TRUE, &menu_info);
- menu_info.fState |= MFS_DISABLED;
- SetMenuItemInfo(menu, 3, TRUE, &menu_info);
- WaitForSingleObject(process, INFINITE);
- CloseHandle(process);
- return 0;
- }
- return -1;
- }
复制代码 |
|