10 static HINSTANCE hInstance
;
12 typedef INT_PTR (WINAPI
*PDEVICEPROPERTIESW
)(HWND
,LPCWSTR
,LPCWSTR
,BOOL
);
15 GetColorDescription(PDEVMODEW lpDevMode
,
21 switch (lpDevMode
->dmBitsPerPel
)
44 !LoadString(hInstance
,
49 lpBuffer
[0] = TEXT('\0');
54 GetRefreshRateDescription(PDEVMODEW lpDevMode
,
60 if (lpDevMode
->dmDisplayFrequency
<= 1)
62 if (!LoadString(hInstance
,
67 lpBuffer
[0] = TEXT('\0');
72 if (!LoadString(hInstance
,
75 sizeof(szFormat
) / sizeof(szFormat
[0])))
77 szFormat
[0] = TEXT('\0');
83 lpDevMode
->dmDisplayFrequency
);
88 InitListAllModesDialog(PDESKDISPLAYADAPTER This
,
89 HWND hwndListAllModesDlg
)
91 TCHAR szFormat
[64], szBuffer
[64], szColors
[64], szRefreshRate
[64];
92 PDEVMODEW lpDevMode
, lpCurrentDevMode
;
96 if (This
->DeskExtInterface
!= NULL
)
98 if (!LoadString(hInstance
,
101 sizeof(szFormat
) / sizeof(szFormat
[0])))
103 szFormat
[0] = TEXT('\0');
106 lpCurrentDevMode
= This
->DeskExtInterface
->GetCurrentMode(This
->DeskExtInterface
->Context
);
110 lpDevMode
= This
->DeskExtInterface
->EnumAllModes(This
->DeskExtInterface
->Context
,
112 if (lpDevMode
!= NULL
)
114 GetColorDescription(lpDevMode
,
116 sizeof(szColors
) / sizeof(szColors
[0]));
118 GetRefreshRateDescription(lpDevMode
,
120 sizeof(szRefreshRate
) / sizeof(szRefreshRate
[0]));
123 sizeof(szBuffer
) / sizeof(szBuffer
[0]),
125 lpDevMode
->dmPelsWidth
,
126 lpDevMode
->dmPelsHeight
,
130 i
= (INT
)SendDlgItemMessage(hwndListAllModesDlg
,
137 SendDlgItemMessage(hwndListAllModesDlg
,
143 if (lpDevMode
== lpCurrentDevMode
)
145 SendDlgItemMessage(hwndListAllModesDlg
,
154 } while (lpDevMode
!= NULL
);
159 ChangeSelectedMode(PDESKDISPLAYADAPTER This
,
160 HWND hwndListAllModesDlg
)
163 PDEVMODEW lpSelDevMode
= NULL
;
166 i
= (INT
)SendDlgItemMessage(hwndListAllModesDlg
,
174 lpSelDevMode
= (PDEVMODEW
)SendDlgItemMessage(hwndListAllModesDlg
,
181 if (lpSelDevMode
!= NULL
)
183 This
->lpSelDevMode
= lpSelDevMode
;
190 static INT_PTR CALLBACK
191 ListAllModesDlgProc(HWND hwndDlg
,
196 PDESKDISPLAYADAPTER This
;
199 if (uMsg
!= WM_INITDIALOG
)
201 This
= (PDESKDISPLAYADAPTER
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
207 This
= (PDESKDISPLAYADAPTER
)lParam
;
208 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)This
);
210 InitListAllModesDialog(This
,
216 switch (LOWORD(wParam
))
219 if (ChangeSelectedMode(This
,
244 ShowListAllModes(PDESKDISPLAYADAPTER This
)
248 lpPrevSel
= This
->lpSelDevMode
;
250 if (This
->DeskExtInterface
!= NULL
&&
251 DialogBoxParam(hInstance
,
252 MAKEINTRESOURCE(IDD_LISTALLMODES
),
255 (LPARAM
)This
) == IDOK
)
257 if (lpPrevSel
!= This
->lpSelDevMode
)
259 (void)PropSheet_Changed(GetParent(This
->hwndDlg
),
261 This
->DeskExtInterface
->SetCurrentMode(This
->DeskExtInterface
->Context
,
268 ShowAdapterProperties(PDESKDISPLAYADAPTER This
)
271 PDEVICEPROPERTIESW pDevicePropertiesW
;
273 hDevMgr
= LoadLibrary(TEXT("devmgr.dll"));
276 pDevicePropertiesW
= (PDEVICEPROPERTIESW
)GetProcAddress(hDevMgr
,
277 "DevicePropertiesW");
278 if (pDevicePropertiesW
!= NULL
)
280 pDevicePropertiesW(This
->hwndDlg
,
286 FreeLibrary(hDevMgr
);
291 InitDisplayAdapterDialog(PDESKDISPLAYADAPTER This
)
293 LPTSTR lpAdapterName
;
295 This
->lpDeviceId
= QueryDeskCplString(This
->pdtobj
,
296 RegisterClipboardFormat(DESK_EXT_DISPLAYID
));
297 EnableWindow(GetDlgItem(This
->hwndDlg
,
298 IDC_ADAPTERPROPERTIES
),
299 This
->lpDeviceId
!= NULL
&& This
->lpDeviceId
[0] != TEXT('\0'));
300 lpAdapterName
= QueryDeskCplString(This
->pdtobj
,
301 RegisterClipboardFormat(DESK_EXT_DISPLAYNAME
));
302 if (lpAdapterName
!= NULL
)
304 SetDlgItemText(This
->hwndDlg
,
308 LocalFree((HLOCAL
)lpAdapterName
);
311 if (This
->DeskExtInterface
!= NULL
)
313 SetDlgItemTextW(This
->hwndDlg
,
315 This
->DeskExtInterface
->ChipType
);
316 SetDlgItemTextW(This
->hwndDlg
,
318 This
->DeskExtInterface
->DacType
);
319 SetDlgItemTextW(This
->hwndDlg
,
321 This
->DeskExtInterface
->MemorySize
);
322 SetDlgItemTextW(This
->hwndDlg
,
324 This
->DeskExtInterface
->AdapterString
);
325 SetDlgItemTextW(This
->hwndDlg
,
327 This
->DeskExtInterface
->BiosString
);
329 This
->lpDevModeOnInit
= This
->DeskExtInterface
->GetCurrentMode(This
->DeskExtInterface
->Context
);
332 This
->lpDevModeOnInit
= NULL
;
334 This
->lpSelDevMode
= This
->lpDevModeOnInit
;
338 ApplyDisplayAdapterChanges(PDESKDISPLAYADAPTER This
)
342 if (This
->DeskExtInterface
!= NULL
)
344 /* Change the display settings through desk.cpl */
345 lChangeRet
= DeskCplExtDisplaySaveSettings(This
->DeskExtInterface
,
347 if (lChangeRet
== DISP_CHANGE_SUCCESSFUL
)
349 /* Save the new mode */
350 This
->lpDevModeOnInit
= This
->DeskExtInterface
->GetCurrentMode(This
->DeskExtInterface
->Context
);
351 This
->lpSelDevMode
= This
->lpDevModeOnInit
;
352 return PSNRET_NOERROR
;
354 else if (lChangeRet
== DISP_CHANGE_RESTART
)
356 /* Notify desk.cpl that the user needs to reboot */
357 PropSheet_RestartWindows(GetParent(This
->hwndDlg
));
358 return PSNRET_NOERROR
;
362 return PSNRET_INVALID_NOCHANGEPAGE
;
366 ResetDisplayAdapterChanges(PDESKDISPLAYADAPTER This
)
368 if (This
->DeskExtInterface
!= NULL
&& This
->lpDevModeOnInit
!= NULL
)
370 This
->DeskExtInterface
->SetCurrentMode(This
->DeskExtInterface
->Context
,
371 This
->lpDevModeOnInit
);
375 static INT_PTR CALLBACK
376 DisplayAdapterDlgProc(HWND hwndDlg
,
381 PDESKDISPLAYADAPTER This
;
384 if (uMsg
!= WM_INITDIALOG
)
386 This
= (PDESKDISPLAYADAPTER
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
392 This
= (PDESKDISPLAYADAPTER
)((LPCPROPSHEETPAGE
)lParam
)->lParam
;
393 This
->hwndDlg
= hwndDlg
;
394 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)This
);
396 InitDisplayAdapterDialog(This
);
401 switch (LOWORD(wParam
))
403 case IDC_ADAPTERPROPERTIES
:
404 ShowAdapterProperties(This
);
407 case IDC_LISTALLMODES
:
408 ShowListAllModes(This
);
416 NMHDR
*nmh
= (NMHDR
*)lParam
;
422 SetWindowLongPtr(hwndDlg
,
424 ApplyDisplayAdapterChanges(This
));
429 ResetDisplayAdapterChanges(This
);
440 IDeskDisplayAdapter_Destroy(PDESKDISPLAYADAPTER This
)
442 if (This
->pdtobj
!= NULL
)
444 IDataObject_Release(This
->pdtobj
);
448 if (This
->DeskExtInterface
!= NULL
)
450 LocalFree((HLOCAL
)This
->DeskExtInterface
);
451 This
->DeskExtInterface
= NULL
;
454 if (This
->lpDeviceId
!= NULL
)
456 LocalFree((HLOCAL
)This
->lpDeviceId
);
457 This
->lpDeviceId
= NULL
;
462 IDeskDisplayAdapter_AddRef(PDESKDISPLAYADAPTER This
)
466 ret
= InterlockedIncrement((PLONG
)&This
->ref
);
468 InterlockedIncrement(&dll_refs
);
474 IDeskDisplayAdapter_Release(PDESKDISPLAYADAPTER This
)
478 ret
= InterlockedDecrement((PLONG
)&This
->ref
);
481 IDeskDisplayAdapter_Destroy(This
);
482 InterlockedDecrement(&dll_refs
);
484 HeapFree(GetProcessHeap(),
492 HRESULT STDMETHODCALLTYPE
493 IDeskDisplayAdapter_QueryInterface(PDESKDISPLAYADAPTER This
,
500 &IID_IShellPropSheetExt
) ||
504 *pvObject
= impl_to_interface(This
, IShellPropSheetExt
);
506 else if (IsEqualIID(iid
,
509 *pvObject
= impl_to_interface(This
, IShellExtInit
);
511 else if (IsEqualIID(iid
,
514 *pvObject
= impl_to_interface(This
, IClassFactory
);
518 DPRINT1("IDeskDisplayAdapter::QueryInterface(%p,%p): E_NOINTERFACE\n", iid
, pvObject
);
519 return E_NOINTERFACE
;
522 IDeskDisplayAdapter_AddRef(This
);
527 IDeskDisplayAdapter_Initialize(PDESKDISPLAYADAPTER This
,
528 LPCITEMIDLIST pidlFolder
,
532 DPRINT1("IDeskDisplayAdapter::Initialize(%p,%p,%p)\n", pidlFolder
, pdtobj
, hkeyProgID
);
536 IDataObject_AddRef(pdtobj
);
537 This
->pdtobj
= pdtobj
;
539 /* Get a copy of the desk.cpl extension interface */
540 This
->DeskExtInterface
= QueryDeskCplExtInterface(This
->pdtobj
);
541 if (This
->DeskExtInterface
!= NULL
)
549 IDeskDisplayAdapter_AddPages(PDESKDISPLAYADAPTER This
,
550 LPFNADDPROPSHEETPAGE pfnAddPage
,
556 DPRINT1("IDeskDisplayAdapter::AddPages(%p,%p)\n", pfnAddPage
, lParam
);
558 psp
.dwSize
= sizeof(psp
);
559 psp
.dwFlags
= PSP_DEFAULT
;
560 psp
.hInstance
= hInstance
;
561 psp
.pszTemplate
= MAKEINTRESOURCE(IDD_DISPLAYADAPTER
);
562 psp
.pfnDlgProc
= DisplayAdapterDlgProc
;
563 psp
.lParam
= (LPARAM
)This
;
565 hpsp
= CreatePropertySheetPage(&psp
);
566 if (hpsp
!= NULL
&& pfnAddPage(hpsp
, lParam
))
573 IDeskDisplayAdapter_ReplacePage(PDESKDISPLAYADAPTER This
,
575 LPFNADDPROPSHEETPAGE pfnReplacePage
,
578 DPRINT1("IDeskDisplayAdapter::ReplacePage(%u,%p,%p)\n", uPageID
, pfnReplacePage
, lParam
);
583 IDeskDisplayAdapter_Constructor(REFIID riid
,
586 PDESKDISPLAYADAPTER This
;
587 HRESULT hRet
= E_OUTOFMEMORY
;
589 DPRINT1("IDeskDisplayAdapter::Constructor(%p,%p)\n", riid
, ppv
);
591 This
= HeapAlloc(GetProcessHeap(),
599 IDeskDisplayAdapter_InitIface(This
);
601 hRet
= IDeskDisplayAdapter_QueryInterface(This
,
604 if (!SUCCEEDED(hRet
))
605 IDeskDisplayAdapter_Release(This
);
612 DllMain(HINSTANCE hinstDLL
,
618 case DLL_PROCESS_ATTACH
:
619 hInstance
= hinstDLL
;
620 DisableThreadLibraryCalls(hInstance
);