Overview (FAQ2 ) -


Windows key shortcuts

Ctrl + Escape or Win: Display start menu.
Shift + F10 or AppsKey: Display context menu.
Win + E: Open Windows Explorer.
Win + R: Open Run dialog.
Win + M: Minimize all windows.
Win + Shift + M: Undo minimize all windows.
Win + D: Toggle minimize all windows.
Win + B (XP only): Activate system tray. Arrow keys select, Enter double-clicks, and AppsKey or Shift + F10 right-clicks.
Win + L (XP Only): Locks keyboard. Similar to Lock Workstation.
Win + F or F3: Open Find dialog. (All Files) F3 may not work in some applications which use F3 for their own find dialogs.
Win + Control + F: Open Find dialog. (Computers)
Win + U: Open Utility Manager.
Win + F1: Open Windows help.
Win + Pause: Open System Properties dialog.
Win + Tab: Cycle through taskbar buttons. Enter clicks, AppsKey or Shift + F10 right-clicks.
Win + Shift + Tab: Cycle through taskbar buttons in reverse.
Alt + Tab: Display CoolSwitch. More commonly known as the AltTab dialog.
Alt + Shift + Tab: Display CoolSwitch; go in reverse.
Alt + Escape: Send active window to the bottom of the z-order.
Alt + Shift + Escape: Activate the window at the bottom of the z-order.
Alt + F4: Close active window; or, if all windows are closed, open shutdown dialog.
Shift while a CD is loading: Bypass AutoPlay.
Ctrl + Alt + Delete or Ctrl + Alt + NumpadDel (Both NumLock states): Invoke the Task Manager or NT Security dialog.
Ctrl + Shift + Escape (XP Only): Invoke the task manager. On earlier OSes, acts like Ctrl + Escape.
Printscreen: Copy screenshot of current screen to clipboard.
Alt + Printscreen: Copy screenshot of current active window to clipboard.
Ctrl + Alt + Down Arrow: Invert screen. Untested on OSes other than XP.
Ctrl + Alt + Up Arrow: Undo inversion.


Ctrl + C or Ctrl + Insert: Copy.
Ctrl + X or Shift + Delete: Cut.
Ctrl + V or Shift + Insert: Paste/Move.
Ctrl + N: New... File, Tab, Entry, etc.
Ctrl + S: Save.
Ctrl + O: Open...
Ctrl + P: Print.
Ctrl + Z: Undo.
Ctrl + A: Select all.
Ctrl + F: Find...
Ctrl + F4: Close tab or child window.
F1: Open help.
F11: Toggle full screen mode.
Alt or F10: Activate menu bar.
Alt + Space: Display system menu. Same as clicking the icon on the titlebar.
Escape: Remove focus from current control/menu, or close dialog box.

Generic Navigation

Tab: Forward one item.
Shift + Tab: Backward one item.
Ctrl + Tab: Cycle through tabs/child windows.
Ctrl + Shift + Tab: Cycle backwards through tabs/child windows.
Enter: If a button's selected, click it, otherwise, click default button.
Space: Toggle items such as radio buttons or checkboxes.
Alt + (Letter): Activate item corresponding to (Letter). (Letter) is the underlined letter on the item's name.
Ctrl + Left: Move cursor to the beginning of previous word.
Ctrl + Right: Move cursor to the beginning of next word.
Ctrl + Up: Move cursor to beginning of previous paragraph. This and all subsequent Up/Down hotkeys in this section have only been known to work in RichEdit controls.
Ctrl + Down: Move cursor to beginning of next paragraph.
Shift + Left: Highlight one character to the left.
Shift + Right: Highlight one character to the right.
Shift + Up: Highlight from current cursor position, to one line up.
Shift + Down: Highlight from current cursor position, to one line down.
Ctrl + Shift + Left: Highlight to beginning of previous word.
Ctrl + Shift + Right: Highlight to beginning of next word.
Ctrl + Shift + Up: Highlight to beginning of previous paragraph.
Ctrl + Shift + Down: Highlight to beginning of next paragraph.
Home: Move cursor to top of a scrollable control.
End: Move cursor to bottom of a scrollable control.

Generic File Browser

Arrow Keys: Navigate.
Shift + Arrow Keys: Select multiple items.
Ctrl + Arrow Keys: Change focus without changing selection. "Focus" is the object that will run on Enter. Space toggles selection of the focused item.
(Letter): Select first found item that begins with (Letter).
BackSpace: Go up one level to the parent directory.
Alt + Left: Go back one folder.
Alt + Right: Go forward one folder.
Enter: Activate (Double-click) selected item(s).
Alt + Enter: View properties for selected item.
F2: Rename selected item(s).
F7: New folder.
Ctrl + NumpadPlus: In a Details view, resizes all columns to fit the longest item in each one.
Delete: Delete selected item(s).
Shift + Delete: Delete selected item(s); bypass Recycle Bin.
Ctrl while dragging item(s): Copy.
Ctrl + Shift while dragging item(s): Create shortcut(s).

In tree pane, if any:
Left: Collapse the current selection if expanded, or select the parent folder.
Right: Expand the current selection if collapsed, or select the first subfolder.
NumpadAsterisk: Expand currently selected directory and all subdirectories. No undo.
NumpadPlus: Expand currently selected directory.
NumpadMinus: Collapse currently selected directory.


Right Shift for eight seconds: Toggle FilterKeys on and off. FilterKeys must be enabled.
Left Alt + Left Shift + PrintScreen: Toggle High Contrast on and off. High Contrast must be enabled.
Left Alt + Left Shift + NumLock: Toggle MouseKeys on and off. MouseKeys must be enabled.
NumLock for five seconds: Toggle ToggleKeys on and off. ToggleKeys must be enabled.
Shift five times: Toggle StickyKeys on and off. StickyKeys must be enabled.

Microsoft Natural Keyboard with IntelliType Software Installed

Win + L: Log off Windows.
Win + P: Open Print Manager.
Win + C: Open control panel.
Win + V: Open clipboard.
Win + K: Open keyboard properties.
Win + I: Open mouse properties.
Win + A: Open Accessibility properties.
Win + Space: Displays the list of Microsoft IntelliType shortcut keys.
Win + S: Toggle CapsLock on and off.

Remote Desktop Connection Navigation

Ctrl + Alt + End: Open the NT Security dialog.
Alt + PageUp: Switch between programs.
Alt + PageDown: Switch between programs in reverse.
Alt + Insert: Cycle through the programs in most recently used order.
Alt + Home: Display start menu.
Ctrl + Alt + Break: Switch the client computer between a window and a full screen.
Alt + Delete: Display the Windows menu.
Ctrl + Alt + NumpadMinus: Place a snapshot of the entire client window area on the Terminal server clipboard and provide the same functionality as pressing Alt + PrintScreen on a local computer.
Ctrl + Alt + NumpadPlus: Place a snapshot of the active window in the client on the Terminal server clipboard and provide the same functionality as pressing PrintScreen on a local computer.

Starting Powerforce in Batch mode

"d:\nvzn4-devel\openinsight\OINSIGHT.exe" /ap=mms /un=mms /mode=batch /window=batch_reporting_monitor /entity=edheal /pfuserid=reportbatcher

start P:\testOINSIGHT\OINSIGHT.exe /ap=pfsec /un=pfsec /mode=batch /window=batch_reporting_monitor /entity=edmen /pfuserid=reportbatcher

Testing OECGI from the cmd line

rem **** begin ****
rem ** test.bat - call oecgi without web server
rem ***
set path_info=/inet_trace
set QUERY_STRING=test=1
OECGI2.EXE >test.txt
start test.txt

rem **** end ******

Windows .dll error messages

These are .ocx / .dll messages experienced in programming, where, why & how resolved (if possible).

error number message further details
-214718113 catastrophic failure saw this message when programming to outlook. When outlook is not started on workstation, the code dies rather crudely.
-2147221005 (800401F3) Invalid class string. registry_key= 'VSPRINTER7.VSPRINTER.1mpd'
oleObj = OleCreateInstance(registry_key)
status = OleStatus()
-2147352567 exception occurred
-2147352567 SQL
-2147467259 SQL

link to Microsoft KB article on error messages The list is apparently from winerror.h (C++)

Top of Page


  • [W] scheduling_workbench
  • [W] time_bookings - edit shift window

Batch Processing

The following is the shortcut to the batch processor.

"\\<<powerforce_share>>\Oinsight\OINSIGHT.exe" /ap=pfsec /un=pfsec /mode=batch /window=batch_reporting_monitor /entity=nlpv /pfuserid=reportbatcher

This is likely to change with rel 9.x using the RTI_SCHEDULER.

Top of Page

