On 23/09/2007, Veli-Pekka Tätilä <[EMAIL PROTECTED]> wrote: > Hi, > Has anyone gotten the system wide RegisterHotkey and UnrEgister hotkey > Win32 functions working with Win32::GUI and Win32::API?
See here: http://www.mail-archive.com/[EMAIL PROTECTED]/msg05248.html Regards, Rob. > I just tried but > my event handler never gets called. Any help as to why this is would be > appreciated. I hope it's some quirk in my own code I just haven't > noticed. > > My understanding is this: > YOu call RegisterHotkey with a window handle via which virtual keycode > messages should be posted, a unique ID for that window handle to > distinguish multiple key handlers, a list of modifier keys that need to > be down and finally a virtual keycode to match for the posting to happen > in the first place. UnregisterHotkey is much the same except that only > the first two params are needed. > > The first problem I had was having to manually dig up constants like > MOD_WIN from winuser.h (VC2005 Express), it appears to be missing in the > listing in Win32::GUI::Constant. The second thing was that I couldn't > find a method of retrieving the Win32 handle from a Win32::GUI::Window > without having to look at its internals. Thirdly and finally, my event > handler is never called. This might either be some glich in importing > the functions, registering the hotkey handlers or adding event handling > hooks to Win32::GUI, which I've never done before. > > Here's the whole code, for your information. What it does is create a > dummy, currently visible window, register a hotkey handler for > shift+ctrl+q, and if that handler is triggered, then prints out the > params in the console: > > > use strict; use warnings; > > use constant {MOD_CONTROL => 2, MOD_SHIFT => 4}; # HOtkey modifiers from > winuser.h > > use constant qw|HOTKEY_ID 32|; # Almost any int will do. > > use Win32::GUI qw||; use Win32::GUI::Constants qw|WM_HOTKEY|; > use Win32::API; > > # Import the funcs use to register system wide hotkey notifications. > Win32::API->Import > ( > user32 => # target window, some id, modifiers, virtual key code. > 'BOOL RegisterHotKey(HWND w, int id, UINT mod, UINT vk)' > ); > > Win32::API->Import > ( > user32 => > 'BOOL UnregisterHotKey(HWND w, int id)' > ); > > my $win = Win32::GUI::Window->new > ( > -name => 'main', -text => 'main', -size => [320, 240], > -onTerminate => \&quit > ); > $win->Show(); > > > # Process the virtual key codes sent to us. > $win->Hook(WM_HOTKEY, \&key); > > # Register hotkey, for alphanumerics ASCIi code is virtual key code. > RegisterHotKey > ( > $win->{'-handle'}, HOTKEY_ID, > MOD_SHIFT | MOD_CONTROL, > ord 'q' > ) or die "HOtkey registration failed: $^E\n"; > > Win32::GUI::Dialog(); > > sub quit > { # Unregister hotkey handler and quit. > UnregisterHotKey($win->{'-handle'}, HOTKEY_ID) or die "Unregistration > failed: $^E\n"; > -1; > } # sub > > sub key > { # Just a debug print of the key postedd to us. > print "Key with params: @_\n"; > 1 > } # sub > > Finally, a cool solution to the hotkey problem and many other uses, in > which hooks are desired would be this: > > Create a DLL in C which does the actual hooking and is somewhat > customizable in terms of what it posts back to its user i.e. functions > to specify how to match params and which window receives the message. > > Post the desired data to a window registered with the DLL using > WM_COPYMESSAGE. > Then use Win32::API to wrap that DLL and have a possibly invisible > Win32::GUI::Window receive the things that were hooked. > > Even better would be a Perl module which encapsulates having to create > the window and wrap the DLL. > > There are plenty of code examples for hooks in the code project. > Googling for Win32 hooks produces some nice links, for instance. I've > used hooks a bit in screen reading but the code is way too ugly to be > published, <smile>. And for screen reading, Win32::ActAcc is infinitely > better. > > > -- > With kind regards Veli-Pekka Tätilä ([EMAIL PROTECTED]) > Accessibility, game music, synthesizers and programming: > http://www.student.oulu.fi/~vtatila > _______________________________________________ > Perl-Win32-Users mailing list > [email protected] > To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs > -- Please update your address book with my new email address: [EMAIL PROTECTED] _______________________________________________ Perl-Win32-Users mailing list [email protected] To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs
