189 lines
4 KiB
C++
189 lines
4 KiB
C++
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ForceApplicationFocus.cpp
|
|
|
|
Abstract:
|
|
|
|
This shim calls SetForegroundWindow after CreateWindowEx and ShowWindow
|
|
calls to fix focus problems that applications tend to have when they
|
|
create/destroy windows on startup and manage to lose the foreground focus.
|
|
|
|
Notes:
|
|
|
|
This is a general purpose shim.
|
|
|
|
History:
|
|
|
|
12/02/1999 markder Created
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
|
|
IMPLEMENT_SHIM_BEGIN(ForceApplicationFocus)
|
|
#include "ShimHookMacro.h"
|
|
|
|
APIHOOK_ENUM_BEGIN
|
|
APIHOOK_ENUM_ENTRY(ShowWindow)
|
|
APIHOOK_ENUM_ENTRY(CreateWindowExA)
|
|
APIHOOK_ENUM_ENTRY(CreateWindowExW)
|
|
APIHOOK_ENUM_END
|
|
|
|
/*++
|
|
|
|
Calls SetForegroundWindow directly after a ShowWindow call with SW_SHOW as
|
|
the operation. The mouse_event call allows the SetForegroundWindow call to
|
|
succeed. This is a hack borrowed from the DirectX sources.
|
|
|
|
--*/
|
|
|
|
BOOL
|
|
APIHOOK(ShowWindow)(
|
|
HWND hWnd,
|
|
INT nCmdShow
|
|
)
|
|
{
|
|
BOOL bReturn;
|
|
|
|
bReturn = ORIGINAL_API(ShowWindow)(hWnd, nCmdShow);
|
|
|
|
if (nCmdShow == SW_SHOW)
|
|
{
|
|
if (hWnd != GetForegroundWindow()) {
|
|
LOGN( eDbgLevelWarning,
|
|
"ShowWindow called for non-foreground window. Forcing to foreground.");
|
|
}
|
|
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 0, 0);
|
|
SetForegroundWindow(hWnd);
|
|
}
|
|
|
|
return bReturn;
|
|
}
|
|
|
|
/*++
|
|
|
|
Calls SetForegroundWindow directly after a CreateWindowEx call with
|
|
WS_VISIBLE as a style. The mouse_event call allows the
|
|
SetForegroundWindow call to succeed. This is a hack borrowed from
|
|
the DirectX sources.
|
|
|
|
--*/
|
|
|
|
HWND
|
|
APIHOOK(CreateWindowExA)(
|
|
DWORD dwExStyle,
|
|
LPCSTR lpClassName,
|
|
LPCSTR lpWindowName,
|
|
DWORD dwStyle,
|
|
int x,
|
|
int y,
|
|
int nWidth,
|
|
int nHeight,
|
|
HWND hWndParent,
|
|
HMENU hMenu,
|
|
HINSTANCE hInstance,
|
|
LPVOID lpParam
|
|
)
|
|
{
|
|
HWND hReturn;
|
|
|
|
hReturn = ORIGINAL_API(CreateWindowExA)(
|
|
dwExStyle,
|
|
lpClassName,
|
|
lpWindowName,
|
|
dwStyle,
|
|
x,
|
|
y,
|
|
nWidth,
|
|
nHeight,
|
|
hWndParent,
|
|
hMenu,
|
|
hInstance,
|
|
lpParam);
|
|
|
|
if (hReturn && (dwStyle & WS_VISIBLE))
|
|
{
|
|
if (hReturn != GetForegroundWindow()) {
|
|
LOGN( eDbgLevelWarning,
|
|
"CreateWindowExA: New window not foreground. Forcing to foreground.");
|
|
}
|
|
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 0, 0);
|
|
SetForegroundWindow(hReturn);
|
|
}
|
|
|
|
return hReturn;
|
|
}
|
|
|
|
/*++
|
|
|
|
Calls SetForegroundWindow directly after a CreateWindowEx call with
|
|
WS_VISIBLE as a style. The mouse_event call allows the
|
|
SetForegroundWindow call to succeed. This is a hack borrowed from
|
|
the DirectX sources.
|
|
|
|
--*/
|
|
|
|
HWND
|
|
APIHOOK(CreateWindowExW)(
|
|
DWORD dwExStyle,
|
|
LPCWSTR lpClassName,
|
|
LPCWSTR lpWindowName,
|
|
DWORD dwStyle,
|
|
int x,
|
|
int y,
|
|
int nWidth,
|
|
int nHeight,
|
|
HWND hWndParent,
|
|
HMENU hMenu,
|
|
HINSTANCE hInstance,
|
|
LPVOID lpParam
|
|
)
|
|
{
|
|
HWND hReturn;
|
|
|
|
hReturn = ORIGINAL_API(CreateWindowExW)(
|
|
dwExStyle,
|
|
lpClassName,
|
|
lpWindowName,
|
|
dwStyle,
|
|
x,
|
|
y,
|
|
nWidth,
|
|
nHeight,
|
|
hWndParent,
|
|
hMenu,
|
|
hInstance,
|
|
lpParam);
|
|
|
|
if (hReturn && (dwStyle & WS_VISIBLE))
|
|
{
|
|
if (hReturn != GetForegroundWindow()) {
|
|
LOGN( eDbgLevelWarning, "CreateWindowExW: New window not foreground. Forcing to foreground.");
|
|
}
|
|
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 0, 0);
|
|
SetForegroundWindow(hReturn);
|
|
}
|
|
|
|
return hReturn;
|
|
}
|
|
|
|
/*++
|
|
|
|
Register hooked functions
|
|
|
|
--*/
|
|
|
|
HOOK_BEGIN
|
|
APIHOOK_ENTRY(USER32.DLL, ShowWindow)
|
|
APIHOOK_ENTRY(USER32.DLL, CreateWindowExA)
|
|
APIHOOK_ENTRY(USER32.DLL, CreateWindowExW)
|
|
HOOK_END
|
|
|
|
|
|
IMPLEMENT_SHIM_END
|
|
|