6 static HINSTANCE hInstance
;
8 typedef INT_PTR (WINAPI
*PDEVICEPROPERTIESW
)(HWND
,LPCWSTR
,LPCWSTR
,BOOL
);
11 GetColorDescription(PDEVMODEW lpDevMode
,
17 switch (lpDevMode
->dmBitsPerPel
)
40 !LoadString(hInstance
,
45 lpBuffer
[0] = TEXT('\0');
50 GetRefreshRateDescription(PDEVMODEW lpDevMode
,
56 if (lpDevMode
->dmDisplayFrequency
<= 1)
58 if (!LoadString(hInstance
,
63 lpBuffer
[0] = TEXT('\0');
68 if (!LoadString(hInstance
,
71 sizeof(szFormat
) / sizeof(szFormat
[0])))
73 szFormat
[0] = TEXT('\0');
79 lpDevMode
->dmDisplayFrequency
);
84 InitListAllModesDialog(PDESKDISPLAYADAPTER This
,
85 HWND hwndListAllModesDlg
)
87 TCHAR szFormat
[64], szBuffer
[64], szColors
[64], szRefreshRate
[64];
88 PDEVMODEW lpDevMode
, lpCurrentDevMode
;
92 if (This
->DeskExtInterface
!= NULL
)
94 if (!LoadString(hInstance
,
97 sizeof(szFormat
) / sizeof(szFormat
[0])))
99 szFormat
[0] = TEXT('\0');
102 lpCurrentDevMode
= This
->DeskExtInterface
->GetCurrentMode(This
->DeskExtInterface
->Context
);
106 lpDevMode
= This
->DeskExtInterface
->EnumAllModes(This
->DeskExtInterface
->Context
,
108 if (lpDevMode
!= NULL
)
110 GetColorDescription(lpDevMode
,
112 sizeof(szColors
) / sizeof(szColors
[0]));
114 GetRefreshRateDescription(lpDevMode
,
116 sizeof(szRefreshRate
) / sizeof(szRefreshRate
[0]));
119 sizeof(szBuffer
) / sizeof(szBuffer
[0]),
121 lpDevMode
->dmPelsWidth
,
122 lpDevMode
->dmPelsHeight
,
126 i
= (INT
)SendDlgItemMessage(hwndListAllModesDlg
,
133 SendDlgItemMessage(hwndListAllModesDlg
,
139 if (lpDevMode
== lpCurrentDevMode
)
141 SendDlgItemMessage(hwndListAllModesDlg
,
150 } while (lpDevMode
!= NULL
);
155 ChangeSelectedMode(PDESKDISPLAYADAPTER This
,
156 HWND hwndListAllModesDlg
)
159 PDEVMODEW lpSelDevMode
= NULL
;
162 i
= (INT
)SendDlgItemMessage(hwndListAllModesDlg
,
170 lpSelDevMode
= (PDEVMODEW
)SendDlgItemMessage(hwndListAllModesDlg
,
177 if (lpSelDevMode
!= NULL
)
179 This
->lpSelDevMode
= lpSelDevMode
;
186 static INT_PTR CALLBACK
187 ListAllModesDlgProc(HWND hwndDlg
,
192 PDESKDISPLAYADAPTER This
;
195 if (uMsg
!= WM_INITDIALOG
)
197 This
= (PDESKDISPLAYADAPTER
)GetWindowLongPtr(hwndDlg
,
204 This
= (PDESKDISPLAYADAPTER
)lParam
;
205 SetWindowLongPtr(hwndDlg
,
209 InitListAllModesDialog(This
,
215 switch (LOWORD(wParam
))
218 if (ChangeSelectedMode(This
,
243 ShowListAllModes(PDESKDISPLAYADAPTER This
)
247 lpPrevSel
= This
->lpSelDevMode
;
249 if (This
->DeskExtInterface
!= NULL
&&
250 DialogBoxParam(hInstance
,
251 MAKEINTRESOURCE(IDD_LISTALLMODES
),
254 (LPARAM
)This
) == IDOK
)
256 if (lpPrevSel
!= This
->lpSelDevMode
)
258 (void)PropSheet_Changed(GetParent(This
->hwndDlg
),
260 This
->DeskExtInterface
->SetCurrentMode(This
->DeskExtInterface
->Context
,
267 ShowAdapterProperties(PDESKDISPLAYADAPTER This
)
270 PDEVICEPROPERTIESW pDevicePropertiesW
;
272 hDevMgr
= LoadLibrary(TEXT("devmgr.dll"));
275 pDevicePropertiesW
= (PDEVICEPROPERTIESW
)GetProcAddress(hDevMgr
,
276 "DevicePropertiesW");
277 if (pDevicePropertiesW
!= NULL
)
279 pDevicePropertiesW(This
->hwndDlg
,
285 FreeLibrary(hDevMgr
);
290 InitDisplayAdapterDialog(PDESKDISPLAYADAPTER This
)
292 LPTSTR lpAdapterName
;
294 This
->lpDeviceId
= QueryDeskCplString(This
->pdtobj
,
295 RegisterClipboardFormat(DESK_EXT_DISPLAYID
));
296 EnableWindow(GetDlgItem(This
->hwndDlg
,
297 IDC_ADAPTERPROPERTIES
),
298 This
->lpDeviceId
!= NULL
&& This
->lpDeviceId
[0] != TEXT('\0'));
299 lpAdapterName
= QueryDeskCplString(This
->pdtobj
,
300 RegisterClipboardFormat(DESK_EXT_DISPLAYNAME
));
301 if (lpAdapterName
!= NULL
)
303 SetDlgItemText(This
->hwndDlg
,
307 LocalFree((HLOCAL
)lpAdapterName
);
310 if (This
->DeskExtInterface
!= NULL
)
312 SetDlgItemTextW(This
->hwndDlg
,
314 This
->DeskExtInterface
->ChipType
);
315 SetDlgItemTextW(This
->hwndDlg
,
317 This
->DeskExtInterface
->DacType
);
318 SetDlgItemTextW(This
->hwndDlg
,
320 This
->DeskExtInterface
->MemorySize
);
321 SetDlgItemTextW(This
->hwndDlg
,
323 This
->DeskExtInterface
->AdapterString
);
324 SetDlgItemTextW(This
->hwndDlg
,
326 This
->DeskExtInterface
->BiosString
);
328 This
->lpDevModeOnInit
= This
->DeskExtInterface
->GetCurrentMode(This
->DeskExtInterface
->Context
);
331 This
->lpDevModeOnInit
= NULL
;
333 This
->lpSelDevMode
= This
->lpDevModeOnInit
;
337 ApplyDisplayAdapterChanges(PDESKDISPLAYADAPTER This
)
341 if (This
->DeskExtInterface
!= NULL
)
343 /* Change the display settings through desk.cpl */
344 lChangeRet
= DeskCplExtDisplaySaveSettings(This
->DeskExtInterface
,
346 if (lChangeRet
== DISP_CHANGE_SUCCESSFUL
)
348 /* Save the new mode */
349 This
->lpDevModeOnInit
= This
->DeskExtInterface
->GetCurrentMode(This
->DeskExtInterface
->Context
);
350 This
->lpSelDevMode
= This
->lpDevModeOnInit
;
351 return PSNRET_NOERROR
;
353 else if (lChangeRet
== DISP_CHANGE_RESTART
)
355 /* Notify desk.cpl that the user needs to reboot */
356 PropSheet_RestartWindows(GetParent(This
->hwndDlg
));
357 return PSNRET_NOERROR
;
361 return PSNRET_INVALID_NOCHANGEPAGE
;
365 ResetDisplayAdapterChanges(PDESKDISPLAYADAPTER This
)
367 if (This
->DeskExtInterface
!= NULL
&& This
->lpDevModeOnInit
!= NULL
)
369 This
->DeskExtInterface
->SetCurrentMode(This
->DeskExtInterface
->Context
,
370 This
->lpDevModeOnInit
);
374 static INT_PTR CALLBACK
375 DisplayAdapterDlgProc(HWND hwndDlg
,
380 PDESKDISPLAYADAPTER This
;
383 if (uMsg
!= WM_INITDIALOG
)
385 This
= (PDESKDISPLAYADAPTER
)GetWindowLongPtr(hwndDlg
,
392 This
= (PDESKDISPLAYADAPTER
)((LPCPROPSHEETPAGE
)lParam
)->lParam
;
393 This
->hwndDlg
= hwndDlg
;
394 SetWindowLongPtr(hwndDlg
,
398 InitDisplayAdapterDialog(This
);
403 switch (LOWORD(wParam
))
405 case IDC_ADAPTERPROPERTIES
:
406 ShowAdapterProperties(This
);
409 case IDC_LISTALLMODES
:
410 ShowListAllModes(This
);
418 NMHDR
*nmh
= (NMHDR
*)lParam
;
424 SetWindowLong(hwndDlg
,
426 ApplyDisplayAdapterChanges(This
));
431 ResetDisplayAdapterChanges(This
);
442 IDeskDisplayAdapter_Destroy(PDESKDISPLAYADAPTER This
)
444 if (This
->pdtobj
!= NULL
)
446 IDataObject_Release(This
->pdtobj
);
450 if (This
->DeskExtInterface
!= NULL
)
452 LocalFree((HLOCAL
)This
->DeskExtInterface
);
453 This
->DeskExtInterface
= NULL
;
456 if (This
->lpDeviceId
!= NULL
)
458 LocalFree((HLOCAL
)This
->lpDeviceId
);
459 This
->lpDeviceId
= NULL
;
464 IDeskDisplayAdapter_AddRef(PDESKDISPLAYADAPTER This
)
468 ret
= InterlockedIncrement((PLONG
)&This
->ref
);
470 InterlockedIncrement(&dll_refs
);
476 IDeskDisplayAdapter_Release(PDESKDISPLAYADAPTER This
)
480 ret
= InterlockedDecrement((PLONG
)&This
->ref
);
483 IDeskDisplayAdapter_Destroy(This
);
484 InterlockedDecrement(&dll_refs
);
486 HeapFree(GetProcessHeap(),
494 HRESULT STDMETHODCALLTYPE
495 IDeskDisplayAdapter_QueryInterface(PDESKDISPLAYADAPTER This
,
502 &IID_IShellPropSheetExt
) ||
506 *pvObject
= impl_to_interface(This
, IShellPropSheetExt
);
508 else if (IsEqualIID(iid
,
511 *pvObject
= impl_to_interface(This
, IShellExtInit
);
513 else if (IsEqualIID(iid
,
516 *pvObject
= impl_to_interface(This
, IClassFactory
);
520 DPRINT1("IDeskDisplayAdapter::QueryInterface(%p,%p): E_NOINTERFACE\n", iid
, pvObject
);
521 return E_NOINTERFACE
;
524 IDeskDisplayAdapter_AddRef(This
);
529 IDeskDisplayAdapter_Initialize(PDESKDISPLAYADAPTER This
,
530 LPCITEMIDLIST pidlFolder
,
534 DPRINT1("IDeskDisplayAdapter::Initialize(%p,%p,%p)\n", pidlFolder
, pdtobj
, hkeyProgID
);
538 IDataObject_AddRef(pdtobj
);
539 This
->pdtobj
= pdtobj
;
541 /* Get a copy of the desk.cpl extension interface */
542 This
->DeskExtInterface
= QueryDeskCplExtInterface(This
->pdtobj
);
543 if (This
->DeskExtInterface
!= NULL
)
551 IDeskDisplayAdapter_AddPages(PDESKDISPLAYADAPTER This
,
552 LPFNADDPROPSHEETPAGE pfnAddPage
,
558 DPRINT1("IDeskDisplayAdapter::AddPages(%p,%p)\n", pfnAddPage
, lParam
);
560 psp
.dwSize
= sizeof(psp
);
561 psp
.dwFlags
= PSP_DEFAULT
;
562 psp
.hInstance
= hInstance
;
563 psp
.pszTemplate
= MAKEINTRESOURCE(IDD_DISPLAYADAPTER
);
564 psp
.pfnDlgProc
= DisplayAdapterDlgProc
;
565 psp
.lParam
= (LPARAM
)This
;
567 hpsp
= CreatePropertySheetPage(&psp
);
568 if (hpsp
!= NULL
&& pfnAddPage(hpsp
, lParam
))
575 IDeskDisplayAdapter_ReplacePage(PDESKDISPLAYADAPTER This
,
577 LPFNADDPROPSHEETPAGE pfnReplacePage
,
580 DPRINT1("IDeskDisplayAdapter::ReplacePage(%u,%p,%p)\n", uPageID
, pfnReplacePage
, lParam
);
585 IDeskDisplayAdapter_Constructor(REFIID riid
,
588 PDESKDISPLAYADAPTER This
;
589 HRESULT hRet
= E_OUTOFMEMORY
;
591 DPRINT1("IDeskDisplayAdapter::Constructor(%p,%p)\n", riid
, ppv
);
593 This
= HeapAlloc(GetProcessHeap(),
601 IDeskDisplayAdapter_InitIface(This
);
603 hRet
= IDeskDisplayAdapter_QueryInterface(This
,
606 if (!SUCCEEDED(hRet
))
607 IDeskDisplayAdapter_Release(This
);
614 DllMain(HINSTANCE hinstDLL
,
620 case DLL_PROCESS_ATTACH
:
621 hInstance
= hinstDLL
;
622 DisableThreadLibraryCalls(hInstance
);