通知領域のアイコンでアプリケーション (ハンドル、pid、パス) を列挙でき、アイコンの位置を制御できますが、ツールチップを取得できません。
ツールチップを含む systray アイコンを列挙するにはどうすればよいですか?
通知領域のアイコンでアプリケーション (ハンドル、pid、パス) を列挙でき、アイコンの位置を制御できますが、ツールチップを取得できません。
ツールチップを含む systray アイコンを列挙するにはどうすればよいですか?
シェルには、プログラムに属していない通知アイコンを検査する機能はありません。(そして、それはあなたのプログラムに属するアイコンでさえ列挙する方法を提供しません;あなたはそれらについてすでに知っていることが期待されます。)
以前は、アイコンの一部またはすべてをハイジャックし、オプションで時計の近くではなく独自のウィンドウに表示するプログラムを使用していたため、すべてのアイコンのリストを取得できたはずです。それはマイク・リンによるトレイセーバーでした。彼のハックがどのように機能したかを確認したい場合は、ソースを利用できます。
また、通知領域のアイコンの位置を制御することについて尋ねた前の質問への回答を確認することもできます。
madshisコンポーネントコレクションのmadKernalパッケージを確認する必要があります。トレイアイコンを操作するためのいくつかのインターフェースがあります。ただし、注意してください。
madKernelを使用すると、任意のアプリケーションのトレイアイコン(API「Shell_NotifyIcon」を参照)を管理できます。この種の機能は完全に文書化されていませんが、win95からwinXPまでうまく機能します。
ITrayIconインターフェイスには、ヒント、アイコン、位置などのプロパティがあります。
Unicode をサポートしていないバージョンの Delphi を使用している場合は、Windows XP と Delphi 2010 でテストした私の方法を次に示します。読み取った文字列を ANSI に変換することを確認してください。
uses CommCtrl;
function TForm1.GetIconsCount: Integer;
begin
Result := SendMessage(FindTrayToolbar, TB_BUTTONCOUNT, 0, 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ListTips;
end;
function TForm1.FindTrayToolbar: HWND;
begin
Result := FindWindow('Shell_TrayWND', nil);
Result := FindWindowEx(Result, 0, 'TrayNotifyWnd', nil);
Result := FindWindowEx(Result, 0, 'SysPager', nil);
Result := FindWindowEx(Result, 0, 'ToolbarWindow32', nil);
end;
procedure TForm1.ListTips;
var
dwTray: DWORD;
wndTray: HWND;
hTray: THandle;
remoteTray: Pointer;
tdata: TTBBUTTON;
i: Integer;
btsread:DWORD;
str:Pchar;
begin
wndTray := FindTrayToolbar;
GetWindowThreadProcessId(wndTray, @dwTray);
hTray := OpenProcess(PROCESS_ALL_ACCESS, false, dwTray);
if hTray <> 0 then
begin
remoteTray := VirtualAllocEx(hTray, nil, Sizeof(tdata), MEM_COMMIT,
PAGE_READWRITE);
for i := 0 to GetIconsCount - 1 do
begin
SendMessage(FindTrayToolbar,TB_GETBUTTON,wparam(i),lparam(remotetray));
ReadProcessMemory(hTray,remotetray,@tdata,sizeof(tdata),btsread);
GetMem(str,255);
ReadProcessMemory(hTray,Ptr(tdata.iString),str,255,btsread);
ListBox1.Items.Add(str);
end;
end
else ShowMessage('Could not locate tray icons');
end;
end.