Application Desktop 도구 모음 사용
애플리케이션 데스크톱 도구 모음(앱바라고도 함)은 Windows 작업 표시줄과 유사한 창입니다. 화면 가장자리에 고정되며 일반적으로 사용자에게 다른 애플리케이션 및 창에 빠르게 액세스할 수 있는 단추가 포함되어 있습니다. 시스템은 다른 애플리케이션이 appbar에서 사용하는 데스크톱 영역을 사용하지 못하도록 차단합니다. 언제든지 바탕 화면에는 여러 개의 앱바가 있을 수 있습니다.
이 항목에는 다음과 같은 섹션이 포함되어 있습니다.
Application Desktop 도구 모음 정보
Windows는 시스템에서 제공하는 appbar 서비스를 활용할 수 있는 API를 제공합니다. 이 서비스는 애플리케이션 정의 앱바가 서로 및 작업 표시줄과 원활하게 작동하도록 하는 데 도움이 됩니다. 시스템은 각 앱바에 대한 정보를 기본 앱바 메시지를 전송하여 크기, 위치 및 모양에 영향을 줄 수 있는 이벤트에 대해 알립니다.
메시지 보내기
애플리케이션은 appbar 메시지라는 특수한 메시지 집합을 사용하여 appbar를 추가 또는 제거하고, 앱바의 크기와 위치를 설정하고, 작업 표시줄의 크기, 위치 및 상태에 대한 정보를 검색합니다. 앱바 메시지를 보내려면 애플리케이션에서 SHAppBarMessage 함수를 사용해야 합니다. 함수의 매개 변수에는 ABM_NEW 같은 메시지 식별자 및 APPBARDATA 구조체의 주소가 포함됩니다. 구조체 멤버에는 시스템에서 지정된 메시지를 처리하는 데 필요한 정보가 포함됩니다.
지정된 appbar 메시지의 경우 시스템에서 APPBARDATA 구조의 일부 멤버를 사용하고 다른 멤버는 무시합니다. 그러나 시스템은 항상 cbSize 및 hWnd 멤버를 사용하므로 애플리케이션은 모든 appbar 메시지에 대해 이러한 멤버를 채워야 합니다. cbSize 멤버는 구조체의 크기를 지정하고 hWnd 멤버는 앱바 창에 대한 핸들입니다.
일부 앱바 메시지는 시스템에서 정보를 요청합니다. 이러한 메시지를 처리할 때 시스템은 요청된 정보를 APPBARDATA 구조에 복사합니다.
등록
시스템은 앱바의 내부 목록을 유지하고 목록의 각 막대에 대한 정보를 기본. 시스템은 이 정보를 사용하여 앱바를 관리하고, 이를 위해 서비스를 수행하고, 알림 메시지를 보냅니다.
애플리케이션은 시스템에서 appbar 서비스를 받기 전에 앱바를 등록해야 합니다(즉, 내부 목록에 추가). 앱바를 등록하기 위해 애플리케이션은 ABM_NEW 메시지를 보냅니다. 함께 제공되는 APPBARDATA 구조에는 앱바 창에 대한 핸들과 애플리케이션에서 정의한 메시지 식별자가 포함됩니다. 시스템은 메시지 식별자를 사용하여 appbar 창의 창 프로시저에 알림 메시지를 보냅니다. 자세한 내용은 Appbar 알림 메시지를 참조하세요.
애플리케이션은 ABM_REMOVE 메시지를 전송하여 앱바의 등록을 취소합니다. appbar를 등록 취소하면 시스템의 내부 appbar 목록에서 앱바가 제거됩니다. 시스템은 더 이상 앱바에 알림 메시지를 보내지 않거나 다른 애플리케이션이 appbar에서 사용하는 화면 영역을 사용하지 못하게 합니다. 애플리케이션은 항상 appbar를 삭제하기 전에 ABM_REMOVE 보내야 합니다.
Appbar 크기 및 위치
애플리케이션은 다른 앱바 또는 작업 표시줄을 방해하지 않도록 앱바의 크기와 위치를 설정해야 합니다. 모든 앱바를 화면의 특정 가장자리에 고정해야 하며 여러 앱바를 가장자리에 고정할 수 있습니다. 그러나 appbar가 작업 표시줄과 동일한 가장자리에 고정된 경우 시스템은 작업 표시줄이 항상 가장 바깥쪽 가장자리에 있는지 확인합니다.
앱바의 크기와 위치를 설정하기 위해 애플리케이션은 먼저 ABM_QUERYPOS 메시지를 전송하여 앱바에 대한 화면 가장자리 및 경계 사각형을 제안합니다. 시스템은 제안된 사각형 내의 화면 영역 부분이 작업 표시줄 또는 다른 앱바에서 사용되는지 여부를 결정하고, 사각형을 조정하고(필요한 경우) 조정된 사각형을 애플리케이션에 반환합니다.
다음으로 애플리케이션은 ABM_SETPOS 메시지를 보내 앱바에 대한 새 경계 사각형을 설정합니다. 다시 말하지만, 시스템은 사각형을 애플리케이션에 반환하기 전에 조정할 수 있습니다. 이러한 이유로 애플리케이션은 ABM_SETPOS 반환된 조정된 사각형을 사용하여 최종 크기와 위치를 설정해야 합니다. 애플리케이션은 MoveWindow 함수를 사용하여 앱바를 위치로 이동할 수 있습니다.
이 시스템은 2단계 프로세스를 사용하여 크기와 위치를 설정함으로써 애플리케이션이 이동 작업 중에 사용자에게 중간 피드백을 제공할 수 있도록 합니다. 예를 들어 사용자가 appbar를 끌면 응용 프로그램에서 앱바가 실제로 이동하기 전에 새 위치를 나타내는 음영 처리된 사각형을 표시할 수 있습니다.
애플리케이션은 앱바를 등록한 후 및 앱바가 ABN_POSCHANGED 알림 메시지를 받을 때마다 앱바의 크기와 위치를 설정해야 합니다. 작업 표시줄의 크기, 위치 또는 표시 유형 상태에서 변경이 발생할 때마다, 화면의 같은 쪽에 있는 다른 앱바가 크기 조정, 추가 또는 제거될 때마다 앱바가 이 알림 메시지를 받습니다.
appbar는 WM_ACTIVATE 메시지를 받을 때마다 ABM_ACTIVATE 메시지를 보내야 합니다. 마찬가지로 appbar가 WM_WINDOWPOSCHANGED 메시지를 받으면 ABM_WINDOWPOSCHANGED 호출해야 합니다. 이러한 메시지를 보내면 시스템이 동일한 가장자리에 있는 자동 숨기기 앱바의 z 순서를 올바르게 설정합니다.
애플리케이션 데스크톱 도구 모음 자동 숨기기
자동 숨기기 앱바는 일반적으로 숨겨지지만 사용자가 마우스 커서를 앱바가 연결된 화면 가장자리로 이동할 때 표시됩니다. 사용자가 마우스 커서를 막대의 경계 사각형 밖으로 이동하면 앱바가 다시 숨겨지게 됩니다.
시스템은 지정된 시간에 다양한 앱바를 허용하지만, 선착순으로 각 화면 가장자리에 대해 한 번에 하나의 자동 숨기기 앱바만 허용합니다. 시스템은 자동 숨기기 앱바의 z 순서를 자동으로 기본(해당 z 순서 그룹 내에서만 해당)
애플리케이션은 ABM_SETAUTOHIDEBAR 메시지를 사용하여 자동 숨기기 앱바를 등록하거나 등록 취소합니다. 이 메시지는 appbar에 대한 가장자리와 앱바를 등록 취소할지 여부를 지정하는 플래그를 지정합니다. 자동 숨기기 앱바가 등록되고 있지만 지정된 에지와 이미 연결되어 있으면 메시지가 실패합니다. 애플리케이션은 ABM_GETAUTOHIDEBAR 메시지를 전송하여 에지와 연결된 자동 숨기기 앱바에 대한 핸들을 검색할 수 있습니다.
자동 숨기기 appbar는 일반 appbar로 등록할 필요가 없습니다. 즉, ABM_NEW 메시지를 전송하여 등록할 필요가 없습니다. ABM_NEW 등록되지 않은 앱바가 화면의 동일한 가장자리에 고정된 앱바와 겹칩니다.
Appbar 알림 메시지
시스템은 앱바에 위치 및 모양에 영향을 줄 수 있는 이벤트에 대해 알리는 메시지를 보냅니다. 메시지는 애플리케이션 정의 메시지의 컨텍스트에서 전송됩니다. 애플리케이션은 appbar를 등록하기 위해 ABM_NEW 메시지를 보낼 때 메시지의 식별자를 지정합니다. 알림 코드는 애플리케이션 정의 메시지의 wParam 매개 변수에 있습니다.
작업 표시줄의 크기, 위치 또는 표시 유형 상태가 변경되거나, 다른 앱바가 화면의 동일한 가장자리에 추가되거나, 화면의 동일한 가장자리에 있는 다른 앱바의 크기가 조정되거나 제거될 때 앱바가 ABN_POSCHANGED 알림 메시지를 받 습니다. 앱바가 ABM_QUERYPOS 및 ABM_SETPOS 메시지를 전송하여 이 알림 메시지에 응답해야 합니다. appbar의 위치가 변경된 경우 MoveWindow 함수를 호출하여 새 위치로 이동해야 합니다.
시스템에서는 작업 표시줄의 자동 숨기기 또는 상시 켜기 상태가 변경될 때마다 ABN_STATECHANGE 알림 메시지를 보냅니다. 즉, 사용자가 작업 표시줄의 속성 시트에서 항상 위쪽 또는 자동 숨기기 검사 상자를 선택하거나 지울 때입니다. 앱바에서 이 알림 메시지를 사용하여 원하는 경우 작업 표시줄의 상태를 준수하도록 설정할 수 있습니다.
전체 화면 애플리케이션이 시작되거나 마지막 전체 화면 애플리케이션이 닫힌 경우 appbar는 ABN_FULLSCREENAPP 알림 메시지를 받습니다. lParam 매개 변수는 전체 화면 애플리케이션이 열리거나 닫히는지 여부를 나타냅니다. 열리면 appbar가 z 순서의 맨 아래로 떨어져야 합니다. 마지막 전체 화면 애플리케이션이 닫혔을 때 appbar는 해당 z 순서 위치를 복원해야 합니다.
사용자가 작업 표시줄의 바로 가기 메뉴에서 Cascade, Tile Horizontally 또는 Tile Vertically 명령을 선택하면 앱바가 ABN_WINDOWARRANGE 알림 메시지를 받습니다. 시스템은 창을 다시 정렬하기 전에(lParam은 TRUE임) 창을 정렬한 후(lParam은 FALSE임) 메시지를 두 번 보냅니다.
appbar는 ABN_WINDOWARRANGE 메시지를 사용하여 계단식 또는 타일 작업에서 자신을 제외할 수 있습니다. 자신을 제외하려면 lParam이 TRUE일 때 appbar가 자신을 숨기고 lParam이 FALSE일 때 자신을 표시해야 합니다. appbar가 이 메시지에 대한 응답으로 자신을 숨기는 경우 ABM_QUERYPOS 보내고 계단식 또는 타일 작업에 대한 응답으로 메시지를 ABM_SETPOS 필요가 없습니다.
애플리케이션 데스크톱 도구 모음 등록
애플리케이션은 ABM_NEW 메시지를 전송하여 앱바를 등록해야 합니다. 앱바를 등록하면 앱바가 시스템의 내부 목록에 추가되고 앱바에 알림 메시지를 보내는 데 사용할 메시지 식별자가 시스템에 제공됩니다. 종료하기 전에 애플리케이션은 ABM_REMOVE 메시지를 전송하여 앱바의 등록을 취소해야 합니다. 등록을 취소하면 시스템의 내부 목록에서 앱바가 제거되고 표시줄이 appbar 알림 메시지를 수신하지 못하게 됩니다.
다음 예제의 함수는 부울 플래그 매개 변수의 값에 따라 appbar를 등록하거나 등록 취소합니다.
// RegisterAccessBar - registers or unregisters an appbar.
// Returns TRUE if successful, or FALSE otherwise.
// hwndAccessBar - handle to the appbar
// fRegister - register and unregister flag
// Global variables
// g_uSide - screen edge (defaults to ABE_TOP)
// g_fAppRegistered - flag indicating whether the bar is registered
BOOL RegisterAccessBar(HWND hwndAccessBar, BOOL fRegister)
{
APPBARDATA abd;
// An application-defined message identifier
APPBAR_CALLBACK = (WM_USER + 0x01);
// Specify the structure size and handle to the appbar.
abd.cbSize = sizeof(APPBARDATA);
abd.hWnd = hwndAccessBar;
if (fRegister)
{
// Provide an identifier for notification messages.
abd.uCallbackMessage = APPBAR_CALLBACK;
// Register the appbar.
if (!SHAppBarMessage(ABM_NEW, &abd))
return FALSE;
g_uSide = ABE_TOP; // default edge
g_fAppRegistered = TRUE;
}
else
{
// Unregister the appbar.
SHAppBarMessage(ABM_REMOVE, &abd);
g_fAppRegistered = FALSE;
}
return TRUE;
}
Appbar 크기 및 위치 설정
애플리케이션은 appbar를 등록한 후, 사용자가 앱바를 이동하거나 크기를 조정한 후, 그리고 앱바가 ABN_POSCHANGED 알림 메시지를 받을 때마다 앱바의 크기와 위치를 설정해야 합니다. 앱바의 크기와 위치를 설정하기 전에 애플리케이션은 ABM_QUERYPOS 메시지를 보내 승인된 경계 사각형에 대해 시스템을 쿼리합니다. 시스템은 작업 표시줄 또는 다른 앱바를 방해하지 않는 경계 사각형을 반환합니다. 시스템은 직사각형 빼기를 통해 직사각형을 조정합니다. 직사각형의 초기 크기를 유지하기 위해 노력하지 않습니다. 이러한 이유로 appbar는 ABM_QUERYPOS 보낸 후 필요에 따라 사각형을 다시 조정해야 합니다.
다음으로 애플리케이션은 ABM_SETPOS 메시지를 사용하여 경계 사각형을 시스템에 다시 전달합니다. 그런 다음 MoveWindow 함수를 호출하여 앱바를 위치로 이동합니다.
다음 예제에서는 appbar의 크기와 위치를 설정하는 방법을 보여 있습니다.
// AppBarQuerySetPos - sets the size and position of an appbar.
// uEdge - screen edge to which the appbar is to be anchored
// lprc - current bounding rectangle of the appbar
// pabd - address of the APPBARDATA structure with the hWnd and cbSize members filled
void PASCAL AppBarQuerySetPos(UINT uEdge, LPRECT lprc, PAPPBARDATA pabd)
{
int iHeight = 0;
int iWidth = 0;
pabd->rc = *lprc;
pabd->uEdge = uEdge;
// Copy the screen coordinates of the appbar's bounding
// rectangle into the APPBARDATA structure.
if ((uEdge == ABE_LEFT) || (uEdge == ABE_RIGHT))
{
iWidth = pabd->rc.right - pabd->rc.left;
pabd->rc.top = 0;
pabd->rc.bottom = GetSystemMetrics(SM_CYSCREEN);
}
else
{
iHeight = pabd->rc.bottom - pabd->rc.top;
pabd->rc.left = 0;
pabd->rc.right = GetSystemMetrics(SM_CXSCREEN);
}
// Query the system for an approved size and position.
SHAppBarMessage(ABM_QUERYPOS, pabd);
// Adjust the rectangle, depending on the edge to which the appbar is anchored.
switch (uEdge)
{
case ABE_LEFT:
pabd->rc.right = pabd->rc.left + iWidth;
break;
case ABE_RIGHT:
pabd->rc.left = pabd->rc.right - iWidth;
break;
case ABE_TOP:
pabd->rc.bottom = pabd->rc.top + iHeight;
break;
case ABE_BOTTOM:
pabd->rc.top = pabd->rc.bottom - iHeight;
break;
}
// Pass the final bounding rectangle to the system.
SHAppBarMessage(ABM_SETPOS, pabd);
// Move and size the appbar so that it conforms to the
// bounding rectangle passed to the system.
MoveWindow(pabd->hWnd,
pabd->rc.left,
pabd->rc.top,
pabd->rc.right - pabd->rc.left,
pabd->rc.bottom - pabd->rc.top,
TRUE);
}
Appbar 알림 메시지 처리
appbar는 작업 표시줄의 상태가 변경되거나 전체 화면 애플리케이션이 시작되거나 마지막 응용 프로그램이 닫히거나 앱바의 크기와 위치에 영향을 줄 수 있는 이벤트가 발생할 때 알림 메시지를 받습니다. 다음 예제에서는 다양한 알림 메시지를 처리하는 방법을 보여줍니다.
// AppBarCallback - processes notification messages sent by the system.
// hwndAccessBar - handle to the appbar
// uNotifyMsg - identifier of the notification message
// lParam - message parameter
void AppBarCallback(HWND hwndAccessBar, UINT uNotifyMsg,
LPARAM lParam)
{
APPBARDATA abd;
UINT uState;
abd.cbSize = sizeof(abd);
abd.hWnd = hwndAccessBar;
switch (uNotifyMsg)
{
case ABN_STATECHANGE:
// Check to see if the taskbar's always-on-top state has changed
// and, if it has, change the appbar's state accordingly.
uState = SHAppBarMessage(ABM_GETSTATE, &abd);
SetWindowPos(hwndAccessBar,
(ABS_ALWAYSONTOP & uState) ? HWND_TOPMOST : HWND_BOTTOM,
0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
break;
case ABN_FULLSCREENAPP:
// A full-screen application has started, or the last full-screen
// application has closed. Set the appbar's z-order appropriately.
if (lParam)
{
SetWindowPos(hwndAccessBar,
(ABS_ALWAYSONTOP & uState) ? HWND_TOPMOST : HWND_BOTTOM,
0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
}
else
{
uState = SHAppBarMessage(ABM_GETSTATE, &abd);
if (uState & ABS_ALWAYSONTOP)
SetWindowPos(hwndAccessBar,
HWND_TOPMOST,
0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
}
case ABN_POSCHANGED:
// The taskbar or another appbar has changed its size or position.
AppBarPosChanged(&abd);
break;
}
}
다음 함수는 앱바의 경계 사각형을 조정한 다음, 애플리케이션 정의 AppBarQuerySetPos 함수(이전 섹션에 포함됨)를 호출하여 막대의 크기와 위치를 적절하게 설정합니다.
// AppBarPosChanged - adjusts the appbar's size and position.
// pabd - address of an APPBARDATA structure that contains information
// used to adjust the size and position.
void PASCAL AppBarPosChanged(PAPPBARDATA pabd)
{
RECT rc;
RECT rcWindow;
int iHeight;
int iWidth;
rc.top = 0;
rc.left = 0;
rc.right = GetSystemMetrics(SM_CXSCREEN);
rc.bottom = GetSystemMetrics(SM_CYSCREEN);
GetWindowRect(pabd->hWnd, &rcWindow);
iHeight = rcWindow.bottom - rcWindow.top;
iWidth = rcWindow.right - rcWindow.left;
switch (g_uSide)
{
case ABE_TOP:
rc.bottom = rc.top + iHeight;
break;
case ABE_BOTTOM:
rc.top = rc.bottom - iHeight;
break;
case ABE_LEFT:
rc.right = rc.left + iWidth;
break;
case ABE_RIGHT:
rc.left = rc.right - iWidth;
break;
}
AppBarQuerySetPos(g_uSide, &rc, pabd);
}