Hier mal meine Version vom Trayicon
QuoteTrayIcon mit Win32::GUI::NotifyIcon
Ich versuche hier in diesem Text zu erklären wie man per Win32::Gui ein TrayIcon erstellt.
Als erstes müssen sie ein Win32::Gui Hauptfenster erstellen. Den nur ein TrayIcon geht leider nicht. Dies rufen wir hiermit auf.
main = Win32::GUI::Window->new(-name => 'Main',
-text => 'Perl TrayIcon',
-width => 0,
-height => 0,
-visible => 0);
-name
Gibt die interne Bezeichnung für das Fenster an.
-text
Title des Fensters
-width
Breite des Fensters
-height
Höhe des Fensters
-visible
Mit 0 Unsichtbar und mit 1 Sichtbar
Als nächstes definieren wir was wir als Icon nutzen wollen
my $icon = new Win32::GUI::Icon('server.ICO');
Danach können wir das Icon aufrufen.
my $ni = $main->AddNotifyIcon(-name => "systray",
-id => $id,
-icon => $icon,
-tip => "tooltip");
-name
Gibt die interne Bezeichnung für das Fenster an.
-id
Eine eindeutige Bezeichnung für das NotifyIcon Objekt.
-icon
Hier wird der Icon angegeben den wir oben angelegt haben. Siehe &âmy $icon&â
-tip
Der Tooltip. Der angezeigt wird wenn man mit dem Mauszeiger darüber bleibt.
Wenn man jetzt noch Win32::GUI::Dialog(); im Script angibt ist es eigentlich schon benutzbar, hat aber noch keine Funktion. Hierfür hat NotifyIcon noch Events parat.
Click()
Wird ausgeführt wenn man mit der linken Maustaste draufdrückt.
RightClick()
Wird ausgeführt wenn man mit der rechten Maustaste draufdrückt.
Mouseevent()
Selber leider noch nicht genutzt. Soll aber auf bestimmt Mausereignisse reagieren können.
Ich werde hier nur RightClick erklären da ich dies am meisten genutzt habe und da es den anderen Events sehr ähnlich ist.
sub systray_RightClick
{
my $systray_menu = new Win32::GUI::Menu(
"SystrayMenu Functions" =>"SystrayMenu",
"> Info" => "Systray_info",
"> Dienst" =>"",
">> Starten" => "Systray_start",
">> Stoppen" => "Systray_stop",
">> Restart" => "Systray_restart",
">> Pausieren" => "Systray_pause",
"> Exit" => "SystrayExit"
);
my($x, $y) = Win32::GUI::GetCursorPos();
$main->TrackPopupMenu($systray_menu->{SystrayMenu}, $x, $y-50);
}
My $systray_menu&â¦
Erstellt ein Menü mit den unten angegebenen Menüpunkten
"> Info" => "Systray_info",
> bedeutet das es ein Hauptmenüpunkt ist. Und das hinter der => sagt aus welche Subroutine aufgerufen werden soll.
">> Starten" => "Systray_start",
>> bedeutet das es ein Untermenüpunkt ist.
my($x, $y) = Win32::GUI::GetCursorPos();
lieÃt aus wo sich der Mauszeiger gerade befindet.
$main->TrackPopupMenu($systray_menu->{SystrayMenu}, $x, $y-50);
Ãffnet das oben angelegte Menü.
So das wärs auch schon fast.
Jetzt noch ein kleines extra am Ende.
NotifyIcon hat nämlich leider einen kleien Bug. Wenn das Programm beendet wird, wird das Icon leider nicht gelöscht.
Dies kann man mit diesen beiden Subs abfangen.
sub Main_Terminate
{
Win32::GUI::NotifyIcon::Delete( $ni, -id => $id );
-1;
}
sub systray_Terminate
{
Win32::GUI::NotifyIcon::Delete( $ni, -id => $id );
-1;
}
Hier noch mal den ganzen Code zur Veranschaulichung.
use Win32::GUI;
use strict;
use warnings;
my $id = "1";
my $hwnd = GUI::GetPerlWindow(); GUI::Hide($hwnd);
my $icon = new Win32::GUI::Icon('server.ICO');
my $main = Win32::GUI::Window->new(-name => 'Main',
-text => 'Perl',
-width => 200,
-height => 200);
my $ni = $main->AddNotifyIcon(-name => "systray",
-id => $id,
-icon => $icon,
-tip => "Go Back!up");
Win32::GUI::Dialog();
Win32::GUI::Show($hwnd);
sub systray_RightClick
{
my $systray_menu = new Win32::GUI::Menu( "SystrayMenu Functions" => "SystrayMenu",
#"Go Back!up",
"> Info" => "Systray_info",
"> Dienst" =>"",
">> Starten" => "Systray_start",
">> Stoppen" => "Systray_stop",
">> Restart" => "Systray_restart",
">> Pausieren" => "Systray_pause",
"> Exit" => "SystrayExit"
);
my($x, $y) = Win32::GUI::GetCursorPos();
$main->TrackPopupMenu($systray_menu->{SystrayMenu}, $x, $y-50);
}
sub Main_Terminate
{
Win32::GUI::NotifyIcon::Delete( $ni, -id => $id );
-1;
}
sub systray_Terminate
{
Win32::GUI::NotifyIcon::Delete( $ni, -id => $id );
-1;
}
Wäre das was fürs Wiki? Oder nicht gut?\n\n
<!--EDIT|zipster|1114068033-->