Solved

NT4 Cant I stop / restict a user closing a program?

Posted on 2009-06-29
3
364 Views
Last Modified: 2013-12-28
Hi there,

I have an app on an NT4 box, if a user clicks the X top right corner to close, and not using the correct exit button in the app, the database corrupts.

Any Ideas?

Cheers
Anthony
0
Comment
Question by:antgodber
3 Comments
 
LVL 83

Accepted Solution

by:
oBdA earned 500 total points
ID: 24735756
You can compile the following script as "StartNoClose" using AutoIT (http://www.autoitscript.com/autoit3/downloads.shtml).
Then run your application through StartNoClose:
StartNoClose.exe "C:\Programe Files\Acme\acme.exe"
Note that you'll need the 3.2.12.1 version for this to work on NT4.
#cs
StartNoClose.au3
Skript for AutoIT (http://www.autoitscript.com/)
Starts the program passed as argument in the command line, and removes "Close" from the system menu;
this will disable the windows's "X" button as well, but it will not disable Alt-F4.
Posted at Experts Exchange by oBdA (http://www.experts-exchange.com/Q_24529579.html?cid=295)
 
Tested and compiled with AutoIT v3.2.12.1; use Aut2exe.exe to compile this script into an executable.
#ce
AutoItSetOption("TrayIconHide", 1)
 
Global Const $SC_CLOSE = 0xF060
Global Const $MF_BYCOMMAND = 0x0
 
Func _ParseCommandLine(ByRef $strRunProgram)
Local $i
	If $CmdLine[0] = 0 Then
		$Syntax = @ScriptName & @CRLF & _
			"Starts the program passed as argument and disables the system 'Close' menu." & @CRLF & _
			@CRLF & _
			"Syntax: " & _
			@ScriptName & " <Program>"
		MsgBox(0 + 32, @ScriptName & " Syntax", $Syntax)
		Exit(0)
	Else
		$strRunProgram = $CmdLineRaw
	EndIf
EndFunc
 
Func _GetHwndFromPID($PID)
; AutoIT code for _GetHwndFromPID by BrettF (http://www.autoitscript.com/forum/index.php?showuser=16404), 
; posted at http://www.autoitscript.com/forum/index.php?showtopic=85337&st=15&start=15
Local $hWnd
Local $stPID
Local $winlist2
    $hWnd = 0
    $stPID = DllStructCreate("int")
    Do
        $winlist2 = WinList()
        For $i = 1 To $winlist2[0][0]
            If $winlist2[$i][0] <> "" Then
                DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $winlist2[$i][1], "ptr", DllStructGetPtr($stPID))
                If DllStructGetData($stPID, 1) = $PID Then
                    $hWnd = $winlist2[$i][1]
                    ExitLoop
                EndIf
            EndIf
        Next
        Sleep(100)
    Until $hWnd <> 0
    Return $hWnd
EndFunc ;==>_GetHwndFromPID
 
Func _RemoveClose($hWnd)
Local $ret
Local $hSystemMenu
	$ret = DllCall("user32.dll", "int_ptr", "GetSystemMenu", "hwnd", $hWnd, "int", 0)
	$hSystemMenu = $ret[0]
	DllCall("user32.dll", "int", "DeleteMenu", "hwnd", $hSystemMenu, "uint", $SC_CLOSE, "uint", $MF_BYCOMMAND)
EndFunc
 
Func _Main()
Local $intPid
Local $hWnd
Local $strRunProgram
	_ParseCommandLine($strRunProgram)
;	When doing test runs out of SciTE, set $strRunProgram to the program you want to start; $CmdLineRaw will contain arguments 
;	from the wrapper in addition to the arguments specified in the View menu.
;	$strRunProgram = "calc.exe"
	$intPid = Run($strRunProgram)
	If ($intPid = 0) Then
		MsgBox(0 + 48, "Error", "Program not found: " & @CRLF & $strRunProgram)
		Exit(1)
	Else
		$hWnd = _GetHwndFromPID($intPid)
		_RemoveClose($hWnd)
	EndIf
EndFunc
 
; ****************************************************************************************************
_Main()
; ****************************************************************************************************

Open in new window

0
 
LVL 74

Expert Comment

by:Glen Knight
ID: 34877590
This question has been classified as abandoned and is being closed as part of the Cleanup Program. See my comment at the end of the question for more details.
0

Featured Post

Live: Real-Time Solutions, Start Here

Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Storage devices are generally used to save the data or sometime transfer the data from one computer system to another system. However, sometimes user accidentally erased their important data from the Storage devices. Users have to know how data reco…
In this article, I will show you HOW TO: Perform a Physical to Virtual (P2V) Conversion the easy way from a computer backup (image).
As developers, we are not limited to the functions provided by the VBA language. In addition, we can call the functions that are part of the Windows operating system. These functions are part of the Windows API (Application Programming Interface). U…
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.

776 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question