setwindowrgn의 Vista 라이브 썸네일 문제
-
20-08-2019 - |
문제
나는 아마도 무언가를 놓치고 있다는 것을 알고 있지만, 영역이있는 창을 사용할 때 Windows가 라이브 썸네일 미리보기를 올바르게 표시 할 수는 없습니다. 최소화 버튼을 누르면 미리보기가 전체 미리보기 (다른 창과 같이)를 표시하지 않고 최소화 된 크기 (160x25)로 클립됩니다.
제작해야 할 사항은 거의 없습니다.
1) 미리보기는 Windows Live Messenger에서 잘 작동하므로 Microsoft는이를 수행하는 방법을 알아 냈습니다.
2) 창문이 보이기 전만해도 setwindowrgn을 호출하면 제대로 작동합니다 (따라서 DWM이 지역의 창문을 다루는 방법을 모른 채 불가능한 결함이 아닙니다.) 창이 보이기 전에 SetWindowrgn을 여러 번 호출 할 수 있으며 훌륭하게 작동합니다. .
3) 크기 조정의 경우 창을 표시 한 후 창 영역을 설정해야합니다. 따라서 이전에 설정하는 수정은 작동하지 않습니다.
4) 기본 창 절차를 사용하더라도 버그는 여전히 발생합니다. 따라서 메시지를 잘못 처리하는 잘못은 아니지만 '처리하지 않음'의 결함 일 수 있습니다 :)).
5) 작업 표시 줄 버튼을 클릭하여 최소화 할 때 (창의 최소화 버튼 대신) 미리보기는 정상적으로 정상적으로 작동합니다 (보시는 경우 영역을 설정 한 후에도). 다시 미리보기를 다루는 방법이 아니라는 것을 다시 증명합니다.
창을 보여준 후 영역을 설정하면 버그가 발생합니다. 따라야 할 코드 :
void create(HINSTANCE hInst)
{
char* className = "default";
/* Register
*/
WNDCLASSEX wcex;
memset(&wcex,0,sizeof(wcex));
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = DefWindowProc;
wcex.hInstance = hInst;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszClassName = className;
RegisterClassEx(&wcex);
/* Create
*/
HWND hwnd = CreateWindow(className, className, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL);
/*
* Set the region
* If set before the window is shown for the first time, minimize preview on vista works
*/
RECT rect;
GetWindowRect(hwnd,&rect);
HRGN rgn = CreateRoundRectRgn(0,0,rect.right-rect.left,rect.bottom-rect.top,15,15);
SetWindowRgn(hwnd,rgn,TRUE);
/* Show the window
*/
ShowWindow(hwnd,SW_SHOW);
/*
* Set the region a second time.
* Doing this will break minimize preview on vista
*/
rgn = CreateRoundRectRgn(0,0,rect.right-rect.left,rect.bottom-rect.top,35,35);
SetWindowRgn(hwnd,rgn,TRUE);
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
create(hInstance);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
해결책
Microsoft는 기술 지원 사고에 응답하여 Vista 내에서 버그로 나열했습니다.