A few days ago I was building an application, where I had embedded an Internet Explorer axwindow and created a menu. Unfortunately, I could not use the standard shortcut keys, like Ctrl-C (Copy), Ctrl-X (Cut), Ctrl- V (Paste), etc.
Thanks to Jez White's recommendation to examine the AxWindow sample apps (available in the source code download), I was able to add the shortcuts that I needed, except for the most important one, tabbing through form fields. Since many of us are embedding IE in our apps, what seems to be the trend in gui design, I am supplying a sample app, below. Thanks to Laurent Rocher for having created such a great example! Though, in Laurent's example, instead of using InternetExplorer, DHTMLEdit was used. In the process, I believe I have discovered a disparity in win32- gui/axwindow, or, perhaps, there is a reason for this disparity: when I created my acceleratortable, I could not use the -onClick=> sub {...} method. Instead, I had to create subroutines for each function. Further, my accereratortable would not work if my $mainWindow had an -on... functions attached to it, like -onTerminate=>sub{...}, - onResize=>sub{...}, etc. You can obtain the complete list of "pass-through" OLE commands by using your OLE Browser (a component of Activestate's ActivePerl release). Here is where the commands are located: Microsoft Internet Controls->InternetExplorer->OLECMDID. A complete listing and definition of each command is available from http://msdn.microsoft.com/library/default.asp?url=/library/en- us/com/htm/oen_a2z_015y.asp. Here is the list, without the definitions: OLECMDID_OPEN = 1, OLECMDID_NEW = 2, OLECMDID_SAVE = 3, OLECMDID_SAVEAS = 4, OLECMDID_SAVECOPYAS = 5, OLECMDID_PRINT = 6, OLECMDID_PRINTPREVIEW = 7, OLECMDID_PAGESETUP = 8, OLECMDID_SPELL = 9, OLECMDID_PROPERTIES = 10, OLECMDID_CUT = 11, OLECMDID_COPY = 12, OLECMDID_PASTE = 13, OLECMDID_PASTESPECIAL = 14, OLECMDID_UNDO = 15, OLECMDID_REDO = 16, OLECMDID_SELECTALL = 17, OLECMDID_CLEARSELECTION = 18, OLECMDID_ZOOM = 19, OLECMDID_GETZOOMRANGE = 20, OLECMDID_UPDATECOMMANDS = 21, OLECMDID_REFRESH = 22, OLECMDID_STOP = 23, OLECMDID_HIDETOOLBARS = 24, OLECMDID_SETPROGRESSMAX = 25, OLECMDID_SETPROGRESSPOS = 26, OLECMDID_SETPROGRESSTEXT = 27, OLECMDID_SETTITLE = 28, OLECMDID_SETDOWNLOADSTATE = 29, OLECMDID_STOPDOWNLOAD = 30, OLECMDID_ONTOOLBARACTIVATED = 31, OLECMDID_FIND = 32, OLECMDID_DELETE = 33, OLECMDID_HTTPEQUIV = 34, OLECMDID_HTTPEQUIV_DONE = 35, OLECMDID_ENABLE_INTERACTION = 36, OLECMDID_ONUNLOAD = 37, OLECMDID_PROPERTYBAG2 = 38, OLECMDID_PREREFRESH = 39, OLECMDID_SHOWSCRIPTERROR = 40, OLECMDID_SHOWMESSAGE = 41, OLECMDID_SHOWFIND = 42, OLECMDID_SHOWPAGESETUP = 43, OLECMDID_SHOWPRINT = 44, OLECMDID_CLOSE = 45, OLECMDID_ALLOWUILESSSAVEAS = 46, OLECMDID_DONTDOWNLOADCSS = 47, OLECMDID_UPDATEPAGESTATUS = 48, OLECMDID_PRINT2 = 49, OLECMDID_PRINTPREVIEW2 = 50, OLECMDID_SETPRINTTEMPLATE = 51, OLECMDID_GETPRINTTEMPLATE = 52 OLECMDID_PAGEACTIONBLOCKED = 55, OLECMDID_PAGEACTIONUIQUERY = 56, OLECMDID_FOCUSVIEWCONTROLS = 57, OLECMDID_FOCUSVIEWCONTROLSQUERY = 58 Here is my demonstration code: ######################### use Win32::GUI; use Win32::GUI::AxWindow; #use Win32::OLE; $Menu = Win32::GUI::MakeMenu( "&Admin" => "&Admin", " > &Microsoft" => "gotoMicrosoft", " > &Adobe" => "gotoAdobe", " > &Google" => "gotoGoogle", " > -" => 0, " > &Edit" => "&Edit", " > > &Copy\tCtrl-C" => "EditCopy", " > > &Paste\tCtrl-V" => "EditPaste", " > > &Cut\tCtrl-X" => "EditCut", " > > -" => 0, " > > &Select All\tCtrl-A" => "EditSelectAll", " > > -" => 0, " > > &Delete\tDel" => "EditDelete", ); my $accel=new Win32::GUI::AcceleratorTable( "Ctrl-C" => "EditCopy", "Ctrl-V" => "EditPaste", "Ctrl-X" => "EditCut", "Ctrl-A" => "EditSelectAll", "Del" => "EditDelete", ); my $icon = new Win32::GUI::Icon("adim.ico"); my $window_class = new Win32::GUI::Class( -name => "Icon", -icon => $icon, ); $desk=Win32::GUI::GetDesktopWindow(); $dw=Win32::GUI::Width($desk); $dh=Win32::GUI::Height($desk); $dw=($dw*.9); $dh=($dh*.9); $mainWindow = new Win32::GUI::Window ( -name => "mainWindow", -menu => $Menu, -accel => $accel, -title => "Testing", -pos => [0, 0], -minsize => [(800*.9), (600*.9)], -size => [$dw, $dh], -class => $window_class, # -onResize => sub { # $Control->Resize ($mainWindow->ScaleWidth(), $mainWindow- >ScaleHeight()); # }, # -onTerminate => sub { # return (-1); # }, ); $Control = new Win32::GUI::AxWindow ( -parent => $mainWindow, -name => "Control", -control => "Shell.Explorer.2", # -control => "{8856F961-340A-11D0-A96B-00C04FD705A2}", -left => 0, -top => 0, -width => $mainWindow->ScaleWidth(), -height => $mainWindow->ScaleHeight(), ); # Call Method $weblink="http://adobe.com"; $Control->CallMethod("Navigate", "$weblink"); #$Control->Update(); $mainWindow->Show(); Win32::GUI::Dialog(); sub gotoMicrosoft_Click { $Control->CallMethod("Navigate", "http://www.microsoft.com"); #$OLEControl = $Control->GetOLE(); #$Control->Navigate("http://www.microsoft.com"); } sub gotoGoogle_Click { $Control->CallMethod("Navigate", "http://www.google.com"); #$OLEControl = $Control->GetOLE(); #$OLEControl->Navigate("http://www.google.com"); } sub gotoAdobe_Click { $Control->CallMethod("Navigate", "http://www.adobe,com"); #$OLEControl = $Control->GetOLE(); #$OLEControl->Navigate("http://www.adobe,com"); } sub EditCopy_Click { $Control->CallMethod(ExecWB,12,2); } sub EditPaste_Click { $Control->CallMethod(ExecWB,13,2); } sub EditCut_Click { $Control->CallMethod(ExecWB,11,2); } sub EditSelectAll_Click { $Control->CallMethod(ExecWB,17,2); } sub EditDelete_Click { $Control->CallMethod(ExecWB,33,2); } sub mainWindow_Terminate { return (-1); } ################### As I mentioned earlier, I have not been able to get the TAB key to work. This is a vital key, especially when working with a web form, where you want the end-user to Tab through sequential form fields. I hope that this bit of brain-candy helps the list. But, further, I hope that someone can tell me/us how to enable the Tab key to tab through form fields. Please help! It's the last piece in my puzzle! :) Brad Smith