使用SHAppBarMessage移动任务栏

时间:2010-12-05 03:33:27

标签: c++ windows winapi

我正在尝试使用带参数ABM_SETPOS的win32函数SHAppBarMessage()以编程方式移动MY任务栏。

我知道&遵循口头禅“始终让用户掌控”&我知道有人会说应用程序没有理由这样做。我正在学习win32&一段时间以来,这个问题一直是我的最佳选择。总是让我想要解决这个问题!如果有一个SHAppBarMessage函数,那么windows必须允许你移动任务栏。

您是否可以就如何让SHAppBarMessage将任务栏移到右侧提供建议?

下面的代码使用两种方法尝试将任务栏移动到屏幕的右边框。两种方法都失败了我开始认为,虽然我已经搜索过MSDN&amp ;,但是Windows 7可能不允许你移动任务栏。没有任何文件表明它已被折旧。

在尝试ABM_SETPOS之前,第一种方法遵循第一种使用ABM_QUERYPOS的礼貌标准,但这不会移动任务栏。

BOOL moveTaskBar( UINT pos, bool a )
{
// Post:

APPBARDATA barData;
RECT       barRect;
HWND       hTaskbar = FindWindow( "Shell_TrayWnd", NULL );

SetRect( &barRect, 1310, 10, 1350, 740 ); // These dimensions & coords are within my screens bounds so thats not a problem

barData.cbSize           =  sizeof(APPBARDATA);
barData.hWnd             =  hTaskbar;
barData.uCallbackMessage =  0;
barData.uEdge            =  pos;
barData.rc               =  barRect;
barData.lParam           = (LPARAM) FALSE;

BOOL fResult = (BOOL) SHAppBarMessage( ABM_QUERYPOS, &barData ); // Get system to verify & suggest position
fResult = (BOOL) SHAppBarMessage( ABM_SETPOS, &barData );        // Set position
fResult = (BOOL) SHAppBarMessage( ABM_WINDOWPOSCHANGED, &barData ); // Inform ??? that the taskbar pos has been changed

// Debugging
// fResult = (BOOL) SHAppBarMessage( ABM_ACTIVATE, &barData );
// fResult = (BOOL) SHAppBarMessage( ABM_GETTASKBARPOS, &barData );


return ( fResult == 0 );
}

我的第二种方法试图强制任务栏HWND移动到x,y位置,这是我不想做的事情,但我试图找到一种移动任务栏的方法,但无论如何这种方法也行不通。这让我觉得你无法在Windows 7中移动任务栏?

BOOL moveTaskBar( UINT pos )
{
// Post:

HWND       hTaskbar = FindWindow( "Shell_TrayWnd", NULL );

SetWindowPos(hTaskbar, NULL, barData.rc.left, barData.rc.top, barData.rc.right, barData.rc.bottom, SWP_NOSENDCHANGING);
ShowWindow(hTaskbar, SW_SHOW);

UpdateWindow(hTaskbar);

HWND hDesktopWindow = GetDesktopWindow();

RedrawWindow( hDesktopWindow, NULL, NULL, RDW_FRAME|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ALLCHILDREN );

SystemParametersInfo(SPI_SETWORKAREA, 0, NULL, SPIF_SENDCHANGE);

UpdateWindow(hDesktopWindow);

}

2 个答案:

答案 0 :(得分:2)

没有办法做到这一点,用户拥有该设置,而不是您的程序(我知道您可能是您自己程序的用户,但这就是原因)。

答案 1 :(得分:0)

这不是真的。您可以使用函数将任务栏注册到您在程序中创建的特定用户,然后将其移动