VirtualBox

Ignore:
Timestamp:
Apr 24, 2013 2:31:56 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
85249
Message:

VBoxTray/Seamless: disable seamless on desktop change (UAC, Lock)

Location:
trunk/src/VBox/Additions/WINNT/VBoxHook
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/VBoxHook/VBoxHook.cpp

    r44528 r45703  
    1919
    2020#pragma data_seg("SHARED")
    21 static HWINEVENTHOOK    hEventHook[2]    = {0};
     21static HWINEVENTHOOK    hWinEventHook[2]    = {0};
     22static HWINEVENTHOOK    hDesktopEventHook   = NULL;
    2223#pragma data_seg()
    2324#pragma comment(linker, "/section:SHARED,RWS")
    2425
    25 static HANDLE   hNotifyEvent = 0;
     26static HANDLE   hWinNotifyEvent = 0;
     27static HANDLE   hDesktopNotifyEvent = 0;
    2628
    2729#ifdef DEBUG
     
    3335
    3436
    35 void CALLBACK VBoxHandleWinEvent(HWINEVENTHOOK hook, DWORD event, HWND hwnd,
     37static void CALLBACK VBoxHandleWinEvent(HWINEVENTHOOK hook, DWORD event, HWND hwnd,
    3638                                 LONG idObject, LONG idChild,
    3739                                 DWORD dwEventThread, DWORD dwmsEventTime)
     
    7678        }
    7779#endif
    78         if (!hNotifyEvent)
     80        if (!hWinNotifyEvent)
    7981        {
    80             hNotifyEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, VBOXHOOK_GLOBAL_EVENT_NAME);
    81             dprintf(("OpenEvent returned %x (last err=%x)\n", hNotifyEvent, GetLastError()));
     82            hWinNotifyEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, VBOXHOOK_GLOBAL_WT_EVENT_NAME);
     83            dprintf(("OpenEvent returned %x (last err=%x)\n", hWinNotifyEvent, GetLastError()));
    8284        }
    83         BOOL ret = SetEvent(hNotifyEvent);
    84         dprintf(("SetEvent %x returned %d (last error %x)\n", hNotifyEvent, ret, GetLastError()));
     85        BOOL ret = SetEvent(hWinNotifyEvent);
     86        dprintf(("SetEvent %x returned %d (last error %x)\n", hWinNotifyEvent, ret, GetLastError()));
    8587        break;
    8688    }
    8789}
    8890
     91static void CALLBACK VBoxHandleDesktopEvent(HWINEVENTHOOK hook, DWORD event, HWND hwnd,
     92                                 LONG idObject, LONG idChild,
     93                                 DWORD dwEventThread, DWORD dwmsEventTime)
     94{
     95    if (!hDesktopNotifyEvent)
     96    {
     97        hDesktopNotifyEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, VBOXHOOK_GLOBAL_DT_EVENT_NAME);
     98        dprintf(("OpenEvent returned %x (last err=%x)\n", hDesktopNotifyEvent, GetLastError()));
     99    }
     100    BOOL ret = SetEvent(hDesktopNotifyEvent);
     101    dprintf(("SetEvent %x returned %d (last error %x)\n", hDesktopNotifyEvent, ret, GetLastError()));
     102}
     103
     104BOOL VBoxHookInstallActiveDesktopTracker(HMODULE hDll)
     105{
     106    if (hDesktopEventHook)
     107        return TRUE;
     108
     109    CoInitialize(NULL);
     110    hDesktopEventHook = SetWinEventHook(EVENT_SYSTEM_DESKTOPSWITCH, EVENT_SYSTEM_DESKTOPSWITCH,
     111                                    hDll,
     112                                    VBoxHandleDesktopEvent,
     113                                    0, 0,
     114                                    0);
     115
     116    return !!hDesktopEventHook;
     117
     118}
     119
     120BOOL VBoxHookRemoveActiveDesktopTracker()
     121{
     122    if (hDesktopEventHook)
     123    {
     124        UnhookWinEvent(hDesktopEventHook);
     125        CoUninitialize();
     126    }
     127    hDesktopEventHook = 0;
     128    return TRUE;
     129}
    89130
    90131/* Install the global message hook */
    91 BOOL VBoxInstallHook(HMODULE hDll)
    92 {
    93     if (hEventHook[0] || hEventHook[1])
     132BOOL VBoxHookInstallWindowTracker(HMODULE hDll)
     133{
     134    if (hWinEventHook[0] || hWinEventHook[1])
    94135        return TRUE;
    95136
    96137    CoInitialize(NULL);
    97     hEventHook[0] = SetWinEventHook(EVENT_OBJECT_LOCATIONCHANGE, EVENT_OBJECT_LOCATIONCHANGE,
     138    hWinEventHook[0] = SetWinEventHook(EVENT_OBJECT_LOCATIONCHANGE, EVENT_OBJECT_LOCATIONCHANGE,
    98139                                    hDll,
    99140                                    VBoxHandleWinEvent,
     
    101142                                    WINEVENT_INCONTEXT | WINEVENT_SKIPOWNPROCESS);
    102143
    103     hEventHook[1] = SetWinEventHook(EVENT_OBJECT_CREATE, EVENT_OBJECT_HIDE,
     144    hWinEventHook[1] = SetWinEventHook(EVENT_OBJECT_CREATE, EVENT_OBJECT_HIDE,
    104145                                    hDll,
    105146                                    VBoxHandleWinEvent,
    106147                                    0, 0,
    107148                                    WINEVENT_INCONTEXT | WINEVENT_SKIPOWNPROCESS);
    108     return !!hEventHook[0];
     149    return !!hWinEventHook[0];
    109150}
    110151
    111152/* Remove the global message hook */
    112 BOOL VBoxRemoveHook()
    113 {
    114     if (hEventHook[0] && hEventHook[1])
    115     {
    116         UnhookWinEvent(hEventHook[0]);
    117         UnhookWinEvent(hEventHook[1]);
     153BOOL VBoxHookRemoveWindowTracker()
     154{
     155    if (hWinEventHook[0] && hWinEventHook[1])
     156    {
     157        UnhookWinEvent(hWinEventHook[0]);
     158        UnhookWinEvent(hWinEventHook[1]);
    118159        CoUninitialize();
    119160    }
    120     hEventHook[0]  = hEventHook[1] = 0;
    121     return true;
     161    hWinEventHook[0]  = hWinEventHook[1] = 0;
     162    return TRUE;
    122163}
    123164
  • trunk/src/VBox/Additions/WINNT/VBoxHook/VBoxHook.def

    r44528 r45703  
    1919
    2020EXPORTS
    21    VBoxInstallHook
    22    VBoxRemoveHook
     21    VBoxHookInstallActiveDesktopTracker
     22    VBoxHookRemoveActiveDesktopTracker
     23    VBoxHookInstallWindowTracker
     24    VBoxHookRemoveWindowTracker
  • trunk/src/VBox/Additions/WINNT/VBoxHook/testcase/tstHook.cpp

    r44528 r45703  
    2222    printf("Enabling global hook\n");
    2323
    24     HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, VBOXHOOK_GLOBAL_EVENT_NAME);
     24    HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, VBOXHOOK_GLOBAL_WT_EVENT_NAME);
    2525
    26     VBoxInstallHook(GetModuleHandle("VBoxHook.dll"));
     26    VBoxHookInstallWindowTracker(GetModuleHandle("VBoxHook.dll"));
    2727    getchar();
    2828
    2929    printf("Disabling global hook\n");
    30     VBoxRemoveHook();
     30    VBoxHookRemoveWindowTracker();
    3131    return 0;
    3232}
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette