Delphi - simulace pohybu myši jako prevence zamknutí PC

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod petrfilipi 19. 6. 2018 07:16

Nazdar všem.

Potřeboval bych napsat malou aplikaci, která by 1x do 10 minut simulovala pohyb myši (nebo s ní opravud o bod fyzicky pohnula) - výsledkem by mělo být defato zrušení inicializace spořiče.
Takže v Delphi (7) jsem do Timeru vložil toto:

if kam then SetCursorPos(mouse.CursorPos.X+10,mouse.CursorPos.Y)
else SetCursorPos(mouse.CursorPos.X-10,mouse.CursorPos.Y);
kam:=not(kam);

inc (s); //jen pro info, jak dlouho moje aplikace běží
if s>59 then begin
s:=0; inc (m);
end;
form1.Caption:=inttostr(m)+':'+inttostr(s);


Myš mi sice po 1s (nebo po jiné době Timeru) poskakuje, ale spořič se stejně zapne.

Našel jsem tedy utilitu "nosleep". Ta funguje skvěle, tady je její údajný kód, co se týče pohybu myši:
While 1
Sleep(30000)
$CurPos = MouseGetPos ( )
MouseMove ( $CurPos[0] + 1, $CurPos[1] )
MouseMove ( $CurPos[0] - 1, $CurPos[1] )
WEnd


Netušíte někdo, proč to v 1. případě nezabere a 2. případě ano, spořič se opravdu neaktivuje.
Celý? kód pro nosleep by měl být zde: https://www.symantec.com/connect/downloads/readynosleepexe-prevents-screensaver-and-pc-locking

Děkuji za rady.

Petr
petrfilipi
Junior

Odeslat příspěvekod Stoura 1 19. 6. 2018 09:25

Jen nápad (bez vlastního pokusu):

Zkoušel jste se podívat, jaké zprávy ta která funkce posílá skrz Windows?
Je možné, že SetCursorPos posílá něco jiného než MouseMove - jedno může uspávání zpracovávat a druhé ne.

A možná by proti usínání fungovalo i posílání zpráv klávesnice.
Stoura 1
Junior
Uživatelský avatar

Odeslat příspěvekod Nargon 19. 6. 2018 12:01

Podle všeho ta utilita nosleep je skript v AutoIt. A tam MouseMove opravdu simuluje pohyb myši. Tj pohyb z místa A na místo B je opravdu vidět jak jede kurzor po obrazovce. Kdežto SetCursorPos pouze nastaví novou pozici myši a kurzor se objeví na nové pozici, ale chybí tam ten pohyb myši. MouseMove má samozřejmě i parametr pro rychlost přesunu a dá se tam nastavit že se kurzor na cílovou souřadnici přesune okamžitě, tj stejně jako to udělá SetCursorPos, ale v defaultním nastavení je tam nějaké to zpoždění a myš po obrazovce jede. Je tedy dost možné že tu okamžitou změnu pozice myši windows nevyhodnotí jako pohyb a tedy nezakáže uspání.

Jinak řešit tohle přes pohyb myši je jako drbat se levou rukou za pravým uchem. Doporučuji podívat se na winapi, kde je funkce "SetThreadExecutionState", viz: https://msdn.microsoft.com/en-us/library/windows/desktop/aa373208(v=vs.85).aspx, tam je přesně to co potřebuješ.
Kód: Vybrat vše
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED) - tímto nastavíš že se systém nemá uspat, ale může se zapnout spořič obrazovky.
nebo
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) - tímto nastavíš že se systém nemá uspat a ani se nemá vypnout display (tj zapnout spořič obrazovky), tohle používají např. přehrávače videa.

a nakonec
SetThreadExecutionState(ES_CONTINUOUS) - vrácení do výchozího stavu, kdy se může systém uspat a display zhasnout případně spustit spořič.

Jak tuhle winapi funkci zavolat z delphi netuším, to si najdi sám.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod petrfilipi 19. 6. 2018 13:52

Díky moc za rady.
S tím pomalým přesunem myši je to logické, zkusím to nějak v Delphi nastavit.
Co se týče API funkcí, tak nevím, zdali to půjde, zkoušel jsem jich mraky a vzhledem k tomu, že PC je v doméně s doménovou politikou, přikazující po deaktivaci šetřiče zadat heslo, tak si nejsem jist, zdali takovýto přímý zápis bude systémem akceptován.
Ale zkusím to.

Ještě jednou díky.

Petr
petrfilipi
Junior

Odeslat příspěvekod JanFiala 20. 6. 2018 05:24

Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod Geniál 20. 6. 2018 13:20

Je nějaký důvod proč potřebuješ Delphi?

Nejlepší je na tohle třeba AutoHotkey script, sám jsem si takový Idler udělal právě pro tyto případy. Záležitost dvou minut.

https://autohotkey.com
https://autohotkey.com/board/topic/7137 ... e-if-idle/
Geniál
Junior

Odeslat příspěvekod petrfilipi 13. 7. 2018 08:03

Chlapi, ještě jednou díky moc za rady.
Petr
petrfilipi
Junior

Odeslat příspěvekod Nargon 13. 7. 2018 09:33

A jen tak ze zvědavosti, čím jsi to nakonec vyřešil?
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků