Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice
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 :
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