open-insight/SYSPROG/STPROC/WINDOWS_SERVICES.txt
2024-03-25 15:17:34 -07:00

450 lines
18 KiB
Plaintext

Function Windows_Services(@Service, @Params)
/***********************************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
permission from SRP Computer Solutions, Inc.
Name : Windows_Services
Description : Handler program for all module related services.
Notes : The generic parameters should contain all the necessary information to process the services. Often
this will be information like the data Record and Key ID.
Parameters :
Service [in] -- Name of the service being requested
Error [out] -- Any errors that were created
Param1-10 [in/out] -- Additional request parameter holders
Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
History : (Date, Initials, Notes)
05/14/13 dmb Original programmer.
05/15/13 dmb Add the IsRunning and Close service. Update the GetHandle service to use the GetTopWindow
API function.
05/22/13 dmb Add Hide, Show, Maximize, and Minimize services (all based on the ShowWindow API).
10/02/13 dmb [SRPFW-18] Add IsVisible service.
11/11/13 dmb [SRPFW-75] Add RunEXE and OpenFile services.
11/12/13 dmb [SRPFW-76] Add KillEXE service.
03/28/20 dmb [SRPFW-304] Update services to use Error_Services when applicable.
05/13/20 dmb [SRPFW-312] Add MakeActive service.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$insert LOGICAL
$insert SERVICE_SETUP
// General Windows API equates
Equ WM_USER to 1024
Equ WM_CLOSE to 16
Equ WM_COMMAND to 273
Equ WM_LBUTTONDOWN to 513 ; // 0x0201
Equ WM_LBUTTONUP to 514 ; // 0x0202
Equ WM_LBUTTONDBLCLK to 515 ; // 0x0203
Equ WM_RBUTTONDOWN to 516 ; // 0x0204
Equ WM_RBUTTONUP to 517 ; // 0x0205
Equ WM_PARENTNOTIFY to 528 ; // 0x0210
Equ WM_SYSCOLORCHANGE to 21 ; // 0x0015
Equ WM_SETCURSOR to 32 ; // 0x0020
Equ WM_SIZE to 5 ; // 0x0005
Equ WM_MOVE to 3 ; // 0x0003
Equ WM_GETMINMAXINFO to 36 ; // 0x0024
Equ WM_WINDOWPOSCHANGING to 70
// ShowWindow API equates
Equ SW_FORCEMINIMIZE to 11
Equ SW_HIDE to 0
Equ SW_MAXIMIZE to 3
Equ SW_MINIMIZE to 6
Equ SW_RESTORE to 9
Equ SW_SHOW to 5
Equ SW_SHOWDEFAULT to 10
Equ SW_SHOWMAXIMIZED to 3
Equ SW_SHOWMINIMIZED to 2
Equ SW_SHOWMINNOACTIVE to 7
Equ SW_SHOWNA to 8
Equ SW_SHOWNOACTIVATE to 4
Equ SW_SHOWNORMAL to 1
Declare function Windows_Services, WinAPI_MoveWindow, WinAPI_GetWindowTextA, WinAPI_GetWindow, WinAPI_IsWindow
Declare function FindWindow, PostMessage, ShowWindow, IsWindowVisible
Declare function SRP_GetTopWindow, ShellExecute, Kill_Application, Utility
Declare subroutine Windows_Services, SRP_SetForeGroundWindow
GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end
Return Response else ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Service Parameter Options
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Options BOOLEAN = True$, False$
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Services
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------------------------
// SetSize
//
// Param1 - Handle to the window.
// Param2 - Class Name to the window. This is ignored if there is a handle.
// Param3 - Caption text of the window. This is ignored if there is a handle or class name.
// Param4 - X Position.
// Param5 - Y Position.
// Param6 - Width.
// Param7 - Height.
//
// Sets the size of the window.
//----------------------------------------------------------------------------------------------------------------------
Service SetSize(Handle, ClassName, CaptionText, XPos, YPos, Width, Height)
If Len(Handle) EQ 0 then
Begin Case
Case Len(ClassName)
Handle = Windows_Services('GetHandle', ClassName)
Case Len(CaptionText)
Handle = Windows_Services('GetHandle', '', CaptionText)
End Case
end
If Handle GT 0 then
rv = WinAPI_MoveWindow(Handle, XPos, YPos, Width, Height, True$)
end else
Error_Services('Add', 'No valid window was passed in to the ' : Service : ' service.')
end
end service
//----------------------------------------------------------------------------------------------------------------------
// IsRunning
//
// Param1 - Handle to the window.
// Param2 - Class Name to the window. This is ignored if there is a handle.
// Param3 - Caption text of the window. This is ignored if there is a handle or class name.
//
// Returns True if the window is running or False is not.
//----------------------------------------------------------------------------------------------------------------------
Service IsRunning(Handle, ClassName, CaptionText)
Begin Case
Case Len(Handle)
If WinAPI_IsWindow(Handle) else Handle = ''
Case Len(ClassName)
Handle = Windows_Services('GetHandle', ClassName)
Case Len(CaptionText)
Handle = Windows_Services('GetHandle', '', CaptionText)
End Case
Response = (Handle GT 0)
end service
//----------------------------------------------------------------------------------------------------------------------
// IsVisible
//
// Param1 - Handle to the window.
// Param2 - Class Name to the window. This is ignored if there is a handle.
// Param3 - Caption text of the window. This is ignored if there is a handle or class name.
//
// Returns True if the window is visible or False is not.
//----------------------------------------------------------------------------------------------------------------------
Service IsVisible(Handle, ClassName, CaptionText)
Begin Case
Case Len(Handle)
If WinAPI_IsWindow(Handle) else Handle = ''
Case Len(ClassName)
Handle = Windows_Services('GetHandle', ClassName)
Case Len(CaptionText)
Handle = Windows_Services('GetHandle', '', CaptionText)
End Case
Response = (IsWindowVisible(Handle) GT 0)
end service
//----------------------------------------------------------------------------------------------------------------------
// RunEXE
//
// Param1 - Full path and file name of the executable to run.
//
// Runs an executable program. This uses the RUNWIN service without any special flags. Therefore all executables will be
// launched modelessly and in normal mode.
//----------------------------------------------------------------------------------------------------------------------
Service RunEXE(PathToEXE)
If Len(PathToEXE) then
AppInfo = Utility('RUNWIN', PathToEXE)
If Len(AppInfo<2>) else
Error_Services('Add', Quote(PathToExe) : ' is an invalid executable file provided to the ' : Service : ' service.')
end
end else
Error_Services('Add', 'No path to an executable file was provided to the ' : Service : ' service.')
end
end service
//----------------------------------------------------------------------------------------------------------------------
// OpenFile
//
// Param1 - Full path and file name to open.
//
// Opens an OS file. This uses the ShellExecute Windows API without any special flags.
//----------------------------------------------------------------------------------------------------------------------
Service OpenFile(PathToFile)
If Len(PathToFile) then
rv = ShellExecute('', 'open' : \00\, PathToFile : \00\, '' : \00\, '' : \00\, 0)
end else
Error_Services('Add', 'No path to a file was provided to the ' : Service : ' service.')
end
end service
//----------------------------------------------------------------------------------------------------------------------
// Close
//
// Param1 - Handle to the window.
// Param2 - Class Name to the window. This is ignored if there is a handle.
// Param3 - Caption text of the window. This is ignored if there is a handle or class name.
//
// Close the window. If the class name or window caption is passed in, only the first instance of any window will be
// closed. The developer will need to call the Close service multiple times until there are no more matching windows.
//----------------------------------------------------------------------------------------------------------------------
Service Close(Handle, ClassName, CaptionText)
If Len(Handle) EQ 0 then
Begin Case
Case Len(ClassName)
Handle = Windows_Services('GetHandle', ClassName)
Case Len(CaptionText)
Handle = Windows_Services('GetHandle', '', CaptionText)
End Case
end
If Handle GT 0 then
rv = PostMessage(Handle, WM_CLOSE, 0, 0)
end else
Error_Services('Add', 'No valid window was passed in to the ' : Service : ' service.')
end
end service
//----------------------------------------------------------------------------------------------------------------------
// KillEXE
//
// Param1 - Full path and file name of the executable to run.
// Param2 - Caption text of the window.
//
// Attempts to kill a running executable program. Returns a 1 if successful, or a negative number if unsuccessful.
//----------------------------------------------------------------------------------------------------------------------
Service KillEXE(EXEName, CaptionText)
Results = ''
If Len(EXEName) OR Len(CaptionText) then
Results = Kill_Application(EXEName, CaptionText, TimeoutDelay, True$)
end else
Error_Services('Add', 'No valid executable file or caption was provided to the ' : Service : ' service.')
end
Response = Results
end service
//----------------------------------------------------------------------------------------------------------------------
// Hide
//
// Param1 - Handle to the window.
// Param2 - Class Name to the window. This is ignored if there is a handle.
// Param3 - Caption text of the window. This is ignored if there is a handle or class name.
//
// Hide the window. If the class name or window caption is passed in, only the first instance of any window will be
// hidden. The developer will need to call the Hide service multiple times until there are no more matching windows.
//----------------------------------------------------------------------------------------------------------------------
Service Hide(Handle, ClassName, CaptionText)
CmdShow = SW_HIDE
GoSub ShowWindowAPI
end service
//----------------------------------------------------------------------------------------------------------------------
// Show
//
// Param1 - Handle to the window.
// Param2 - Class Name to the window. This is ignored if there is a handle.
// Param3 - Caption text of the window. This is ignored if there is a handle or class name.
//
// Activates the window and displays it in its current size and position. If the class name or window caption is passed
// in, only the first instance of any window will be hidden. The developer will need to call the Hide service multiple
// times until there are no more matching windows.
//----------------------------------------------------------------------------------------------------------------------
Service Show(Handle, ClassName, CaptionText)
CmdShow = SW_SHOW
GoSub ShowWindowAPI
end service
//----------------------------------------------------------------------------------------------------------------------
// Maximize
//
// Param1 - Handle to the window.
// Param2 - Class Name to the window. This is ignored if there is a handle.
// Param3 - Caption text of the window. This is ignored if there is a handle or class name.
//
// Maximizes the specified window. If the class name or window caption is passed in, only the first instance of any
// window will be hidden. The developer will need to call the Hide service multiple times until there are no more
// matching windows.
//----------------------------------------------------------------------------------------------------------------------
Service Maximize(Handle, ClassName, CaptionText)
CmdShow = SW_MAXIMIZE
GoSub ShowWindowAPI
end service
//----------------------------------------------------------------------------------------------------------------------
// Minimize
//
// Param1 - Handle to the window.
// Param2 - Class Name to the window. This is ignored if there is a handle.
// Param3 - Caption text of the window. This is ignored if there is a handle or class name.
//
// Minimizes the specified window. If the class name or window caption is passed in, only the first instance of any
// window will be hidden. The developer will need to call the Hide service multiple times until there are no more
// matching windows.
//----------------------------------------------------------------------------------------------------------------------
Service Minimize(Handle, ClassName, CaptionText)
CmdShow = SW_MINIMIZE
GoSub ShowWindowAPI
end service
//----------------------------------------------------------------------------------------------------------------------
// MakeActive
//
// Handle - Handle to the window. - [Required]
//
// Brings the window to the foreground and makes it active. This uses the SetForegroundWindow API:
// https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setforegroundwindow
//----------------------------------------------------------------------------------------------------------------------
Service MakeActive(Handle)
If Handle NE '' then
SRP_SetForeGroundWindow(Handle)
end
end service
//----------------------------------------------------------------------------------------------------------------------
// GetHandle
//
// Param1 - Class Name to the window.
// Param2 - Caption text of the window. This is ignored if there is a handle or class name.
// Param3 - Flag that determines if all handles should be returned rather than the first match. Only works when finding
// handles by CaptionText.
//
// Gets the handle for the window.
//----------------------------------------------------------------------------------------------------------------------
Service GetHandle(ClassName, CaptionText, AllHandles)
Handle = ''
If AllHandles NE True$ then AllHandles = False$
Begin Case
Case Len(ClassName)
// The FindWindow API returns the handle of a valid class name that is already running.
Handle = FindWindow(ClassName : \00\, '')
Case Len(CaptionText)
// The GetTopWindow API will return the handle of the first window running in z-order.
StartHandle = SRP_GetTopWindow('')
NextHandle = StartHandle
TextBuffer = Str(\00\, 100)
// The GetWindowText API will return the caption text of the window.
rv = WinAPI_GetWindowTextA(NextHandle, TextBuffer, Len(TextBuffer))
ThisCaption = TextBuffer[1, \00\]
If ThisCaption EQ CaptionText then Handle = NextHandle : @FM
// If the top window is not a match, then use the GetWindow API to retrieve the next running window's
// handle. Continue to loop through each window until a match is found or there are no more windows
// to process.
If Len(Handle) EQ 0 OR AllHandles = True$ then
Loop
Until (NextHandle EQ 0) OR (Len(Handle) AND AllHandles EQ False$)
NextHandle = WinAPI_GetWindow(NextHandle, 2)
TextBuffer = Str(\00\, 100)
rv = WinAPI_GetWindowTextA(NextHandle, TextBuffer, Len(TextBuffer))
ThisCaption = TextBuffer[1, \00\]
If ThisCaption EQ CaptionText then
Locate NextHandle in Handle using @FM setting fPos else
Handle := NextHandle : @FM
end
end
Repeat
end
Handle[-1, 1] = '' ; // Strip off the final @FM
End Case
Response = Handle
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////?
ShowWindowAPI:
If Len(Handle) EQ 0 then
Begin Case
Case Len(ClassName)
Handle = Windows_Services('GetHandle', ClassName)
Case Len(CaptionText)
Handle = Windows_Services('GetHandle', '', CaptionText)
End Case
end
If Handle GT 0 then
rv = ShowWindow(Handle, CmdShow)
end else
Error_Services('Add', 'No valid window was passed in to the ' : Service : ' service.')
end
return