2010-02-04 19 views
5

Tôi có thể liệt kê các ứng dụng (xử lý, pid, đường dẫn) với các biểu tượng trong vùng thông báo và tôi có thể kiểm soát vị trí của các biểu tượng, nhưng tôi không thể lấy được chú giải công cụ.Làm cách nào tôi có thể nhận được các chú giải công cụ của các biểu tượng khu vực thông báo?

Tôi có thể liệt kê các biểu tượng systray bao gồm các chú giải công cụ như thế nào?

Trả lời

1

Dưới đây là phương pháp của tôi thử nghiệm với Windows XP và delphi 2010 nếu bạn đang sử dụng một phiên bản của delphi Mà không hỗ trợ unicode làm shure bạn chuyển đổi các chuỗi đọc cho 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

Vỏ không cung cấp cơ sở để kiểm tra các biểu tượng thông báo không thuộc về chương trình của bạn. (Và nó cung cấp không có cách nào để liệt kê ngay cả các biểu tượng mà làm thuộc về chương trình của bạn; bạn sẽ được biết về những chương trình đó.)

Tôi đã từng sử dụng một chương trình chiếm đoạt một số hoặc tất cả các biểu tượng và tùy chọn hiển thị chúng trong cửa sổ riêng của nó thay vì ở khu vực gần đồng hồ, vì vậy nó phải có khả năng nhận được một danh sách tất cả các biểu tượng. Đó là TraySaver, bởi Mike Lin. Các nguồn có sẵn nếu bạn muốn xem làm thế nào hack của mình làm việc.

Bạn cũng có thể xem câu trả lời cho câu hỏi trước đã hỏi về controlling the position of icons in the notification area.

+0

tôi có thể liệt kê các biểu tượng trong systray Tôi có thể liệt kê các ứng dụng (xử lý, pid, đường dẫn) Tôi có thể kiểm soát vị trí của các biểu tượng. NHƯNG tôi không thể nhận được chú giải công cụ. Đó là những gì tôi muốn biết. –

+0

Bạn có thể đã đề cập rằng trong câu hỏi: "Tôi có thể liệt kê các biểu tượng, nhưng tôi không thể nhận được các chú giải công cụ. Đây là mã tôi đang sử dụng. Xin vui lòng giúp điền vào chỗ trống." Bạn đã đọc liên kết thứ hai tôi đã cung cấp cho bạn chưa? –

+0

Có, tôi đã đọc liên kết thứ hai. Tôi có thể kiểm soát các biểu tượng trong vùng thông báo. Nhưng nó là một câu chuyện khác. Sử dụng cùng một mã nhiều hơn hoặc ít hơn tôi có thể liệt kê các biểu tượng trong khay hệ thống. (bản dịch từ http://www.codeproject.com/KB/applications/ShellTrayInfo.aspx) Nhưng tôi không thể nhận được mẹo công cụ của họ. –

2

Bạn nên xem madKernal package bộ sưu tập thành phần madshis. Nó có một số giao diện cho working with trayicons. Tuy nhiên, hãy cẩn thận:

Với madKernel bạn có thể quản lý biểu tượng khay (xem API "Shell_NotifyIcon") của bất kỳ ứng dụng nào. Loại chức năng này hoàn toàn không có giấy tờ, nhưng hoạt động tốt từ win95 đến winXP.

Giao diện ITrayIcon có thuộc tính cho gợi ý, biểu tượng, vị trí và hơn thế nữa.