이렇게 할 수 있습니다. 아마도 나는 을 시뮬레이션 할 수 있습니다.이 효과. 사용자가 다른 실행중인 응용 프로그램과 계속 상호 작용할 수 있기 때문에 실제로 UAC 대화 상자와 같지 않습니다. 응용 프로그램에서 사용할 수있는 "시스템 모달"과 같은 개념은 없습니다. 물론 디자인에 의한 것입니다. 그러나 나머지 데스크탑이 희미 해져서 앱의 대화 상자에 집중하도록하는 "라이트 박스"를 확실히 보여줄 수 있습니다.
내가 할 수있는 방법은 다른 모든 창의 위에있는 거대한 layered window을 만들고 전체 화면을 채우고 검정색으로 채우고 원하는대로 불투명도를 설정하는 것입니다. 그런 다음 MessageBox 함수를 호출하거나 DialogBox 함수를 사용하여 사용자 지정 대화 상자 중 하나를 표시하는 모달 대화 상자를 표시하기 전에 라이트 상자 창을 표시합니다. 마지막으로 사용자가 모달 대화 상자를 닫으면 라이트 상자 창이 사라집니다.
다음은 몇 가지 샘플 코드입니다. 간결성을 위해 오류 검사가 생략되었습니다. 하나 이상의 클래스에서이 엉망진창을 감싸는 것처럼 다른 좋은 스타일이 있습니다. 당신은 그것을 알 수 있습니다
INT_PTR ShowLightBoxedDialog(HINSTANCE hInstance,
LPCTSTR pDlgTemplate,
HWND hwndParent,
DLGPROC pDlgProc,
BYTE opacityLevel)
{
const TCHAR szLightBoxClass[] = TEXT("LightBoxWndClass");
// Register the light box window class.
static bool lightBoxRegistered = false;
if (!lightBoxRegistered)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(wcex);
wcex.style = CS_NOCLOSE | CS_SAVEBITS;
wcex.lpfnWndProc = LightBoxWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hIconSm = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = NULL;
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szLightBoxClass;
RegisterClassEx(&wcex);
lightBoxRegistered = true;
}
// Create and display the light box window.
HWND hwndLightBox = CreateWindowEx(WS_EX_NOACTIVATE | WS_EX_LAYERED,
szLightBoxClass,
NULL,
WS_POPUPWINDOW,
0, 0, 0, 0,
hwndParent,
NULL,
hInstance,
NULL);
SetLayeredWindowAttributes(hwndLightBox, 0, opacityLevel, LWA_ALPHA);
SetWindowPos(hwndLightBox,
HWND_TOP,
GetSystemMetrics(SM_XVIRTUALSCREEN),
GetSystemMetrics(SM_YVIRTUALSCREEN),
GetSystemMetrics(SM_CXVIRTUALSCREEN),
GetSystemMetrics(SM_CYVIRTUALSCREEN),
SWP_SHOWWINDOW);
// Display the modal dialog box (as you normally would).
// NOTE: The dialog box won't appear centered on the screen.
// For that, you will need to write centering code in response
// to the WM_INITDIALOG message in the dialog procedure.
INT_PTR result = DialogBox(hInstance, pDlgTemplate, hwndLightBox, pDlgProc);
//
// For demonstration purposes, I used the following code:
// INT_PTR result = MessageBox(hwndLightBox,
// TEXT("OH NOEZ!\n\nYour system is kaput! Abandon þe all hope."),
// NULL,
// MB_ABORTRETRYIGNORE | MB_ICONERROR);
// Destroy the light box window.
DestroyWindow(hwndLightBox);
// Return the result of the modal dialog box.
return result;
}
기본적으로 내가 당신이 "라이트 박스"효과가있는 대화 상자를 필요할 때마다 사용하는 DialogBox function 래퍼를 생성 완료했습니다. 동일한 매개 변수 (처음 4 개)를 모두 사용하면 끝에 "라이트 박스"효과에 사용 된 불투명도 레벨을 지정할 수있는 추가 값이 추가됩니다. 150-200의 범위에있는 것이 아마도 좋을 것입니다. 당연히, 당신은 무언가를 고르고 그것을 하드 코딩 할 수 있지만 하드 코딩 된 값에 심각한 알레르기가 있습니다. 어쨌든, 어디에서이 함수를 호출하는 슈퍼 쉽습니다 : 코드가 이미 Windows에서 작동하는 방법을 모달 대화 상자를 활용
ShowLightBoxedDialog(hInstance, /* your application instance */
MAKEINTRESOURCE(IDD_SAMPLE), /* your dialog template */
hWnd, /* parent window for dialog */
SampleWndProc, /* ptr to dialog procedure */
175); /* light box opacity level */

때문에, 사용자는 어떤 상호 작용 할 수 없습니다 대화 상자를 닫을 때까지 응용 프로그램을 닫습니다. 그리고 "라이트 박스"창이 다른 모든 것들 위에 놓여 있기 때문에 모든 마우스 클릭을 잡아서 다른 응용 프로그램에 포커스를 설정할 수 없습니다. 그러나 Alt + Tab과 같은 것을 사용하면 해결할 수 있습니다.
여기가 이 아니라 보안 기능입니다! 그것은 단지 시각 효과 일뿐입니다!
그리고 어리석은 시각적 효과이기 때문에 사용자에게는 실망 스럽습니다. 실제로 사용하지 않는 것이 좋습니다. 그러나 이제는 어떻게하는지 알게되었습니다. 그러한 전력을 책임감있게 사용하십시오.
전체 화면 항상 맨 위 창을 표시하는 것은 어떻습니까? 어쨌든 나는 클라이언트에서 요구 사항이되기를 바란다. 사용자로서이 작업을 수행하는 응용 프로그램을 좋아하지 않기 때문이다. :-) – CodeCaster
조금 더 자세히 설명해 주시겠습니까? 당신은 창을 만들고 숨겨진 상태로 유지한다는 것을 의미합니다. 어떤 종류의 창이 될 것입니까? – user1624807