셸 알림 영역에 액세스하고 수정하는 것은 어렵지만 가능합니다. 먼저 최상위 창을 찾을 필요가 :
var
Wnd: HWND;
begin
Wnd := FindWindow('Shell_TrayWnd', nil);
if IsWindow(Wnd) then
EnumChildWindows(Wnd, @FindTrayWnd, 0);
end;
다음 트레이 알림 영역을 찾기 위해 아이를 열거 :
function FindTrayWnd(AWnd: HWND; AParam: LPARAM): BOOL; stdcall;
var
ClassName: string;
begin
SetLength(ClassName, 64);
SetLength(ClassName, GetClassName(AWnd, PChar(ClassName), 64));
Result := True;
if AnsiCompareText(ClassName, 'TrayNotifyWnd') = 0 then begin
EnumChildWindows(AWnd, @FindToolbar, 0);
Result := False;
end;
end;
다음 알림 아이콘 표준 Windows 도구 모음을 찾기 위해 아이를 열거합니다. Windows 메시지는 도구 모음 속성을 가져 오거나 설정하는 데 사용됩니다.
function FindToolbar(AWnd: HWND; AParam: LPARAM): BOOL; stdcall;
const
VMFLAGS = PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE;
var
ClassName: string;
i, ButtonCount: integer;
ProcessId, BytesRead: Cardinal;
ProcessHandle: THandle;
ExplorerButtonInfo: PTBButton;
ButtonInfo: array of TTBButton;
begin
SetLength(ClassName, 64);
SetLength(ClassName, GetClassName(AWnd, PChar(ClassName), 64));
if AnsiCompareText(ClassName, 'ToolbarWindow32') = 0 then begin
GetWindowThreadProcessId(AWnd, @ProcessId);
ProcessHandle := OpenProcess(VMFLAGS, FALSE, ProcessId);
ExplorerButtonInfo := VirtualAllocEx(ProcessHandle, nil, SizeOf(TTBButton),
MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
if ExplorerButtonInfo <> nil then try
ButtonCount := SendMessage(AWnd, TB_BUTTONCOUNT, 0, 0);
SetLength(ButtonInfo, ButtonCount);
for i := 0 to ButtonCount - 1 do begin
SendMessage(AWnd, TB_GETBUTTON, i, LPARAM(ExplorerButtonInfo));
ReadProcessMemory(ProcessHandle, ExplorerButtonInfo, @ButtonInfo[i],
SizeOf(TTBButton), BytesRead);
end;
// manipulate the button info, use WriteProcessMemory() and SendMessage()
// to repopulate the toolbar
finally
VirtualFreeEx(ProcessId, ExplorerButtonInfo, SizeOf(TTBButton),
MEM_RELEASE);
end;
Result := False;
end else
Result := True;
end;
당신은 버튼을 식별 할 수 있어야한다 : 툴바가 다른 프로세스에 살고 있기 때문에 당신은 (버튼의 텍스트 나 버튼 정보를 받고 같은) 어떤 종류의 버퍼를 포함하는 모든 메시지에 대한 ReadProcessMemory()
및 WriteProcessMemory()
를 고용 할 필요가 알림 아이콘의 이름을 클릭 한 다음 해당 버튼을 삭제하고 원하는 위치에 삽입하십시오. 모든 오류 처리가 생략되었지만 시작해야합니다.
Windows API에서 해결책을 찾을 수 없을 때마다 그럴만 한 이유가 있는지 여부를 묻는 것이 좋습니다. 정확한 일치는 아니지만 일반적인 아이디어는 http://blogs.msdn.com/oldnewthing/archive/2006/11/01/922449.aspx를 참조하십시오.어쩌면 트레이 아이콘이있는 여러 가지 이유를 다시 생각해 봐야 할 것입니다. 그리고 그 이유가 참으로 좋다면 좋은 아이콘을 제시하고 그 위치를 혼자 두십시오. – mghie
@mghie - 귀하가 제공 한 링크와 의견의 톤을 모두 유추하는 것이 아니라 사용자가 제어하는 설정을 도용하거나 침입하려고한다는 것을 암시하는 것입니다. 그건 사실이 아니야. * 사용자가 아이콘 위치를 제어 할 수 있도록하기 위해 노력하고 있는데, Windows (XP)가 직접 요청하지 않았기 때문에 아이콘 위치를 쉽게 제어 할 수있다. 다른 곳에서. – Jamo
@ Jamo : 미안 해요, 아무 것도 함축하지 않았습니다. Windows API는 거대하며 같은 목적을 달성하는 데 여러 가지 방법이 있습니다. 뭔가를 성취 할 준비가 된 방법이 없다면, 목적을 달성하지 못하는 것보다 더 자주 있습니다. 물론 사용자가 제어하는 설정에 개입하지 않아도됩니다. 고객이 제어 할 의도가없는 것을 제어하도록 요청할 수 있습니다. – mghie