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