You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
245 lines
6.2 KiB
245 lines
6.2 KiB
/* File: C:\WACKER\TDLL\error_box.c (Created: 22-Dec-1993)
|
|
*
|
|
* Copyright 1990,1994 by Hilgraeve Inc. -- Monroe, MI
|
|
* All rights reserved
|
|
*
|
|
* $Revision: 10 $
|
|
* $Date: 4/17/02 10:00a $
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#pragma hdrstop
|
|
|
|
#include "stdtyp.h"
|
|
#include "assert.h"
|
|
|
|
#include "tdll.h"
|
|
#include "htchar.h"
|
|
#include "globals.h"
|
|
#include "errorbox.h"
|
|
#include "misc.h"
|
|
|
|
#include <term\res.h>
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
|
* Global Variables:
|
|
*
|
|
* These global variables are used to tell if the timer expored. At some
|
|
* future time it may become necessary to lock them, but not yet.
|
|
*/
|
|
|
|
#define TMB_IDLE 0
|
|
#define TMB_ACTIVE 1
|
|
#define TMB_EXPIRED 2
|
|
|
|
static int nState = TMB_IDLE;
|
|
static LPCTSTR pszMsgTitle;
|
|
static HWND hwndMsgOwner;
|
|
static BOOL CALLBACK TMTPproc(HWND hwnd, LPARAM lP);
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
|
* FUNCTION:
|
|
* TimedMessageTimerProc
|
|
*
|
|
* DESCRIPTION:
|
|
* This is the function that is passed to SetTimer when TimedMessageBox is
|
|
* called.
|
|
*
|
|
* PARAMETERS:
|
|
* As per the Win32 documentation.
|
|
*
|
|
* RETURNS:
|
|
* As per the Win32 documentation.
|
|
*/
|
|
VOID CALLBACK TimedMessageTimerProc(HWND hwnd,
|
|
UINT uMsg,
|
|
UINT_PTR idEvent,
|
|
DWORD dwTime)
|
|
{
|
|
// EnumThreadWindows(GetWindowThreadProcessId(hwndMsgOwner, NULL),
|
|
// TMTPproc, 0);
|
|
/*
|
|
* This works, but it is a very chancy thing to be doing.
|
|
* TODO: figure out a better way to kill the sucker.
|
|
*/
|
|
EnumWindows(TMTPproc, 0);
|
|
}
|
|
|
|
static BOOL CALLBACK TMTPproc(HWND hwnd, LPARAM lP)
|
|
{
|
|
TCHAR cBuffer[128];
|
|
|
|
cBuffer[0] = TEXT('\0');
|
|
/* Get the title of the window */
|
|
GetWindowText(hwnd, cBuffer, 128);
|
|
/* Compare to what we are looking for */
|
|
if (StrCharCmp(cBuffer, pszMsgTitle) == 0)
|
|
{
|
|
/* TODO: remove this after debugging is done */
|
|
mscMessageBeep(MB_ICONHAND);
|
|
nState = TMB_EXPIRED;
|
|
/* Take that, you rogue window ! */
|
|
PostMessage(hwnd, WM_CLOSE, 0, 0);
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
|
* FUNCTION:
|
|
* TimedMessageBox
|
|
*
|
|
* DESCRIPTION:
|
|
* This function is a replacement for MessageBox. It has the added feature
|
|
* of having a timeout feature. The timeout feature is necessary for any
|
|
* type of HOST mode or script feature.
|
|
*
|
|
* PARAMETERS:
|
|
* The parameters are the same as those passed to MessageBox plus our own
|
|
* timeout value. If the timeout value is greater than ZERO, then the
|
|
* timeout feature is active. If it is less than or equal to ZERO, the
|
|
* timeout feature is disabled.
|
|
*
|
|
* RETURNS:
|
|
* This function returns the usual MessageBox return values. It can also
|
|
* return a new value for a timeout. Each instance of calling this box
|
|
* should take care to handle the timeout return in an useful manner.
|
|
*
|
|
* For now, the timeout return value is set to (-1)
|
|
*/
|
|
int TimedMessageBox(HWND hwndOwner,
|
|
LPCTSTR lpszText,
|
|
LPCTSTR lpszTitle,
|
|
UINT fuStyle,
|
|
int nTimeout)
|
|
{
|
|
int nRet = 0;
|
|
UINT_PTR uTimer = 0;
|
|
TCHAR acTitle[256];
|
|
LPTSTR pTitle = (LPTSTR)lpszTitle;
|
|
|
|
if (lpszText == NULL || StrCharGetStrLength(lpszText) == 0)
|
|
{
|
|
UINT uiBeep;
|
|
|
|
if (fuStyle & MB_ICONASTERISK)
|
|
{
|
|
uiBeep = MB_ICONASTERISK;
|
|
}
|
|
else if (fuStyle & MB_ICONEXCLAMATION)
|
|
{
|
|
uiBeep = MB_ICONEXCLAMATION;
|
|
}
|
|
else if (fuStyle & MB_ICONHAND)
|
|
{
|
|
uiBeep = MB_ICONHAND;
|
|
}
|
|
else if (fuStyle & MB_ICONQUESTION)
|
|
{
|
|
uiBeep = MB_ICONQUESTION;
|
|
}
|
|
else if(fuStyle & MB_OK)
|
|
{
|
|
uiBeep = MB_OK;
|
|
}
|
|
else
|
|
{
|
|
uiBeep = -1;
|
|
}
|
|
|
|
mscMessageBeep(uiBeep);
|
|
return nRet;
|
|
}
|
|
|
|
if ((lpszTitle == 0 || StrCharGetStrLength(lpszTitle) == 0) &&
|
|
LoadString(glblQueryDllHinst(), IDS_MB_TITLE_ERR, acTitle, 256) != 0)
|
|
{
|
|
pTitle = acTitle;
|
|
}
|
|
|
|
/*
|
|
* A small hack because of the way the timeout stuff works.
|
|
* TODO: get this to work better.
|
|
*/
|
|
if (nTimeout > 0)
|
|
{
|
|
nTimeout *= 1000L; /* Convert seconds to milliseconds */
|
|
|
|
/* TODO: put something more unique into the title for ID purposes */
|
|
/* something like the parent window handle or similar */
|
|
pszMsgTitle = lpszTitle; /* Used to ID the window */
|
|
hwndMsgOwner = hwndOwner;
|
|
|
|
nState = TMB_ACTIVE;
|
|
if ((uTimer = SetTimer(NULL, 0, nTimeout, TimedMessageTimerProc)) == 0)
|
|
{
|
|
assert(FALSE);
|
|
/* Return failure */
|
|
return nRet;
|
|
}
|
|
}
|
|
|
|
fuStyle |= MB_SETFOREGROUND;
|
|
|
|
// TODO: May have to use MessageBoxEx() which provides a way of including
|
|
// a language specification so that pre-defined buttons appear with the
|
|
// correct language on them, OR MessageBoxIndirect() which allows for a
|
|
// definition of a hook-proc which can process the HELP messages - jac.
|
|
//
|
|
// REV: 3/27/2002 -- The following is a clipping from the MSDN documentation:
|
|
//
|
|
// The MessageBox function creates, displays, and operates a message box.
|
|
// The message box contains an application-defined message and title, plus
|
|
// any combination of predefined icons and push buttons.
|
|
//
|
|
// The MessageBoxEx function creates, displays, and operates a message box.
|
|
// The message box contains an application-defined message and title, plus
|
|
// any combination of predefined icons and push buttons. The buttons are in
|
|
// the language of the system user interface.
|
|
//
|
|
// Currently MessageBoxEx and MessageBox work the same way.
|
|
//
|
|
// TODO: We still need to make sure the sounds are transmitted when running
|
|
// in a Terminal Service session (Remote Desktop Connection) when the sound
|
|
// is anything other than -1.
|
|
//
|
|
|
|
nRet = MessageBox(hwndOwner,
|
|
lpszText,
|
|
pTitle,
|
|
fuStyle);
|
|
|
|
switch (nState)
|
|
{
|
|
case TMB_ACTIVE:
|
|
/*
|
|
* Everything is OK, no problem
|
|
*/
|
|
if (uTimer != 0)
|
|
{
|
|
KillTimer(NULL, uTimer);
|
|
}
|
|
break;
|
|
case TMB_EXPIRED:
|
|
/*
|
|
* Timer expired and killed MessageBox
|
|
*/
|
|
nRet = (-1);
|
|
if (uTimer != 0)
|
|
{
|
|
KillTimer(NULL, uTimer);
|
|
}
|
|
break;
|
|
case TMB_IDLE:
|
|
default:
|
|
if (uTimer != 0)
|
|
{
|
|
KillTimer(NULL, uTimer);
|
|
}
|
|
break;
|
|
}
|
|
|
|
nState = TMB_IDLE;
|
|
|
|
return nRet;
|
|
}
|