Код (Text): .const CLSID_Shell GUID <013709620h,0C279h,011CEh,<0A4h,09Eh,044h,045h,053h,054h,0h,0h>> IID_IShellDispatch GUID <0D8F015C0h,0C278h,011CEh,<0A4h,09Eh,044h,045h,053h,054h,0h,0h>> .code start: invoke CoInitialize,NULL push ebx invoke CoCreateInstance,addr CLSID_Shell,NULL,CLSCTX_INPROC_SERVER,addr IID_IShellDispatch,esp pop ebx mov esi,[ebx] push ebx call near ptr [esi+56] push ebx call near ptr [esi+8] call CoUninitialize invoke ExitProcess,NULL end start В мсдн написано, что результат аналогичен нажатию на кнопку "показать рабочий стол". Однако, диалоговые окна не прячутся.
Код (Text): invoke CloseWindow,hWnd где hWnd - хэндл выскакивающего окна. Окно сворачивается в прямоугольник в левом нижнем углу над панелью задач. Как же его убрать с рабочего стола?
Код (Text): .data? hProgman dd ? hTaskbar dd ? .const clTrayWnd db 'Shell_TrayWnd',0 .code ShowDesktopProc proc hWnd:DWORD,lParam:DWORD invoke IsWindowVisible,hWnd .if eax!=0 invoke IsIconic,hWnd .if !eax invoke IsWindow,hWnd .if eax!=0 mov ecx,hProgman mov edx,hTaskbar .if hWnd!=ecx && hWnd!=edx invoke ShowWindow,hWnd,SW_HIDE .endif .endif .endif .endif mov eax,TRUE ret ShowDesktopProc endp start: call GetDesktopWindow invoke GetWindow,eax,GW_CHILD invoke GetWindow,eax,GW_HWNDLAST mov hProgman,eax invoke FindWindow,addr clTrayWnd,NULL mov hTaskbar,eax invoke EnumWindows,addr ShowDesktopProc,0 invoke ExitProcess,NULL end start Окна исчезают с экрана, но их невозможно восстановить через "Alt-Tab".
KIV, будем продолжать перетирать то же самое по новому кругу? Мелкомягкие давным-давно научились прятать окна любого типа. Почему мы не можем?
Пытаюсь получить список всех окошек, которые появляются при нажатии кнопок Alt-Tab. Так вроде получается: Код (Text): .data? buffer db MAX_PATH dup (?) .code ShowDesktopProc proc hWnd:DWORD,lParam:DWORD invoke IsWindowVisible,hWnd .if eax!=0 invoke GetWindowLong,hWnd,GWL_EXSTYLE .if eax!=WS_EX_TOOLWINDOW invoke GetWindowTextLength,hWnd .if eax!=0 invoke GetWindowText,hWnd,offset buffer,MAX_PATH invoke MessageBox,NULL,offset buffer,NULL,MB_OK .endif .endif .endif xor eax,eax inc eax ret ShowDesktopProc endp start: invoke EnumWindows,offset ShowDesktopProc,0 invoke ExitProcess,NULL end start Дальше хочу получить идентификатор к каждому процессу: Код (Text): .data? buffer db MAX_PATH dup (?) .code ShowDesktopProc proc hWnd:DWORD,lParam:DWORD local pid : DWORD invoke IsWindowVisible,hWnd .if eax!=0 invoke GetWindowLong,hWnd,GWL_EXSTYLE .if eax!=WS_EX_TOOLWINDOW invoke GetWindowTextLength,hWnd .if eax!=0 lea ecx,pid invoke GetWindowThreadProcessId,hWnd,ecx invoke OpenProcess,PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,FALSE,pid mov ebx,eax invoke GetModuleFileNameEx,eax,NULL,offset buffer,MAX_PATH invoke CloseHandle,ebx invoke MessageBox,NULL,offset buffer,NULL,MB_OK .endif .endif .endif xor eax,eax inc eax ret ShowDesktopProc endp start: invoke EnumWindows,offset ShowDesktopProc,0 invoke ExitProcess,NULL end start Однако, доступны не все процессы, а только один или два.