Dec 242017
 
PC Magazine volume 12 number 10 - WCLIB.WCL for WINCMD.
File V12N10.ZIP from The Programmer’s Corner in
Category Files from Magazines
PC Magazine volume 12 number 10 – WCLIB.WCL for WINCMD.
File Name File Size Zip Size Zip Type
ENDJOIN.C 1554 535 deflated
ENDJOIN.EXE 15925 7932 deflated
ENDJOIN.MAK 312 146 deflated
FILEBYTE.BAT 399 249 deflated
INP.COM 77 74 deflated
INP.SCR 1111 372 deflated
INPUT.BAT 106 92 deflated
OLFDEMO.C 2046 767 deflated
OLFDEMO.DEF 239 139 deflated
PATHS.C 2149 581 deflated
PATHS.EXE 16437 7989 deflated
PATHS.MAK 294 142 deflated
PIKPRN.XLA 2715 1030 deflated
SAVEDIR.BAT 63 54 deflated
VBMB.RC 329 230 deflated
VBMBTEST.EXE 16128 6867 deflated
VBMBTEST.PAS 1676 702 deflated
VERBOSMB.PAS 2755 1023 deflated
WCLIB.DOC 36447 10679 deflated
WCLIB.WCL 13232 5738 deflated
WCLIBC.ZIP 19383 18858 deflated

Download File V12N10.ZIP Here

Contents of the WCLIB.DOC file


WCLIB.WCL (VERSION 1.0) Copyright (c) 1993 Douglas Boling
-------------------------------------------------------------------------
First Published in PC Magazine May 25,1993 (Utilities)
-------------------------------------------------------------------------

WCLIB.WCL:
Our WINCMD utility gave you a command language interpreter
for Windows 3.1. WCLIB is a dynamic link library for the WINCMD utility.
It enhances the WINCMD language by adding new functions that will let you
move and size windows, read and write files, access the Windows Clipboard,
and control your multimedia devices from a WINCMD program.

USING WCLIP

To install WCLIB, you must copy WCLIB.WCL into the same directory as
WINCMD.EXE. When WINCMD is started it will automatically add all the new
WCLIB functions to the WINCMD language. You use the WCLIB functions exactly
as you would the standard WINCMD functions: Just enter the name of the
function, followed by its parameters enclosed in parentheses.

WCLIB's new functions can be divided into four functional groups:
window management, file access, multimedia, and Clipboard. A table
listing them all is shown (below) in Figure 1.

WINDOW MANAGEMENT GROUP

The function GetWindowHandle() returns the handle for a window on
the screen. In Windows programming jargon, a handle is a number that a
program uses when referring to a window. To get the handle of the
Program Manager's main window, you would use the function

proghand = GetWindowHandle("Program Manager")

In WCLIB, knowing a window's handle is the key to controlling that
window. The standard functions included in WINCMD, such as AppActivate(),
always refer to windows by their title bar text. Unfortunately, not all
windows have a title bar or other text. The WCLIB functions that involve
windows use the window handle instead and so can reference any window on
the screen.

The next two functions, SizeWindow() and MoveWindow(), let a WINCMD
program set the size and position of windows on the screen. SizeWindow()
takes three parameters: the handle of the window, the new width, and the
new height. The latter two parameters are specified in pixels. For
example, to resize the Program Manager window to a window 300 pixels wide
by 200 high, you'd use the following lines:

handle = GetWindowHandle("Program Manager")

SizeWindow (handle, 200, 300)


SizeWindow() returns TRUE (any nonzero value) if the function was
successful and FALSE (a zero value) if it was not.

The MoveWindow() function similarly takes three arguments: the
window handle, the horizonal position, and the vertical position. To
parallel the previous example, to move the Program Manager window to the
top-left corner of the screen, the commands would be

handle = GetWindowHandle("Program Manager")
MoveWindow (handle, 0, 0)


As with the SizeWindow() function, MoveWindow() returns TRUE if the
function was successful in moving the window and FALSE if it was not.

While you often want to move and size a window, there are times
when you simply wish to minimize or maximize it. To minimize a window
to an icon, you use the function MinimizeWindow(), whose only parameter
is the handle of the window. Similarly, MaximizeWindow() zooms a window
to cover the entire desktop, and RestoreWindow() restores a window from
an iconic or maximized state. Both also take only the window handle as
a parameter. All three of these functions return TRUE if the function
was successful and FALSE otherwise.

Since being able to learn the specific position and size of a window
is just as important as being able to move or size it yourself, WCLIB
includes three functions that return information in this area.
GetWindowSize() takes one parameter, the window handle, and it returns
the size of the window. Both the width and height of the window are
encoded in the one returned parameter. The width of the window is
contained in the lower half of the returned value; the height is
contained in the upper half. To separate the two values, you can use
the HighWord() and LowWord() functions. For example, the following
code fragment will display the size of the Program Manager's window:

size = GetWindowSize (GetWindowHandle("Program Manager"))

Say "The Program Manager window is" HighWord(size) "high and" LowWord(size)
"wide"

As discussed in the last issue in connection with the WINCMD language,
the SAY statement simply displays text in the WINCMD.EXE window.

Notice in this example that instead of using a separate line to get
and save the handle of the Program Manager window, I simply included the
GetWindowHandle() function in the call to GetWindowSize(). While this is
not necessary, some people find it convenient to write programs this way.
It reduces the number of lines in the program and eliminates the need to
create a variable to hold the window handle. Note too that it might be
good to check the GetWindowHandle() result before passing it on to
GetWindowSize().

The GetWindowPos() function is similar to GetWindowSize(). Its
single parameter is the window handle, and it returns the position of
that window encoded in the returned value. Thus, by making only a few
minor changes to the previous example, you can display the position of
the Program Manager's window thus:

pos = GetWindowPos (GetWindowHandle("Program Manager"))

Say "The Program Manager window is at row" LowWord(pos) "and column"
HighWord(pos)

GetWindowState() returns the state--iconic, restored, or
maximized--of a window. This function takes a window handle as its one
parameter and returns a 1 if the window is in a restored state, a 2 if
the window is being displayed as an icon, and a 3 if it is maximized.

GetWindow() is a powerful function that can be used to track the
relationships between a window and its parent, owner, or children. The
function takes two parameters: the handle of the window, and a parameter
that requests that a specified relationship will return a TRUE (nonzero)
value. Figure 2 (below) lists the relationships that can be requested
and the value of the second parameter to request that relationship.
GetWindow() returns the window handle for the window that has the
specified relationship. If no window meets the relationship requested,
or if either parameter passed to GetWindow() is invalid, the function
returns FALSE.

Unfortunately, to explain these window relationships would take an
entire article in itself. For those who are interested in learning more
about the subject, the best text is the classic Programming Windows, by
PC Magazine contributing editor Charles Petzold.

The GetWindowText() function is the inverse of GetWindowHandle().
It returns the title text of a window from the window handle passed to
it. This function provides an easy way to convert a window handle
returned by GetWindow() into a title that can be used by AppActivate()
and the other functions of WINCMD that require title text.

The next two functions, PostMessage() and SendMessage(), give a
WINCMD program access to the very heart of Windows: the message
architecture. Messages are the commands and notifications sent to
windows by other windows and by Windows itself. As with GetWindow(),
a complete explanation of window messages is beyond the scope of this
article, but the functions are included in the WCLIB repertoire to give
WINCMD programs an additional level of functionality.

Both PostMessage() and SendMessage() take four parameters: the
handle of the window to which the message is to be sent, the message
value, the word parameter for that message, and the long parameter.
PostMessage() returns a zero if the function fails, and a nonzero
otherwise. SendMessage() returns the value returned by Windows'
SendMessage() call.

A handy use for PostMessage() is to tell an application to
terminate by posting a WM_QUIT message to it. For example, to tell
the File Manager to terminate, you would use the following line:

PostMessage (GetWindowHandle("File Manager"), 0x12, 0, 0)

Windows has hundreds of different messages. Again, the best source
for learning about these messages is Charles Petzold's Programming
Windows. Since window messages are normally referred to by their names
rather than by their actual number values, you will need to refer to
the file WINDOWS.H, which is included with the Windows Software
Development Kit and with other Windows development environments. You
must be very careful when using SendMessage() and PostMessage(), since
sending the wrong message at the wrong time can be disastrous to the
target window and even to Windows itself.

The last two functions in the window management group are
LoadIconFile() and SetIcon(). These are designed primarily to allow a
WINCMD program to set the icon of its own window, but with care they
can also be used to set the icons for other windows on the desktop.
LoadIconFile() takes the filename of a Windows icon file as its only
parameter. If the file is successfully loaded, LoadIconFile() returns
a handle to the icon.

The two SetIcon() parameters are the handle of a window and the
handle of the icon to use. The function returns the handle of the icon
that the window used previously. For example, to set the icon of a
WINCMD window with an icon from the file TRASH.ICO, the statements
would be

hicon = LoadIconFile ("TRASH.ICO")
if (hicon <> 0) holdicon = SetIcon (hmain, hicon)


In this example, the file TRASH.ICO is loaded and the variable is
set to the icon handle. If the load fails, will be zero. The IF
statement allows the WINCMD window icon to be set only if the icon from
TRASH.ICO was loaded successfully. Note that this example is the first
use of WINCMD's predefined variable, which is automatically set to the
handle of the WIN-CMD window. The only other predefined variable in
the WINCMD language is, which is the instance handle for the current
instance of WINCMD.EXE.

MULTIMEDIA FUNCTIONS

Microsoft bundled its Multimedia Windows software with the standard
Windows 3.1. The multimedia interface itself is fairly complex: It has
over 100 APIs! Fortunately, however, Microsoft also provided a high-level
interface, called the Media Control Interface (MCI), which provides a
much simpler way to communicate with multimedia devices. Included in the
MCI interface is a call that allows programs to use ASCII strings to
command multimedia devices. (Make sure you don't confuse these strings
with those you may use to get your e-mail!)

The WCLIB SendMCIString() function allows WINCMD programs to send
MCI command strings to a multimedia device. The single parameter to
SendMCIString() is the command string to send. If the command sent
was successful, SendMCIString() returns any response the command returns.
If the command fails, SendMCIString() returns the string ERROR, followed
by the MCI error number that was returned. For example, if you sent the
command

SENDMCISTRING ("open cdaudio")

a response of ERROR 291 would indicate that the CD-AUDIO device was
already in use.

The GetMCIErrorString() function lets a WINCMD program translate an
error number returned by SendMCIString() into a string that describes the
error. The one parameter required is the error number returned by
SendMCIString(). Note, however, that a WINCMD program must parse the
error string returned by SendMCIString() in order to separate the error
number from its preceding ERROR string. For example, the following
lines will display an error string if an MCI string command fails:

answer = SendMCIString (string)

if (Substr (answer,0 ,5) == "ERROR")

say answer GetMCIErrorString (substr (answer, 6, 10))

else
say answer


The MCIPLAY.WCM program shown later in this article further illustrates
the use of these two multimedia functions.

FILE FUNCTIONS

The WCLIB file functions allow you to read and write files.
FileOpen() opens or creates a file for operation. The function takes
two parameters: the name of the file to open and the access mode.
The allowable access mode values are 0 for read-only, 1 for write-only,
and 2 for read/write access. FileOpen() returns a file handle that must
be used for all other file functions.

The FileMovePtr() function changes the position of the file
read/write pointer; for example, the location in the file from which data
will next be read or to which it will next be written. The function takes
three parameters: the file handle, the pointer offset value, and a flag
that indicates the method to be used when changing the pointer. The
method flag can be set to one of three values. A 0 indicates that the
file pointer should be moved to the specified offset from the start of
the file. A method flag setting of 1 indicates that the offset should
be made from the current file pointer position, and a 2 indicates that
the pointer should be offset from the end of the file.

FileMovePtr() returns the new value of the file pointer for the
file. For example, to set the file pointer to 100 bytes from the start
of a file, the command would be

FileMovePtr (hFile, 100, 0)


To move the file pointer ahead 300 bytes, you would use the command

FileMovePtr (hFile, 300, 1)


Similarly, to set the file pointer to 200 bytes from the end of a file use

FileMovePtr (hFile, -200, 2)


A common use for this last method of flag setting is to find the
size of a file. If you move the file pointer to an offset of 0 from the
end of the file, the returned value will be the file size. These examples
all assume that the file has been previously opened and that the file
handle has been assigned to the variable hFile.

The FileRead() function reads bytes from a file and takes as its
two parameters the file handle and the number of bytes to be read.
The return value for the function is the actual data read, which can be
assigned to a WINCMD variable by using the equal sign (=), as explained
in the last issue. The read is performed from the current position of
the file pointer. After the read is done, the file pointer is updated
to point to the byte following the last byte read. If there are no more
bytes in the file to read--if the file pointer is pointing to the end
of the file--FileRead() returns -1.

FileWrite() does the complementary job of writing to a file. It
also takes two parameters, the handle of the file, and a variable that
contains the data to be written. FileWrite() returns the number of
bytes written to the file. If the file handle is invalid or if the file
is read-only, FileWrite() returns 0.

The FileClose() function closes a file and takes as its only
parameter the handle to that file. WINCMD programs should always close
any files that have been opened before the program terminates.

Finally, the FileExist() function determines whether a specified
file exists. The function takes the name of the file as its one parameter
and returns TRUE if the file exists, FALSE otherwise. Note that the
filename passed to FileExist() can contain wildcards.

CLIPBOARD FUNCTIONS

The final two functions allow WINCMD programs to read and write text
to the Windows Clipboard. GetClipText() takes no arguments and simply
returns any text data in the Clipboard. If the Clipboard is empty or if
the data there cannot be rendered in a text format (if it contains a
bitmap, for example,) GetClipText() returns 0. SetClipText() empties
the Clipboard and then sets it to whatever text has been passed to the
function. The function takes one argument: the text to be placed in
the Clipboard.

WCLIB AT WORK

The WINCMD program, WORDFIX.WCM, shown (below) in Figure 3, demonstrates
some of the new functions of WCLIB in the process of solving two of my
major problems with Word for Windows. One of these is that Word does
not remember its size and location on the screen between launches.
The other is that the application displays a message box demanding SHARE
if a second copy is launched. WORDFIX fixes the message box problem by
first checking to see if Word is already running and, if so, switching
the original Word window to the foreground. If Word is not running,
WORDFIX starts the program and then moves and resizes its window.

The WORDFIX subroutine CheckRunning checks the title text of every
window on the desktop to see whether a Word window is currently open on
the screen. This check consists of using GetWindow() to return the first
window in the window manager list. (The window manager is the part of
Windows that manages the windows on the desktop.) The routine then gets
the title text for that window and compares it to the target window
text--in this case, the string ``Microsoft Word''. If the text matches,
CheckRunning returns the handle of the window. Otherwise, GetWindow is
called again to get the next window in the window manager list and loops
back. The loop ends after the last window has been checked.

The value returned by CheckRunning is compared with 0 to see whether
Word is running. If so, AppActivate() is called to bring Word to the
foreground. Since CheckRunning returns a window handle and AppActivate()
needs the title text of a window, GetWindowText() is used to convert
the handle into the necessary title bar text.

Note that the CheckRunning subroutine provides a way around the
GetWindowHandle() limitation I mentioned toward the beginning of this
article, namely, that the function will fail if a window adds text on
its title line beyond what you have specified.

If Word is not running, WORDFIX launches it and waits half a second
to allow Word to display its main window. CheckRunning is called again
to return the handle to the Word window. If for some reason Word did
not start, WORDFIX simply terminates. Otherwise, MoveWindow() and
SizeWidow() are called to place the Word window exactly where you want
it on your screen. WORDFIX quietly terminates when it has completed
its business.

One endearing feature of WINCMD programs is that they can be
hidden behind any icon in the Program Manager. I have WORDFIX in my
Programs group with the Word for Windows icon set instead of the
default WINCMD icon. This way it looks as if I am simply starting Word,
when in fact I'm using a WINCMD program to start the application.

The MCIPLAY.WCM program, which is shown (below) in Figure 4, uses the MCI
string interface to let you control multimedia devices on your system.
The program is rather straightforward. It consists of the MCI string
functions discussed earlier, the AskBox() function which is used to query
the user for the MCI command, and a WHILE loop that continues the process
until the user has pressed the CANCEL button on the dialog box. The SAY
statement is used to display any return messages from the MCI.

If you have the file GONG.WAV in your Windows directory, you can
hear MCIPLAY in operation by entering

