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.
126 lines
2.3 KiB
126 lines
2.3 KiB
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
CorelSiteBuilder.cpp
|
|
|
|
Abstract:
|
|
|
|
App repeatedly calls SetWindowTextA with the same title causing
|
|
flickering. This repros on some machines and not others: we don't know why.
|
|
|
|
Notes:
|
|
|
|
This is an app specific shim.
|
|
|
|
History:
|
|
|
|
01/31/2001 linstev Created
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
|
|
IMPLEMENT_SHIM_BEGIN(CorelSiteBuilder)
|
|
#include "ShimHookMacro.h"
|
|
|
|
APIHOOK_ENUM_BEGIN
|
|
APIHOOK_ENUM_ENTRY(SetWindowTextA)
|
|
APIHOOK_ENUM_END
|
|
|
|
HWND g_hLast = NULL;
|
|
CString * g_csLastWindowText = NULL;
|
|
|
|
CRITICAL_SECTION g_csGlobals;
|
|
|
|
/*++
|
|
|
|
Only send the message if the text has changed.
|
|
|
|
--*/
|
|
|
|
BOOL
|
|
APIHOOK(SetWindowTextA)(
|
|
HWND hWnd,
|
|
LPCSTR lpString
|
|
)
|
|
{
|
|
EnterCriticalSection(&g_csGlobals);
|
|
|
|
if (lpString)
|
|
{
|
|
CSTRING_TRY
|
|
{
|
|
CString csString(lpString);
|
|
|
|
if ((g_hLast == hWnd) && g_csLastWindowText->Compare(csString) == 0) {
|
|
//
|
|
// We have the same window and title, don't bother setting it again
|
|
//
|
|
|
|
LeaveCriticalSection(&g_csGlobals);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// Store the current settings as the last known values
|
|
//
|
|
g_hLast = hWnd;
|
|
*g_csLastWindowText = csString;
|
|
}
|
|
CSTRING_CATCH
|
|
{
|
|
// Do nothing
|
|
}
|
|
}
|
|
|
|
LeaveCriticalSection(&g_csGlobals);
|
|
|
|
return ORIGINAL_API(SetWindowTextA)(hWnd, lpString);
|
|
}
|
|
|
|
/*++
|
|
|
|
Register hooked functions
|
|
|
|
--*/
|
|
|
|
BOOL
|
|
NOTIFY_FUNCTION(
|
|
DWORD fdwReason)
|
|
{
|
|
if (fdwReason == DLL_PROCESS_ATTACH) {
|
|
CSTRING_TRY
|
|
{
|
|
if (!InitializeCriticalSectionAndSpinCount(&g_csGlobals, 0x80000000))
|
|
{
|
|
return FALSE;
|
|
}
|
|
g_csLastWindowText = new CString;
|
|
if (g_csLastWindowText == NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
CSTRING_CATCH
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
HOOK_BEGIN
|
|
|
|
CALL_NOTIFY_FUNCTION
|
|
|
|
APIHOOK_ENTRY(USER32.DLL, SetWindowTextA)
|
|
|
|
HOOK_END
|
|
|
|
IMPLEMENT_SHIM_END
|
|
|