Programming Tricks

    On the create event of the menu, do something similar to this:

    call set_property(@window,"TIMER", 10000)
    call set_property(@window,"@TIME",time())

    And then, on the timer event of the menu (MDI Frame), have something similar to this:

    call yield()
    Time = get_property(@window,'@TIME')
    CurrTime = time()
    DeltaTime = CurrTime - Time

    // if it has been 60 minutes / 3600 seconds
    If DeltaTime > 3600 then
    x = dialog_box('AUTOSHUTDOWN', @window, '')

    Have various processes update the @TIME property of the MDI Frame, as needed.

  • Sample program code for POPUP (sample_popup.txt)
  • exists = 1
    IF rowexists('SYSOBJ','$':progname:"*":@appid<1>) ELSE
    IF rowexists('SYSOBJ','$':progname) ELSE
    exists = 0

    IF exists ELSE
    err = 'Invalid Program'
    GOTO error

  • starttime = date() + time() / 86400

  • void = set_property(@WINDOW,"@THINGO",value)

  • REPBIL08 has logic for multi-week print

  • cancelled = get_printer("CANCEL")
    IF cancelled THEN
    eof = 1
    void = set_printer(" ",printline)


  • now = iconv(oconv(date(),'D/'):' ':oconv(time(), 'MTS'), "DT^S") - gives as unique a key as possible for time stamping.

  • use a user-defined property, for example @BUSY, to flag that the processing is active.

    isBusy = Get_Property(CtrlEntId, '@BUSY')
    if isBusy then
    return 0

    unused = set_Property(CtrlEntId, '@BUSY', 1)
    * Do processing here, including Yield() statements
    * ....
    Set_Property(CtrlEntID, '@BUSY', 0 )

    return 0

  • The sysadmin menus window is oryx_menu_def. To run it standalone.

  • Declare function UCASE
    menuName = UCASE("TEMP":RTI_CREATEGUID("b"))

  • [S] nv_disable_ghosting
    I've just discovered that an application can disable this behaviour (ie going grey and unresponsive) by calling the DisableProcessWindowsGhosting() Windows API function on startup. This "Disables the window ghosting feature for the calling GUI process.

    Window ghosting is a Windows Manager feature that lets the user minimize, move, or close the main window of an application that is not responding.

    "Not only that, but it seems to free up the CPU quite a bit, making OI processing faster - even on XP!

  • > oeprofile.log to DUMP boot sequence.

  • How to close a window whose WRITE event sends a close event to the form?

    In this situation the Window will close properly if the user closes through the write event. However, if the user closes using the "X" at the top right of the window, OI will prompt "Save Changes". If the user selects 'Yes', the Close calls Write, which then calls Close again. OI will debug when Close tries to run twice.

    The Solution? Ask the window is it is closing? Use retstack() to see which programs are running, if WINDOW.CLOSE if in the stack, you are already closing. The code is as follows:
    declare function retstack
    * Pre-write...Do some stuff...
    Call forward_event()
    * Post-write...Do some stuff...
    stack = retstack()
    cmd = "CLOSE.WINDOW"
    is_closing = INDEX(stack, cmd,1)
    if is_closing else
    call send_event(@window,"CLOSE")

  • cancelled = Get_Printer("CANCEL")

    - then set eof = 1

  • LOOP
    this_item = list[x,@FM]
    WHILE bol2() < x
    x = col2() + 1

  • timestamp = date() + (time() / SECS_PER_DAY$) (== 86400)

  • Web Browser Control exposes MSHTML (MS rendering engine & DOM). shdocvw.dll.
    Place an OLE control on your form, & set the "text" property to "Shell.Explorer".
    call send_message(@window:".OLE_WEB", "OLE.Navigate2", "http://www.envizion.com.au").

    Loading a local html file: ...,"OLE.Navigate2","file:///d:\html\file.html", including .pdf files. Browse the local file system "OLE.Navigate2", "file:///c:\windows").

  • loading content from a Basic+ string.

    OINSIGHT /CA=caption /BN=0

    Use an existing POPUP to display only 2 keys

    existingpopup = 'CONTACT_TYPES'

    popdef = ''
    popdef<PMODE$> = 'K'

    result = popup(@Window, popdef, EXISTINGPOPUP)



    RLIST(TheSelect, 5, '', '', '')

    eof = false$
    TableList = ''
    Readnext tbid else eof = true$
    Until eof do
    TableList := tbid:@VM

    TableList[-1,1] = ''

    SelectedTables = ''

    popdef = ""
    popdef<PFORMAT$> = "Table":@svm:40:@svm:"L"
    popdef<PDISPLAY$> = TableList
    popdef<PMODE$> = "L"
    popdef<PSELECT$> = 2
    popdef<PTITLE$> = "Select the relevant tables"
    popdef<PTYPE$> = "F"
    popdef<PINITSELECT$> = SelectedTables
    popdef<PCaptureEsc$> = True$

    result = Popup (@Window, popdef)
    In the above definition, mode is the field that says I'm passing 'L'iteral data and display is the actual data
    If mode was 'K', then display would be a vm list of keys and you would need popdef<PFILE$> to specify the which dictionary

    SelectedTables would be an @vm list of rows you want to appear as already selected in a multiselect popup or a single row otherwise.


    result = Popup (@Window, popdef, existingpopup)
    So yours may look like this

    popdef = ''
    popdef<PMODE$> = 'K' ; // just in case it isnt already

    result = popup(@Window, popdef, contact_types)

    This might be a writeup on how Events propogate:

    My current understanding of promoted events, the event chain and how OLE events figure into this.
    They're having an issue with OLE events triggering before other events are finishing, eg the click of an OLE button is happening before the Lostfocus of the previous control has done its thing. I believe its the way the frameworks are implemented as Don told James, its expected behaviour. Regardless of the background, I did my best to explain the steps to James and whilst I'm sure you're atop of all this, thought it might be handy to add to your list of things to remember documentation. That wasn't all lost with the fried server was it? Anyway, the crux of the info is below for you to do with what you will.

    Your application is 'YOURAPP'
    Your test window is 'TEST'
    Your editline is called 'DATE'
    The event you're firing is the 'LOSTFOCUS'

    When the lostfocus event occurs on the date editline, whilstever you continue to return a 1, the following actual events are checked and run if something is found. They do so in this order.

    7. YOURAPP*..OIWIN* ... SYSPROG*..OIWIN* ...

    Which in english means

    1. Run any lostfocus code that is specific to the 'DATE' editfield on the 'TEST' window
    2. Run any lostfocus code that is specific to the 'TEST' window
    3. Run any lostfocus code that is specific to editfields on ANY window in application 'YOURAPP'
    4. Run any lostfocus code that is specific to editfields on ANY window in application 'SYSPROG'
    5. Run any lostfocus code that is specific to ANY window in application 'YOURAPP'
    6. Run any lostfocus code that is specific to ANY window in application 'SYSPROG'
    7. Run any code that is specific to ANY window in application 'YOURAPP'
    8. Run any code that is specific to ANY window in application 'SYSPROG'

    Of course, the more inheritance levels you have, the longer that chain is but hopefully you get the picture.

    Now my understanding of the qualify_event is that its job is to tell OI what point in the chain should any OLE events be sent to. In other words, OLE events themselves don't automatically follow this process above. In fact OI ignores them altogether unless you specifically qualify the event, which is why we do it. Qualifying tells OI to firstly listen for whichever OLE event you qualify, (in your case, all of them) and then when you hear one, run any code specified at the point in the chain you've qualified to.
    That's where the EventKey comes in. Your EventKey in your qualify message is YOURAPP*..OIWIN* which if you look back up is the 7th point in the chain above. So, whilst your lostfocus event makes its way through the chain to that point, the OLE click goes directly there. Now, admittedly, this is still a little grey area but it is therefore conceivable that the two can get in each others way.
    Qualifying to here makes sense in the context of the frameworks because that event will be found in every OI app so nothing other than installing frameworks is required and promoted events just start working.

    What do we do differently?

    Our EventKey points to YOURAPP*OLE.OLECONTROL.OIWIN*

    As you can see, that doesn't appear in the event chain above at all but is the equivalent of line 3 but for OLE events not LostFocus events. So my guess at the grey area is that in our case, the lostfocus event gets to finish its entire chain and then the OLE chain begins. In your case, the OLE event is somehow intercepting the lostfocus because they are both trying to run the same event exe but the OLE one gets there first whilst the lostfocus is resolving itself higher up the chain.

    Now if all you do is change your qualify to point here, then the OLE events won't actually fire at all which is why they wouldn't do it within the frameworks. This event would not yet have an entry in the 'SYSREPOSEVENTEXES' file or if it does, it wouldn't be calling your code anyway. So it would appear as if the OLE controls just don't work. The other piece of the puzzle is to use the OI Event Designer to generate promoted event for the OLE event on any OLE control.

    Dave G can show you how to do that if you haven't done it before. He wrote the thing. The result would be that any time an OLE event occurs the YOURAPP*OLE.OLECONTROL.OIWIN* would run calling the routine pe_olecontrol_ole. That is where you do your generic OLE stuff.

    To turn off DEP - exec cmd as Administrator

    bcedit /set nx AlwaysOff
  • Old way of doing promoted events
    [CreateEvent] of window - make it a script, which calls the commuter module for the window with ("CREATE",CreateParam) - to pass in what the window was called with.

    This is mainly when invoking a window programatically & it wont' behave correctly. The above generally is the fix.

