From: Waldemar B. <wb...@sa...> - 2007-01-18 16:16:25
Attachments:
test_kbd.pl
|
Hello! Maybe you could me help? I have the code (read later please). What is my problem? The aim of the program is to catch keyboard events and write them into string named $_EVENT. However it works different in WindowsXP (correctly I think) and in Windows98 (wrong). It can be seen in console printouts on the both systems. In windows 98 I notice the application with this "catching" stops with errors which point to Dialog function. In Windows XP everything is allright. cheers Waldemar =============================================================================================== #!/usr/bin/perl -w use strict; use Win32::GUI qw(); my $_EVENT = ''; my $Window = new Win32::GUI::Window ( -name => "Window", -pos => [0,0], -size => [200,100], -onResize => sub { my ($self) = @_; my ($width,$height) = ($self->GetClientRect())[2..3]; $self->Pole->Resize($width+1, $height+1) if exists $self->{Pole};}, -onKeyDown => \&keydown, -onTerminate => sub { return -1 }, ); $Window->AddTextfield( -name => "Pole", -pos => [0,0], -size => [800,600], -onKeyDown => \&keydown, ); $Window->Pole->Text(""); $Window->Pole->Append("Exit = Alt+F4"); $Window->Pole->SetFocus(); $Window->Show(); Win32::GUI::Dialog(); ########################################################################## #--------------------------------------------- sub keydown { my ( $self, undef, $key ) = @_; my $hash_EVENT = Win32::GUI::GetKeyboardState; $_EVENT = what_event( $hash_EVENT ); print $_EVENT,"|\n"; return 1; } #--------------------------------------------- sub what_event { my $_EVENT = shift; my $result = ''; my $SHIFT = ''; my $CTRL = ''; my $ALT = ''; if (( $_EVENT->[160] )||( $_EVENT->[161] )) { $SHIFT = 'Shift' } if (( $_EVENT->[162] )||( $_EVENT->[163] )) { $CTRL = 'Ctrl' } if (( $_EVENT->[164] )||( $_EVENT->[165] )) { $ALT = 'Alt' } if (( $_EVENT->[16] )) { $SHIFT = 'Shift' } if (( $_EVENT->[17] )) { $CTRL = 'Ctrl' } if (( $_EVENT->[18] )) { $ALT = 'Alt' } for ( my $i = 0; $i < 256; $i++ ) { if ( $_EVENT->[$i] ) { print $i,'|'; if ( $i == 0 ) { $result .= 'Null' } elsif ( $i == 8 ) { $result = 'Backspace' } elsif ( $i == 9 ) { $result = $CTRL.$SHIFT.'Tab' } elsif ( $i == 13 ) { $result = $CTRL.$SHIFT.'Enter' } elsif ( $i == 27 ) { $result = $CTRL.$SHIFT.'Escape' } elsif ( $i == 33 ) { $result = $CTRL.$SHIFT.'PgUp' } elsif ( $i == 34 ) { $result = $CTRL.$SHIFT.'PgDn' } elsif ( $i == 36 ) { $result = $CTRL.$SHIFT.'Home' } elsif ( $i == 35 ) { $result = $CTRL.$SHIFT.'End' } elsif ( $i == 38 ) { $result = $CTRL.$SHIFT.'Up' } elsif ( $i == 37 ) { $result = $CTRL.$SHIFT.'Left' } elsif ( $i == 39 ) { $result = $CTRL.$SHIFT.'Right' } elsif ( $i == 40 ) { $result = $CTRL.$SHIFT.'Down' } elsif ( $i == 45 ) { $result = $CTRL.$SHIFT.'Insert' } elsif ( $i == 46 ) { $result = $CTRL.$SHIFT.'Delete' } elsif (( 47 < $i )&&( $i < 58 )) { $result = $CTRL.$SHIFT.chr( $i ) } elsif (( 64 < $i )&&( $i < 91 )) { my $shift = 0; $shift = 32 if (( $SHIFT eq 'Shift' )||( $CTRL eq 'Ctrl' )); $result = $CTRL.$ALT.chr( $i + 32 - $shift ) } elsif (( 111 < $i )&&( $i < 124 )) { $result = $ALT.$CTRL.$SHIFT.'F'.($i-111); } else { if (( $i != 160 )&&( $i != 161 )&&( $i != 16 )&& ( $i != 162 )&&( $i != 163 )&&( $i != 17 )&& ( $i != 164 )&&( $i != 165 )&&( $i != 18 )) { } } } } return $result; } =============================================================================================== |
From: Robert M. <rm...@po...> - 2007-01-18 20:09:26
|
Waldemar Biernacki wrote: > Hello! > > Maybe you could me help? > > I have the code (read later please). What is my problem? I don't know. > The aim of the program is to catch keyboard events and write them into string > named $_EVENT. However it works different in WindowsXP (correctly I think) > and in Windows98 (wrong). It can be seen in console printouts on the both > systems. I don't have both systems. What is different between them? > In windows 98 I notice the application with this "catching" stops with errors > which point to Dialog function. In Windows XP everything is allright. What errors? What version of perl? What version of Win32::GUI? The code you posted appears to work OK for me on both Win98 and Win2k (i.e. it does what I would expect it to) - but as I don't know what I am looking for I may be missing your point. Regards, Rob. |
From: Waldemar B. <wb...@sa...> - 2007-01-18 22:28:28
|
Robert May wrote: > I don't have both systems. What is different between them? The problem is that one perl script gives different outputs on different Windows versions: XP and 98(SE). Both systems have Perl 5.8.817 (ActiveState) and Win32-GUI 1.05 (installed from ppd). I rewrote the console outputs from both systems (after perl application started then I pressed 5 keys Down,a,Right,a,Up): in Windows XP (SP1): ================= c:\apps\test_kbd.pl 40|Down 65|a 39|Right 65|a 38|Up ================= and this is repeatable each time: ================= c:\apps\test_kbd.pl 40|Down 65|a 39|Right 65|a 38|Up ================= and any time I start the program it works the same. ------------------------------------------------------- However on Windows 98 (SE) when I start the program on the system which is just started then at the first time I have the same as in XP: ================= c:\apps\test_kbd.pl 40|Down 65|a 39|Right 65|a 38|Up ================= but at second and next times I have the following output: ================= c:\apps\test_kbd.pl 40|115|F4 65|115|F4 39|115|F4 65|115|F4 38|115|F4 ================= and it is repeatable. Is my problem clearer for you? I can add that this effect I've got on "true" machine with Windows 98 but also on vmware machine emulation. Any suggestions? wb |
From: Robert M. <rm...@po...> - 2007-01-19 19:58:40
|
Waldemar Biernacki wrote: > Robert May wrote: >> I don't have both systems. What is different between them? > The problem is that one perl script gives different outputs on different > Windows versions: XP and 98(SE). > Both systems have Perl 5.8.817 (ActiveState) and Win32-GUI 1.05 > (installed from ppd). > I rewrote the console outputs from both systems (after perl application > started then > I pressed 5 keys Down,a,Right,a,Up): [snip] > ------------------------------------------------------- > However on Windows 98 (SE) when I start the program on the system which > is just started then at the first time > I have the same as in XP: > but at second and next times I have the following output: > ================= > c:\apps\test_kbd.pl > 40|115|F4 > 65|115|F4 > 39|115|F4 > 65|115|F4 > 38|115|F4 > ================= > and it is repeatable. > > Is my problem clearer for you? Much clearer. You omitted that it only happens after you exit the application using Alt+F4 - you can run it successfully as many times as you want if you exit using the mouse. I can repeat this on Win98. I've not looked into it very hard, and can't explain why GetKeyboardState() is saying that the F4 key is pressed when it is not - GetKeyState(VK_F4) shows the same behaviour too. I'm going to put this down to a Win98 problem - it happens even if I start notepad, exit notepad using Alt+F4 and then run the script. Regards, Rob. |
From: Waldemar B. <wb...@sa...> - 2007-01-19 08:01:56
|
I think that in Win32::GUI there is a bug. When you start the code attached at the end of the mail then you can see that: 1. key F10 does not work. The same is in WinXP and in Win98. 2. When I did similar program for Win32-Console package it work correctly. 3. The F10 key behavior is funny: it works as a switcher for other Fxx keys but not for other keys. When I press the F10 key 1,3,... (odd number) times then other Fxx keys don't work. I use Perl 5.8.817 - Activestate, Win32-GUI 1.05 I've checked it also with 1.03 version of Win32-GUI - the same result ----------- It could seem that it is not important problem. In the case of WinXP the problem is not big in fact. Only F10 doesn't work and application works smoothly. However on Windows98 there is quite serious problem; because the keyboard answer is unstable and unpredictible I am facing against the problem: Is the problem of Windows or Perl itself? No! Other software, like Win32-Console works properly. Is it solution to the problem. ############################################### #!/usr/bin/perl -w use strict; use warnings; use Win32::GUI qw(); my $Window = new Win32::GUI::Window ( -name => "Window", -pos => [0,0], -size => [200,100], -onTerminate => sub { return -1 }, ); $Window->AddTextfield( -name => "Pole", -pos => [0,0], -size => [800,600], -onKeyDown => \&keydown, ); $Window->Pole->Text("Exit = Alt+F4"); $Window->Pole->SetFocus(); $Window->Show(); Win32::GUI::Dialog(); exit(1); #----------------------------------------- sub keydown { my $hasz = Win32::GUI::GetKeyboardState(); for ( my $i = 0; $i < 256; $i++ ) { print $i,'|' if $hasz->[$i] } print "\n"; return 1; } ############################################### |
From: Robert M. <rm...@po...> - 2007-01-19 20:51:29
|
Waldemar Biernacki wrote: > I think that in Win32::GUI there is a bug. I don't :-) I think you are missing some of the subtleties of windows GUI programming. > When you start the code attached at the end of the mail then you can see > that: > > 1. key F10 does not work. The same is in WinXP and in Win98. That depends what you mean by 'does not work'. F10 is a system-wide accelerator, used to move focus to the menu bar of a window. It never generates a WM_KEYDOWN message (which is what -onKeyDown hooks), but generates WM_SYSKEYDOWN message instead. Alt does the same, as does any Alt+CHAR. > 2. When I did similar program for Win32-Console package it work correctly. The Console and Windows subsystems are very different when it comes to processing key strokes. > 3. The F10 key behavior is funny: it works as a switcher for other Fxx > keys but not for other keys. After pressing F10, when you press a letter key don't you get a beep the first time, and then all keys start working again? > When I press the F10 key 1,3,... (odd number) times then other Fxx keys > don't work. If you add a menu to the window, I think it becomes a bit more obvious (code below). Watch the focus move the the menu bar when you press and release the F10 key. > ----------- > It could seem that it is not important problem. In the case of WinXP the > problem is not big in fact. > Only F10 doesn't work and application works smoothly. > However on Windows98 there is quite serious problem; because the > keyboard answer > is unstable and unpredictible I am facing against the problem: > Is the problem of Windows or Perl itself? If you are referring to the Alt+_F4 problem in your previous mail, then I think it is a Win98 problem. Regards, Rob. #!perl -w use strict; use warnings; use Win32::GUI qw(VK_SHIFT VK_CONTROL VK_MENU); my $menu = Win32::GUI::Menu->new( "File" => "File", ">Exit" => { -name => "Exit", -onClick => sub {-1}, }, ); my $Window = new Win32::GUI::Window ( -size => [200,100], -onKeyDown => \&keydown, -menu => $menu, ); $Window->Show(); Win32::GUI::Dialog(); $Window->Hide(); exit(1); #----------------------------------------- sub keydown { my ($self, $ext, $vkey) = @_; # I'm not interested in seeing the modifier # keys on thier own: return 1 if($vkey == VK_SHIFT or $vkey == VK_CONTROL or $vkey == VK_MENU); print "(virtual) key just pressed: $vkey (" . decode_vk($vkey) . ")\n"; my $modifiers = ""; $modifiers .= "Shift, " if Win32::GUI::GetKeyState(VK_SHIFT); $modifiers .= "Alt, " if Win32::GUI::GetKeyState(VK_MENU); $modifiers .= "Ctrl, " if Win32::GUI::GetKeyState(VK_CONTROL); $modifiers = substr $modifiers, 0, -2; print "modifiers: $modifiers\n"; my $kbd_ref = Win32::GUI::GetKeyboardState(); my $wanted = ""; my $count = 0; for (0 .. 255) { if ($kbd_ref->[$_]) { $wanted .= "$_(".decode_vk($_).")|" ; ++$count; } } $wanted = substr $wanted, 0, -1; print "$count depressed (virtual) keys: $wanted\n\n"; return 1; } #----------------------------------------- my %vk_to_string; sub decode_vk { return $vk_to_string{shift()}; } BEGIN { %vk_to_string = ( 1 => "VK_LBUTTON", 2 => "VK_RBUTTON", 3 => "VK_CANCEL", 4 => "VK_MBUTTON", 5 => "VK_XBUTTON1", 6 => "VK_XBUTTON2", 8 => "VK_BACK", 9 => "VK_TAB", 12 => "VK_CLEAR", 13 => "VK_RETURN", 16 => "VK_SHIFT", 17 => "VK_CONTROL", 18 => "VK_MENU", 19 => "VK_PAUSE", 20 => "VK_CAPITAL", 21 => "VK_HANGEUL", 23 => "VK_JUNJA", 24 => "VK_FINAL", 25 => "VK_KANJI", 27 => "VK_ESCAPE", 28 => "VK_CONVERT", 29 => "VK_NONCONVERT", 30 => "VK_ACCEPT", 31 => "VK_MODECHANGE", 32 => "VK_SPACE", 33 => "VK_PRIOR", 34 => "VK_NEXT", 35 => "VK_END", 36 => "VK_HOME", 37 => "VK_LEFT", 38 => "VK_UP", 39 => "VK_RIGHT", 40 => "VK_DOWN", 41 => "VK_SELECT", 42 => "VK_PRINT", 43 => "VK_EXECUTE", 44 => "VK_SNAPSHOT", 45 => "VK_INSERT", 46 => "VK_DELETE", 47 => "VK_HELP", 48 => "VK_0", 49 => "VK_1", 50 => "VK_2", 51 => "VK_3", 52 => "VK_4", 53 => "VK_5", 54 => "VK_6", 55 => "VK_7", 56 => "VK_8", 57 => "VK_9", 65 => "VK_A", 66 => "VK_B", 67 => "VK_C", 68 => "VK_D", 69 => "VK_E", 70 => "VK_F", 71 => "VK_G", 72 => "VK_H", 73 => "VK_I", 74 => "VK_J", 75 => "VK_K", 76 => "VK_L", 77 => "VK_M", 78 => "VK_N", 79 => "VK_O", 80 => "VK_P", 81 => "VK_Q", 82 => "VK_R", 83 => "VK_S", 84 => "VK_T", 85 => "VK_U", 86 => "VK_V", 87 => "VK_W", 88 => "VK_X", 89 => "VK_Y", 90 => "VK_Z", 91 => "VK_LWIN", 92 => "VK_RWIN", 93 => "VK_APPS", 95 => "VK_SLEEP", 96 => "VK_NUMPAD0", 97 => "VK_NUMPAD1", 98 => "VK_NUMPAD2", 99 => "VK_NUMPAD3", 100 => "VK_NUMPAD4", 101 => "VK_NUMPAD5", 102 => "VK_NUMPAD6", 103 => "VK_NUMPAD7", 104 => "VK_NUMPAD8", 105 => "VK_NUMPAD9", 106 => "VK_MULTIPLY", 107 => "VK_ADD", 108 => "VK_SEPARATOR", 109 => "VK_SUBTRACT", 110 => "VK_DECIMAL", 111 => "VK_DIVIDE", 112 => "VK_F1", 113 => "VK_F2", 114 => "VK_F3", 115 => "VK_F4", 116 => "VK_F5", 117 => "VK_F6", 118 => "VK_F7", 119 => "VK_F8", 120 => "VK_F9", 121 => "VK_F10", 122 => "VK_F11", 123 => "VK_F12", 124 => "VK_F13", 125 => "VK_F14", 126 => "VK_F15", 127 => "VK_F16", 128 => "VK_F17", 129 => "VK_F18", 130 => "VK_F19", 131 => "VK_F20", 132 => "VK_F21", 133 => "VK_F22", 134 => "VK_F23", 135 => "VK_F24", 144 => "VK_NUMLOCK", 145 => "VK_SCROLL", 146 => "VK_OEM_FJ_JISHO", 147 => "VK_OEM_FJ_MASSHOU", 148 => "VK_OEM_FJ_TOUROKU", 149 => "VK_OEM_FJ_LOYA", 150 => "VK_OEM_FJ_ROYA", 160 => "VK_LSHIFT", 161 => "VK_RSHIFT", 162 => "VK_LCONTROL", 163 => "VK_RCONTROL", 164 => "VK_LMENU", 165 => "VK_RMENU", 166 => "VK_BROWSER_BACK", 167 => "VK_BROWSER_FORWARD", 168 => "VK_BROWSER_REFRESH", 169 => "VK_BROWSER_STOP", 170 => "VK_BROWSER_SEARCH", 171 => "VK_BROWSER_FAVORITES", 172 => "VK_BROWSER_HOME", 173 => "VK_VOLUME_MUTE", 174 => "VK_VOLUME_DOWN", 175 => "VK_VOLUME_UP", 176 => "VK_MEDIA_NEXT_TRACK", 177 => "VK_MEDIA_PREV_TRACK", 178 => "VK_MEDIA_STOP", 179 => "VK_MEDIA_PLAY_PAUSE", 180 => "VK_LAUNCH_MAIL", 181 => "VK_LAUNCH_MEDIA_SELECT", 182 => "VK_LAUNCH_APP1", 183 => "VK_LAUNCH_APP2", 186 => "VK_OEM_1", 187 => "VK_OEM_PLUS", 188 => "VK_OEM_COMMA", 189 => "VK_OEM_MINUS", 190 => "VK_OEM_PERIOD", 191 => "VK_OEM_2", 192 => "VK_OEM_3", 219 => "VK_OEM_4", 220 => "VK_OEM_5", 221 => "VK_OEM_6", 222 => "VK_OEM_7", 223 => "VK_OEM_8", 225 => "VK_OEM_AX", 226 => "VK_OEM_102", 227 => "VK_ICO_HELP", 228 => "VK_ICO_00", 229 => "VK_PROCESSKEY", 230 => "VK_ICO_CLEAR", 231 => "VK_PACKET", 233 => "VK_OEM_RESET", 234 => "VK_OEM_JUMP", 235 => "VK_OEM_PA1", 236 => "VK_OEM_PA2", 237 => "VK_OEM_PA3", 238 => "VK_OEM_WSCTRL", 239 => "VK_OEM_CUSEL", 240 => "VK_OEM_ATTN", 241 => "VK_OEM_FINISH", 242 => "VK_OEM_COPY", 243 => "VK_OEM_AUTO", 244 => "VK_OEM_ENLW", 245 => "VK_OEM_BACKTAB", 246 => "VK_ATTN", 247 => "VK_CRSEL", 248 => "VK_EXSEL", 249 => "VK_EREOF", 250 => "VK_PLAY", 251 => "VK_ZOOM", 252 => "VK_NONAME", 253 => "VK_PA1", 254 => "VK_OEM_CLEAR", ); } #BEGIN __END__ |
From: Waldemar B. <wb...@sa...> - 2007-01-19 22:56:31
|
Robert! Thank you for your explanation. > I don't :-) I think you are missing some of the subtleties of windows > GUI programming. I have to admit... > That depends what you mean by 'does not work'. I agree, it does work. > If you add a menu to the window, I think it becomes a bit more obvious > (code below). Watch the focus move the the menu bar when you press and > release the F10 key. I've seen it. > If you are referring to the Alt+_F4 problem in your previous mail, > then I think it is a Win98 problem. Thank you for all. Waldemar |
From: Waldemar B. <wb...@sa...> - 2007-02-05 10:20:38
|
Robert, thank you for your efforts and email, I'll try my best to clarify... The idea is to create and manage many windows. The clue is that I do not know how many of them can be created. To open new window we use Right key, to close Left and to switch between windows Enter. I was working on it and - when I had changed destroying window to hiding them everything was OK. However I hope to destroy them because of the fact I don't know how many of them I have to create. >> The point is that in WindowsXP it works fine but in Widows 98 SP2 it >> does not. >> Windows' error screen points to USER32.DLL error. > What is the error that you get? It apears small window with the following information (in my translation): PERL couse an error: incorrect page in the module USER32.DLL at 0167:bff558c6. Registry: EAX=00000001 CS=0167 EIP=bff558c6 EFLGS=00010202 EBX=00000100 SS=016f ESP=0153f998 EBP=0153fa10 ECX=00000d1c DS=016f ESI=02c761ec FS=0d2f EDX=01554280 ES=016f EDI=0155424c GS=0000 Bytes in CS:EIP: 66 81 39 90 68 75 25 66 81 79 06 90 68 75 1d 81 Stos: 02ba4a51 00000d1c 000006a0 00000100 00000025 014b0001 0155424c 02c761ec 00000000 04427695 16d717c7 000089f4 61ec0038 000002c7 89e60e17 17c71248 > If you can post a smaller, complete example showing your problem, and > removing all the stuff that is not necessary, then I will help you try > to identify the problem. I enclose new refreshed code at the end Waldemar ############################################################ #! perl -w use strict; use Win32::GUI qw(); my $last = -1; my @Window; my @start = (0); my @rows = (5); my $which = 0; my $help; makewindow(); Win32::GUI::Dialog(); exit(1); sub Window_Terminate { return -1 } sub makewindow { return 1 if $last > 3; $last++; $start[$last] = 0; $rows[$last] = 5+$last; $Window[$last]->{SCREEN} = new Win32::GUI::Window ( -title => "Item: $last", -pos => [10+$last*202, 20], -size => [200, 200], -name => "Window_$last", -onKeyDown => \&keydown, ); if ( $last == 0 ) { $Window[$last]->{HELP} = $Window[$last]->{SCREEN}->AddLabel( -parent => $Window[$last]->{SCREEN}, -pos=>[4,20], -size=>[150,150], -text=>"HELP:\n\n Right=add window\n Left=close (only top) window\n Enter=switch between windows\n", -multiline=>1, ) } $Window[$last]->{SCREEN}->Show(1); print "item $last created\n"; $which = $last; } sub keydown { my ( $self, undef, $key ) = @_; my $hash_EVENT = Win32::GUI::GetKeyboardState; if ( $hash_EVENT->[39] ) { makewindow(); } elsif ( $hash_EVENT->[13] ) { if ( $which == $last ) { $which = 0 } else { $which++ } $Window[$which]->{SCREEN}->SetFocus(); } elsif ( $hash_EVENT->[37] ) { if (( $which == $last )&&( $last>0)) { print "item $last deleted\n"; $Window[$which]->{SCREEN}->DESTROY if $Window[$which]->{SCREEN}; $last--; $which--; $Window[$which]->{SCREEN}->SetFocus(); } elsif ( $last == 0 ) { print "item $last deleted\n"; return -1; } } return 1; } ############################################################ |
From: Robert M. <rm...@po...> - 2007-02-08 22:05:54
|
Waldemar Biernacki wrote: > Robert, > > thank you for your efforts and email, I'll try my best to clarify... Thank you. I can see the problem clearly. It's because you're destroying a window while in the middle of processing an event sent to it, and the code isn't expecting that, and so ends up trying to access some of the window's properties after they have been freed. I've got a solution to most of it, but there are a couple of areas where I'm not sure how to resolve it ... some more thought required, but I'll try to get a fix into the next release. For the record, here's the shortest example I can come up with that exhibits the problem: #!perl -w use strict; use warnings; use Win32::GUI(); my $mw; $mw = Win32::GUI::Window->new( -onKeyDown => sub { undef $mw; return -1; }, ); $mw->Show(); Win32::GUI::Dialog(); __END__ >>> The point is that in WindowsXP it works fine but in Widows 98 SP2 it >>> does not. >>> Windows' error screen points to USER32.DLL error. I concur that the problem only manifests itself on Win98, but that's just lucky. With various variations of the script I can get the error to appear in either User32.dll or Perl58.dll. Here's one way around the problem - I think this is pretty close to the behaviour of your current script (except for behaviour on clicking the 'close' button on the windows, which is somewhat unusual here, but I didn't know what you were expecting: #!perl -w use strict; use warnings; use Win32::GUI qw(VK_LEFT VK_RIGHT VK_RETURN); my @Window; makewindow(); $Window[0]->AddLabel( -pos => [4,20], -size => [150,150], -text => "HELP:\n\n". " Right=add window\n". " Left=close (only top) window\n". " Enter=switch windows", ); while(@Window) { Win32::GUI::Dialog(); pop @Window; } exit(1); sub makewindow { return if @Window > 4; push @Window, Win32::GUI::Window->new( -title => @Window ? "Item: " . @Window : "Main Window", -pos => [10+(@Window*202), 20], -size => [200, 200], -onKeyDown => \&keydown, ); $Window[-1]->Show(); return; } sub keydown { my ( $self, undef, $key ) = @_; if($key == VK_RIGHT) { makewindow(); } elsif($key == VK_LEFT) { return -1; } elsif($key == VK_RETURN) { for my $index (0 .. $#Window) { if($self == $Window[$index]) { $Window[++$index % @Window]->SetFocus(); } } } return 0; } __END__ Regards, Rob. |
From: Waldemar B. <wb...@sa...> - 2007-02-12 20:16:41
|
Hello! I've got the following problem: My textfield object has its value which is dynamically determined while the application is running. I can set background of the textfield dependent on the textfield value vary easy: by using Change(...) function. However when I aply the Change function to the -tip=>... option to obtain dynamical help it does not work. In what way I should set -tip dynamically? regards Waldemar |
From: Waldemar B. <wb...@sa...> - 2007-01-29 07:53:48
|
Hey! I have more general questions. Introduction: I wrote an application which seems to act in WindowsXP correctly but in Windows98 very unstable. The main feature of the application is that it contains dynamic number of windows which can be created while the application is running. In the first win32::gui tutorial they say, that $w->show() does not show anything but make the object visible, whereas Win32::GUI::Dialog() does it. My questions: 1. I create each of the window using Win32::GUI::Window->new(...). May I use ONE Win32::GUI::Dialog() function for all the windows or should I use as many Dialogs as many windows I have? 2. Where I can find detail description of the Win32::GUI::Dialog() function? 3. Is it possible to turn off the main loop to implement my own event managment, whereas graphics will be taken from Win32::GUI. Waldemar |
From: Robert M. <rm...@po...> - 2007-02-04 17:39:59
|
Waldemar Biernacki wrote: > I have more general questions. Please start a new message, and set the subject to reflect your questions. If you haven't seen it, can I suggest that you read this: http://www.catb.org/~esr/faqs/smart-questions.html > In the first win32::gui tutorial they say, that $w->show() does not show > anything but make the object visible, > whereas Win32::GUI::Dialog() does it. That's not how I read part One of the Win32::GUI tutorial: http://perl-win32-gui.sourceforge.net/cgi-bin/docs.cgi?doc=tutorial-part1 > My questions: > > 1. I create each of the window using Win32::GUI::Window->new(...). May I > use ONE > Win32::GUI::Dialog() function for all the windows or should I use as > many Dialogs as many windows I have? Without seeing more of what you mean, then it's difficult to answer precisely, but, generally, you want to call Win32::GUI::Dialog() once (per thread of execution). > 2. Where I can find detail description of the Win32::GUI::Dialog() function? What there is can be found here: http://perl-win32-gui.sourceforge.net/cgi-bin/docs.cgi?doc=reference-methods#dialog You may also want to look at the source, and read about the related Win32 functions on MSDN. > 3. Is it possible to turn off the main loop to implement my own event > managment, whereas graphics will be taken from Win32::GUI. Again, you question is not really explicit enough, but I think Win32::GUI::DoEvents() may be what you're looking for? Regards, Rob. |
From: Waldemar B. <wb...@sa...> - 2007-01-29 18:45:42
|
Hello, I have one question more. Later on a code is given (I have Win32::GUI ver 1.05). Sorry! - it is not as simple as it should be! The point is that in WindowsXP it works fine but in Widows 98 SP2 it does not. Windows' error screen points to USER32.DLL error. Maybe someone could help me and show how to change the code to be working in 98? Waldemar #################################################### #! perl -w use strict; use Win32::GUI qw(); use Win32::GUI::Grid; my $file = $ARGV[0]; unless ( -e $file ) { print "no file [$file] !\n"; exit(1); } my $last = -1; my @Window; my @start = (0); my @rows = (5); my $which = 0; my $help; makewindow(); Win32::GUI::Dialog(); exit(1); sub Window_Terminate { return -1 } ############################################################### sub makewindow { return 1 if $last > 3; $last++; $start[$last] = 0; $rows[$last] = 5+$last; $Window[$last]->{SCREEN} = new Win32::GUI::Window ( -title => "Item: $last", -pos => [10+$last*202, 20], -size => [200, 400], -name => "Window_$last", -onKeyDown => \&keydown, ); $Window[$last]->{GRID} = new Win32::GUI::Grid ( -parent => $Window[$last]->{SCREEN}, -name => "Grid_$last", -pos => [0, 0], -size => [190,400], -onKeyDown => \&keydown, ); if ( $last == 0 ) { $Window[$last]->{HELP} = $Window[$last]->{SCREEN}->AddLabel( -parent => $Window[$last]->{SCREEN}, -pos=>[4,200], -size=>[150,150], -text=>"HELP:\nF4=add\nF7=switch\nEnter=close (the last only)", -multiline=>1, ) } $Window[$last]->{SCREEN}->Show(1); $Window[$last]->{GRID}->SetEditable(0); $Window[$last]->{GRID}->SetRows($rows[$last]); $Window[$last]->{GRID}->SetColumns(1); $Window[$last]->{GRID}->SetFixedRows(0); $Window[$last]->{GRID}->SetFixedColumns(0); $Window[$last]->{GRID}->SetColumnWidth ( 0, 200 ); $Window[$last]->{GRID}->Refresh(); read_file($last); print "item $last created\n"; $which = $last; } sub read_file { my $which = shift; if ( open ( FH, "<$file" )) { for ( my $i = 0; $i < $start[$which]+$rows[$which] ; $i++ ) { my $file_row = <FH>; $file_row =~ s/\t/____/g; $file_row =~ s/\s//g; $Window[$which]->{GRID}->SetCellText( $i-$start[$which], 0, $file_row ) if $i>=$start[$which]; } close FH; } } sub keydown { my ( $self, undef, $key ) = @_; my $hash_EVENT = Win32::GUI::GetKeyboardState; my $_EVENT = what_event( $hash_EVENT ); if ( $_EVENT eq 'F4' ) { makewindow(); } elsif ( $_EVENT eq 'F7' ) { if ( $which == $last ) { $which = 0 } else { $which++ } $Window[$which]->{SCREEN}->SetFocus(); } elsif ( $_EVENT eq 'Enter' ) { if (( $which == $last )&&( $last>0)) { print "item $last deleted\n"; $Window[$which]->{SCREEN}->DESTROY if $Window[$which]->{SCREEN}; $last--; $which--; } elsif ( $last == 0 ) { print "item $last deleted\n"; return -1; } } elsif ( $_EVENT eq 'Down' ) { $start[$which] += 1; } elsif ( $_EVENT eq 'Up' ) { $start[$which] -= 1; $start[$which] = 0 if $start[$which] < 0; } elsif ( $_EVENT eq 'PgDn' ) { $start[$which] += $rows[$which]; } elsif ( $_EVENT eq 'PgUp' ) { $start[$which] -= $rows[$which]; $start[$which] = 0 if $start[$which] < 0; } read_file($which); $Window[$which]->{GRID}->Refresh(); return 1; } #------------------------------------ sub what_event { my $_EVENT = shift; my $result = ''; my $SHIFT = ''; my $CTRL = ''; my $ALT = ''; if (( $_EVENT->[160] )||( $_EVENT->[161] )) { $SHIFT = 'Shift' } if (( $_EVENT->[162] )||( $_EVENT->[163] )) { $CTRL = 'Ctrl' } if (( $_EVENT->[164] )||( $_EVENT->[165] )) { $ALT = 'Alt' } if (( $_EVENT->[16] )) { $SHIFT = 'Shift' } if (( $_EVENT->[17] )) { $CTRL = 'Ctrl' } if (( $_EVENT->[18] )) { $ALT = 'Alt' } ######################################### # Windows 98 tricks: #--------------------------------------- my $counter = 0; for (my $ii=0; $ii<256; $ii++) { $counter++ if $_EVENT->[$ii] } if ( $counter > 1 ) { $_EVENT->[115] = 0 } ######################################### for ( my $i = 0; $i < 256; $i++ ) { if ( $_EVENT->[$i] ) { if ( $i == 0 ) { $result .= 'Null' } elsif ( $i == 8 ) { $result = 'Backspace' } elsif ( $i == 9 ) { $result = $CTRL.$SHIFT.'Tab' } elsif ( $i == 13 ) { $result = $CTRL.$SHIFT.'Enter' } elsif ( $i == 27 ) { $result = $CTRL.$SHIFT.'Escape' } elsif ( $i == 33 ) { $result = $CTRL.$SHIFT.'PgUp' } elsif ( $i == 34 ) { $result = $CTRL.$SHIFT.'PgDn' } elsif ( $i == 36 ) { $result = $CTRL.$SHIFT.'Home' } elsif ( $i == 35 ) { $result = $CTRL.$SHIFT.'End' } elsif ( $i == 38 ) { $result = $CTRL.$SHIFT.'Up' } elsif ( $i == 37 ) { $result = $CTRL.$SHIFT.'Left' } elsif ( $i == 39 ) { $result = $CTRL.$SHIFT.'Right' } elsif ( $i == 40 ) { $result = $CTRL.$SHIFT.'Down' } elsif ( $i == 45 ) { $result = $CTRL.$SHIFT.'Insert' } elsif ( $i == 46 ) { $result = $CTRL.$SHIFT.'Delete' } elsif (( 47 < $i )&&( $i < 58 )) { $result = $CTRL.$SHIFT.chr( $i ) } elsif (( 64 < $i )&&( $i < 91 )) { my $shift = 0; $shift = 32 if (( $SHIFT eq 'Shift' )||( $CTRL eq 'Ctrl' )); $result = $CTRL.$ALT.chr( $i + 32 - $shift ) } elsif (( 111 < $i )&&( $i < 124 )) { $result = $ALT.$CTRL.$SHIFT.'F'.($i-111); } else { if (( $i != 160 )&&( $i != 161 )&&( $i != 16 )&& ( $i != 162 )&&( $i != 163 )&&( $i != 17 )&& ( $i != 164 )&&( $i != 165 )&&( $i != 18 )) {} } } } return $result; } |
From: Robert M. <rm...@po...> - 2007-02-04 17:49:27
|
Waldemar Biernacki wrote: > Hello, > > I have one question more. > Later on a code is given (I have Win32::GUI ver 1.05). > Sorry! - it is not as simple as it should be! When I run what you have posted I get: no file [] ! and I haven't investigated what I need to put in a file to get the script to run. > The point is that in WindowsXP it works fine but in Widows 98 SP2 it > does not. > Windows' error screen points to USER32.DLL error. What is the error that you get? > Maybe someone could help me and show how to change the code to be > working in 98? If you can post a smaller, complete example showing your problem, and removing all the stuff that is not necessary, then I will help you try to identify the problem. (I haven't run your code, but it looks to me like you might be passing a negative first parameter to SetCellText() in your read_file() subroutine. Is this intentional?) Regards, Rob. |