open waveaudio
play waveaudio!\windows\gong.wav
close waveaudio


HOW WINCMD AND WCLIB WORK

Space limitations in the earlier issue precluded a technical
discussion of the WINCMD interpreter, so I'll review that program
before considering WCLIB. The operation of the WINCMD interpreter
centers around its variable list. This list contains all the keywords
of the WINCMD language--IF, WHILE, DO, and so on--plus all the words
that have been tokenized from the ASCII file that the interpreter is
currently executing as a WINCMD program.

The process of running a WINCMD program can be divided into three
steps: resetting the interpreter, loading and tokenizing the WINCMD
program, and interpreting the program's token list. The first step
involves loading the variable list with the WINCMD language keywords.
Keywords are loaded into the list together with pointers to the routines
in WINCMD.EXE that will actually execute the keywords' functions. Thus
the IF keyword is loaded with a pointer to the LocalIF routine in
WINCMD.EXE, for example. The command line parameters are then loaded
into the variable list so that they will be accessible to the program.
At this point, any function libraries with a .WCL extension are called
to load their functions into the variable list as well. (I'll discuss
what happens when a .WCL library is loaded shortly.)

Once the variable list has been initialized, the WINCMD program to
be executed is read into a block of global memory. The file is then
scanned, a word at a time, with the first character of each word
determining how the WINCMD tokenizer treats the word.

If the word begins with a letter or an underscore, it is treated
as a variable name. WINCMD.EXE then searches the variable list to see
whether the word is already there. If it's not, the word is added to
the variable list and a pointer for the entry is added to another list,
called the line token list. (This list consists mainly of pointers to
tokens in the variable list.) The order of the pointers in the token
list is the same as the order of the words in the WINCMD program.

At this point the interpreter is converting the ASCII words in the
WINCMD program into pointers to variables and keywords in the variable
list. Thus when WINCMD is subsequently executed, the interpreter only
has to work with the pointers and does not need to retokenize each line
as it is executed.

There can be other items in the line token list besides pointers
to entries in the variable list. If the word being parsed does not begin
with a letter or an underscore but with a number, the interpreter converts
the word into a 32-bit number that is added to the token list as a numeric
constant. If the tokenizer sees a double quote character, it assumes that
anything up to the next quote is a string constant. Instead of adding
the quoted string to the variable list, the tokenizer adds it to the line
token list as a string constant.

To summarize the tokenization process, let's look at the simple,
three-line WINCMD program listed below.

FRED = 5
IF (BOB < 5)
BOB = FRED + 3


This program begins as an ASCII file. After the file has been parsed,
the variable list contains all the keywords plus two variable names, FRED
and BOB:

While
Do
If
=
>
<
+
-
.
.
.
BOB
FRED


The original values assigned to the variables are the names of the
variables, that is, FRED is assigned the string ``FRED'' and BOB is
assigned the string ``BOB''. As shown (below) in Figure 5, the token list
contains such items as line-number tokens, variable-pointer tokens, and
numeric-constant tokens. Note that the items in the line token list are
in the same order as the words from the original file.

Once a WINCMD program has been tokenized, the only remaining task
is to execute it, starting with the first item in the line token list.
If the item is a pointer to a variable, the second item is checked to
see if it is an equal sign. If so, the items beyond the equal sign are
evaluated, and the result is assigned to the variable at the start of
the line.

In the example shown in Figure 5, the first line starts with the
variable FRED, so the interpreter checks to see if the second item is
an equal sign. Since it is, the interpreter evaluates the rest of the
items on that line and assigns the result (in this case 5) to the
variable FRED. After the first line of the program has been executed,
the entry in the variable list for FRED also contains the value 5.
Since nothing has been assigned to the variable BOB, the data for that
entry simply contains the string ``BOB''.

The first item in the line token list for the second line is a
keyword, so the interpreter calls the routine pointed to by the IF
entry in the variable list. The IF routine then evaluates the items
in the line token list that make up the condition on the line following
the IF. Depending on the result of the evaluation, this line may or may
not be executed. In the Figure 5 example, the variable BOB is still
assigned the string ``BOB'', so its numeric value is 0. Since 0 is
less than 5, the line following the IF statement is executed.

