|
|
|||
| Version
www.capesoft.com Updated Friday 16 July 2010 |
|||
Welcome to WinEvent. This small library package allows you to leverage the power
of the Windows API. In addition to the WinAlert functions (which allow you access
to the native Windows messages) there are also now Comm's (RS232) functions, Taskbar
functions and Windows Behaviour & System functions.
All the functionality provided in WinEvent is built into Windows itself in one
way or another. The main advantage of WinEvent is two fold.
| Main Advantages | |||
|
|
It provides the functions in a simple easy-to-use manner, avoiding the complexities of the Windows API. | ||
|
|
The functions are (mostly) cross-compatible between 16 and 32 bit implementations of your program. The Taskbar functions and some advanced Comm's functions are only available in 32 bit programs, but all the other functions are the same in 16 and 32 bit programs. | ||
WinEvent functionality is divided into 5 areas:
| Functionality | |||
|
|
Windows message capturing functions (WinAlert) WinAlert allows your CW programs more access to the native Window messages. This is in itself nothing new. Using the sub-classing technique access to the Windows messages has been available since almost the first days of CW. WinAlert provides a simple wrapper to subclassing, which removes the complexities and makes the code both simple to follow, easy to implement, and consistent with the rest of the Clarion language. In essence one new major function, and a couple of support functions allow the flexibility and ease of use that we've come to expect from Clarion. In addition it comes with a template that makes adding this wrapper to your applications even easier. You can use the template to alert messages on individual windows. In addition a utility template makes it possible to enable Auto Shut Down across your entire application. |
||
|
|
RS 232 Port functions Very often developers need simple access to a Comm's port. This simple functionality is built into the Windows API, but is quite complex and difficult to code. In addition to this the APIs for 16 bit and 32 bit Windows are very different. The Comm's section of the WinEvent package provides some simple easy-to-use functions that allow you to read and write to Comm's ports. In addition almost all the functions are the same in 16 and 32 bit ( the library takes care of the API differences ) so it's easier to move from one platform to another. The library also corrects a bug in the Windows functions that affect Comm's at speeds of greater than 19200. Some advanced functions to test specific hardware handshaking lines for their current status are only supported in 32 bit as no 16 bit equivalent exists. |
||
|
|
Taskbar functions Users of Windows 95, and Windows NT 4.0, will be familiar with the Taskbar that usually sits at the bottom of the screen. The taskbar functions allow you to add / change and delete an icon from the "Tray" ( the area at the right hand side of the taskbar ) as well as detect when the mouse has been clicked on an icon in the tray. This is very useful for apps which are running in the background on a full time basis. In addition, you can make use of a function that prevents your program from appearing on the main area of the Taskbar itself. |
||
|
|
Window behaviour functions A small group of functions that allow you to change the behaviour of a window. This includes the ability to make a window permanently "on top", and also the ability to bring the window to the front. |
||
|
|
System functions These functions return system information to your application. The Windows, and Dos (if applicable) version numbers are available to your application. Also you are able to get the current free disk space in 16 and 32 bit. This is useful for detecting low disk space conditions before they occur. A function for playing a wav file is also included. |
||
WinEvent is copyrighted © 2010 by CapeSoft Software. CapeSoft Software assumes no responsibility for applications created which incorporate WinEvent. WinEvent is used entirely at your own risk.
You may not distribute any of the WinEvent files.
Each developer needs his own license to use WinEvent. (Need to
buy
more licenses?)
We welcome your comments, suggestions, and criticisms. Please do not hesitate
to contact us if you have a problem, or a suggestion.
You can contact CapeSoft in one of the following ways:
| CapeSoft Support | |||
| support@capesoft.com | |||
| Telephone | +27 21 715 4000 | ||
| Fax | +27 21 715 2535 | ||
| Post | PO Box 511, Plumstead, 7801, Cape Town, South Africa | ||
Purchase WinEvent at $149.00 from:
| CapeSoft Sales | |||
| Web | www.capesoft.com | ||
|
|
|||
| Telephone | +27 21 715 4000 | ||
| Fax | +27 21 715 2535 | ||
| Post | PO Box 511, Plumstead, 7801, Cape Town, South Africa | ||
| Buy Online | |||
| Web |
www.clarionshop.com |
||
To install WinEvent, run the supplied installation file and follow the prompts.
You are free to distribute the WinEvent DLLs with any of your Applications without
extra charge.
The DLLs your program require will depend on your version of Clarion. Note that
programs compiled in Local Mode do not use DLLs and therefore there is
nothing extra for you to distribute.
| DLLs required (Standalone mode only) | |||
|
Clarion Version
|
DLL required | ||
| Clarion 6 | WE60X.DLL | ||
| Clarion 5.5 | WE55X.DLL | ||
| Clarion 5 | EVENT532.DLL | ||
This manual is split into two sections. This first section contains a general
overview of the WinEvent features. Each of the WinEvent function areas is dealt
with and the templates provided are discussed here.
The second section is the Technical Reference. In this section the individual
functions are described, along with their syntax. This is particularly useful
as most of these functions are designed to be used in simple embed points etc.
Included in the WinEvent package is a simple example program that demonstrates all of WinEvent's features. This example is in the \Clarion\3rdParty\Examples\Winevent\Windemo directory and is called WinDemo.
There is also an example of a barcode collector
program. This is stored in \Clarion\3rdParty\Examples\Winevent\Barcode
To use the WinEvent functions in your application you must first enable them. This is done by selecting the Global Properties option from the Application dropdown menu, selecting the Extensions button then the Insert button, scrolling down the extension options and then selecting EnableWinEvent - Enable the WinEvent functions in your app.

On the Settings tab of the WinEvent global extension template:

The Auto-Shutdown on tick box to apply the automatic shutdown function to your application. This will then be globally applied to the application. By default, this feature is on, but you can disable it here if you'd like to. You can also disable it at a local level as well.
The Make windows visible on Desktop will ensure that when your windows open, they are visible on the desktop area. You can disable this locally if there are specific windows that don't require this feature (otherwise by default it will be on for all windows in your application).
You need to add the WinEvent global extension template to each of your applications that use the WinEvent functions. If you are using the Auto-Shutdown or Make windows visible on desktop functionality, then you will need to add WinEvent to all the dlls with window procedures in them.
First some terminology. An Event is the Clarion word for a message that is provided
to you via the ACCEPT loop. A Message is the Windows equivalent. Part of the job
of the Accept command is to filter out many of these Messages, and pass on only
those Events that are usually required.
The idea is to use a new function, called WinAlert in the same way you would use
the Alert function for keystrokes. This allows you to get at the messages before
the Accept command does, taking further action where it is required. In addition
to simply spotting the message, you can also specify its action at the same time.
Some messages require an immediate reply (usually True or False) to the procedure
that sent the message. However most messages would be required simply so that
you can gain more control over the things that are happening. In this case a user
event, is posted to the Accept loop, after storing the value of the Message.
To further complicate the issue Messages can also have additional data tagged
on with them. This data is stored in 2 variables, often going by the somewhat
cryptic names of wParam and lParam. The w and l represent the data type (w for
Word - ie a Short (16bit programs) or Long (32 bit programs) and l for Long). On receiving the User event, WinMessageEvent
you can use 2 new support functions, WinParam1() and WinParam2() to get the values
of these parameters when the message arrived, as well as the Winevent() function
to see which windows message triggered the event.
One of the most frequently asked questions on the Internet's cw-talk mailing list, is "How do I get my application to terminate automatically when the user shuts down Windows ?" Using WinEvent the answer is both simple and elegant. you simply add the WinEvent global extension template and leave the defaults checked and away you go.
You can override some of the global defaults set in the Global WinEvent Extension template in the WinEvent: Alert Windows Messages local extension template that is populated onto each window:

If Auto Shutdown has been globally set for your application, this option will enable you to disable the Auto Shutdown for when a selected window is the focus window (i.e. a window that requires you to save information before closing).
Make this window visible on Desktop allows you to either use the Default option (i.e. the setting in the Global Extension template) - or force it to override the global default option using the Yes or No option.
You can also use the Append compile date to title bar - which by default is turned off as it would only be necessary on one of your windows in your application (if you require this functionality).
The WinEvent extension template, which is included, assist's you in using the WinAlert functions. It organizes in one place the three items that are required, namely Alerting the message, handling any action that may be required, and unAlerting the message before closing the window. The template leads you through the options that you have, and provides you with the required embed point for processing the WinMessageEvent. You may alert as many Windows messages as you like.


You can view a list of the Windows Messages to equate in the eventequ.clw file (which is found in your Clarion6\3rdparty\libsrc directory).
Action (group 1):
WinAccept is a event handler that will accept the windows event before it arrives at your window. Action (group 1) determines what reply WinAccept must do (for the Windows Kernel) when this event is received. If Return 1 or Return 0 is selected, then those values are returned to the Windows kernel, otherwise the event is passed on to Clarion for Clarion to return a value to the Windows kernel.
Action (group 2):
These options are telling WinAccept what to do with the event - in terms of forwarding it on to your Clarion procedure. There are 3 possible options you can select:
None will do nothing further with the event received.
Post WinMessageEvent will post the user event on to the Event handler (which means you can run code when that event is passed to the event handler).
case Event() - WinMessageEvent
of 0 ! WinMessageEvent
!Put your code in here to process when this event is received.
Post Equivalent Event will assess the received windows message and post a suitable Clarion equivalent to the window as follows:
| Windows Message | Clarion Event posted |
| WE::WM_CLOSE | Event:CloseWindow |
| WE::WM_MOUSEMOVE | Event:MouseMove |
| WE::WM_NCMOUSEMOVE | |
| WE::WM_TIMER | Event:Timer |
| WE::WM_LBUTTONDOWN | Event:MouseDown |
| WE::WM_RBUTTONDOWN | |
| WE::WM_NCRBUTTONDOWN | |
| WE::WM_NCLBUTTONDOWN | |
| WE::WM_NCMBUTTONDOWN | |
| WE::WM_MBUTTONDOWN | |
| WE::WM_LBUTTONUP | Event:MouseUp |
| WE::WM_RBUTTONUP | |
| WE::WM_NCRBUTTONUP | |
| WE::WM_NCLBUTTONUP | |
| WE::WM_NCMBUTTONUP | |
| WE::WM_MBUTTONUP |
Please Note: If using the WE::WM_MouseWheel on a window with a listbox, then only the mouse wheel events occurring when the mouse wheel button is depressed will be passed to the WinAccept. Windows will only pass on the mouse wheel events when a list box is not present.
Basically when you ask Windows to shut itself down it polls each running application by sending it the WM_QueryEndSession message. If all the applications respond by returning True, then they are each, in turn, instructed to close. In the above line of code you are telling the WinEvent library, that when the window receives this message, then it must return True. The utility template automatically adds an instance of the WinEvent extension template to each of your procedures.
This details how to add WinAlert functionality to a hand-coded project. For a
detailed description of each of the functions, see the Reference section of this
document.
| Adding WinAlert to a function | |||
|
|
Use the WinAlert function to alert the message. This should be called before the Accept command, but after the window is opened. | ||
|
|
Use the WinAlert function, with no parameters, before Closing the window. | ||
|
|
Use the WinEvent's WinControl, WinParam1 and WinParam2 functions to examine the message. | ||
| Enabling WinAlert in the root module | |||
|
|
Include the (supplied in \clarion\libsrc ) map file, EventMap.Clw, in your Global Map. | ||
|
|
Include the (supplied in \clarion\libsrc ) equates file, EventEqu.Clw in your main module's data section. | ||
|
|
Clarion 5: Add the Event532.Lib file to your project
for Stand-Alone compile mode or EvLib532.Lib for Local compiles.
All these library files are in your \clarion5\3rdparty\lib directory.
Clarion 5.5: Add the we55x.Lib file to your project for Stand-Alone compile mode or we55xL.Lib for Local compiles. All these library files are in your \clarion 55\3rdparty\lib directory. Clarion 6: Add the we60x.Lib file to your project for Stand-Alone compile mode or we60xL.Lib for Local compiles. All these library files are in your \clarion 60\3rdparty\lib directory. |
||
Note: A WinEvent Demo has been included with WinEvent (\Clarion X\3rdParty\examples\WinEvent\Demo\windemo.app) and can be used to view how these features can be used.
The Comm's section of the WinEvent package provides some simple easy-to-use functions that allow you to read and write to Comm's ports (RS232).
| Using Comms functions in a hand-coded project | |||
|
|
Include the (supplied in \clarion\libsrc ) map file, EventMap.Clw, in your Global Map. | ||
|
|
Include the (supplied in \clarion\libsrc ) equates file, EventEqu.Clw in your main module's data section. | ||
|
|
Clarion 5: Add
the Event532.Lib file to your project for Stand-Alone compile mode or EvLib532.Lib
for Local compiles. All these library files are in your \clarion5\3rdparty\lib directory.
Clarion 5.5: Add the we55x.Lib file to your project for Stand-Alone compile mode or we55xL.Lib for Local compiles. All these library files are in your \clarion55\3rdparty\lib directory. Clarion 6: Add the we60x.Lib file to your project for Stand-Alone compile mode or we60xL.Lib for Local compiles. All these library files are in your \clarion6\3rdparty\lib directory. |
||
Newport
ReadPort
WritePort
ResetPort
ClosePort
KillAllPorts
SetHandShake
CtsHigh
DsrHigh
RingHigh
CdHigh
SetRts
SetDtr
For a detailed description of each of the functions, see the reference section. You will need to handcode the functions into your application where you need them.
There are a number of Taskbar functions which allow your application to interact with the Windows Taskbar. These functions allow you to add icons to the Taskbar's tray, add balloon text, menu option and also allow you to prevent your application (icon) from appearing on the taskbar.
![]()
An Extension template has been provided to add an icon to the tray. This icon
will automatically be put in the tray when the window is opened, and automatically
removed when the window is closed. You can also use the functions in hand code
to add, change and remove icons at will.
If you place an Icon in the tray, then you will also probably want to capture
mouse events when the user interacts with this icon. We've included some generic
default behaviour, but you may like to add some more options. In WinEvent this is done
automatically for you. The template also takes care of all the details - there
are embed points so you can add your code for the event, and there are buttons
on the AddIcon template to easily get to those embed points.
Tip: Use the Mouse Right Up embed point for opening a Pop-up menu.

The name of the icon to add is the filename of the icon to add to the systemtray. You can use a ~ to use icons included in the project.
The Icon tip is the text for the default tooltip that will appear. You can change this at runtime using the WinTaskBarChangeIcon function
Note: For use with services, you must use the icon handle to change the icon at runtime.
Use the Code to Run when Events are received button to get to the embed points to code in your handcode to run when handling received events. If you used the old embed points (where there was one button for each embed point on the template) - then check the Show Old Event Buttons checkbox and you will be able to edit your previous code through the Old Embeds tab.
The Add Show|Hide|Close Menu to right-click Popup option allows the template to build this functionality into the taskbar icon easily. These are pretty standard functions that you will probably require when using the taskbar functionality.
Checking the Hide Window on Startup option will ensure that your application opens in minimized mode when starting.
Checking the Not on Toolbar when Minimized will make sure that your window is removed from the taskbar when minimizing (so that it will only appear in the systemtray).
Checking the Only Close from popup menu will mean that when clicking the X button (the red x on the right side of the titlebar), the application is minimized instead of closing (as well as all other CloseWindow controls). This means that the user must exit through the correct option instead of merely clicking the X. If you would like to allow your user another method of exiting the application (like through a window option) then you can code the following:
WE::CloseAllNow = 1
post(event:closewindow)
Checking the Left click Icon shows window option will restore the window if the user clicks on the icon in the system tray.
You can use the Add items to the popup
button to add other items to the popup menu. You will need to handcode these
calls in as follows:
WE::MouseRightPopup.AddItem('Process','Process
the Records')
You can use menus in the popup as well:
WE::MouseRightPopup.AddItem('Menu','Menu','-',1)
WE::MouseRightPopup.AddItem('Do it','Do it','Menu',2)
You can use the Handle new popup items
button to add other items to the popup menu. You will need to handcode these
calls in as follows (the code needs to appear between the 'Run popup for
Show|Hide|Close' and the 'Perform Show|Hide|Close' embed points):
of 'Process the Records'
ProcessTheRecords()
Note : The message is ultimately processed by the Accept command. If your
program spends a long time processing between calls to the Accept loop then you
may notice a delay between clicking on the Icon, and the execution of your embedded
code. For better responses make sure your program frequently returns to the Accept
command.
Note: If you have hand-coded handling these events then you should be aware that the method has changed and your old code will no longer work. In the past the event came through as WinMessageEvent. This has been changed - the mouse events are now separated and come through as WinMessageEvent+500+x where x is 512 (mouse move) or 513(mouse left down) or 514(mouse left up) or 515(double left click) or 516(mouse right down) or 517(mouse right up).
WinTaskbarAddIcon
WinTaskbarChangeIcon
WinTaskbarRemoveIcon
WinNotOnTaskbar
ds_WinTaskbarBalloon
For a detailed description of each of the functions, see the reference section.
WinOnTop
WinNotOnTop
WinBringToFront
ds_WinTransparent
ds_VisibleOnDesktop
ds_ShowWindow
ds_HideWindow
For a detailed description of each of the functions, see the reference section.
ds_GetWinVersion
WindowsVersion
WindowsRelease
DosVersion
DosRelease
Sound
GetWindowsDir
GetSystemWindowsDir
ScreenWidth
ScreenHeight
ScreenDepth
ds_GetScreenDPI
ds_GetUserName
ds_GetWorkstationName
ds_IsMediaCenter
ds_IsTerminalServer
ds_IsTablet
ds_IsStarter
ds_OnNetwork
ds_RefreshDesktop
For a detailed description of each of the
functions, see the reference section.
GetFreeDiskSpace
GetDiskSpace
ds_GetDiskMegs
ds_Memory
For a detailed description of each of the
functions, see the reference section.
ds_GetReg
ds_PutReg
For a detailed description of each of the
functions, see the reference section.
ds_FastClock
ds_FormatFastTime
ds_Timer
ds_Sleep
ds_WeekDay
ds_ReadCPUTimeStamp
For a detailed description of each of the
functions, see the reference section.
ds_DeleteFile
ds_GetFileDirEntry
ds_SetFileAttributes
ds_CreateDirectory
ds_CopyDirectory
ds_RemoveDirectory
ds_SetFileDateTime
ds_MoveFile
ds_GetFolderPath
ds_GetTempPath
ds_String2File
ds_File2String
ds_GetHModule
ds_GetHIcon
ds_CreateShortcutEx
ds_GetFileVersionInfo
ds_GetCurrentEXEDate
For a detailed description of each of the functions, see the reference section.
ds_GetCurrentProcess
ds_GetCurrentThread
ds_GetProcessTime
ds_GetThreadTime
ds_SetRealTimePriority
For a detailed description of each of the
functions, see the reference section.
ds_LoadDLLProc
ds_UnloadDLLProc
ds_GetDLLVersion
For a detailed description of each of the
functions, see the reference section.
ds_GSMSendSMS
ds_GSMEnterPin
ds_GSMEchoOFF
ds_GSMSetSMSTextmode
ds_GetGSMReply
ds_EmptyPort
ds_GSMReadSMSInit
ds_GSMReadSMS
ds_GSMDeleteSMS
ds_GSMSetSMSReporting
ds_GSMSelectSR
ds_GSMReadSMSReportInit
ds_GSMReadSMSReport
ds_GSMDeleteSMSReport
ds_GSMReadEvents
ds_GSMSetEvents
ds_GSMReset
For a detailed description of each of the
functions, see the reference section.
First, some Important info:
Note: Using a GSM modem is really the only way to send and receive SMSes using WinEvent. Phones themselves vary widely in the ability to handle GSM and every manufacturer's GSM protocol (Commands, etc) are so widely varied, that they will be impossible to support (although you may be lucky - but to avoid the frustration, get a modem).
Note: Only the standard Charset is supported at this stage. We will include the ability to change charsets as soon as possible.
Note: Modems tested with WinEvent: Siemens TC35i, SonyEricson GT47 and Wavecom Wismo (serial only). Please let us know if you have tested with other models of Modems, and we'll add those to this list.
First call NewPort and wait for it to finish before sending an sms - it will look something like the following:
LOC:SMSPortID = NewPort('COM' &clip(left(pComport)) &':' &clip(left(pBaud)) &', ' &clip(left(pParity)) &', ' &clip(left(pPData)) &', ' &clip(left(pStop)))You need to wait a couple of seconds between sending SMS's. You can use a window timer event for this. Have a look at the ds_GSMSendSMS function for details.
Make sure there is space on the SIM card (although you shouldn't need the space unless you are reading SMS's, but it's a good idea anyway). Take a look at the ds_GSMReadSMS and ds_GSMDeleteSMS functions.
ds_OutputDebugString
ds_Debug
ds_WineventDebug
ds_ViewDebug
ds_ViewDebugClose
ds_Error
ds_ErrorCode
ds_ErrorReset
ds_SaveStack
ds_TestStack
For a detailed description of each of the
functions, see the reference section.
Auto-shutdown gives your application the ability to automatically shutdown when windows performs a restart or shutdown or user logoff while your application is running. This is on by default when you add the WinEvent global extension template to your application.
Note: If you have a Multi-DLL application and require the Auto-shutdown throughout your application, then you need to add the global extension to each application in the Multi-DLL suite. You can override this locally at the template level by checking the 'Disable Auto Shutdown' checkbox - if there are specific windows where you would like to disable the auto-shutdown.
For handcoded window procedures, you'll need to code the following:
ds_SetOKToEndSessionHandler
ds_SetEndSessionHandler
ds_SetNoEndSession
For a detailed description of each of the functions, see the reference section.
When you select Auto-Shutdown on your Global WinEvent Extension
two callback functions MyOKToEndSessionHandler & MyEndSessionHandler are
added to your app. These appear in your Global Embeds list as :
Winevent MyOKToEndSessionHandler
Winevent MyEndSessionHandler
Use MyOKToEndSessionHandler to tell windows whether it is OK to shut down
now. Set the return value variable OKToEndSession to FALSE if you do
not what to allow shutdown now.
If you have given the go ahead to shutdown and no other program has refused
then MyEndSessionHandler will be called before windows ends this
application. This is for you to save any settings etc. Please
note that windows ends all your app threads without allowing then to execute
the closing window code you may have written. This is your only chance
to execute code.
If either your MyEndSessionHandler or MyOKToEndSessionHandler code takes
longer than 3 seconds to execute then windows (XP 2K etc) pops up a "Ending
Application" window which gives you about 15 seconds.
ds_FormatHex
ds_SetClipboard
ds_ShutDown
ds_WineventVersion
ds_Ulong64ToReal
For a detailed description of each of the
functions, see the reference section.
WinAlert
Winevent
WinControl
WinParam1
WinParam2
WinChangeUserEvent
WinSysEvent
WinSysParam1
WinSysParam2
WinWtsEvent
WinWtsID
NewPort
ResetPort
ClosePort
KillAllPorts
WritePort
ReadPort
SetHandShake
CtsHigh
DsrHigh
RingHigh
CdHigh
SetRts
SetDtr
WinTaskBarAddIcon
WinTaskBarRemoveIcon
WinTaskBarChangeIcon
WinNotOnTaskBar
ds_WinTaskbarBalloon
WinOnTop
WinNotOnTop
WinBringToFront
ds_WinTransparent
ds_VisibleOnDesktop
ds_ShowWindow
ds_HideWindow
ds_GetWinVersion
WindowsVersion
WindowsRelease
DosVersion
DosRelease
GetFreeDiskSpace
GetDiskSpace
Sound
GetWindowsDir
GetSystemWindowsDir
ScreenWidth
ScreenHeight
ScreenDepth
ds_GetScreenDPI
ds_GetUserName
ds_GetWorkstationName
ds_IsMediaCenter
ds_IsTerminalServer
ds_IsTablet
ds_IsStarter
ds_OnNetwork
ds_FastClock
ds_FormatFastTime
ds_Timer
ds_Sleep
ds_WeekDay
ds_DeleteFile
ds_GetFileDirEntry
ds_SetFileAttributes
ds_CreateDirectory
ds_RemoveDirectory
ds_SetFileDateTime
ds_MoveFile
ds_GetFolderPath
ds_GetTempPath
ds_String2File
ds_File2String
ds_GetHModule
ds_GetHIcon
ds_CreateShortcut
ds_GetFileVersionInfo
ds_LoadDLLProc
ds_UnloadDLLProc
ds_GSMSendSMS
ds_GSMEnterPin
ds_GSMEchoOFF
ds_GSMSetSMSTextmode
ds_GetGSMReply
ds_EmptyPort
ds_GSMReadSMSInit
ds_GSMReadSMS
ds_GSMDeleteSMS
ds_GSMSetSMSReporting
ds_GSMSelectSR
ds_GSMReadSMSReportInit
ds_GSMReadSMSReport
ds_GSMDeleteSMSReport
ds_GSMReadEvents
ds_GSMSetEvents
ds_GSMReset
ds_Debug
ds_WineventDebug
ds_ViewDebug
ds_ViewDebugClose
ds_Error
ds_ErrorCode
ds_ErrorReset
ds_SaveStack
ds_TestStack
WinAlert : For alerting windows messages
WinEvent : For handling standard windows messages.
WinWtsEvent : For handling the wm_WTSSESSION_CHANGE windows message.
| Value | Meaning |
|---|---|
| WTS_CONSOLE_CONNECT 0x1 |
A session was connected to the console session. |
| WTS_CONSOLE_DISCONNECT 0x2 |
A session was disconnected from the console session. |
| WTS_REMOTE_CONNECT 0x3 |
A session was connected to the remote session. |
| WTS_REMOTE_DISCONNECT 0x4 |
A session was disconnected from the remote session. |
| WTS_SESSION_LOGON 0x5 |
A user has logged on to the session. |
| WTS_SESSION_LOGOFF 0x6 |
A user has logged off the session. |
| WTS_SESSION_LOCK 0x7 |
A session has been locked. |
| WTS_SESSION_UNLOCK 0x8 |
A session has been unlocked. |
| WTS_SESSION_REMOTE_CONTROL 0x9 |
A session has changed its remote controlled status.
To determine the status, call
|
WinAlert : For alerting windows messages
WinEvent : For handling standard windows messages.
WinSysEvent : For handling the wm_SYSCOMMAND windows message.
mode ( string ) : This is a mode string such as would be accepted by the Dos MODE
command.
in buffer size (long) ( optional parameter - default 512 bytes )
out buffer size (long) ( optional parameter - default 512 bytes )
These are the sizes Windows must use for the In and Out buffers.
pUseEvents (byte) (optional parameter - default = 0)
When set (TRUE) the current window will receive com events.
Comms transmit buffer empty event = WinEventMessage + 5601
Comms characters received = WinEventMessage + 5602
Comms handshaking lines changed = WinEventMessage + 5602
Returns :
Long
<0 if an error has occurred. Otherwise a port number used by readport and writeport.
![]()
Note: Do not use:
if WritePort(pid,buf,10) >= 0
!Successful write
end
instead of:
bytessent = WritePort(pid,buf,10)
if bytessent
!Successful write
end
Tip: To monitor the port in the background (i.e. without hogging processing time) - you can put the ReadPort in a timer event (Timer set to at least 100 - unless for mission critical timing applications). If the ReadPort returns a 0 then just skip the code for handling the buffer code. In 32bit, windows has an almost unlimited COMPort buffer, so you don't have to worry about comms going missing (if it's not monitored in a tight loop).
Additional notes:
There are 3 events available for event tracking:
To track these events, you can place code in the relative embed point to run when one of these events occurs:

pText (string) : The balloon text. If no balloon text is supplied then any open balloon is closed. Embedding '<13,10>' in the text produces multiline text.
pTitle (string) : Optional. The balloon title. Icons only appear if the title is supplied.
pFlags (uLong) : Optional. Default = 1 (An information icon).
WE::NIIF_ERROR EQUATE(003h) An error icon.
WE::NIIF_INFO EQUATE(001h) An information icon. (Default)
WE::NIIF_NONE EQUATE(000h) No icon.
WE::NIIF_WARNING EQUATE(002h) A warning icon.
WE::NIIF_NOSOUND EQUATE(010h) XP/Vista only. Do not play the associated sound.
pTimeout (ulong) : Optional. Default=1500 (15 seconds). Balloon minimum
display time in 100ths of a second. (clarion time)
If the balloon is not displaying, then try the winevent demo application (Go to Taskbar Functions - and you will find the show|hide balloon buttons that you can use to test this functionality). If it is not working, then you have balloontips turned off in your windows registry. Search for BalloonTips, and change the value of the key you find from 0 to 1.
To hide the window
window{prop:iconize} = TRUE
window{prop:hide} = TRUE
To unhide the window
window{prop:hide} = FALSE
window{prop:iconize} = FALSE
Note that the order of the hide / iconize commands is important
pGrabFocus (byte) : Optional. Defaults to TRUE. When set you window takes focus and so keyboard input goes to your window.
Returns
None.
Returns
NB: Only available for non-MDI windows.
pWinY (*long) : Optional. If omitted then the current target window is used. If supplied then the variable is updated.
pWinWidth (*long) : Optional. If omitted then the current target window is used. If supplied then the variable is updated.
pWinHeight (*long) : Optional. If omitted then the current target window is used. If supplied then the variable is updated.
pMode (long) : Optional. Default=1 When set this flags that
the window must not be obscured by the taskbar.
Win XXX ...............
Note: At least up to Clarion6.3 9056, the Clarion IDE is run in XP
compatibility mode on Windows Vista. This means that when running an application
from within the IDE, the ds_GetWinVersion will return Win XP, and not Win Vista.
The same application run from a normal shortcut will return the correct windows
version (i.e. Win Vista).
pSelector (string) : Optional. Defaults to 'USER FREE' This modifies the returned disk size.
'USER FREE' Returns the free disk space
available to the current user.
'TOTAL'
Returns the total disk size.
'TOTAL FREE' Returns the free disk space on the
drive.
pSelector (string) : Optional. Defaults to 'USER' This specifies which RAM size is returned.
'USER'
Returns the virtual memory used by this application.
'SWAP USED' Returns the page file used
kBytes.
'SWAP FREE' Returns the page file free
kBytes.
'SWAP TOTAL' Returns the page file total
kBytes.
'RAM USED' Returns
the physical RAM used kBytes.
'RAM FREE' Returns
the physical RAM free kBytes.
'RAM TOTAL' Returns the
physical RAM total kBytes.
'VMEM USED' Returns the virtual memory
used kBytes.
'VMEM FREE' Returns the virtual memory
free kBytes.
'VMEM TOTAL' Returns the virtual memory
total kBytes.
hKey (long)
The top level key containing the section of the registry to read. Valid values
are;
WE::WM_HKEY_CLASSES_ROOT
WE::WM_HKEY_CURRENT_USER
WE::WM_HKEY_LOCAL_MACHINE
WE::WM_HKEY_USERS
SubKeyPath (string)
The path inside the registry to the item you want to read.
ValueName (String)
The name of the variable you want to read.
hKey (long)
The top level key containing the section of the registry to write. Valid values
are;
WE::WM_HKEY_CLASSES_ROOT
WE::WM_HKEY_CURRENT_USER
WE::WM_HKEY_LOCAL_MACHINE
WE::WM_HKEY_USERS
SubKeyPath (string)
The path inside the registry to the item you want to write.
ValueName (String)
The name of the variable you want to write.
Value (String)
The value you want to write into the registry.
Type (Long)
the type of the value you are writing. Valid values are;
WE::REG_SZ
!!// Unicode nul terminated string
WE::REG_EXPAND_SZ
!!// Unicode nul terminated string
WE::REG_BINARY
!!// Free form binary
WE::REG_DWORD
!!// 32-bit number
WE::REG_DWORD_LITTLE_ENDIAN !!// 32-bit number (same as REG_DWORD)
WE::REG_DWORD_BIG_ENDIAN !!// 32-bit number
WE::REG_MULTI_SZ
!!// Multiple Unicode strings
Default value for this parameter is WE::REG_SZ.
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Nothing.
![]()
UseCPUTimeStamp (byte) : Optional, Default = FALSE. If set then the
ds_ReadCPUTimeStamp() function is used to return the time down to a resolution
of the CPU clock. (1 GHz = 1ns resolution)
ReSyncTime (byte) : Optional, Default = FALSE. Use (once) when time has
been adjusted and so ds_FastClock <> Clock().
![]()
pFastTime (real) : The time in 100 ths of a second (clarion time).
pDecimalPlaces (long) : Optional. The number of decimal places to display.
![]()
pFastTime (real) : The time in 100 ths of a second (clarion time) for which
to sleep.
![]()
pTimerNumber (long) : Used to specify multiple timers (per thread)
pFastTime (real) : The time in 100 ths of a second (clarion time).
Returns
![]()
pDate (long) : The date for which the week day is required. (Clarion date)
pShortFormatFlag (byte) : Optional. If TRUE(1) then the short name for
the day is returned. "Wednesday" would return as "Wed"
Returns
![]()
pSaveREal (*real) : The 64 bit number returned by the CPU is saved into this real. Will overflow after 52 bits. (50 days at 1GHz)
![]()
pSaveREal (*real) : The 64 bit number returned by the CPU is saved into this real. Will overflow after 52 bits. (50 days at 1GHz)
![]()
pFileName (string) : Specify the file (with path) to delete.
Returns
code
ds_DeleteFile('c:\FileName.ext')
![]()
pFileName (string) : Specify the file (with path) for which the directory entry data is required.
pEntryG (*string) : Provide the lable of an EntryG structure. See example below.
Returns
EntryG group,PRE(EntryG)
name STRING(256)
shortname string(13)
date
LONG
time
LONG
size
LONG
attrib BYTE
end
code
ds_GetFileDirEntry('c:\FileName.ext',EntryG)
! fills the EntryG with the files directory attributes.
![]()
pFileName (string) : Specify the file (with path) for which the directory entry data is required.
pNewFileAttribs (byte) : Specify the new attributes.
ff_:NORMAL EQUATE(0) !Always active
ff_:READONLY EQUATE(1) !Not for use as attributes parameter
ff_:HIDDEN EQUATE(2)
ff_:SYSTEM EQUATE(4)
ff_:DIRECTORY EQUATE(10H)
ff_:ARCHIVE EQUATE(20H) ! NOT Win95 compatible
Returns
code
ds_SetFileAttributes('c:\FileName.ext',0)
! clears files attributes.
![]()
Source (string) : The name of the source directory to copy from.
Destination (string) : The name of the destination directory to copy to. If the destination directory does not exist it will be created.
Mask (string) : The mask for files in the source folder(s) to copy. For example *.htm will copy only files with the htm extension. If this parameter is left blank then the default mask, *.*, will be used.
IncludeSubDirectories (long) : Set to 1 for sub-directories to be copied as well. Set to 0 if only files must be copied. This parameter is option, the default value is 0 (ie by default sub-directories are not copied.)
IncludeHiddenFiles (long) : This parameter is optional, the default value is 1. If you do not want to copy hidden files then set this parameter to 0.
IncludeSystemFiles (long) : This parameter is optional, the default value is 1. If you do not want to copy system files then set this parameter to 0.
ProgressControl (long) : The Use Equate number of a progress control on the window. If this is set then the progress bar will be updated as the Copy command progresses. If it is set to 0 or omitted then no progress control will be updated.
StringControl (long) : The Use Equate number of a string control on the window that will be updated with the name of the file currently being copied. If set to 0, or omitted, then no string control will be updated.
code
ans = ds_CopyDirectory(FileSelected,CopyTo,'*.*',1,1,1,?Progress1,?String1)
![]()
pNewDirectoryName (string) : Specify the name (including path) of the new directory to create.
Returns
code
ds_CreateDirectory('c:\My
New Directory') ! creates the directory
![]()
pDirectoryName (string) : Specify the name (including path) of the directory to remove.
Returns
code
ds_RemoveDirectory('c:\My
New Directory') ! removes any empty directory.
![]()
pFileName (string) : Specify the file (with path) for which the directory is to be modified.
pNewDate (long) : New date (clarion date) for the file.
pNewTime (long) : New time (clarion time) for the file.
Returns
code
ds_SetFileDateTime('c:\MyFile.txt',today(),clock())
! Sets the files date and time to now.
![]()
pFileName (string) : Specify the file (with path) to be moved.
pNewFileName (string) : Specify the new file (with new path).
Returns
code
ds_MoveFile('c:\MyFile.txt','c:\NewDirectory\NewFileName.ext')
! moves and renames the file to the directory.
![]()
pCSIDL (long) : A CSIDL equate specifying the windows folder.
pCreateFlag (byte) : Optional. If TRUE (1) then the folder will be created if it does not exist.
WE::CSIDL_DESKTOP equate(000h)
! C:\Documents and Settings\username\Desktop
WE::CSIDL_PROGRAMS equate(002h)
! C:\Documents and Settings\username\Start
Menu\Programs
WE::CSIDL_PERSONAL equate(005h)
! C:\Documents and Settings\username\My
Documents
WE::CSIDL_FAVORITES equate(006h)
! C:\Documents and Settings\username\Favorites
WE::CSIDL_STARTUP equate(007h)
! C:\Documents and Settings\username\Start
Menu\Programs\Startup
WE::CSIDL_RECENT equate(008h)
! C:\Documents and Settings\username\My Recent
Documents
WE::CSIDL_SENDTO equate(009h)
! C:\Documents and Settings\username\SendTo
WE::CSIDL_STARTMENU equate(00Bh)
! C:\Documents and Settings\username\Start Menu
WE::CSIDL_MYMUSIC equate(00Dh)
! C:\Documents and Settings\username\My
Documents\My Music
WE::CSIDL_DESKTOPDIRECTORY equate(010h)
! C:\Documents and
Settings\username\Desktop
WE::CSIDL_NETHOOD equate(013h)
! C:\Documents and Settings\username\NetHood
WE::CSIDL_FONTS equate(014h)
! C:\Windows\Fonts
WE::CSIDL_TEMPLATES equate(015h)
! C:\Documents and Settings\username\Templates
WE::CSIDL_COMMON_STARTMENU equate(016h)
!*C:\Documents and Settings\All
Users\Start Menu
WE::CSIDL_COMMON_PROGRAMS equate(017h)
! C:\Documents and Settings\All
Users\Start Menu\Programs
WE::CSIDL_COMMON_STARTUP equate(018h)
!*C:\Documents and Settings\All
Users\Start Menu\Programs\Startup
WE::CSIDL_COMMON_DESKTOPDIRECTORY equate(019h)
!*C:\Documents and Settings\All
Users\Desktop
WE::CSIDL_APPDATA equate(01Ah)
! C:\Documents and Settings\username\Application
Data
WE::CSIDL_PRINTHOOD equate(01Bh)
! C:\Documents and Settings\username\PrintHood
WE::CSIDL_LOCAL_APPDATA equate(01Ch)
! C:\Documents and Settings\username\Local
Settings\Application Data
WE::CSIDL_ALTSTARTUP equate(01Dh)
!*
WE::CSIDL_COMMON_ALTSTARTUP equate(01Eh)
!*
WE::CSIDL_COMMON_FAVORITES equate(01Fh)
!*C:\Documents and Settings\All
Users\Favorites
WE::CSIDL_INTERNET_CACHE equate(020h)
! C:\Documents and Settings\username\Local
Settings\Temporary Internet Files
WE::CSIDL_COOKIES equate(021h)
! C:\Documents and Settings\username\Cookies
WE::CSIDL_HISTORY equate(022h)
! C:\Documents and Settings\username\Local
Settings\History
WE::CSIDL_COMMON_APPDATA equate(023h)
! C:\Documents and Settings\All
Users\Application Data
WE::CSIDL_WINDOWS equate(024h)
! C:\Windows
WE::CSIDL_SYSTEM equate(025h)
! C:\Windows\System32
WE::CSIDL_PROGRAM_FILES equate(026h)
! C:\Program Files
WE::CSIDL_MYPICTURES equate(027h)
! C:\Documents and Settings\username\My
Documents\My Pictures
WE::CSIDL_PROFILE equate(028h)
!*C:\Documents and Settings\username
WE::CSIDL_PROGRAM_FILES_COMMON equate(02Bh)
!#C:\Program Files\Common
WE::CSIDL_COMMON_TEMPLATES equate(02Dh)
!*C:\Documents and Settings\All
Users\Templates
WE::CSIDL_COMMON_DOCUMENTS equate(02Eh)
! C:\Documents and Settings\All
Users\Documents
WE::CSIDL_COMMON_ADMINTOOLS equate(02Fh)
! C:\Documents and Settings\All
Users\Start Menu\Programs\Administrative Tools
WE::CSIDL_ADMINTOOLS equate(030h)
! C:\Documents and Settings\username\Start
Menu\Programs\Administrative Tools
WE::CSIDL_COMMON_MUSIC equate(035h)
!*C:\Documents and Settings\All
Users\Documents\My Music
WE::CSIDL_COMMON_PICTURES equate(036h)
!*C:\Documents and Settings\All
Users\Documents\My Pictures
WE::CSIDL_CDBURN_AREA equate(03Bh)
!*C:\Documents and Settings\username\Local
Settings\Application Data\Microsoft\CD Burning
Note: You cannot use CSIDL_CONTROLS, CSIDL_PRINTERS, and CSIDL_DRIVES as these are all virtual drives, and the windows API returns impty strings for these equates.
code
DisplayPath = ds_GetFolderPath(WE::CSIDL_PROGRAMS,1)
! C:\Documents and Settings\username\Start Menu\Programs
DisplayLongPath = longpath(DisplayPath)
Note (a comparison for XP and Vista returns):
WE::CSIDL_Common_Appdata
XP C:\Documents and Settings\All Users\Application Data
Vista C:\ProgramData
WE::CSIDL_AppData
XP C:\Documents and Settings\user.domain\Application Data
Vista C:\Users\user\Roming
WE::CSIDL_Local_Appdata
XP C:\Documents and Settings\user.domain\Local Settings\Applicatin
Data
Vista C:\Users\user\AppData\Local
WE::CSIDL_Program_Files
XP C:\Program Files
Vista C:\Program Files
![]()
None.
Returns
code
DisplayPath = ds_GetTempPath() ! C:\WINDOWS\TMP
![]()
pWriteString (string) : String to be written to file.
pWriteLen (long) : Optional. The length of the string to be written to file. If omitted then the string is clipped before writing to file.
pFileName (string) : The name of the file (including path).
Returns
code
if ds_String2File('Just
Testing',,'C:\MyTestFile.TXT') ! Creates / empties file and then writes data
to file.
message('ds_string2file failed : ' &
ds_error())
end
![]()
pStringRef (ds_StringRef) : The label of a ds_StringRef structure.
pMaxLen (long) : Optional. The max length of the string to be returned. File contents truncated at this length if required.
pFileName (string) : The name of the file (including path).
Returns
NB: You must dispose the returned string after using the contents in order to avoid memory leaks (if the function succeeds):
dispose(TestFileRead.bin)
TestFileRead GROUP(ds_StringRef)
END
code
if ds_string2file('testing 123...',,'c:\testing.txt')
message('ds_string2file failed : ' & ds_error())
end
if ds_file2string(TestFileRead,,'c:\testing.txt')
message('ds_file2string failed : ' & ds_error())
!No need to dispose if it failed
else
DisplayString = TestFileRead.bin ! string read from file.
DisplayLength = TestFileRead.len ! Length of string read from
file.
dispose(TestFileRead.bin)
end
![]()
![]()
pIconName (string) : The name of the icon file or icon resource. Compiled-in icon names must be prefixed with '~'.
pHIconModule (ulong) : Optional. A handle to the module containing the icon.
pIconSize (long) : Optional. The size required. Usually 16X16, 32X32 or 48X48. Defaults to 16X16 if it exists.
![]()
pTargetFile (string) : The file, including the path, to which a shortcut must
be made.
Example C:\WINDOWS\SYSTEM32\CALC.EXE
pIconName (<string>) : The file, including the path, which contains the icon to be used with this shortcut. If omitted then the first icon in the pTargetFile is used.
pIconIndex (long) : The index of the icon within the pIconName file to use. If omitted then the first icon is used.
pDescription (string) : The tip which will appear if the cursor is held over the shortcut.
pHotKey (long) : The hot key to run the shortcut. Omit or use ZERO if
not required.
Example CTRLALTC
pStartIn (string) : The path to the directory in which the file must be run / opened.
pShortCut (string) : The name for the shortcut.
Example 'Calculator.LNK'
pShortCutPath (<string >) : The destination where the shortcut must be
placed. If omitted then defaults to the desktop.
Example C:\Documents and Settings\Derek\Desktop
pArguments (<string>): if you would like to add arguments (i.e. command line parameters) to the shortcut command line, then you can pass these in this parameter.
pReserved (<string>): reserved for future functionality.
This function replaces the deprecated ds_CreateShortCut function (which has no parameter for additional arguments).
![]()
pDescription (string) : Default='FileVersion' The name version data required.
Standard descriptions are as follows:
| Comments | InternalName | ProductName |
| CompanyName | LegalCopyright | ProductVersion |
| FileDescription | LegalTrademarks | PrivateBuild |
| FileVersion | OriginalFilename | SpecialBuild |
pFileName (*string) : Default=Current Module. The name including path of the file from which version data is required.
Returns
code
DisplayInfo = ds_GetFileVersionInfo() ! returns FileVersion by
default.
![]()
None
Returns
code
CurrentEXEDate = ds_GetCurrentEXEDate() ! returns the EXE date by
default.
![]()
pProcName (string) : The name of the DLL procedure. This procedures call address will be returned.
pLibName (string) : The name of the DLL to load.
pProcAddress (ulong) : The call address of the DLL procedure is saved here. Subsequent calls to ds_LoadDLLProc will simply return if this is already set.
pLibInstance (ulong) : Optional. This is used by ds_UnloadDLLProc to
unload the DLL if it is no longer required.
Windows will unload the DLL when your application quits and so this is not
required.
Returns
"Inside global map" - Global embed point
module('windows')
WC_GetDiskFreeSpaceEx(ulong,*dlong,*dlong,*dlong), byte, raw,
pascal, Dll(_fp_) ! The Dll(_fp_) tells the
compiler not to link in this function.
end
"Global Data" - Global embed point
fp_GetDiskFreeSpaceEx
ulong,static,name('WC_GetDiskFreeSpaceEx')
code
if ~ds_LoadDLLProc('GetDiskFreeSpaceExA','kernel32',fp_GetDiskFreeSpaceEx)
result =
WC_GetDiskFreeSpaceEx(0,dlongUserFree,dlongTotal,dlongTotalFree)
...
else
! lib or function not found
message('ds_LoadDLLProc failed : ' & ds_Error())
end
Note: To use an external clarion DLL you need to do the following:
1. You must use the real procedure name from the Clarion DLL (this normally ends with @F - but you will need to check this using a tool such as libmaker.exe to find out the exact name of the function that is exported).
2. You need to add the pascal attribute to your procedure prototype.
![]()
Parameters
pProcAddress (ulong) : The call address of the DLL procedure will be reset. This will force a subsequent call to ds_LoadDLLProc to reload the DLL.
pLibInstance (ulong) : This must be set by ds_LoadDLLProc.
Returns
"Inside global map" - Global embed point
module('windows')
WC_GetDiskFreeSpaceEx(ulong,*dlong,*dlong,*dlong), byte, raw,
pascal, Dll(_fp_) ! The Dll(_fp_) tells the
compiler not to link in this function.
end
"Global Data" - Global embed point
fp_GetDiskFreeSpaceEx
ulong,static,name('WC_GetDiskFreeSpaceEx')
LibInstance
ulong,static
code
if ~ds_LoadDLLProc('GetDiskFreeSpaceExA','kernel32',fp_GetDiskFreeSpaceEx,LibInstance)
result =
WC_GetDiskFreeSpaceEx(0,dlongUserFree,dlongTotal,dlongTotalFree)
...
else
! lib or function not found
message('ds_LoadDLLProc failed : ' & ds_Error())
end
.....
if ds_UnloadDLLProc(fp_GetDiskFreeSpaceEx,LibInstance) ! Unload DLL as no
longer required
message('ds_UnloadDLLProc failed : ' & ds_Error())
end
![]()
pDLLName (string) : The name of the DLL from which version info is required.
pDLLVerInf (*ds_DLLVersionG) : This structure is filled with the version info.
Returns
DLLVerInf group(ds_DLLVersionG) .
code
if ~ds_GetDLLVersion('shell32.dll',DLLVerInf)
! ds_DLLVersionG group
! MajorVersion ulong
! MinorVersion ulong
! BuildNumber ulong
! PlatformID ulong
! String string(30)
! end
if DLLVerInf.MajorVersion > 4
! Taskbar balloons supported under shell
version 5 and higher.
else
! Taskbar balloons not supported.
end
end
![]()
Note : Uses ds_Timer(999).
ds_GSMSendSMS calls the following 4 procedures:
ds_GSMEchoOFF(pPID)
ds_GSMEnterPin(pPID,pPIN)
ds_GSMSetSMSTextmode(pPID)
ds_GSMGetReply...
Parameters
pPID (long) : This is the PortID of the open com port to which the GSM modem is connected. See the NewPort function.
pSMSText (string) : The SMS text string to send. Example 'Please call me. I am low on airtime :)'
pSMSPhoneNumber (string) : The mobile number to send the SMS to.
pPIN (string) : Optional. The PIN number to gain access to the SIM card in
the GSM modem.
The PIN code request on the SIM card may be disabled. In this case the PIN
is not required.
NB : If you try the wrong PIN code 3 times then your SIM may be locked and will
need the PUK number to unlock it. This is not handled by WinEvent.
pSMSID (*long) : Optional. Most GSM modems return an SMS identifier that may
be used with the SMS delivery report to identify which SMS was delivered.
Returns
PID long
SMSID long
code
PID = NewPort('com1:9600,n,8,1')
if ds_GSMSendSMS(PID,'Hello There','08XXXXXXXXX','1234',SMSID)
message = ds_Error()
else
message = 'Send Succeeded, SMSID=' & SMSID1
end
Note: If you want to use non-standard chars (like æøåÆØÅ) then you'll need to use their ASCII value equivalents in the string.
![]()
Parameters
pPID (long) : This is the PortID of the open com port to which the GSM modem is connected. See the NewPort function.
pPIN (string) : The PIN number to gain access to the SIM card in
the GSM modem.
The PIN code request on the SIM card may be disabled. In this case ds_GSMEnterPin
will return 0 (Success).
NB : If you try the wrong PIN code 3 times then your SIM may be locked and will
need the PUK number to unlock it. This is not handled by WinEvent.
Returns
PID long
code
PID = NewPort('com1:9600,n,8,1')
if ds_GSMEchoOFF(PID)
message('ds_GSMEchoOFF failed : ' & ds_Error())
elsif ds_GSMEnterPIN(PID,PIN)
message('ds_GSMEnterPIN failed : ' & ds_Error())
else
message('PIN OK')
end
![]()
Parameters
pPID (long) : This is the PortID of the open com port to which the GSM modem is connected. See the NewPort function.
Returns
PID long
code
PID = NewPort('com1:9600,n,8,1')
if ds_GSMEchoOFF(PID)
message('ds_GSMEchoOFF failed : ' & ds_Error())
else
message('ECHO OFF')
end
![]()
Parameters
pPID (long) : This is the PortID of the open com port to which the GSM modem is connected. See the NewPort function.
Returns
PID long
code
PID = NewPort('com1:9600,n,8,1')
if ds_GSMEchoOFF(PID)
message('ds_GSMEchoOFF failed : ' & ds_Error())
elsif ds_GSMSetSMSTextmode(PID)
message('ds_GSMSetSMSTextmode failed : ' & ds_Error())
else
message('ds_GSMSetSMSTextmode OK')
end
![]()
pPID (long) : This is the PortID of the open com port to which the GSM modem is connected. See the NewPort function.
pCMD (string) : The command to send to the modem.
Tip : Most modems require a CR / LF terminator on the command ie. 'AT+CPIN?<13,10>' where ascii 13 is CR and ascii 10 is LF.
pCmdLen (long) : Optional. This is the command string length to send. If omitted then the string is clipped before sending.
pReplyString (*string) : The modem response is returned in this string.
pTimeout (long) : Optional. Default =50 (0.50 secs). This is the timeout for the first character of the modem response. You might need to increase this to quite large (depending on the service provider). Some Providers require as much as 90 seconds (i.e. this timeout set to 9000). If you are getting intermittent or failed replies, then this is one possibility that should be adjusted.
pTimeout2 (long) : Optional. Default =25 (0.25 secs). This is the timeout for subsequent characters of the modem response.
pTrailingOK (byte) : Optional. Default=FALSE. This flag when set specifies that the modem response terminates with an '<13,10>OK<13,10>' .
If not set then the first '<13,10>' will be taken as the end of the modem response.
pFindPrompt (byte) : Optional. Default=FALSE. This flag when set specifies that the modem response terminates with an '> ' .
pIgnorePrompt (byte) : Optional. Default=FALSE. This flag when set then leading '> ' characters in the modem response are discarded.
Returns
PID long
ReplyString string(1024)
code
PID = NewPort('com1:9600,n,8,1')
ds_GetGSMReply(PID,'AT+CPIN?<13,10>',,ReplyString,,,1) ! Query +CPIN
state and waits for OK response.
ds_GetGSMReply(PID,'AT+CMGS="082XXXXXX"<13,10>',,ReplyString,1000,,,1) !
Dials Mobile Number and waits for "> " response.
![]()
Parameters
pPID (long) : This is the PortID of the open com port to which the GSM modem is connected. See the NewPort function.
pTimeout (long) : Optional. Default =50 (0.5 secs). This is the timeout for attempting to empty the com port input buffer.
Returns
PID long
code
PID = NewPort('com1:9600,n,8,1')
if ds_ds_EmptyPort(PID)
message('ds_EmptyPort failed : ' & ds_Error())
else
message('ds_EmptyPort OK')
end
![]()
Parameters
pPID (long) : This is the PortID of the open com port to which the GSM modem is connected. See the NewPort function.
pPIN (string) : Optional. The PIN number to gain access to the SIM card in
the GSM modem.
The PIN code request on the SIM card may be disabled. In this case the PIN
is not required.
NB : If you try the wrong PIN code 3 times then your SIM may be locked and will
need the PUK number to unlock it. This is not handled by WinEvent.
Returns
PID long
code
PID = NewPort('com1:9600,n,8,1')
if ds_GSMReadSMSInit(PID)
message('ds_GSMReadSMSInit failed : ' & ds_Error())
else
message('ds_GSMReadSMSInit OK')
end
![]()
pPID (long) : This is the PortID of the open com port to which the GSM modem is connected. See the NewPort function.
pSMSIndex (long) : Which memory index to read.
pSMSG (*ds_SMSMessageG) : This structure is filled with the data from the memory index.
Returns
PID long
SMSIndex long
SMSG group(ds_SMSMessageG)
end
code
SMSIndex = 0
PID = NewPort('com1:9600,n,8,1')
if ds_GSMReadSMSInit(PID,PIN)
message('ds_GSMReadSMSInit failed : ' & ds_Error())
else
loop
SMSIndex += 1
if ds_GSMReadSMS(PID,SMSIndex,SMSG) then break .
! SMSIndex
! ds_SMSMessageG group,type
! Type string(20)
! MobileNumber string(50)
! Date long
! Time long
! TimeZone long
! Text string(255)
! end
end
end
![]()
pPID (long) : This is the PortID of the open com port to which the GSM modem is connected. See the NewPort function.
pSMSIndex (long) : Which memory index to clear.
Returns
PID long
code
PID = NewPort('com1:9600,n,8,1')
if ds_GSMDeleteSMS(PID,3) ! delete index 3
message('ds_GSMDeleteSMS failed : ' & ds_Error())
else
message('ds_GSMDeleteSMS OK')
end
![]()
Note : ds_GSMReadSMSInit calls the following.
ds_GSMEnterPin(PID,PIN)
ds_GSMSetSMSTextmode(PID)
ds_GSMGetReply....
Parameters
pPID (long) : This is the PortID of the open com port to which the GSM modem is connected. See the NewPort function.
pEnableReport (byte) : Optional. Default=1 (TRUE) If this flag is
reset (0) then the SMS delivery reporting is disabled.
pTimeout (long) : Optional. Default =1440 minutes (24 Hours). This
is the length of time in minutes that the network must try to send the SMS for
before sending a failed report.
The range of the timeout is from 5 minutes to 63 weeks.
if pTimeOut > 43200 ! 30 days
the resolution is weeks [5 to 63 weeks]
elsif pTimeOut > 1440 ! 1 day
the resolution is days [2 to 30 days]
elsif pTimeOut > 720 ! 12 hours
the resolution is 30 minute blocks [12:30 to 24:00]
else ! <= 12 hours
the resolution is 5 minute blocks [0:05 to 12:00]
end
pPIN (string) : Optional. The PIN number to gain access to the SIM card in
the GSM modem.
The PIN code request on the SIM card may be disabled. In this case the PIN
is not required.
NB : If you try the wrong PIN code 3 times then your SIM may be locked and will
need the PUK number to unlock it. This is not handled by WinEvent.
Returns
PID long
code
PID = NewPort('com1:9600,n,8,1')
if ds_GSMSetSMSReporting(PID)
message('ds_GSMSetSMSReporting failed : ' & ds_Error())
else
message('ds_GSMSetSMSReporting OK')
end
![]()
pPID (long) : This is the PortID of the open com port to which the GSM modem is connected. See the NewPort function.
pSRMemory (byte) : Optional. Default=1 (TRUE) If this flag is
set then the SMS delivery report storage area is selected.
If this flag is reset then the received SMS storage area is selected.
Returns
PID long
code
PID = NewPort('com1:9600,n,8,1')
if ds_GSMSelectSR(PID)
message('ds_GSMSelectSR failed : ' & ds_Error())
else
message('ds_GSMSelectSR OK')
end
![]()
Parameters
pPID (long) : This is the PortID of the open com port to which the GSM modem is connected. See the NewPort function.
pPIN (string) : Optional. The PIN number to gain access to the SIM card in
the GSM modem.
The PIN code request on the SIM card may be disabled. In this case the PIN
is not required.
NB : If you try the wrong PIN code 3 times then your SIM may be locked and will
need the PUK number to unlock it. This is not handled by WinEvent.
Returns
PID long
code
PID = NewPort('com1:9600,n,8,1')
if ds_GSMReadSMSReportInit(PID)
message('ds_GSMReadSMSReportInit failed : ' & ds_Error())
else
message('ds_GSMReadSMSReportInit OK')
end
![]()
pPID (long) : This is the PortID of the open com port to which the GSM modem is connected. See the NewPort function.
pSMSReportIndex (long) : Which memory index to read.
pDRG (*ds_SMSReportG) : This structure is filled with the data from the memory index.
Returns
PID long
SMSReportIndex long
DRG group(ds_SMSReportG)
end
code
SMSReportIndex = 0
PID = NewPort('com1:9600,n,8,1')
if ds_GSMReadSMSReportInit(PID,PIN)
message('ds_GSMReadSMSReportInit failed : ' & ds_Error())
else
loop
SMSReportIndex += 1
if ds_GSMReadSMSReport(PID,SMSReportIndex,DRG) then break .
! SMSReportIndex
! ds_SMSReportG group,type
! Type string(20)
! SMSID long
! MobileNumber string(50)
! SentDate long
! SentTime long
! SentTimeZone long
! DeliveredDate long
! DeliveredTime long
! DeliveredTimeZone long
! StatusCode long
! Status string(20)
! end
end
end
![]()
pPID (long) : This is the PortID of the open com port to which the GSM modem is connected. See the NewPort function.
pSMSReportIndex (long) : Which memory index to clear.
Returns
PID long
code
PID = NewPort('com1:9600,n,8,1')
if ds_GSMDeleteSMSReport(PID,3) ! delete index 3
message('ds_GSMDeleteSMSReport failed : ' & ds_Error())
else
message('ds_GSMDeleteSMSReport OK')
end
![]()
Parameters
pPID (long) : This is the PortID of the open com port to which the GSM modem is connected. See the NewPort function.
pERG (*ds_GSMEventG) : This structure is filled with any event data found.
Returns
PID long
ERG group(ds_GSMEventG)
end
code
PID = NewPort('com1:9600,n,8,1')
if ds_GSMReadEvents(PID,ERG)
message('GSMReadEvents failed : ' & ds_Error())
else
! ds_GSMEventG group,type
! Date long
! Time long
! Text string(255)
! Type string(3)
! Index long
! end
end
![]()
pPID (long) : This is the PortID of the open com port to which the GSM modem is connected. See the NewPort function.
pEventsMask (long) : Optional. Default=255. This long selects
which events are enabled.
Returns
PID long
code
PID = NewPort('com1:9600,n,8,1')
if ds_GSMSetEvents(PID)
message('ds_GSMSetEvents failed : ' & ds_Error())
else
message('ds_GSMSetEvents OK')
end
![]()
pPID (long) : This is the PortID of the open com port to which the GSM modem is connected. See the NewPort function.
Returns
PID long
code
PID = NewPort('com1:9600,n,8,1')
if ds_GSMReset(PID)
message('ds_GSMReset failed : ' & ds_Error())
else
message('ds_GSMReset OK')
end
![]()
pDebugString (string) : Debug info string.
pAddCRLF (byte) : Add carriage return and line feed to the debugstring if set.
code
ds_OutputDebugString('Test to debug - view in something like DebugViewer
from SysInternals)
![]()
pDebugString (string) : Debug info string.
pWindowLabel (string) : Optional. This label identifies which procedure is sending the debug info. The thread number is added to the end of this string.
pEventNumber (long) : Optional. Used by the template in order to display the window events.
pFieldNumber (long) : Optional. Used by the template to display which control received the event.
Returns
code
ds_ViewDebug ! opens the debug viewer.
ds_Debug('Just testing') ! sends "Just Testing" to the windows debug
viewer.
![]()
pEnable (byte) : If TRUE (1) then WinEvent internal debugging info is sent to
the debug viewer. If FALSE (0) then WinEvent internal debugging info is
suppressed.
Returns
fp_Testing ulong
code
ds_WineventDebug(1)
ds_LoadDLLProc('Testing','NoneExistant.dll',fp_Testing) !
Attempt to locate a procedure in an non-existant dll.
Debug string ! ds_LoadDLLProc error, LoadLibrary failed DLL=NoneExistant.dll
The specified module could not be found.
![]()
None.
Returns
fp_Testing ulong
code
ds_ViewDebug ! open debug viewer.
ds_WineventDebug(1)
ds_LoadDLLProc('Testing','NoneExistant.dll',fp_Testing) !
Attempt to locate a procedure in an non-existant dll.
Debug string ! ds_LoadDLLProc error, LoadLibrary failed DLL=NoneExistant.dll
The specified module could not be found.
![]()
None.
Returns
fp_Testing ulong
code
ds_DebugView ! open debug viewer.
ds_WineventDebug(1)
ds_LoadDLLProc('Testing','NoneExistant.dll',fp_Testing) !
Attempt to locate a procedure in an non-existant dll.
Debug string ! ds_LoadDLLProc error, LoadLibrary failed DLL=NoneExistant.dll
The specified module could not be found.
ds_DebugViewClose ! close the debug viewer.
![]()
pThisErrorCode (long) : Optional. If omitted then the current ds_ErrorCode() is used. This is the error code for which the text error message is required.
Returns
fp_Testing ulong
code
if ds_LoadDLLProc('Testing','NoneExistant.dll',fp_Testing) !
Attempt to locate a procedure in an non-existant dll.
message('Error ' & ds_error())
end
![]()
None.
Returns
fp_Testing ulong
SaveErrorCode long
code
if ds_LoadDLLProc('Testing','NoneExistant.dll',fp_Testing) !
Attempt to locate a procedure in an non-existant dll.
SaveErrorCode = ds_ErrorCode()
message('Error ' & ds_error())
end
![]()
pCallingProcedure (string) : Optional. This procedure name will be returned with any ds_Error() message string. Useful for identifying the parent procedure where a procedure is called from various procedures.
Returns
fp_Testing ulong
SaveErrorCode long
code
if ds_LoadDLLProc('Testing','NoneExistant.dll',fp_Testing) !
Attempt to locate a procedure in an non-existant dll.
SaveErrorCode = ds_ErrorCode()
message('Error ' & ds_error())
end
![]()
None.
Returns
code
ds_SaveStack
! some external procedure call.
ds_TestStack
![]()
pDisplayValue (ulong) : The number to format as hex.
pPadSpaces (byte) : The length of the hex number to return (leading zeros).
Returns
DisplayHex string(10)
code
DisplayHex = ds_FormatHex(31,4) ! 001F
![]()
pClipFormat (ulong) : The format specifier.
pNewContents (string) : The data to be placed in the clipboard.
| pClipFormat Value | pNewContents requires: |
| WE::CF_BITMAP | a handle to a bitmap memory space. |
| WE::CF_DIB | a memory object containing a BITMAPINFO structure followed by the bitmap bits. DIB = Device-Independant Bitmap |
| WE::CF_DIBV5 | a memory object containing a BITMAPV5HEADER structure followed by the bitmap color space information and the bitmap bits. |
| WE::CF_DIF | |
| WE::CF_ENHMETAFILE | a handle to an enhanced metafile (HENHMETAFILE). |
| WE::CF_HDROP | a handle to type HDROP that identifies a list of files. (see example below) |
| WE::CF_LOCALE | |
| WE::CF_METAFILEPICT | a handle to a metafile picture format as defined by the METAFILEPICT structure. |
| WE::CF_OEMTEXT | a Text format string. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data. |
| WE::CF_PALETTE | |
| WE::CF_PENDATA | |
| WE::CF_RIFF | |
| WE::CF_SYLK | |
| WE::CF_TEXT | a Text format string. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data. |
| WE::CF_TIFF | a Tagged-image file format. |
| WE::CF_UNICODETEXT | a Unicode text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data. |
| WE::CF_WAVE | an audio data string in one of the standard wave formats, such as 11 kHz or 22 kHz Pulse Code Modulation (PCM). |
Returns
This example places the name "C:\autoexec.bat"
into the windows clipboard.
Using windows explorer you can then paste a copy of the file elsewhere.
data
hDropStruct group
pFiles
long ! offset from here to FileList
pt
ulong ! drop point (in screen co-ords)
blank ulong
fNC
long !Set for Non-Client area.
fWide
long
FileList
string(255) ! Null terminated list of null terminated file names.
end
code
hDropStruct.filelist = 'C:\autoexec.bat<0,0>' ! List of files.
Note the double null terminator.
hDropStruct.pFiles = 20
hDropStruct.fWide = 0 ! ASCII
if ~ds_SetClipboard(CF_hDrop,hDropStruct) ! Place name in
clipboard.
message('SetClipboardFailed')
end
![]()
pForce (byte) : Optional. When set (1) then any processes that do not "respond" are terminated by windows.
Returns
code
ds_Shutdown() ! Request a windows shutdown.
![]()
None.
Returns
code
if ds_WinEventVersion < 3.21
message('Error old WinEvent DLL in use')
end
![]()
pUlongHigh (long) : The first 4 bytes of the ulong64.
pUlongLow (long) : The last 4 bytes of the ulong64.
Returns
RealVar
real
ulong64G
group
High
long
Low
long
end
code
RealVar = ds_Ulong64toReal(ulong64G:High,ulong64G:Low)
![]()
pCallBackAddress (ulong) : The address of the OKToEndSessionHandler.
The OKToEndSessionHandler must be prototyped as :
MyOKToEndSessionHandler(long pLogoff),long,pascal
Returns
OldHandlerAddress ulong
code
OldHandlerAddress =
ds_SetOKToEndSessionHandler(address(MyOKToEndSessionHandler))
![]()
pCallBackAddress (ulong) : The address of the EndSessionHandler.
The EndSessionHandler must be prototyped as :
EndSessionHandler(long pLogoff),long,pascal
Returns
OldHandlerAddress ulong
code
OldHandlerAddress = ds_SetEndSessionHandler(address(MyEndSessionHandler))
![]()
pNoEndSession (long) : When set (1) then the Auto-Shutdown is disabled.
Returns
code
ds_SetNoEndSession(TRUE)
! Do backup routine here
ds_SetNoEndSession(FALSE)
![]()
None.
Returns
long hProcess
code
hProcess = ds_GetCurrentProcess()
![]()
None.
Returns
long hThread
code
hThread = ds_GetCurrentThread()
![]()
hProcess (long) : Optional. The windows handle to the process.
Defaults to the current process.
IncludeFlags (long) : Optional. 1 = User Time, 2 = Kernal Time, 0 = Total
Time (Default)
Returns
real UserTime
code
UserTime = ds_GetProcessTime(,1)
DisplayTime = ds_FormatFastTime(UserTime,6) !
HH:MM:SS.SSSSSS
![]()
hThread (long) : Optional. The windows handle to the thread.
Defaults to the current thread.
IncludeFlags (long) : Optional. 1 = User Time, 2 = Kernal Time, 0 = Total
Time (Default)
Returns
real UserTime
code
UserTime = ds_GetThreadTime(,1)
DisplayTime = ds_FormatFastTime(UserTime,6) !
HH:MM:SS.SSSSSS
![]()
hProcess (long) : Optional. The windows handle to the process.
Defaults to the current process.
hThread (long) : Optional. The windows handle to the thread.
Defaults to the current thread.
RealTimeFlag (byte) : Optional. When set (Default) then Real Time Priority
is selected. When clear then Normal Priority is selected.
Returns
code
ds_SetRealTimePriority(,,TRUE) ! Select Real Time
priority
......
ds_SetRealTimePriority(,,FALSE) ! Select Nornal
priority
TaskBar/SystemTray Questions:
1.1 I'd like to also change the taskbar button tooltip
- how do I do this?
1.2 My application still appears on the Taskbar.
1.3 I want to hide my application to the taskbar, what's the
best way to do this
1.4 My icon does not appear in the SystemTray
Comport Questions:
C.1 How do I open a serial port cash drawer using WinEvent?
C.2 I use a virtual comport USB to COM convertor. After some
time the comport closes down.
2.1 Cannot get my application to auto-shutdown.
2.2 Instances of the WinEvent template appear after importing
procedures from another application.
2.3. Are there any parallel port functions included in WinEvent?
1.2
Question: I am trying to use the 'WinNotOnTaskBar' extension template on
my frame so that my application does not appear on the task bar, but it still
appears.
Answer: This extension template places a call to a function called
WinNotOnTaskBar
before the open window command. If you have a 3rdparty or source coded call
to open a different window before this function is called, it will not
work. You may need to manually code a call to this function before the 3rdparty/source
coded window is called.
1.4 My icon does not appear in the SystemTray
Answer: Your application is not finding the icon to place in the system tray. Rather include the icon into the project and use ~myicon.ico (in the AddIcon to system tray). If in doubt - check the example (that ships with WinEvent) for how it's done in there.
C.1 Question: How do I open a serial port cash drawer using WinEvent?
Answer: You need to find out the character to pass on the port to the cash drawer (to perform the open) and handle this in a normal coms port operation:
Portid = newport('com' & left(port) &
':' & baudrate & ',n,8,1')
!Handle error here.
bytesent=writeport(portid,drcode,0)
closeport(portid)
C.2 Question: I use a virtual comport USB to COM convertor. After some time the comport closes down.
Answer:
2.1
Question: I want my application to auto-shutdown. I have checked the 'Auto
Shutdown Enabled' checkbox on the WinEvent extension template on my frame, but
it still does not auto-shutdown.
Answer: Are you using 'WinNotOnTaskBar'? auto-shutdown is
not compatible with 'WinNotOnTaskBar'. Use window{prop:hide} instead
(click here for an example). You need
to either check the 'Auto shutdown on' checkbox in the WinEvent Global Extension
template (the easiest way), check each 'Auto shutdown enabled' checkbox
on each of the windows or hand code the relevant function yourself. You may
prefer to take the second option if there are windows which must be closed (like
forms, etc) by the user before the application is automatically closed. In this
case, you can leave those 'Auto shutdown enabled' checkbox cleared, so that
your application won't auto-shutdown when these windows are open. For those
more daring, you can do the hand coding method (click
here
for more details).
2.2 Question: I'm trying to import a procedure from another application,
but 2 instances of the WinEvent template appear after import on that procedure.
Answer: There are 2 possible solutions to this (depending on which may be
better in your situation):
1. Delete the WinEvent global template from the application that you want to
export the procedures from. Export the procedures to a txa file, and then add
the WinEvent global template back into your application. You can the import the
txa file into your new application.
Pros: Simpler and quicker.
Conns: Can lose some template settings (of the templates that were temporarily
removed).
This should only be done in applications where the default template settings are
used.
2. Export the procedures that you want to a txa file. You now need to manually edit the txa file and remove all WinEvent: Alert Windows Messages template instances in that file. Basically, what you need to delete is the following (wherever it occurs in the txa file:
[ADDITION]
NAME WinEvent WinEvent
[INSTANCE]
INSTANCE 2
OWNER 1
[PROMPTS]
%DisableWinEvent LONG (0)
%AutoDown LONG (0)
%NoAutoDown LONG (0)
%EnableWheelMouse LONG (0)
%AlertWinEventDebug LONG (0)
%DisplayCompileDate LONG (0)
%DisplayCompileDateFormat DEFAULT ('@D6')
%WinAlert MULTI LONG ()
%Mess DEPEND %WinAlert DEFAULT TIMES 0
%Act1 DEPEND %WinAlert DEFAULT TIMES 0
%act2 DEPEND %WinAlert DEFAULT TIMES 0
%SortListbox MULTI LONG ()
%ThisListbox DEPEND %SortListbox DEFAULT TIMES 0
%ThisListboxHeader DEPEND %SortListbox MULTI DEFAULT TIMES 0
%gloWinEventTesting LONG (0)
%gloWinEventTestingColor1 LONG (15728618)
%gloWinEventTestingColor2 LONG (16777215)
2.3. Question: Are there any parallel port functions included in WinEvent?
Answer: No. WinEvent does not include a parallel port library in it's functions.
This means that you're still using old equates (before the WinEvent equates were changed in 3.37). Basically you need to add the WE:: prefix to all handcoded: WM_, CSIDL_, WTS_, NIIF_ and CF_ variables so:
WM_QUERYENDSESSION will become WE::WM_QUERYENDSESSION