Stránka 1 z 1

zabránit dvojitému(současnému) spuštění programu

Napsal: 08 bře 2010 10:19
od petrofff
HOTKEY spouští VBS skript, který během dvou vteřin odešle aplikaci sekvenci kláves.zkratek (=macro)
Bohužel při delším stisku HOTKEY se opakovaně spustí tentýž proces => dříve než 1. doběhl do konce
Z kláves vznikne "guláš", je tedy nutné mu v tom zabránit postupem:

Kód: Vybrat vše

if <test: NeníToPoprvé> then Quit
<nastav: NeníToPoprvé>
příkazový blok = sendkey1, sleep 50, sendkey2, sleep 50, ...atd
<nuluj: NeníToPoprvé>

Zkusil jsem použít jako příznak <NeníToPoprvé> atribut hidden spouštěného skriptu:
=> funguje ale chtěl bych řešení bez zápisu na disk (quli zpomalení závislém na akt.používání HDD)

Napadl mě způsob: <test: NeníToPoprvé?> = <projdi všemi procesy, je tam wscript.exe víc než 1x ?>
[+] Nastav/Nuluj se nepoužije. Lze realizovat jako VBS
[−] Není funkční, pokud zrovna někde běží wscript.exe !!!
Byl by použitelný po modifikaci (není problém použít VB místo VBS), tj. pokud lze proces nějak identifikovat, že je to ten náš
...nešlo by to podle titulku okna ??? ( myslím že změnit titulek si běžící aplikace umí )

Klidně použiju jakékoli jiné řešení (kromě spouštění nějaké utility z disku => zpomalení)

Re: zabránit dvojitému(současnému) spuštění programu

Napsal: 08 bře 2010 14:39
od CZechBoY
ani jsem to skoro nečetl, ale: k zvýraznění CODE(programováního jazyku) použij SYNTAX BBCode(úplně vpravo mezi BBCode) pak tam ještě dej lang=jazyk
k problému:
zkus dát na začátek if(spusteno<>1) then spusteno=1 ....tvůj kód.. konec

Re: zabránit dvojitému(současnému) spuštění programu

Napsal: 09 bře 2010 09:55
od petrofff
To CZechBoY:
1. V TAGu [cоde] nemám zdroják, jde o meta-jazyk (opravdu nejde o problém se syntaxí)
2. Jediný zdrojový kód, kterým můžu posloužit, je současný skript VBS [syntax lang=vb]. Dík za upozornění - fajn funkce
[syntax lang=vb]'~~~~~~~~~~~~~ VSTUP DO KRITICKÉ SEKCE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Dim fso
Dim act
Set fso = CreateObject("Scripting.FileSystemObject")
Set act = fso.GetFile(WScript.ScriptFullName)
if act.Attributes and 2 then WScript.Quit         ' if <test:NeníToPoprvé> then Quit  
act.Attributes = act.Attributes or 2              '    <nastav:NeníToPoprvé>

'~~~~~~~~~~~~~ ZASÍLÁNÍ KLÁVES APLIKACI OPERA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Set shell = WScript.CreateObject("WScript.Shell")
shell.AppActivate("opWindow")   ' Opera -> fokus
 WScript.Sleep 100
shell.SendKeys "{F7}"           'Zajistí skrytí panelů:       
 WScript.Sleep 50
shell.SendKeys "{ESC}"
 WScript.Sleep 50
  . . . . .  
     atd.
'~~~~~~~~~~~~ VÝSTUP Z KRITICKÉ SEKCE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
act.Attributes = (act.Attributes or 2) - 2         ' <nuluj:NeníToPoprvé>
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[/syntax]

Re: zabránit dvojitému(současnému) spuštění programu

Napsal: 09 bře 2010 22:27
od Sender
Nevím jeká je podpora winAPI,ale ve vyšších programovacích jazycích se to obvykle řeší funkcemi CreateMutex, CreateSemaphore,FindWindow a další.
http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx