How to close a running program from an Alaskan program

This forum is for eXpress++ general support.
Post Reply
Message
Author
User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

How to close a running program from an Alaskan program

#1 Post by Eugene Lutsenko »

Running a program for execution from a program in Alaska is no problem. But how do I close a running program from an Alaskan program?. For example, how do I close the browser from a program in Alaska? I mean close the external program unconditionally, as from the task Manager to close the process.

Example. I'm running an on-line translator: http://aidos.byethost5.com/translate.php. A browser window Opens with the translation. Now it is necessary to close this window or better to close the browser itself. This should be done without the user's participation, i.e. programmatically. I don't care which program to close it from: php or Alaska. But it seems impossible to do this from php.

It would be ideal to launch the translator without opening the browser at all. The fact is that the file for translation, the translation direction and the translated file: all this is uploaded and downloaded via ftp by my program. You don't need a browser at all.

Code: Select all

<?php

// Документация к API Яндекс-переводчика txt-файлов: https://yandex.ru/dev/translate/

$key = 'My key';  // Получить ключ: https://yandex.ru/dev/translate/doc/dg/concepts/api-keys-docpage/

$text = file_get_contents('text_ru.txt');                                            // Текст должен быть в кодировке UTF-8 или если он в другой - то надо здесь его перекодировать
$text = iconv('CP866', 'UTF-8', $text);                                              // Перекодирование текста из DOS-TXT OEM866 в UTF-8

$lang = file_get_contents('lang.txt');                                               // Файл, в котором задано направление перевода, например: 'ru-en'

$params = array( 'key' => $key , 'text' => $text, 'lang' => $lang,);                 // Задать направление перевода: 'ru-en'
$query = http_build_query($params);
$response = file_get_contents('https://translate.yandex.net/api/v1.5/tr.json/translate?'.$query);
$data = json_decode($response, true);
$text = $data['text'][0];

echo $text;

// Перекодирование текста из windows-1251 в UTF-8, хотя на хосте файл виден как бы в кодировке windows-1251, когда его скачаешь на комп он и так оказывается уже в utf-8
//$text = iconv('windows-1251', 'UTF-8', $text);

$fp = fopen("text_transl.txt", "w");     // открываем файл, если файл не существует, делается попытка создать его
fwrite($fp, $text);                      // записываем в файл текст
fclose($fp);                             // закрываем

?>
[/size]

k-insis
Posts: 94
Joined: Fri Jan 28, 2011 4:07 am

Re: How to close a running program from an Alaskan program

#2 Post by k-insis »

Easiest from exe is to execute command

syntax:

taskkill /im <name_of_exe>

example:

taskkill /im totalcmd64.exe

This will send WM_CLOSE message event to instances of this particullar exe

Option B is to use Win32 Api to find Open instance of program and then post WM_CLOSE message event to it.

Victorio
Posts: 620
Joined: Sun Jan 18, 2015 11:43 am
Location: Slovakia

Re: How to close a running program from an Alaskan program

#3 Post by Victorio »

Hi Eugene,

I am using it with tasklist and taskkill like this :

Code: Select all

LOCAL lOk,bezi:=.F.

* generate list of running processes to temporary file tasklist.csv
RunShell('/C TaskList.Exe /V /FO CSV > tasklist.csv',,.F.,.T.)

* read and convert csv file to array
aTasks := DC_Csv2Array('tasklist.csv')

* remove header, because some problem if other language windows version for example france 
ARemove( aTasks,1 )

* and replace header with own
aHeader:={"Image Name","PID","Session Name","Session#","Mem Usage","Status","User Name","CPU Time","Window Title"}

aWidths := Array(Len(aTasks[1]))

AFill(aWidths,10)
aWidths[1] := 25
aWidths[2] := 5
aWidths[3] := 5
aWidths[4] := 6
aWidths[9] := 40

ASort(aTasks,,,{|a,b|a[1]<b[1]})

* test if application for example mview.exe running
test=AScan(aTasks,"mview.exe")

* application running, i kill them
if test!=0
	RunShell('/F /IM ' + "mview.exe",'C:\windows\system32\TaskKill.Exe',.t.,.f.)
endif
I am using this long time, but with several functions, where user can confirm if run another application or kill and open againg, and other
variants.

I am using this also for kill opened acrobat reader, when I need close program or when cannot create PDF file with same name as opened in Acrobat Reader.

A am sure, this can be realize with other low level calling system dll, but this works for me good.

Note : I use change header of csv file, because I have some problem on PC with France version of Windows 10, where header containded some umlauts/diacritics character which caused problem when convert to array

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: How to close a running program from an Alaskan program

#4 Post by Eugene Lutsenko »

Thanks everyone. I will try. This is encouraging

User avatar
rdonnay
Site Admin
Posts: 4722
Joined: Wed Jan 27, 2010 6:58 pm
Location: Boise, Idaho USA
Contact:

Re: How to close a running program from an Alaskan program

#5 Post by rdonnay »

You can run the sample eXpress++ program: ..\samples\tasklist\tasks.exe.

It will list all running programs and allow you to choose any program to kill.

The source code for TASKS.PRG should help you.
The eXpress train is coming - and it has more cars.

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: How to close a running program from an Alaskan program

#6 Post by Eugene Lutsenko »

Yes, thank you very much, Roger and Victorio! This is really what you need!

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: How to close a running program from an Alaskan program

#7 Post by Eugene Lutsenko »

Your examples work well. Thank you very much! But is it possible in Alaska to find out which browser is installed on your computer by default with a single command? I don't want to analyze tasklist before and after launching the browser. Although of course this way you can find out

Victorio
Posts: 620
Joined: Sun Jan 18, 2015 11:43 am
Location: Slovakia

Re: How to close a running program from an Alaskan program

#8 Post by Victorio »

I mean, You can find it in registry
for example key
Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice
key Progld

Sometimes is problem to correctly kill proces if 32 or 64 bit systems, also when I use Acrobat Reader, I also test how caption have it

Here are some example, I do not know if I use it, or change to other system, but here is example when I want kill Acrobat reader but in task is not only Acrord32 but also file name opened in it :
look for inspiration :

Code: Select all

* test if running Acrobat reader and also if is open with file "SUBOR"
************************************
FUNCTION TESTSPUSTENYACROBAT2(subor)	// zistí či je spustený acrobat reader a či
************************************	// v title nie je názov otvoreného dokumentu
LOCAL jeotvoreny:=.F.

RunShell('/C TaskList.Exe /V /FO CSV > tasklistw.csv',,.F.,.T.)
Sleep(100)		// čaká chvíľku, aby sa stabilizoval

* načíta do pola aTasks obsah CSV súboru
aTasks := DC_Csv2Array('tasklistw.csv')

* kontrola, či bol CSV súbor do pola načítaný
** ak sa nepodarilo nenačítať tasklist
IF Empty(aTasks)		
	* pokus o opakovanie načítania
	opak:=1
	DO WHILE Empty(aTasks) .and. opak<3		
		RunShell('/C TaskList.Exe /V /FO CSV > tasklistw.csv',,.F.,.T.)
		Sleep(100)		// čaká chvíľku, aby sa stabilizoval
		aTasks := DC_Csv2Array('tasklistw.csv')
		opak++	
	ENDDO
	* ak ani opakovane sa nepodarilo vytvorit TASKLISTW.CSV, mview sa nespustí
	IF Empty(aTasks)		
		DCMSGBOX 'Nemôžem vytvoriť súbor TASKLISTW.CSV'
		DC_GetDestroy(GetList)
		DC_ClearEvents()
		return nil
	ENDIF
ENDIF

*qqq 30.10.2017 vymazanie prvého riadku, lebo hlavičku si nadefinujem sám, na francúzkom w10 totiž problém s diakritikou
*               a možno bude aj na SK windowse, 
ARemove( aTasks,1 )

* zistenie hlavičky z prvej položky poľa
*qqq 30.10.2017 ruším načítanie hlavičky, lebo som ju vyššie vymazal a nadefinujem vlastnú
*aHeader := aTasks[1]
aHeader:={"Image Name","PID","Session Name","Session#","Mem Usage","Status","User Name","CPU Time","Window Title"}

* zistenie šírky polí
aWidths := Array(Len(aTasks[1]))

AFill(aWidths,10)
aWidths[1] := 25
aWidths[2] := 5
aWidths[3] := 5
aWidths[4] := 6
aWidths[9] := 40

* vymazanie prvého riadku z tasklistu, čo sú názvy polí
*qqq 30.10.2017 tu už blokujem vymazanie, pretože hlavičku som vymazal vyššie, aby sa celkom ignorovala
*ARemove( aTasks,1 )
ASort(aTasks,,,{|a,b|a[1]<b[1]})

jeotvoreny:=TestTaskAcrobat(aTasks,aHeader,subor)

Return jeotvoreny

******************************************************************************************************
STATIC FUNCTION TestTaskAcrobat( aTasks, aHeader, subor)
******************************************************************************************************
* funkcia zistí, či Acrobat je alebo nieje spustený s otvoreným dokumentom a vráti .T. alebo .F.

LOCAL jeotvoreny2:=.F.
LOCAL SAVEXACT		// pom.premenná pre nastavenie porovnávania reťazcov

*aHeader:={"Image Name","PID","Session Name","Session#","Mem Usage","Status","User Name","CPU Time","Window Title"}

SAVEXACT := SET(_SET_EXACT)
SET EXACT OFF





* !!! HERE test if found opened file name in Tasks and then if also AcroRd32.exe opened

* hľadá názov PDF súboru, napr. LV3.PDF
test1:=AScan(aTasks,alltrim(subor))		
* hľadá aplikáciu AcroRd32.exe , tj. či je spustený acrobat
test2:=AScan(aTasks,"AcroRd32.exe")		

SET EXACT &savexact

if test1!=0
	*ladenie("test1!=0 našiel otvorený súbor v tasks subor="+subor)
endif

if test2!=0
	*ladenie("test2!=0 našiel otvorený AcroRd32 v tasks")
endif

* ak našiel v task v title názov súboru a je otvorený, tak vráti .T.
*qqq 3.5.2018 tu upravujem dávam testovať aj súbor aj otvorený acrobat
if test1!=0
*if test1!=0 .or. test2!=0	// nemôžem or test2, lebo nemusí byť už súbor, a potom chyba ak test1=0, na poli zhavaruje
	if aTasks[test1,9]="AcroRd32.exe"
	*if alltrim(aTasks[test1,9])="AcroRd32.exe"	// tu dajaky problem
		*ladenie("subor je otvoreny z AcroRd32.exe, atasks[test1,9]="+atasks[test1,9])
		jeotvoreny2:=.T.
	endif
endif

********************
RETURN jeotvoreny2
********************

* CLOSE ACROBAT with waiting to end printing file, this not work correctly, then now I use Sumatra PDF.
******************************************
FUNCTION ZATVORACROBATPT(cestaplussubor)	// fnc.pre zatvorenie acrobatu po tlači čakanie na vytlačenie PDF cez priamu tlač
******************************************	// v Acrobate a až potom kill
* parameter je cesta plus súbor,funkcia si z toho vyberie názov súboru

* čakacia slučka potrebná, aby sa acrobat nezatvoril skôr, ako je súbor vytlačený
* využíva zmenu názvu v Title Acrobatu, ktorý sa mení podľa toho, či je súbor otvorený alebo sa tlačí, alebo 
* nie, buď je v Title názov súboru alebo potom je už názov Adobe Acrobat Reader

* zistenie názvu súboru z komplet cesty plus súbor
testsubor:=substr(cestaplussubor,rat("\",cestaplussubor)+1,len(cestaplussubor)-rat("\",cestaplussubor))

* tu ešte krátka pauza, aby sa stihol otvoriť acrobat
sleep(30)

* testovanie, či je ešte otvorený súbor buď v prehliadači alebo sa tlačí a je hidden
do while TESTSPUSTENYACROBAT2(testsubor)
	sleep(50)
enddo
sleep(50)	// predĺžujem z 10 na 50 aby mal čas na odoslanie aj na sieťovú tlačiareň

*qqq 3.5.2018 skúšam volanie WMIC
*RunShell("printjob get >d:\testik001.txt","wmic.exe",.f.,.t.)
* tu sú komplet popísané parametre
*https://www.computerhope.com/wmic.htm


* zatvorenie Acrobat readeru cez Taskkill
* ošetrenie na chybu, ak nie je Acrobat nainštalovaný
if Valtype(cestapdfview) # 'C' .OR. Empty(cestapdfview)
	* ak Acrobat nieje nainštalovaný, tak ho ani neukončuje cez TaskKill
else
	* zistenie názvu acrobat readeru exe 
	nazovacrobat:=alltrim(substr(cestapdfview,rat("\",cestapdfview)+1,len(cestapdfview)-rat("\",cestapdfview)))
	if len(nazovacrobat)!=0
		*RunShell("/F /IM "+cestapdfview,'C:\windows\system32\TaskKill.Exe',.f.,.t.)
		* tu dávam oba spôsoby, priamo Acrord32.exe funguje  16.3.2018 ale z cestou nechce brať ? neviem prečo
		RunShell("/F /IM "+"acrord32.exe",'C:\windows\system32\TaskKill.Exe',.f.,.t.)
		RunShell("/F /IM "+nazovacrobat,'C:\windows\system32\TaskKill.Exe',.f.,.t.)
	endif
endif

return nil

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: How to close a running program from an Alaskan program

#9 Post by Eugene Lutsenko »

Huge thanks to everyone! Everything works fine!

Code: Select all

  
*********************************************************************************************************************
  // Отметка в базе данных test_strings.txt на сайте: http://aidos.byethost5.com реквизитов посетителя
  // и переход (редирект) на основной сайт: http://lc.kubagro.ru ЕСЛИ ЕСТЬ INTERNET*
  *********************************************************************************************************************

  IF .NOT. InternetGetConnectedState( @n, 0 ) == 0

     RunShell('/C c:\Windows\System32\TaskList.exe /V /FO CSV > TaskList1.csv',,.F.,.T.)       // .F. - чтобы программа не продожалась дальше, пока не закончится перевод

     DC_SpawnURL( 'http://aidos.byethost5.com/index.php', .T., .T. )
*    DC_SpawnURL( 'http://aidos.byethost5.com/index.php' )

     RunShell('/C c:\Windows\System32\TaskList.exe /V /FO CSV > TaskList2.csv',,.F.,.T.)       // .F. - чтобы программа не продожалась дальше, пока не закончится перевод

     ******* Определить, какой браузер открылся (установленный по умолчанию) и его принудительно закрыть, если он не был открыт до запуска системы Эйдос **************

     aTaskList1 := {}                                    // Все программы, запущенные на компьютере ДО    обращения к FTP-серверу
     nHandle := DC_txtOpen( 'TaskList1.csv' )            
     DO WHILE !DC_TxtEOF( nHandle )                      // Начало цикла по строкам
        mLine = DC_TxtLine( nHandle )                    // Выделить строку из текстового файла
        mPosExe = AT('.exe', mLine)                      
        IF mPosExe > 0                                   
           mPos = AT('","', mLine)                       
           mModName = SUBSTR(mLine,2,mPos-2)             
*          MsgBox(ConvToOemCP(mLine))                    
*          MsgBox(mModName)                              
           IF ASCAN(aTaskList1, mModName) = 0            // Каждая программа запоминается только один раз
              AADD (aTaskList1, mModName)                
           ENDIF                                         
        ENDIF                                            
        DC_TxtSkip( nHandle, 1 )                         
     ENDDO                                               
     DC_TxtClose( nHandle )                              
                                                         
     aTaskList2 := {}                                    // Все программы, запущенные на компьютере ПОСЛЕ обращения к FTP-серверу
     nHandle := DC_txtOpen( 'TaskList2.csv' )            
     DO WHILE !DC_TxtEOF( nHandle )                      // Начало цикла по строкам
        mLine = DC_TxtLine( nHandle )                    // Выделить строку из текстового файла
        mPosExe = AT('.exe', mLine)                      
        IF mPosExe > 0                                   
           mPos = AT('","', mLine)                       
           mModName = SUBSTR(mLine,2,mPos-2)             
*          MsgBox(ConvToOemCP(mLine))                    
*          MsgBox(mModName)                              
           IF ASCAN(aTaskList2, mModName) = 0            // Каждая программа запоминается только один раз
              AADD (aTaskList2, mModName)                
           ENDIF                                         
        ENDIF                                            
        DC_TxtSkip( nHandle, 1 )                         
     ENDDO                                               
     DC_TxtClose( nHandle )                              
                                                         
     aBrowsers := {}                                     // Наименования exe-модулей различных браузеров. ДОБАВИТЬ их как можно больше
     AADD(aBrowsers, 'explore.exe' )                     
     AADD(aBrowsers, 'opera.exe'   )                     
     AADD(aBrowsers, 'firefox.exe' )                     
     AADD(aBrowsers, 'chrome.exe'  )                     
     AADD(aBrowsers, 'iexplore.exe')                     
                                                         
     aTaskList12 := {}                                   // Только новые программы, запущенные на компьютере ПОСЛЕ обращения к FTP-серверу, их и надо принудительно закрыть
     FOR j=1 TO LEN(aTaskList2)
         IF ASCAN(aTaskList1, aTaskList2[j]) = 0         // Новая программа, запущенная на компьютере ПОСЛЕ обращения к FTP-серверу
            IF ASCAN(aBrowsers, aTaskList2[j]) > 0       // Запоминать только названия exe-модулей браузеров
               IF ASCAN(aTaskList12, aTaskList2[j]) = 0  // Каждая новая программа запоминается только один раз
                  AADD (aTaskList12, aTaskList2[j])
               ENDIF
            ENDIF
         ENDIF
     NEXT

     IF LEN(aTaskList12) > 0
        FOR j=1 TO LEN(aTaskList12)
            DO CASE
               CASE aTaskList12[j] = 'explore.exe' 
                    RunShell('/F /IM ' + 'explore.exe' ,'c:\Windows\System32\taskKill.exe',.T.,.F.)      // принудительно закрыть новую программу: aTaskList12[j]
               CASE aTaskList12[j] = 'opera.exe'
                    RunShell('/F /IM ' + 'opera.exe'   ,'c:\Windows\System32\taskKill.exe',.T.,.F.)      // принудительно закрыть новую программу: aTaskList12[j]   
               CASE aTaskList12[j] = 'firefox.exe'
                    RunShell('/F /IM ' + 'firefox.exe' ,'c:\Windows\System32\taskKill.exe',.T.,.F.)      // принудительно закрыть новую программу: aTaskList12[j] 
               CASE aTaskList12[j] = 'chrome.exe'  
                    RunShell('/F /IM ' + 'chrome.exe'  ,'c:\Windows\System32\taskKill.exe',.T.,.F.)      // принудительно закрыть новую программу: aTaskList12[j]
               CASE aTaskList12[j] = 'iexplore.exe'
                    RunShell('/F /IM ' + 'iexplore.exe','c:\Windows\System32\taskKill.exe',.T.,.F.)      // принудительно закрыть новую программу: aTaskList12[j]
            ENDCASE
        NEXT
     ENDIF

  ENDIF
  *********************************************************************************************************************
  *********************************************************************************************************************
[/size]

Post Reply