You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
3.8 KiB
196 lines
3.8 KiB
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
RestoreSystemCursors.cpp
|
|
|
|
Abstract:
|
|
|
|
Due to a bug in NT, cursors are not correctly restored with the following
|
|
code sequence:
|
|
|
|
1. hNewCursor = LoadCursor(0, "cursor.cur");
|
|
2. SetSystemCursor(hNewCursor, OCR_NORMAL)
|
|
3. hOldCursor = LoadCursor(0,MAKEINTRESOURCE(OCR_NORMAL));
|
|
4. SetSystemCursor(hOldCursor, OCR_NORMAL)
|
|
|
|
The last call (4) does nothing on NT, but works correctly on Win9x.
|
|
|
|
To fix this we use the known USER workaround, namely CopyCursor. Note that
|
|
this will probably be fixed in Whistler by the time it ships.
|
|
|
|
Notes:
|
|
|
|
This is a general purpose shim.
|
|
|
|
History:
|
|
|
|
02/13/2000 linstev Created
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
|
|
IMPLEMENT_SHIM_BEGIN(RestoreSystemCursors)
|
|
#include "ShimHookMacro.h"
|
|
|
|
APIHOOK_ENUM_BEGIN
|
|
APIHOOK_ENUM_ENTRY(GetCommandLineA)
|
|
APIHOOK_ENUM_ENTRY(GetCommandLineW)
|
|
APIHOOK_ENUM_END
|
|
|
|
#define OCR_NORMAL 32512UL
|
|
#define OCR_IBEAM 32513UL
|
|
#define OCR_WAIT 32514UL
|
|
#define OCR_CROSS 32515UL
|
|
#define OCR_UP 32516UL
|
|
#define OCR_SIZE 32640UL
|
|
#define OCR_ICON 32641UL
|
|
#define OCR_SIZENWSE 32642UL
|
|
#define OCR_SIZENESW 32643UL
|
|
#define OCR_SIZEWE 32644UL
|
|
#define OCR_SIZENS 32645UL
|
|
#define OCR_SIZEALL 32646UL
|
|
#define OCR_ICOCUR 32647UL
|
|
#define OCR_NO 32648UL
|
|
#define OCR_HAND 32649UL
|
|
#define OCR_APPSTARTING 32650UL
|
|
|
|
struct CURSOR
|
|
{
|
|
DWORD id;
|
|
HCURSOR hCursor;
|
|
};
|
|
|
|
CURSOR g_arrCursors[] =
|
|
{
|
|
{OCR_NORMAL, 0},
|
|
{OCR_IBEAM, 0},
|
|
{OCR_WAIT, 0},
|
|
{OCR_CROSS, 0},
|
|
{OCR_UP, 0},
|
|
{OCR_SIZE, 0},
|
|
{OCR_ICON, 0},
|
|
{OCR_SIZENWSE, 0},
|
|
{OCR_SIZENESW, 0},
|
|
{OCR_SIZEWE, 0},
|
|
{OCR_SIZENS, 0},
|
|
{OCR_SIZEALL, 0},
|
|
{OCR_ICOCUR, 0},
|
|
{OCR_NO, 0},
|
|
{OCR_HAND, 0},
|
|
{OCR_APPSTARTING, 0}
|
|
};
|
|
|
|
BOOL g_bInit = FALSE;
|
|
|
|
/*++
|
|
|
|
Backup cursors.
|
|
|
|
--*/
|
|
|
|
VOID
|
|
BackupCursors()
|
|
{
|
|
if (!g_bInit)
|
|
{
|
|
g_bInit = TRUE;
|
|
|
|
// Backup all the cursors
|
|
for (int i=0; i<sizeof(g_arrCursors)/sizeof(CURSOR);i++)
|
|
{
|
|
HCURSOR hCursorT = LoadCursor(0,MAKEINTRESOURCE(g_arrCursors[i].id));
|
|
|
|
if (hCursorT)
|
|
{
|
|
g_arrCursors[i].hCursor = CopyCursor(hCursorT);
|
|
DestroyCursor(hCursorT);
|
|
}
|
|
else
|
|
{
|
|
g_arrCursors[i].hCursor = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*++
|
|
|
|
Restore cursors.
|
|
|
|
--*/
|
|
|
|
VOID
|
|
RestoreCursors()
|
|
{
|
|
if (g_bInit)
|
|
{
|
|
// Restore all the cursors
|
|
for (int i=0; i<sizeof(g_arrCursors)/sizeof(CURSOR);i++)
|
|
{
|
|
if (g_arrCursors[i].hCursor)
|
|
{
|
|
SetSystemCursor(g_arrCursors[i].hCursor, g_arrCursors[i].id);
|
|
DestroyCursor(g_arrCursors[i].hCursor);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*++
|
|
|
|
Backup cursors.
|
|
|
|
--*/
|
|
|
|
LPSTR
|
|
APIHOOK(GetCommandLineA)()
|
|
{
|
|
BackupCursors();
|
|
return ORIGINAL_API(GetCommandLineA)();
|
|
}
|
|
|
|
/*++
|
|
|
|
Backup cursors.
|
|
|
|
--*/
|
|
|
|
LPWSTR
|
|
APIHOOK(GetCommandLineW)()
|
|
{
|
|
BackupCursors();
|
|
return ORIGINAL_API(GetCommandLineW)();
|
|
}
|
|
|
|
/*++
|
|
|
|
Register hooked functions
|
|
|
|
--*/
|
|
|
|
BOOL
|
|
NOTIFY_FUNCTION(
|
|
DWORD fdwReason
|
|
)
|
|
{
|
|
if (fdwReason == DLL_PROCESS_DETACH) {
|
|
RestoreCursors();
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
HOOK_BEGIN
|
|
|
|
CALL_NOTIFY_FUNCTION
|
|
APIHOOK_ENTRY(KERNEL32.DLL, GetCommandLineA)
|
|
APIHOOK_ENTRY(KERNEL32.DLL, GetCommandLineW)
|
|
|
|
HOOK_END
|
|
|
|
IMPLEMENT_SHIM_END
|
|
|