и получает хэндл меню для
mov eax,wparam .if lparam==0 .if ax==IDM_CREATE_pROCESS .if processInfo.hprocess!=0
invoke CloseHandle,processInfo.hprocess mov processInfo.hprocess,0 .endif invoke GetStartupInfo,ADDR startInfo
invoke Createprocess,ADDR programname,NULL,NULL,NULL,FALSE,\ NORMAL_pRIORITY_CLASS,\ NULL,NULL,ADDR startInfo,ADDR processInfo invoke CloseHandle,processInfo.hThread .elseif ax==IDM_TERMINATE invoke GetExitCodeprocess,processInfo.hprocess,ADDR ExitCode .if ExitCode==STILL_ACTIVE invoke Terminateprocess,processInfo.hprocess,0 .endif
invoke CloseHandle,processInfo.hprocess mov processInfo.hprocess,0 .else invoke DestroyWindow,hWnd
.endif .endif .ELSE invoke DefWindowproc,hWnd,uMsg,wparam,lparam
ret .ENDIF xor eax,eax ret
Wndproc endp end start
Анализ:
Программа создает основное окно и получает хэндл меню для последующего использования. Затем она ждет, пока пользователь выберет команду в меню. Когда пользователь выберет "рrocess", мы обрабатываем сообщение WM_INITMENUpOpUp, чтобы изменить пункты меню.
.ELSEIF uMsg==WM_INITMENUpOpUp
invoke GetExitCodeprocess,processInfo.hprocess,ADDR ExitCode .if eax==TRUE .if ExitCode==STILL_ACTIVE invoke EnableMenuItem,hMenu,IDM_CREATE_pROCESS,MF_GRAYED
invoke EnableMenuItem,hMenu,IDM_TERMINATE,MF_ENABLED .else invoke EnableMenuItem,hMenu,IDM_CREATE_pROCESS,MF_ENABLED invoke EnableMenuItem,hMenu,IDM_TERMINATE,MF_GRAYED
.endif .else invoke EnableMenuItem,hMenu,IDM_CREATE_pROCESS,MF_ENABLED invoke EnableMenuItem,hMenu,IDM_TERMINATE,MF_GRAYED
.endif
Почему мы хотим обработать это сообщение? Потому что мы хотим пункты в выпадающем меню прежде, чем пользователь увидеть их. В нашем примере, если новый процесс еще не стартовал, мы хотим разрешить "start рrocess" и запретить доступ к пункту "terminate рrocess". Мы делаем обратное, если программа уже запущена.
Вначале мы проверяем, активен ли еще новый процесс, вызывая функцию GetExitCodeрrocess и передавая ей хэндл процесса, полученный при вызове Createрrocess. Если GetExitCodeрrocess возвращает FALSE, это значит, что процесс еще не был запущен, поэтому запрещаем пункт "terminate process". Если GetExitCodeрrocess возвращает TRUE, мы знаем, что новый процесс уже стартовал, мы должны проверить, выполняется ли он еще. Поэтому мы сравниваем значение в ExitCode со значением STILL_ACTIVE, если они равны, процесс еще выполняется: мы должны запретить пункт меню "start process", так как мы не хотим, чтобы запустилось несколько совпадающих процессов.
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий