check for open internet explorer window

ninjaimp

New Member
Hi

I want to check to see if a browser window is currently open, hopefully by checking its locationname.

however i am unable to find a way to check for a running process of iexplore in progress.

i can get the browser window to open but would like to know if it is already open before doing so?

Code:
DEF VAR hExplorer AS COM-HANDLE.
CREATE "InternetExplorer.Application" hExplorer.
hExplorer:VISIBLE = TRUE.
hexplorer:navigate2("[URL]http://www.ebpagetoopen.com[/URL]").
PAUSE 5.

any help is appreciated
 

sphipp

Member
Try:

Code:
FUNCTION TaskIsRunning RETURNS LOGICAL (pi_cTask AS CHARACTER):
DEFINE VARIABLE cline      AS CHARACTER  NO-UNDO.
DEFINE VARIABLE lTaskFound AS LOGICAL    NO-UNDO.
ASSIGN pi_ctask = TRIM (pi_ctask).
INPUT THROUGH VALUE ('tasklist') NO-ECHO.
REPEAT:
    IMPORT cline NO-ERROR.
    IF cline BEGINS pi_ctask THEN DO:
        ASSIGN lTaskFound = YES.
        LEAVE.
    END.
END.
INPUT CLOSE.
RETURN lTaskFound.

END FUNCTION.
MESSAGE TaskIsRunning ("iexplore") VIEW-AS ALERT-BOX INFO BUTTONS OK.
 

sphipp

Member
If you have a play with tasklist then you can extract the title of the web page that is running.

Code:
FUNCTION IsTaskRunning RETURNS LOGICAL (pi_cTask AS CHARACTER, pi_cTitle AS CHARACTER):
DEFINE VARIABLE cline AS CHARACTER  NO-UNDO EXTENT 20.
DEFINE VARIABLE lRunning AS LOGICAL    NO-UNDO.
INPUT THROUGH VALUE ('tasklist /FI "Imagename eq iexplore.exe" /fo csv /v /nh') NO-ECHO.
REPEAT:
    IMPORT DELIMITER "," cline.
    IF cline [1] BEGINS pi_ctask AND cline [9] = pi_ctitle THEN DO:
        ASSIGN lRunning = YES.
        LEAVE.
    END.
END.
INPUT CLOSE.
RETURN lRunning.
END FUNCTION.
MESSAGE IsTaskRunning ("iexplore.exe","ProgressTalk.com - Reply to Topic - Windows Internet Explorer")
    VIEW-AS ALERT-BOX INFO BUTTONS OK.
 

sphipp

Member
Using some code from OEHive http://www.oehive.org/node/513:

Code:
&GLOB PROCESS_TERMINATE 1
 
PROCEDURE OpenProcess EXTERNAL "kernel32" :
  DEFINE INPUT  PARAMETER dwDesiredAccess AS LONG.
  DEFINE INPUT  PARAMETER bInheritHandle  AS LONG.
  DEFINE INPUT  PARAMETER dwProcessId     AS LONG.
  DEFINE RETURN PARAMETER hProcess        AS LONG.
END PROCEDURE.
 
PROCEDURE CloseHandle EXTERNAL "kernel32" :
  DEFINE INPUT  PARAMETER hObject     AS LONG.
  DEFINE RETURN PARAMETER ReturnValue AS LONG.
END PROCEDURE.
 
PROCEDURE TerminateProcess EXTERNAL "kernel32" :
  DEFINE INPUT  PARAMETER hProcess  AS LONG.
  DEFINE INPUT  PARAMETER uExitCode AS LONG.
  DEFINE RETURN PARAMETER retval    AS LONG.
END PROCEDURE.

FUNCTION IsTaskRunning RETURNS LOGICAL 
(INPUT pi_cTask AS CHARACTER, 
INPUT pi_cTitle AS CHARACTER,
OUTPUT po_cPID AS CHARACTER):
 
DEFINE VARIABLE cline AS CHARACTER  NO-UNDO EXTENT 20.
DEFINE VARIABLE lRunning AS LOGICAL    NO-UNDO.
 
INPUT THROUGH VALUE ('tasklist /FI "Imagename eq ' + pi_ctask + '" /fo csv /v /nh') NO-ECHO.
REPEAT:
    IMPORT DELIMITER "," cline.
    IF cline [1] BEGINS pi_ctask AND cline [9] = pi_ctitle THEN DO:
        ASSIGN lRunning = YES
               po_cPID  = cline [2].
        LEAVE.
    END.
END.
INPUT CLOSE.
 
RETURN lRunning.

END FUNCTION.
 
PROCEDURE ipCloseProcess:

DEFINE INPUT  PARAMETER pi_cProgram AS CHARACTER  NO-UNDO.
DEFINE INPUT  PARAMETER pi_cTitle AS CHARACTER  NO-UNDO.
 
DEFINE VARIABLE ProcessId     AS CHARACTER  NO-UNDO.
DEFINE VARIABLE ProcessHandle AS INTEGER NO-UNDO.
DEFINE VARIABLE ReturnValue   AS INTEGER NO-UNDO.
 
IF istaskrunning (INPUT pi_cProgram,INPUT pi_cTitle, OUTPUT ProcessID) THEN DO:
    RUN OpenProcess ({&PROCESS_TERMINATE}, 0, INT (ProcessId), OUTPUT ProcessHandle).
    IF ProcessHandle NE 0 THEN DO:
       RUN TerminateProcess (ProcessHandle, 0, OUTPUT ReturnValue).
       RUN CloseHandle(ProcessHandle, OUTPUT ReturnValue).
    END.
END.
END PROCEDURE.
 
RUN ipCloseProcess ("iexplore.exe","Google - Windows Internet Explorer").
 

ninjaimp

New Member
thanks sphipp, this is certainly doing the trick the only issue is it closes down another session of browser example:

I have two browser sessions open:
1) my page
2) google

it will close both, but if 3 sessions are open it still only closes 2?

wondered if you had any ideas?
 

sphipp

Member
Change

Code:
IF istaskrunning (INPUT pi_cProgram,INPUT pi_cTitle, OUTPUT ProcessID) THEN DO:
    RUN OpenProcess ({&PROCESS_TERMINATE}, 0, INT (ProcessId), OUTPUT ProcessHandle).
    IF ProcessHandle NE 0 THEN DO:
       RUN TerminateProcess (ProcessHandle, 0, OUTPUT ReturnValue).
       RUN CloseHandle(ProcessHandle, OUTPUT ReturnValue).
    END.
END.
to

Code:
REPEAT:
IF istaskrunning (INPUT pi_cProgram,INPUT pi_cTitle, OUTPUT ProcessID) THEN DO:
    RUN OpenProcess ({&PROCESS_TERMINATE}, 0, INT (ProcessId), OUTPUT ProcessHandle).
    IF ProcessHandle NE 0 THEN DO:
       RUN TerminateProcess (ProcessHandle, 0, OUTPUT ReturnValue).
       RUN CloseHandle(ProcessHandle, OUTPUT ReturnValue).
    END.
END.
ELSE RETURN.
END.

You might want to put in an extra check to make sure you don't try more than, say, 20 repeats, just in case you can't kill the process and it goes into an infinite loop.
 
Top