2010-02-04 101 views

回答

1

這裏是我的方法與Windows XP和Delphi 2010,如果您使用的是版本的Delphi至極的不支持Unicode化妝舒爾你轉換讀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. 
4

該shell不提供檢查不屬於您的程序的通知圖標的功能。 (而且它沒有提供列舉甚至屬於你的程序的圖標的方式,你將會比已經知道這些。)

我用的是被劫持的部分或全部的圖標的程序和可選地將它們顯示在它自己的窗口中而不是在時鐘附近的區域中,所以它一定能夠獲得所有圖標的列表。 Mike Lin,是TraySaver。如果你想看看他的黑客是如何工作的,可以使用源代碼。

你也可以看看前面提到的關於controlling the position of icons in the notification area的問題的答案。

+0

我可以列舉的圖標中的字符串測試系統托盤 我可以枚舉應用程序(handle,pid,path) 我可以控制圖標的位置。 但我不能得到工具提示。那就是我想知道的。 –

+0

你可能會提到在這個問題中:「我可以枚舉這些圖標,但是我無法獲得工具提示,下面是我正在使用的代碼,請幫助填寫空白。你讀過我給你的第二個鏈接了嗎? –

+0

是的,我讀了第二個鏈接。 我可以控制通知區域中的圖標。但那是另一回事。 或多或少使用相同的代碼,我可以枚舉系統托盤中的圖標。 (從http://www.codeproject.com/KB/applications/ShellTrayInfo.aspx翻譯) 但我不能得到他們的工具提示。 –

2

你應該看看madshis組件集合的madKernal package。它有一些working with trayicons的接口。但請注意:

使用madKernel,您可以管理任何應用程序的托盤圖標(請參閱API「Shell_NotifyIcon」)。這種功能完全沒有記錄,但從win95到winXP運行良好。

ITrayIcon接口具有提示,圖標,位置等屬性。

相關問題