From f5113d2d56ceee2502f65183512985a76569c5e3 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 24 Oct 2013 17:41:28 +0200 Subject: [PATCH] user32: Set the display device property on the desktop window as soon as it is created. --- dlls/user32/desktop.c | 33 +++++++++++++++++++++++++++++++-- programs/explorer/desktop.c | 22 ++++++++-------------- 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/dlls/user32/desktop.c b/dlls/user32/desktop.c index 563a214d7b1..bc9125235b9 100644 --- a/dlls/user32/desktop.c +++ b/dlls/user32/desktop.c @@ -32,6 +32,7 @@ #include "wingdi.h" #include "winnls.h" #include "controls.h" +#include "wine/unicode.h" static HBRUSH hbrushPattern; static HBITMAP hbitmapWallPaper; @@ -97,8 +98,36 @@ static void init_wallpaper( const WCHAR *wallpaper ) */ LRESULT WINAPI DesktopWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { - if (message == WM_NCCREATE) return TRUE; - return 0; /* all other messages are ignored */ + static const WCHAR display_device_guid_propW[] = { + '_','_','w','i','n','e','_','d','i','s','p','l','a','y','_', + 'd','e','v','i','c','e','_','g','u','i','d',0 }; + static const WCHAR guid_formatW[] = { + '%','0','8','x','-','%','0','4','x','-','%','0','4','x','-','%','0','2','x','%','0','2','x','-', + '%','0','2','x','%','0','2','x','%','0','2','x','%','0','2','x','%','0','2','x','%','0','2','x',0}; + + switch (message) + { + case WM_NCCREATE: + { + CREATESTRUCTW *cs = (CREATESTRUCTW *)lParam; + const GUID *guid = cs->lpCreateParams; + + if (guid) + { + ATOM atom; + WCHAR buffer[37]; + + sprintfW( buffer, guid_formatW, guid->Data1, guid->Data2, guid->Data3, + guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], + guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7] ); + atom = GlobalAddAtomW( buffer ); + SetPropW( hwnd, display_device_guid_propW, ULongToHandle( atom ) ); + } + return TRUE; + } + default: + return 0; /* all other messages are ignored */ + } } /*********************************************************************** diff --git a/programs/explorer/desktop.c b/programs/explorer/desktop.c index d85483c86aa..a3bfb5c4bdc 100644 --- a/programs/explorer/desktop.c +++ b/programs/explorer/desktop.c @@ -633,11 +633,8 @@ static BOOL get_default_desktop_size( const WCHAR *name, unsigned int *width, un return found; } -static void set_desktop_guid( HWND desktop, HMODULE driver ) +static void set_desktop_guid( HWND desktop, GUID *guid, HMODULE driver ) { - static const WCHAR display_device_guid_propW[] = { - '_','_','w','i','n','e','_','d','i','s','p','l','a','y','_', - 'd','e','v','i','c','e','_','g','u','i','d',0 }; static const WCHAR device_keyW[] = { 'S','y','s','t','e','m','\\', 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', @@ -646,18 +643,11 @@ static void set_desktop_guid( HWND desktop, HMODULE driver ) '{','%','s','}','\\','0','0','0','0',0}; static const WCHAR driverW[] = {'G','r','a','p','h','i','c','s','D','r','i','v','e','r',0}; - GUID guid; RPC_WSTR guid_str; - ATOM guid_atom; HKEY hkey; WCHAR key[sizeof(device_keyW)/sizeof(WCHAR) + 39]; - UuidCreate( &guid ); - UuidToStringW( &guid, &guid_str ); - TRACE( "display guid %s\n", debugstr_w(guid_str) ); - - guid_atom = GlobalAddAtomW( guid_str ); - SetPropW( desktop, display_device_guid_propW, ULongToHandle(guid_atom) ); + UuidToStringW( guid, &guid_str ); sprintfW( key, device_keyW, guid_str ); RpcStringFreeW( &guid_str ); @@ -724,6 +714,7 @@ void manage_desktop( WCHAR *arg ) { static const WCHAR messageW[] = {'M','e','s','s','a','g','e',0}; HDESK desktop = 0; + GUID guid; MSG msg; HDC hdc; HWND hwnd, msg_hwnd; @@ -766,9 +757,12 @@ void manage_desktop( WCHAR *arg ) SetThreadDesktop( desktop ); } + UuidCreate( &guid ); + TRACE( "display guid %s\n", debugstr_guid(&guid) ); + /* create the desktop window */ hwnd = CreateWindowExW( 0, DESKTOP_CLASS_ATOM, NULL, - WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, 0, 0, 0, 0, 0, NULL ); + WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, 0, 0, 0, 0, 0, &guid ); /* create the HWND_MESSAGE parent */ msg_hwnd = CreateWindowExW( 0, messageW, NULL, WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, @@ -785,7 +779,7 @@ void manage_desktop( WCHAR *arg ) ReleaseDC( hwnd, hdc ); SetWindowLongPtrW( hwnd, GWLP_WNDPROC, (LONG_PTR)desktop_wnd_proc ); - set_desktop_guid( hwnd, graphics_driver ); + set_desktop_guid( hwnd, &guid, graphics_driver ); SendMessageW( hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIconW( 0, MAKEINTRESOURCEW(OIC_WINLOGO))); if (name) set_desktop_window_title( hwnd, name ); SetWindowPos( hwnd, 0, GetSystemMetrics(SM_XVIRTUALSCREEN), GetSystemMetrics(SM_YVIRTUALSCREEN),