user32: Set the thread DPI awareness to the window's when calling a window procedure.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2018-05-02 17:33:19 +02:00
parent 487599e77f
commit 39f0bbff4e
3 changed files with 42 additions and 25 deletions

View File

@ -228,6 +228,7 @@ WNDPROC16 WINPROC_GetProc16( WNDPROC proc, BOOL unicode )
static LRESULT call_window_proc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam,
LRESULT *result, void *arg )
{
DPI_AWARENESS_CONTEXT awareness;
WNDPROC16 func = arg;
int index = winproc_to_index( func );
CONTEXT context;
@ -281,6 +282,7 @@ static LRESULT call_window_proc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPA
}
}
awareness = SetThreadDpiAwarenessContext( GetWindowDpiAwarenessContext( HWND_32(hwnd) ));
args.params[4] = hwnd;
args.params[3] = msg;
args.params[2] = wParam;
@ -288,6 +290,7 @@ static LRESULT call_window_proc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPA
args.params[0] = LOWORD(lParam);
WOWCallback16Ex( 0, WCB16_REGS, sizeof(args.params) + size, &args, (DWORD *)&context );
*result = MAKELONG( LOWORD(context.Eax), LOWORD(context.Edx) );
SetThreadDpiAwarenessContext( awareness );
return *result;
}

View File

@ -3512,11 +3512,22 @@ static void test_dpi_context(void)
ReleaseDC( 0, hdc );
}
static LRESULT CALLBACK dpi_winproc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
{
DPI_AWARENESS_CONTEXT ctx = pGetWindowDpiAwarenessContext( hwnd );
DPI_AWARENESS_CONTEXT ctx2 = pGetThreadDpiAwarenessContext();
ok( pGetAwarenessFromDpiAwarenessContext( ctx ) == pGetAwarenessFromDpiAwarenessContext( ctx2 ),
"msg %04x wrong awareness %p / %p\n", msg, ctx, ctx2 );
return DefWindowProcA( hwnd, msg, wp, lp );
}
static void test_dpi_window(void)
{
DPI_AWARENESS_CONTEXT context, orig;
DPI_AWARENESS awareness;
ULONG_PTR i, j;
HWND hwnd;
MSG msg = { 0, WM_USER + 1, 0, 0 };
if (!pGetWindowDpiAwarenessContext)
{
@ -3524,31 +3535,25 @@ static void test_dpi_window(void)
return;
}
orig = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
hwnd = CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, GetModuleHandleA(0), NULL );
ok( hwnd != 0, "failed to create window\n" );
context = pGetWindowDpiAwarenessContext( hwnd );
awareness = pGetAwarenessFromDpiAwarenessContext( context );
ok( awareness == DPI_AWARENESS_UNAWARE, "wrong awareness %u\n", awareness );
DestroyWindow( hwnd );
pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
hwnd = CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, GetModuleHandleA(0), NULL );
ok( hwnd != 0, "failed to create window\n" );
context = pGetWindowDpiAwarenessContext( hwnd );
awareness = pGetAwarenessFromDpiAwarenessContext( context );
ok( awareness == DPI_AWARENESS_SYSTEM_AWARE, "wrong awareness %u\n", awareness );
DestroyWindow( hwnd );
pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE );
hwnd = CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, GetModuleHandleA(0), NULL );
ok( hwnd != 0, "failed to create window\n" );
context = pGetWindowDpiAwarenessContext( hwnd );
awareness = pGetAwarenessFromDpiAwarenessContext( context );
ok( awareness == DPI_AWARENESS_PER_MONITOR_AWARE, "wrong awareness %u\n", awareness );
DestroyWindow( hwnd );
for (i = DPI_AWARENESS_UNAWARE; i <= DPI_AWARENESS_PER_MONITOR_AWARE; i++)
{
pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)~i );
hwnd = CreateWindowA( "DpiTestClass", "Test",
WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, GetModuleHandleA(0), NULL );
ok( hwnd != 0, "failed to create window\n" );
context = pGetWindowDpiAwarenessContext( hwnd );
awareness = pGetAwarenessFromDpiAwarenessContext( context );
ok( awareness == i, "%lu: wrong awareness %u\n", i, awareness );
msg.hwnd = hwnd;
for (j = DPI_AWARENESS_UNAWARE; j <= DPI_AWARENESS_PER_MONITOR_AWARE; j++)
{
pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)~j );
SendMessageA( hwnd, WM_USER, 0, 0 );
DispatchMessageA( &msg );
CallWindowProcA( dpi_winproc, hwnd, WM_USER + 2, 0, 0 );
}
DestroyWindow( hwnd );
}
SetLastError( 0xdeadbeef );
context = pGetWindowDpiAwarenessContext( (HWND)0xdeadbeef );
@ -3634,6 +3639,9 @@ START_TEST(sysparams)
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
RegisterClassA( &wc );
wc.lpszClassName = "DpiTestClass";
wc.lpfnWndProc = dpi_winproc;
RegisterClassA( &wc );
ghTestWnd = CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, hInstance, NULL );

View File

@ -233,6 +233,7 @@ static WPARAM map_wparam_char_WtoA( WPARAM wParam, DWORD len )
/* call a 32-bit window procedure */
static LRESULT call_window_proc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp, LRESULT *result, void *arg )
{
DPI_AWARENESS_CONTEXT context;
WNDPROC proc = arg;
USER_CheckNotLock();
@ -241,7 +242,9 @@ static LRESULT call_window_proc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp, LRES
TRACE_(relay)( "\1Call window proc %p (hwnd=%p,msg=%s,wp=%08lx,lp=%08lx)\n",
proc, hwnd, SPY_GetMsgName(msg, hwnd), wp, lp );
context = SetThreadDpiAwarenessContext( GetWindowDpiAwarenessContext( hwnd ));
*result = WINPROC_wrapper( proc, hwnd, msg, wp, lp );
SetThreadDpiAwarenessContext( context );
TRACE_(relay)( "\1Ret window proc %p (hwnd=%p,msg=%s,wp=%08lx,lp=%08lx) retval=%08lx\n",
proc, hwnd, SPY_GetMsgName(msg, hwnd), wp, lp, *result );
@ -251,6 +254,7 @@ static LRESULT call_window_proc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp, LRES
/* call a 32-bit dialog procedure */
static LRESULT call_dialog_proc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp, LRESULT *result, void *arg )
{
DPI_AWARENESS_CONTEXT context;
WNDPROC proc = arg;
LRESULT ret;
@ -260,8 +264,10 @@ static LRESULT call_dialog_proc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp, LRES
TRACE_(relay)( "\1Call dialog proc %p (hwnd=%p,msg=%s,wp=%08lx,lp=%08lx)\n",
proc, hwnd, SPY_GetMsgName(msg, hwnd), wp, lp );
context = SetThreadDpiAwarenessContext( GetWindowDpiAwarenessContext( hwnd ));
ret = WINPROC_wrapper( proc, hwnd, msg, wp, lp );
*result = GetWindowLongPtrW( hwnd, DWLP_MSGRESULT );
SetThreadDpiAwarenessContext( context );
TRACE_(relay)( "\1Ret dialog proc %p (hwnd=%p,msg=%s,wp=%08lx,lp=%08lx) retval=%08lx result=%08lx\n",
proc, hwnd, SPY_GetMsgName(msg, hwnd), wp, lp, ret, *result );