The third line of this program, like the first, is a simple
assignment statement. The items beyond the equal sign are evaluated
and in this case FRED is 5, so the result is 5 + 3 or 8. When the
interpreter tries to execute the line after the last assignment, it
sees the end-of-file token, meaning the program has finished.

Calling a predefined function is similar to processing a keyword.
Function names are listed in the variable list, along with the keywords
and variables. As with keywords, predefined functions each have a
pointer in the variable list that points to the WINCMD.EXE subroutine
that executes the function. Thus, executing a function is simply a
matter of parsing its parameters and calling the routine that executes
it.

ADDING LIBRARY FUNCTIONS

Since functions are simply items in the variable list, it's fairly
easy for libraries such as WCLIB to add functions. They are simply added
to the variable list. When WINCMD.EXE is launched, it looks for files
with a .WCL extension in its directory, and if any are found,
LoadLibrary is called to load the file as a DLL. If the load is
successful and the .WCL DLL has external entry points named WCLibLoad
and WCLibFunc, it is assumed to be a WINCMD function library. The DLL
WCLibLoad routine is called immediately so the library can perform any
initialization processing necessary, and the WCLibFunc entry point is
saved in WINCMD.EXE. Later, when a function from the library is called,
the WCLibEntry point is called to execute the function.

When the interpreter is reset, a third entry point, WCLibReset, is
called. The library then uses a callback function in WINCMD.EXE to add
entries to the WINCMD variable list. These entries include the name of
the function and numbers that indicate the source DLL of the function
and a function number. The interpreter uses these numbers to determine
which DLL to call when the function is called in a WINCMD program.

When the WCLibFunc routine in WCLIB is called, it uses the function
number passed with the call to look up a pointer for the proper function
to call inside the DLL. The WCLibFunc call also includes a pointer to a
callback entry point in WINCMD.EXE. This allows libaries such as WCLIB
to call routines that manipulate entries in the variable list. The
callback is necessary because multiple instances of WINCMD.EXE may be
running at any one time. The callback allows the single instance of the
WCLIB DLL to operate on the correct variable list each time it is called.


Fortunately, the user need not appreciate the complex interaction
between WINCMD.EXE and WCLIB. Together they provide a powerful command
language that can be used to control your Windows desktop. And the fact
that WINCMD can be extended with additional libraries makes its language
an ever-evolving process. Who knows? There may be another WINCMD function
library sometime in the future!
-------------------------------------------------------------------------
DOUGLAS BOLING IS A CONTRIBUTING EDITOR TO PC MAGAZINE.
-------------------------------------------------------------------------

The New WCLIB Functions

Window Management Functions Action
--------------------------------------------------------------------------

GetWindowHandle (title text) Returns the handle of the window with
the matching title text
SizeWindow (window handle, cx, cy) Resizes a window

MoveWindow (window handle, x, y) Moves a window

MinimizeWindow (window handle) Minimizes a window

MaximizeWindow (window handle) Maximizes a window

RestoreWindow (window handle) Restores a window

GetWindowSize (window handle) Returns the size of a window

HighWord (number) Returns the upper 16 bits of a number

LowWord (number) Returns the lower 16 bits of a number

GetWindowPos (window handle) Returns the x and y coordinates for
a window

GetWindowState (window handle) Returns the state
(icon/restored/zoomed) of a window

GetWindow (window handle, relation) Returns the handle of a window
related to a window

GetWindowText (window handle) Returns the title text for a window

PostMessage (window handle, message
number, word param, long param) Posts a message to a window

SendMessage (window handle, message
number, word param, long param) Sends a message to a window

LoadIconFile (icon filename) Loads an icon and returns an icon
handle

SetIcon (window handle, icon handle) Sets a window's icon
--------------------------------------------------------------------------

Multimedia Functions Action
--------------------------------------------------------------------------

SendMCIString (MCI string) Sends an MCI command string

GetMCIErrorString (MCI error number) Returns an error message for an
MCI error number
--------------------------------------------------------------------------
File Functions Action
--------------------------------------------------------------------------

FileOpen (filename, access mode) Opens a file

FileMovePtr (file handle, offset, flag) Moves a file read/write pointer

FileRead (file handle, bytes to read) Reads bytes from a file