Top of Page

Running OI in Remote App (not desktop)

(taken from OI works conversation) I have RemoteApp launch a boot script so I can customize the launch process without impacting the RemoteApp icons. Attached is a stripped down version of a VBS script used to set the mapped drive and launch OpenInsight

Set wshNetwork = CreateObject("WScript.Network")
Set objShell = CreateObject("Wscript.Shell")

Dim strApp, strAppArgs, strAppShare

strAppArgs = "/ap=APP /DV=0"
strAppShare = "\Server\Share"

'Try to remove and re-attach the mapped drive incase it points to the wrong server
On Error Resume Next
WshNetwork.RemoveNetworkDrive MAPPED_DRIVE , True, True
On Error Goto 0
wshNetwork.MapNetworkDrive MAPPED_DRIVE, strAppShare

'Before launching OpenInsight we must change to the OpenInsight directory
'Get the path fo the apllication and strip out the application path
arrPath = Split(strApp, "\")
For i = 0 to Ubound(arrPath) - 1
strAppPath = strAppPath & arrPath(i) & "\"

'Change to the directory and execute OpenInsight
objShell.CurrentDirectory = strAppPath
objShell.Run strApp & " " & strAppArgs, 1, True

Try customizing it for your application and publishing a RemoteApp that points to the script instead of directly to OInsight.exe


SRP Email Executables

The SRP Mail Utility Install should have installed one stored procedure executable. Examine the SYSOBJ to verify the existence of $SRP_SEND_MAIL. If this record is missing, you can re-run the setup or manually add it using the following steps:

  1. Create a new record

  2. Copy and Paste the following text



  3. Save the record in SYSPROCS as DLL_SRP_MAIL

  4. From the command line, type the folloing:

    run declare_fcns "DLL_SRP_MAIL"

New report writer (9.3.1)

Top of Page


Checking web_access: [T] SYSTEM_CONTROLS / sys_web_settings<4> log_http, writes to PHONE_LOG

Top of Page


Connection strings for databases

ACS specific code

  • [S] mpd_import_acs_openbal
    [S] mpd_import_acs_emps

    [W] import_employees
    [S] nv_import_employees (commuter module)
    [S] nv_import_acs_employees
    [S] nv_excel


Top of Page


Changes to SQLExpress (to make Dashboard work)

Sql Server Configuration Manager
-> SQL Server Network Configuration
-> Protocols for SQLEXPRESS
-> Shared Memory
-> Enabled => false
-> Address
-- on all addresses and the 'global' section down the bottom
-> Set Dynamic Port to blank
-> TCP Port to 1433

Top of Page


  1. Windows 7 has an issue with displaying OI windows correctly. The following article has details of the problem and the fix. Here is the .reg fix to apply to your Windows 7 fonts.
    windows 7 fonts

  2. You'll usually find the Virtual Store for the Windows folder here:

  3. Upgrading from pre-8.3 requires running

    [S] convert_payclass_elements_sub
    atop of running a table_update - use the most current data table patch.
    [W] build_deploy_table
    ** all clients are updated, & this should never be required again **

  4. Guidelines for choosing OI frame size
    up to 50 bytes : 1024 bytes
    51 - 100 bytes : 2048
    101+ bytes : 4096
  5. To stop OI re-sizing the files constantly, do a setsize of 4 or something high as OI does a -something and it ends up resetting the sizelock to a value which says resize yourself. Revelation found this issue in the engine a few months ago (Aug 18, '13).

[SYSENV/RCI_MMS] has default config so that OI reports use some ocmpany default values
vspdf.ocx, vsprint7.ocx problems on Windows 8.
Instead of copying to c:\windows\system32 - copy to c:\windows\syswow64 and the exec the regsvr??.exe command found in that directory to register the 2 files.