2016-05-14 56 views
0

我想确定Windows任务栏(系统托盘?)停靠在哪一侧 - 因此我可以将弹出窗口放置在任务栏上方/下方/左侧/右侧。检索任务栏停靠位置:结果不正确

我使用SHAppBarMessage(ABM_QUERYPOS, &barData)来获取这些信息,但是当我的任务栏是ABE_TOP时,我总是会返回ABE_LEFT

怎么回事?也许我不能使用该功能来确定它?也许我的APPBARDATA params是错误的?

APPBARDATA barData; 
barData.cbSize = sizeof(APPBARDATA); 
barData.hWnd = FindWindow("Shell_TrayWnd", NULL); 
barData.uCallbackMessage = 0; 
//barData.uEdge = ABE_LEFT; 
//barData.rc = RECT{0,0300,300}; 
barData.lParam = (LPARAM)FALSE; 

SHAppBarMessage(ABM_QUERYPOS, &barData); 

// barData.uEdge always equals ABE_LEFT 
+2

您没有检查任何一个API调用的返回值。你怎么知道'FindWindow'返回一个有效的HWND,或'SHAppBarMessage'是否成功?您发布的代码与轮盘代码相当:*我会把它扔到那里,也许它可以工作,或者它不会。*您应该**总是**检查API调用的返回值,并阅读该文档找出那些返回值的含义以及如何找到更多信息。 –

+0

另一个最佳实践是在将它传递给Win32 API调用之前,用memset将结构清零。但我确定这不是你的问题 – kcraigie

+0

如果只是要求显示器的工作区 –

回答

0

看起来我正在使用错误的标志。以下工作:

APPBARDATA barData {0}; 
barData.cbSize = sizeof(APPBARDATA); 
UINT_PTR res = SHAppBarMessage(ABM_GETTASKBARPOS, &barData); 
+0

如果有多个显示器怎么办? –