Gus*_*eno 11 icons windows-explorer system-tray systray
这个问题困扰了我很长一段时间,这真的很烦人.
每次我在重新启动/重启后登录时,资源管理器都需要一些时间才能显示.我已经采取了等待所有服务启动然后我登录的步骤,但它没有任何区别.结果始终相同:即使应用程序已启动,某些图标也不会显示.
我已经挖了一些代码,让一个应用程序"粘贴"在那里的一个图标,但是有一个API调用可以执行,所以资源管理器重新读取所有图标信息?像无效或重绘或类似的东西?
显然,看起来乔恩是对的,这是不可能做到的.
我遵循了Bob Dizzle和Mark Ransom代码并构建了这个(Delphi Code):
procedure Refresh;
var
hSysTray: THandle;
begin
hSysTray := GetSystrayHandle;
SendMessage(hSysTray, WM_PAINT, 0, 0);
end;
function GetSystrayHandle: THandle;
var
hTray, hNotify, hSysPager: THandle;
begin
hTray := FindWindow('Shell_TrayWnd', '');
if hTray = 0 then
begin
Result := hTray;
exit;
end;
hNotify := FindWindowEx(hTray, 0, 'TrayNotifyWnd', '');
if hNotify = 0 then
begin
Result := hNotify;
exit;
end;
hSyspager := FindWindowEx(hNotify, 0, 'SysPager', '');
if hSyspager = 0 then
begin
Result := hSyspager;
exit;
end;
Result := FindWindowEx(hSysPager, 0, 'ToolbarWindow32', 'Notification Area');
end;
Run Code Online (Sandbox Code Playgroud)
但无济于事.
我甚至尝试过
InvalidateRect()
Run Code Online (Sandbox Code Playgroud) 仍然没有显示.
还有其他建议吗?
Lou*_*vis 11
看一下这篇博客文章:刷新TASKBAR通知区域.我正在使用此代码刷新系统托盘以摆脱孤立的图标,它的工作完美.博客文章内容非常丰富,并对作者发现他的解决方案所采取的步骤进行了很好的解释.
#define FW(x,y) FindWindowEx(x, NULL, y, L"")
void RefreshTaskbarNotificationArea()
{
HWND hNotificationArea;
RECT r;
GetClientRect(
hNotificationArea = FindWindowEx(
FW(FW(FW(NULL, L"Shell_TrayWnd"), L"TrayNotifyWnd"), L"SysPager"),
NULL,
L"ToolbarWindow32",
// L"Notification Area"), // Windows XP
L"User Promoted Notification Area"), // Windows 7 and up
&r);
for (LONG x = 0; x < r.right; x += 5)
for (LONG y = 0; y < r.bottom; y += 5)
SendMessage(
hNotificationArea,
WM_MOUSEMOVE,
0,
(y << 16) + x);
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*her 11
在Windows 7或Windows 8上使用路易斯答案(来自刷新TASKBAR通知区域)的任何人的两个重要细节:
首先,正如答案所反映的那样,XP中标题为"通知区域"的窗口现在在Windows 7(实际上可能是Vista)中标题为"用户升级通知区域".
其次,此代码不会清除当前隐藏的图标.这些包含在一个单独的窗口中.使用原始代码刷新可见图标,使用以下内容刷新隐藏图标.
//Hidden icons
GetClientRect(
hNotificationArea = FindWindowEx(
FW(NULL, L"NotifyIconOverflowWindow"),
NULL,
L"ToolbarWindow32",
L"Overflow Notification Area"),
&r);
for (LONG x = 0; x < r.right; x += 5)
for (LONG y = 0; y < r.bottom; y += 5)
SendMessage(
hNotificationArea,
WM_MOUSEMOVE,
0,
(y << 16) + x);
Run Code Online (Sandbox Code Playgroud)
对于只需要一个实用程序来运行来完成此任务而不是代码的任何人,我使用此更新构建了一个简单的exe:刷新通知区域