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
,
208 This
= (PDESKDISPLAYADAPTER
)lParam
;
209 SetWindowLongPtr(hwndDlg
,
213 InitListAllModesDialog(This
,
219 switch (LOWORD(wParam
))
222 if (ChangeSelectedMode(This
,
247 ShowListAllModes(PDESKDISPLAYADAPTER This
)
251 lpPrevSel
= This
->lpSelDevMode
;
253 if (This
->DeskExtInterface
!= NULL
&&
254 DialogBoxParam(hInstance
,
255 MAKEINTRESOURCE(IDD_LISTALLMODES
),
258 (LPARAM
)This
) == IDOK
)
260 if (lpPrevSel
!= This
->lpSelDevMode
)
262 (void)PropSheet_Changed(GetParent(This
->hwndDlg
),
264 This
->DeskExtInterface
->SetCurrentMode(This
->DeskExtInterface
->Context
,
271 ShowAdapterProperties(PDESKDISPLAYADAPTER This
)
274 PDEVICEPROPERTIESW pDevicePropertiesW
;
276 hDevMgr
= LoadLibrary(TEXT("devmgr.dll"));
279 pDevicePropertiesW
= (PDEVICEPROPERTIESW
)GetProcAddress(hDevMgr
,
280 "DevicePropertiesW");
281 if (pDevicePropertiesW
!= NULL
)
283 pDevicePropertiesW(This
->hwndDlg
,
289 FreeLibrary(hDevMgr
);
294 InitDisplayAdapterDialog(PDESKDISPLAYADAPTER This
)
296 LPTSTR lpAdapterName
;
298 This
->lpDeviceId
= QueryDeskCplString(This
->pdtobj
,
299 RegisterClipboardFormat(DESK_EXT_DISPLAYID
));
300 EnableWindow(GetDlgItem(This
->hwndDlg
,
301 IDC_ADAPTERPROPERTIES
),
302 This
->lpDeviceId
!= NULL
&& This
->lpDeviceId
[0] != TEXT('\0'));
303 lpAdapterName
= QueryDeskCplString(This
->pdtobj
,
304 RegisterClipboardFormat(DESK_EXT_DISPLAYNAME
));
305 if (lpAdapterName
!= NULL
)
307 SetDlgItemText(This
->hwndDlg
,
311 LocalFree((HLOCAL
)lpAdapterName
);
314 if (This
->DeskExtInterface
!= NULL
)
316 SetDlgItemTextW(This
->hwndDlg
,
318 This
->DeskExtInterface
->ChipType
);
319 SetDlgItemTextW(This
->hwndDlg
,
321 This
->DeskExtInterface
->DacType
);
322 SetDlgItemTextW(This
->hwndDlg
,
324 This
->DeskExtInterface
->MemorySize
);
325 SetDlgItemTextW(This
->hwndDlg
,
327 This
->DeskExtInterface
->AdapterString
);
328 SetDlgItemTextW(This
->hwndDlg
,
330 This
->DeskExtInterface
->BiosString
);
332 This
->lpDevModeOnInit
= This
->DeskExtInterface
->GetCurrentMode(This
->DeskExtInterface
->Context
);
335 This
->lpDevModeOnInit
= NULL
;
337 This
->lpSelDevMode
= This
->lpDevModeOnInit
;
341 ApplyDisplayAdapterChanges(PDESKDISPLAYADAPTER This
)
345 if (This
->DeskExtInterface
!= NULL
)
347 /* Change the display settings through desk.cpl */
348 lChangeRet
= DeskCplExtDisplaySaveSettings(This
->DeskExtInterface
,
350 if (lChangeRet
== DISP_CHANGE_SUCCESSFUL
)
352 /* Save the new mode */
353 This
->lpDevModeOnInit
= This
->DeskExtInterface
->GetCurrentMode(This
->DeskExtInterface
->Context
);
354 This
->lpSelDevMode
= This
->lpDevModeOnInit
;
355 return PSNRET_NOERROR
;
357 else if (lChangeRet
== DISP_CHANGE_RESTART
)
359 /* Notify desk.cpl that the user needs to reboot */
360 PropSheet_RestartWindows(GetParent(This
->hwndDlg
));
361 return PSNRET_NOERROR
;
365 return PSNRET_INVALID_NOCHANGEPAGE
;
369 ResetDisplayAdapterChanges(PDESKDISPLAYADAPTER This
)
371 if (This
->DeskExtInterface
!= NULL
&& This
->lpDevModeOnInit
!= NULL
)
373 This
->DeskExtInterface
->SetCurrentMode(This
->DeskExtInterface
->Context
,
374 This
->lpDevModeOnInit
);
378 static INT_PTR CALLBACK
379 DisplayAdapterDlgProc(HWND hwndDlg
,
384 PDESKDISPLAYADAPTER This
;
387 if (uMsg
!= WM_INITDIALOG
)
389 This
= (PDESKDISPLAYADAPTER
)GetWindowLongPtr(hwndDlg
,
396 This
= (PDESKDISPLAYADAPTER
)((LPCPROPSHEETPAGE
)lParam
)->lParam
;
397 This
->hwndDlg
= hwndDlg
;
398 SetWindowLongPtr(hwndDlg
,
402 InitDisplayAdapterDialog(This
);
407 switch (LOWORD(wParam
))
409 case IDC_ADAPTERPROPERTIES
:
410 ShowAdapterProperties(This
);
413 case IDC_LISTALLMODES
:
414 ShowListAllModes(This
);
422 NMHDR
*nmh
= (NMHDR
*)lParam
;
428 SetWindowLongPtr(hwndDlg
,
430 ApplyDisplayAdapterChanges(This
));
435 ResetDisplayAdapterChanges(This
);
446 IDeskDisplayAdapter_Destroy(PDESKDISPLAYADAPTER This
)
448 if (This
->pdtobj
!= NULL
)
450 IDataObject_Release(This
->pdtobj
);
454 if (This
->DeskExtInterface
!= NULL
)
456 LocalFree((HLOCAL
)This
->DeskExtInterface
);
457 This
->DeskExtInterface
= NULL
;
460 if (This
->lpDeviceId
!= NULL
)
462 LocalFree((HLOCAL
)This
->lpDeviceId
);
463 This
->lpDeviceId
= NULL
;
468 IDeskDisplayAdapter_AddRef(PDESKDISPLAYADAPTER This
)
472 ret
= InterlockedIncrement((PLONG
)&This
->ref
);
474 InterlockedIncrement(&dll_refs
);
480 IDeskDisplayAdapter_Release(PDESKDISPLAYADAPTER This
)
484 ret
= InterlockedDecrement((PLONG
)&This
->ref
);
487 IDeskDisplayAdapter_Destroy(This
);
488 InterlockedDecrement(&dll_refs
);
490 HeapFree(GetProcessHeap(),
498 HRESULT STDMETHODCALLTYPE
499 IDeskDisplayAdapter_QueryInterface(PDESKDISPLAYADAPTER This
,
506 &IID_IShellPropSheetExt
) ||
510 *pvObject
= impl_to_interface(This
, IShellPropSheetExt
);
512 else if (IsEqualIID(iid
,
515 *pvObject
= impl_to_interface(This
, IShellExtInit
);
517 else if (IsEqualIID(iid
,
520 *pvObject
= impl_to_interface(This
, IClassFactory
);
524 DPRINT1("IDeskDisplayAdapter::QueryInterface(%p,%p): E_NOINTERFACE\n", iid
, pvObject
);
525 return E_NOINTERFACE
;
528 IDeskDisplayAdapter_AddRef(This
);
533 IDeskDisplayAdapter_Initialize(PDESKDISPLAYADAPTER This
,
534 LPCITEMIDLIST pidlFolder
,
538 DPRINT1("IDeskDisplayAdapter::Initialize(%p,%p,%p)\n", pidlFolder
, pdtobj
, hkeyProgID
);
542 IDataObject_AddRef(pdtobj
);
543 This
->pdtobj
= pdtobj
;
545 /* Get a copy of the desk.cpl extension interface */
546 This
->DeskExtInterface
= QueryDeskCplExtInterface(This
->pdtobj
);
547 if (This
->DeskExtInterface
!= NULL
)
555 IDeskDisplayAdapter_AddPages(PDESKDISPLAYADAPTER This
,
556 LPFNADDPROPSHEETPAGE pfnAddPage
,
562 DPRINT1("IDeskDisplayAdapter::AddPages(%p,%p)\n", pfnAddPage
, lParam
);
564 psp
.dwSize
= sizeof(psp
);
565 psp
.dwFlags
= PSP_DEFAULT
;
566 psp
.hInstance
= hInstance
;
567 psp
.pszTemplate
= MAKEINTRESOURCE(IDD_DISPLAYADAPTER
);
568 psp
.pfnDlgProc
= DisplayAdapterDlgProc
;
569 psp
.lParam
= (LPARAM
)This
;
571 hpsp
= CreatePropertySheetPage(&psp
);
572 if (hpsp
!= NULL
&& pfnAddPage(hpsp
, lParam
))
579 IDeskDisplayAdapter_ReplacePage(PDESKDISPLAYADAPTER This
,
581 LPFNADDPROPSHEETPAGE pfnReplacePage
,
584 DPRINT1("IDeskDisplayAdapter::ReplacePage(%u,%p,%p)\n", uPageID
, pfnReplacePage
, lParam
);
589 IDeskDisplayAdapter_Constructor(REFIID riid
,
592 PDESKDISPLAYADAPTER This
;
593 HRESULT hRet
= E_OUTOFMEMORY
;
595 DPRINT1("IDeskDisplayAdapter::Constructor(%p,%p)\n", riid
, ppv
);
597 This
= HeapAlloc(GetProcessHeap(),
605 IDeskDisplayAdapter_InitIface(This
);
607 hRet
= IDeskDisplayAdapter_QueryInterface(This
,
610 if (!SUCCEEDED(hRet
))
611 IDeskDisplayAdapter_Release(This
);
618 DllMain(HINSTANCE hinstDLL
,
624 case DLL_PROCESS_ATTACH
:
625 hInstance
= hinstDLL
;
626 DisableThreadLibraryCalls(hInstance
);