показать рабочий стол

Тема в разделе "WASM.BEGINNERS", создана пользователем gale1238, 16 сен 2010.

  1. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    Код (Text):
    1. .const
    2.     CLSID_Shell GUID <013709620h,0C279h,011CEh,<0A4h,09Eh,044h,045h,053h,054h,0h,0h>>
    3.     IID_IShellDispatch GUID <0D8F015C0h,0C278h,011CEh,<0A4h,09Eh,044h,045h,053h,054h,0h,0h>>
    4. .code
    5. start:
    6.     invoke CoInitialize,NULL
    7.     push ebx
    8.     invoke CoCreateInstance,addr CLSID_Shell,NULL,CLSCTX_INPROC_SERVER,addr IID_IShellDispatch,esp
    9.     pop ebx
    10.     mov esi,[ebx]
    11.     push ebx
    12.     call near ptr [esi+56]
    13.     push ebx
    14.     call near ptr [esi+8]
    15.     call CoUninitialize
    16.     invoke ExitProcess,NULL
    17. end start
    В мсдн написано, что результат аналогичен нажатию на кнопку "показать рабочий стол".
    Однако, диалоговые окна не прячутся.
     
  2. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    1. какие возвращаемые значения?
    2. работает ли приведенный пример из мсдена?
     
  3. Kaimi

    Kaimi Андрей

    Публикаций:
    0
    Регистрация:
    15 апр 2010
    Сообщения:
    120
    А должны? У меня и при нажатии "Показать рабочий стол" они не прячутся
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Видимо это эквивалентно нажатию WIN + M, а нужно WIN + D. Копайте дальше)
     
  5. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    Кто-нибудь умеет прятать всплывающие окна?
     
  6. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    Код (Text):
    1. invoke CloseWindow,hWnd
    где hWnd - хэндл выскакивающего окна. Окно сворачивается в прямоугольник в левом нижнем углу над панелью задач. Как же его убрать с рабочего стола?
     
  7. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    gale1238,

    «Не тратьте силы, возьмите молоток побольше.» DestroyWindow().
     
  8. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    gale1238

    ShowWindow(hWnd, SW_HIDE);
     
  9. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    Код (Text):
    1. .data?
    2.     hProgman dd ?
    3.     hTaskbar dd ?
    4. .const
    5.     clTrayWnd db 'Shell_TrayWnd',0
    6. .code
    7. ShowDesktopProc proc hWnd:DWORD,lParam:DWORD
    8.     invoke IsWindowVisible,hWnd
    9.     .if eax!=0
    10.         invoke IsIconic,hWnd
    11.         .if !eax
    12.             invoke IsWindow,hWnd
    13.             .if eax!=0
    14.                 mov ecx,hProgman
    15.                 mov edx,hTaskbar
    16.                 .if hWnd!=ecx && hWnd!=edx
    17.                     invoke ShowWindow,hWnd,SW_HIDE
    18.                 .endif
    19.             .endif
    20.         .endif
    21.     .endif
    22.     mov eax,TRUE
    23.     ret
    24. ShowDesktopProc endp
    25. start:
    26.     call GetDesktopWindow
    27.     invoke GetWindow,eax,GW_CHILD
    28.     invoke GetWindow,eax,GW_HWNDLAST
    29.     mov hProgman,eax
    30.     invoke FindWindow,addr clTrayWnd,NULL
    31.     mov hTaskbar,eax
    32.     invoke EnumWindows,addr ShowDesktopProc,0
    33.     invoke ExitProcess,NULL
    34. end start
    Окна исчезают с экрана, но их невозможно восстановить через "Alt-Tab".
     
  10. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    А если сделать SW_MINIMIZE вместо SW_HIDE?
     
  11. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    KIV,
    будем продолжать перетирать то же самое по новому кругу?
    Мелкомягкие давным-давно научились прятать окна любого типа. Почему мы не можем?
     
  12. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    Пытаюсь получить список всех окошек, которые появляются при нажатии кнопок Alt-Tab.
    Так вроде получается:
    Код (Text):
    1. .data?
    2.     buffer db MAX_PATH dup (?)
    3. .code
    4. ShowDesktopProc proc hWnd:DWORD,lParam:DWORD
    5.     invoke IsWindowVisible,hWnd
    6.     .if eax!=0
    7.         invoke GetWindowLong,hWnd,GWL_EXSTYLE
    8.         .if eax!=WS_EX_TOOLWINDOW
    9.             invoke GetWindowTextLength,hWnd
    10.             .if eax!=0
    11.                 invoke GetWindowText,hWnd,offset buffer,MAX_PATH
    12.                 invoke MessageBox,NULL,offset buffer,NULL,MB_OK
    13.             .endif
    14.         .endif
    15.     .endif
    16.     xor eax,eax
    17.     inc eax
    18.     ret
    19. ShowDesktopProc endp
    20. start:
    21.     invoke EnumWindows,offset ShowDesktopProc,0
    22.     invoke ExitProcess,NULL
    23. end start
    Дальше хочу получить идентификатор к каждому процессу:
    Код (Text):
    1. .data?
    2.     buffer db MAX_PATH dup (?)
    3. .code
    4. ShowDesktopProc proc hWnd:DWORD,lParam:DWORD
    5.     local pid : DWORD
    6.     invoke IsWindowVisible,hWnd
    7.     .if eax!=0
    8.         invoke GetWindowLong,hWnd,GWL_EXSTYLE
    9.         .if eax!=WS_EX_TOOLWINDOW
    10.             invoke GetWindowTextLength,hWnd
    11.             .if eax!=0
    12.                 lea ecx,pid
    13.                 invoke GetWindowThreadProcessId,hWnd,ecx
    14.                 invoke OpenProcess,PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,FALSE,pid
    15.                 mov ebx,eax
    16.                 invoke GetModuleFileNameEx,eax,NULL,offset buffer,MAX_PATH
    17.                 invoke CloseHandle,ebx
    18.                 invoke MessageBox,NULL,offset buffer,NULL,MB_OK
    19.             .endif
    20.         .endif
    21.     .endif
    22.     xor eax,eax
    23.     inc eax
    24.     ret
    25. ShowDesktopProc endp
    26. start:
    27.     invoke EnumWindows,offset ShowDesktopProc,0
    28.     invoke ExitProcess,NULL
    29. end start
    Однако, доступны не все процессы, а только один или два.
     
  13. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    Эврика!
    Оказывается, надо было заменить регистр ebx на переменную pid.