Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Что означает параметр DESKTOP_HOOKCONTROL в функции CreateDesktop?

#c_sharp #winapi


В документация по функции CreateDesktop на msdn описывается следующая сигнатура:

HDESK WINAPI CreateDesktop(
  _In_       LPCTSTR               lpszDesktop,
  _Reserved_ LPCTSTR               lpszDevice,
  _Reserved_ DEVMODE               *pDevmode,
  _In_       DWORD                 dwFlags,
  _In_       ACCESS_MASK           dwDesiredAccess,
  _In_opt_   LPSECURITY_ATTRIBUTES lpsa
);


Меня интересует параметр dwDesiredAccess с типом ACCESS_MASK: (документация).
Если более конкретно, то значение DESKTOP_HOOKCONTROL.

DESKTOP_HOOKCONTROL (0x0008L)   Required to establish any of the window hooks.


Получается, что он нужен для установления любого хука.

Т.е. если DESKTOP_HOOKCONTROL не будет, то на вновь созданном desktop нельзя будет
установить хуки? Но это не так, я проверил.

Тогда что означает этот параметр?

private enum DesktopAccess : uint
{
    DesktopNone = 0,
    DesktopReadobjects = 0x0001,
    DesktopCreatewindow = 0x0002,
    DesktopCreatemenu = 0x0004,
    DesktopHookcontrol = 0x0008,
    DesktopJournalrecord = 0x0010,
    DesktopJournalplayback = 0x0020,
    DesktopEnumerate = 0x0040,
    DesktopWriteobjects = 0x0080,
    DesktopSwitchdesktop = 0x0100,

    GenericAll = (DesktopReadobjects | DesktopCreatewindow | DesktopCreatemenu
                 // | DesktopHookcontrol
                  | DesktopJournalrecord | DesktopJournalplayback |
                  DesktopEnumerate 
                  | DesktopWriteobjects | DesktopSwitchdesktop),
}
CreateDesktop(nameDesktop, IntPtr.Zero, IntPtr.Zero, 0x0001, (uint)DesktopAccess.GenericAll,
IntPtr.Zero);


Весь код можете найти тут: https://stackoverflow.com/questions/29902715/how-close-all-process-on-new-desktop
    


Ответы

Ответ 1



Т.е. если DESKTOP_HOOKCONTROL не будет, то на вновь созданном desktop нельзя будет установить хуки? Но это не так, я проверил. Как вы проверили этот момент? Если просто собрали код по приведенной ссылке без флага DesktopHookcontrol, то это ничего не дает, так как этот пример переключает окна на себя и закрывает их. Для этого достаточно DESKTOP_SWITCHDESKTOP и (возможно)DESKTOP_WRITEOBJECTS. DESKTOP_HOOKCONTROL нужен для того, чтобы можно было перехватывать события у окон с помощью функции SetWindowsHookEx. Приведенный пример никакие события не перехватывает и функцию SetWindowsHookEx не использует. Подробнее про хуки здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/ms644959%28v=vs.85%29.aspx

Комментариев нет:

Отправить комментарий