On 11/07/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
I have a small program which can be minimized to the tray.
Now I want to have an accelerator which fires to minimize the program to the
tray => this works fine.
But now I want to restore the window with an accelerator anytime.
It should work if I'm writing a text or in internet explorer or firefox ...
everytime.
is this possible?
how can I install the accelerator so that it can be activated?
Yes, it's possible, you'll find it discussed on this list if you
search for WM_HOTKEY or WM_SETHOTKEY (these are 2 slightly different
techniques.
I'll attach some code that shows the WM_SETHOTKEY method to this mail
- it doesn't quite meet your requirements, but it's close and can be
done with Win32::GUI alone. I'll follow-up with code that uses the
Win32 RegisterHotKey() function - I think it exactly meets what you
want to do, but needs Win32::API() to call the functions that are
missing from Win32::GUI.
Regards,
Rob.
#!perl -w
use strict;
use warnings;
# What this script does:
# Creates a Window, and a notify icon.
# Register a Hotkey (Ctrl-A) for the window.
# When the window is minimised, it is not hidden.
# Left-clicking on the notify icon, or pressing the
# Hotkey combination will Show the window again.
# In this example, we can't hide the window, as if we do, then
# I can't find a suitable hook into the message system to know
# when to show the window again.
use Win32::GUI 1.05 qw( CW_USEDEFAULT
WM_SETHOTKEY
VK_A
IDI_DEFAULTICON );
# Some constants missing from Win32::GUI::Constants
sub HOTKEYF_SHIFT() {0x01} # Shift key
sub HOTKEYF_CONTROL() {0x02} # Ctrl key
sub HOTKEYF_ALT() {0x04} # Alt key
sub HOTKEYF_EXT() {0x08} # Extended key (??)
my $mw = Win32::GUI::Window->new(
-title => 'HotKey demonstration',
-left => CW_USEDEFAULT,
-size => [400,300],
);
my $icon = Win32::GUI::Icon->new(IDI_DEFAULTICON);
$mw->AddNotifyIcon(
-icon => $icon,
-onClick => \&show_window,
);
set_hotkey($mw, VK_A, HOTKEYF_CONTROL);
$mw->Show();
Win32::GUI::Dialog();
sub show_window {
my ($win) = @_;
$win->Show();
return 0;
}
# Set the hotkey for a window (or replace it if this is called
# more than once)
sub set_hotkey {
my ($win, $key, $modifier) = @_;
# $win - any top level window
# $key - any virtual keycode (VK_*) Esc, TAB, SPACE and a few others.
# $modifier: any combination of the HOTKEYF_* constants (or 0 for
no modifier)
# Watch out. Despite what the MS documentation says the modifier
# goes in the upper byte of a short, not the upper WORD of a
# DWORD. I.e. the left shift is 8 bits, not 16 bits
my $wParam = ($modifier << 8) + $key;
# Set the hotkey for the window by sending a WM_SETHOTKEY
# message. If successful pressing the hokey combination
# results in a WM_SYSCOMMAND message being sent to the registered window
# with wParam equl to SC_HOTKEY. DefWindowProc process this by bringing
# the window to the foreground.
my $ret = $win->SendMessage(WM_SETHOTKEY, $wParam, 0);
if($ret == -1) {
die('set_hotkey() failed to register the hotkey - invalid hotkey');
}
elsif($ret == 0) {
die('set_hotkey() failed to register the hotkey - invalid window');
}
elsif($ret == 1) {
# success
}
elsif($ret == 2) {
warn('set_hotkey(): registered hotkey, but another window has the '.
"same hotkey.\nThe window activated by the hotkey will be".
"randomly selected\n");
}
else {
die('set_hotkey(): unexpected return value from WM_SETHOTKEY');
}
return;
}