Windowsシステムで古いソフトウェアを識別し、ユーザーと対話して更新するプログラムを作成しました。Windows APIを使用して複数のバルーンを条件付きで表示する - Delphiのシステムトレイアイコン
システムトレイアイコンを表示し、システムにインストールされているアップデート/ソフトウェアの使用可能/ダウンロードに関するバルーンヒントを表示するソフトウェアアップデータプログラムがあります。
問題は、各タスクが処理しているときに複数のバルーンヒントを表示できないことです。このようなアップデートは、ソフトウェアのために利用可能であるとき、それはAn update for Software Name is available.
のようなバルーンを示すユーザーを忘れてはならないと、ユーザが再びシステムトレイにそれをダウンロードし、最小限にすることを選択したとき、バルーンヒントが再びしかしUpdates are downloading...Click to view the Progress of Downloads.
のようなものを示さなければならない、など私はシステムトレーアイコンを1つだけ使用してこれをどうやって行うことができるのかを知りたいですか?
フラグNIM_MODIFY
フラグをもう一度使用して、プログラムの現在の状態に応じてバルーンチップを変更できますか?
これについて検索したところ、いくつかの例が見つかりましたが、Visual StudioとC++では見つかりました。プログラムが実行されているとき、私は複数のヒントを表示しようとした方法です
:
unit MainForm-1;
...
const
NIF_INFO = $10;
NIF_MESSAGE = 1;
NIF_ICON = 2;
NOTIFYICON_VERSION = 3;
NIF_TIP = 4;
NIM_SETVERSION = $00000004;
NIM_SETFOCUS = $00000003;
NIIF_INFO = $00000001;
NIIF_WARNING = $00000002;
NIIF_ERROR = $00000003;
NIN_BALLOONSHOW = WM_USER + 2;
NIN_BALLOONHIDE = WM_USER + 3;
NIN_BALLOONTIMEOUT = WM_USER + 4;
NIN_BALLOONUSERCLICK = WM_USER + 5;
NIN_SELECT = WM_USER + 0;
NINF_KEY = $1;
NIN_KEYSELECT = NIN_SELECT or NINF_KEY;
TRAY_CALLBACK = WM_USER + $7258;
PNewNotifyIconData = ^TNewNotifyIconData;
TDUMMYUNIONNAME = record
case Integer of
0: (uTimeout: UINT);
1: (uVersion: UINT);
end;
TNewNotifyIconData = record
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: array [0..127] of Char;
dwState: DWORD;/
dwStateMask: DWORD;
szInfo: array [0..255] of Char;
DUMMYUNIONNAME: TDUMMYUNIONNAME;
szInfoTitle: array [0..63] of Char;
dwInfoFlags: DWORD;
end;
type
MainForm-1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
IconData: TNewNotifyIconData;
procedure SysTrayIconMessageHandler(var Msg: TMessage); message TRAY_CALLBACK;
procedure AddSysTrayIcon;
procedure ShowBalloonTips;
procedure DeleteSysTrayIcon;
public
end;
var
MainForm-1: TForm;
implementation
uses
ShellAPI...,.....,;
procedure MainForm-1.SysTrayIconMessageHandler(var Msg: TMessage);
begin
case Msg.lParam of
WM_MOUSEMOVE:;
WM_LBUTTONDOWN:;
WM_LBUTTONUP:;
WM_LBUTTONDBLCLK:;
WM_RBUTTONDOWN:;
WM_RBUTTONUP:;
WM_RBUTTONDBLCLK:;
NIN_BALLOONSHOW:;
NIN_BALLOONHIDE:;
NIN_BALLOONTIMEOUT:
NIN_BALLOONUSERCLICK:;
end;
end;
procedure MainForm-1.AddSysTrayIcon;
begin
IconData.cbSize := SizeOf(IconData);
IconData.Wnd := AllocateHWnd(SysTrayIconMessageHandler);
IconData.uID := 0;
IconData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
IconData.uCallbackMessage := TRAY_CALLBACK;
IconData.hIcon := Application.Icon.Handle;
IconData.szTip := 'Software Updater is running';
if not Shell_NotifyIcon(NIM_ADD, @IconData) then
ShowMessage('System Tray Icon cannot be created.');
end;
procedure MainForm-1.DisplayBalloonTips;
var
TipInfo, TipTitle: string;
begin
IconData.cbSize := SizeOf(IconData);
IconData.uFlags := NIF_INFO;
if ssHelperState = UpdatesAvailable then TipInfo := 'Updates are available to the programs installed on your Computer' + ' Click to see details.';
if ssHelperState = UpdatesDownloading then TipInfo := 'Updates are downloading in the background. Click to view the details.';
strPLCopy(IconData.szInfo, TipInfo, SizeOf(IconData.szInfo) - 1);
IconData.DUMMYUNIONNAME.uTimeout := 2500;
if ssHelperState = UpdatesAvailable then TipTitle := 'Updates are Available...';
if ssHelperState = UpdatesDownloading then TipTitle := 'Downloading the Updates...';
strPLCopy(IconData.szInfoTitle, TipTitle, SizeOf(IconData.szInfoTitle) - 1);
IconData.dwInfoFlags := NIIF_INFO;
Shell_NotifyIcon(NIM_MODIFY, @IconData);
{Following code is for testing purpose.}
IconData.DUMMYUNIONNAME.uVersion := NOTIFYICON_VERSION;
if not Shell_NotifyIcon(NIM_SETVERSION, @IconData) then
ShowMessage('Setting the Version is Failed.');
end;
procedure MainForm-1.DeleteSysTrayIcon;
begin
DeallocateHWnd(IconData.Wnd);
if not Shell_NotifyIcon(NIM_DELETE, @IconData) then
ShowMessage('Unable to delete System Tray Icon.');
end;
procedure MainForm-1.FormCreate(Sender: TObject);
begin
AddSysTrayIcon;
ShowBalloonTips;
end;
procedure MainForm-1.FormDestroy(Sender: TObject);
begin
DeleteSysTrayIcon;
end;
...
end.
しかし、これは失敗しているとプログラムがあるとき、私は何度も何度も同じバルーンヒント(第一)を得続けます実行中.......
NIN_BALLOONSHOW
とNIN_BALLOONHIDE
フラグを正しく使用する方法がわかりません。だから、あなたの重要な助けを進んでいただきありがとうございます。
を私が知っている 'NotifyIconData'の新しい構造体です。' szTip'や他のフィールドをクリアする方法を教えてください。私は今も自分のコードの他の部分をすべて追加しました。 – GTAVLover
'DUMMYUNIONNAME'は非常に便利で、システムトレイのアイコンのバルーンの表示時間を決めることができるので追加しました: – GTAVLover
' Shell_NotifyIcon() 'API全体を再宣言する必要はありませんバージョン管理機能を使用します。 'uVersion'フィールド(Delphi 2010で追加されました)が存在しない場合でも、Delphi 2009で使用することは可能です。私はこれを示すために私の答えを更新しました。 –