앞에서 강제로 종료된 어플리케이션의 트레이아이콘을 지우는 소스코드를 올렸는데
제가 착각하여 이미 오래전 부터 온라인상에서 떠돌던 소스코드를 그대로 올려 버렸네요.
말씀드린것 처럼 윈도우98에서나 통하지 Win7에서는 트레이아이콘 박스가 생기면서 부터 그 방법은 통하지 않습니다.
그래서 제가 약간 수정했습니다.
다시 올리니 참고하세요.
Procedure MouseMove(WinHandle : THandle);
Var
rec : TRect;
w,h : DWORD;
x,y : DWORD;
Begin
if WinHandle <> 0 then
begin
GetClientRect(WinHandle, rec);
w := DWORD(GetSystemMetrics(sm_cxsmicon));
h := DWORD(GetSystemMetrics(sm_cysmicon));
y := w shr 1;
while y < rec.Bottom do
begin
x := h shr 1;
while x < rec.Right do
begin
SendMessage(WinHandle, wm_mousemove, 0, y shl 16 or x);
x := x + w;
end;
y := y + h;
end;
end;
End;
procedure RemoveDeadIcons;
var
FSysTrayHandle, FSysTrayHandleEx: THandle;
TrayNotifyHandle, OSDependence: THandle;
begin
FSysTrayHandle := 0;
FSysTrayHandleEx := 0;
TrayNotifyHandle := FindWindow('Shell_TrayWnd', nil);
if TrayNotifyHandle = 0 then Exit;
MouseMove(TrayNotifyHandle);
TrayNotifyHandle := FindWindowEx(TrayNotifyHandle, 0, 'TrayNotifyWnd', nil);
if TrayNotifyHandle = 0 then Exit;
MouseMove(TrayNotifyHandle);
OSDependence := FindWindowEx(TrayNotifyHandle, 0, 'SysPager', nil);
if OSDependence = 0 then
OSDependence := TrayNotifyHandle;
MouseMove(OSDependence);
FSysTrayHandle := FindWindowEx(OSDependence, 0, 'ToolbarWindow32', nil);
MouseMove(FSysTrayHandle);
FSysTrayHandleEx := FindWindow('NotifyIconOverflowWindow', nil);
if FSysTrayHandleEx = 0 then Exit;
MouseMove(FSysTrayHandleEx);
FSysTrayHandleEx := FindWindowEx(FSysTrayHandleEx, 0, 'ToolbarWindow32', nil);
if TrayNotifyHandle = 0 then Exit;
MouseMove(FSysTrayHandleEx);
end; |