FileWrite (file handle, data to write) Writes data to a file

FileClose (file handle) Closes a file

FileExist (filename) Determines whether a file exists
--------------------------------------------------------------------------
Clipboard Functions Action
--------------------------------------------------------------------------

GetClipText () Retrieves text from the Clipboard

SetClipText (data for Clipboard) Sets the Clipboard contents
---------------------------------------------------------------------------
Figure 1: By adding the new functions provided by WCLIB.WCL, you can write
far more powerful programs in the WINCMD command language. The functions are
listed in the order they appear in the text.
==============================================================================

GETWINDOW() Relationships
------------------------------------------------------------------------------
Value Meaning
-----------------------------------------------
0 First sibling for a child window
1 Last sibling for a child window
2 Next sibling for a child window
3 Previous sibling for a child window
4 The owner of the window
5 The first child window of a window
6 The parent of a window
-----------------------------------------------------------------------------
Figure 2: The second parameter to GetWindow() must specify one of these allowed values.
=============================================================================

WORDFIX.WCM
Complete Listing
//============================================================
// WinCmd program to fix problems with WinWord
//
// Copyright (c) 1993 Douglas Boling
//============================================================
//
// Check to see if Word already running. If so,
// just switch to Word Window and exit
//
handle = checkrunning ("Microsoft Word")
if (handle) do
appactivate (getwindowtext (handle))
exit
end

//
// Launch Word and wait .5 seconds
//
"\winword.exe"

delay (500)

//
// Attempt to get handle to Word's main window. If
// we can't quit.
//
handle = CheckRunning ("Microsoft Word")
if (handle == 0)
exit

//
// Move and size window to my specs
//
MoveWindow (handle, 200, 15)
SizeWindow (handle, 900, 950)
exit

//------------------------------------------------------------
// CheckRunning - A routine that scans all windows to see
// if a window has a partial matching title text
//------------------------------------------------------------
checkrunning:
//
// Get first window in window list
//
handle = getwindow (hmain, 0)
//
// Loop until no more windows
//
while (handle <> 0) do
//
// Get window text
//
text = getwindowtext (handle)
//
// If the first part of the window text matches the
// argument passed to CheckRunning return handle
//
if (substr (text, 0, length(arg(1))) == arg(1))
return handle
//
// Get next window handle in window list
//
handle = getwindow (handle, 2)
end
//
// No matching window found, return 0
//
return 0
----------------------------------------------------------------------------
Figure 3: The WINCMD WORDFIX program manages the way Word for Windows
starts.
----------------------------------------------------------------------------
MCIPLAY.WCM
Complete Listing
//==============================================================
// MCIPLAY - A WinCmd program that sends command strings using
// the SendMCIString function
// Copyright (c) 1993 Douglas Boling
//==============================================================
//
// Ask the user for an MCI string command
//
string = AskBox ("Enter MCI String", " ")
//
// See if the user pressed the cancel button
//
if (a+string == a)
string = EXIT
//
// Loop until cancel pressed
//
while (string <> exit) do
//
// Send the MCI string
//
answer = SendMCIString (string)
//
// Check for errors. If error, print error string
//
if (substr (answer,0 ,5) == "ERROR")
say answer getmcierrorstring (substr (answer, 6, 10))
else
say answer
//
// Get next command
//
string = AskBox ("Enter MCI String", string)
if (a+string == a)
string = EXIT
end
exit
--------------------------------------------------------------------------
Figure 4: MCIPLAY is a WINCMD program for controlling multimedia devices.
==========================================================================

==============================================================================

Line Token List
------------------------------------------------------

LINE 0 | VAR (FRED) | OPERATOR (=)|CONSTANT (5)|
-----------------------------------------------------------------
LINE 1 | STATEMENT (IF)| VAR (BOB) |OPERATOR (<)|CONSTANT (5)|
-----------------------------------------------------------------------------
LINE 2 | VAR (BOB) | OPERATOR (=)|VAR (FRED) |OPERATOR (+)|CONSTANT(3)|
-----------------------------------------------------------------------------

Figure 5: The WINCMD interpreter uses a list of pointers like this one to execute its programs.
=============================================================================


 December 24, 2017  Add comments

Leave a Reply