windows-nt/Source/XPSP1/NT/windows/appcompat/shims/general/disablestickykeys.cpp
2020-09-26 16:20:57 +08:00

127 lines
2.7 KiB
C++

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
DisableStickyKeys.cpp
Abstract:
This shim disables the Sticky Keys Accessibility Option at DLL_PROCESS_ATTACH,
and re-enables it on termination of the application.
Some applications, ie. A Bug's Life, have control keys mapped to the shift key. When the
key is pressed five consecutive times the option is enabled and they are dumped out to the
desktop to verify that they want to enable the option. In the case of A Bug's Life, the
application errors and terminates when going to the desktop.
History:
05/11/2000 jdoherty Created
11/06/2000 linstev Removed User32 dependency on InitializeHooks
04/01/2001 linstev Use SHIM_STATIC_DLLS_INITIALIZED callout
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(DisableStickyKeys)
#include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_END
LPSTICKYKEYS g_lpOldStickyKeyValue;
BOOL g_bInitialize = FALSE;
/*++
DisableStickyKeys saves the current value for LPSTICKYKEYS and then disables the option.
--*/
VOID
DisableStickyKeys()
{
if (!g_bInitialize) {
//
// Disable sticky key support
//
g_bInitialize = TRUE;
g_lpOldStickyKeyValue = (LPSTICKYKEYS) malloc(sizeof(STICKYKEYS));
g_lpOldStickyKeyValue->cbSize = sizeof(STICKYKEYS);
LPSTICKYKEYS pvParam = (LPSTICKYKEYS) malloc(sizeof(STICKYKEYS));
pvParam->cbSize = sizeof(STICKYKEYS);
pvParam->dwFlags = 0;
SystemParametersInfo(SPI_GETSTICKYKEYS, sizeof(STICKYKEYS),
g_lpOldStickyKeyValue, 0);
SystemParametersInfo(SPI_SETSTICKYKEYS, sizeof(STICKYKEYS), pvParam,
SPIF_UPDATEINIFILE & SPIF_SENDCHANGE);
LOGN( eDbgLevelInfo, "[DisableStickyKeys] Sticky keys disabled");
}
}
/*++
EnableStickyKeys uses the save value for STICKYKEYS and resets the option to the original setting.
--*/
VOID
EnableStickyKeys()
{
if (g_bInitialize) {
//
// Restore sticky key state
//
SystemParametersInfo(SPI_SETSTICKYKEYS, sizeof(STICKYKEYS),
g_lpOldStickyKeyValue, SPIF_UPDATEINIFILE & SPIF_SENDCHANGE);
LOGN( eDbgLevelInfo, "[EnableStickyKeys] Sticky key state restored");
}
}
BOOL
NOTIFY_FUNCTION(
DWORD fdwReason
)
{
if (fdwReason == SHIM_STATIC_DLLS_INITIALIZED) {
//
// Turn OFF sticky keys
//
DisableStickyKeys();
} else if (fdwReason == DLL_PROCESS_DETACH) {
//
// Restore sticky keys
//
EnableStickyKeys();
}
return TRUE;
}
/*++
Register hooked functions
--*/
HOOK_BEGIN
CALL_NOTIFY_FUNCTION
HOOK_END
IMPLEMENT_SHIM_END