Windows: gescript een screenshot van een applicatie maken

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Hoi

Ik ben bezig met een app die een screenshot van een applicatie moet nemen en dan wat data-analyse op basis van dat screenshot moet doen. Development is gebeurd met handmatige screenshots en nu tijd voor deployment.
De applicatie is geschreven in python3 en moet op een windows 2012 server komen te draaien. Nu wil ik graag een screenshot maken van een specifiek window (ik ken de titel) zodat ik niet de hele desktop krijg en daar ook niet in hoef te gaan hobbien. Eventueel is het prima om met powershell een screenshot te maken en die als bmp/png op het filesystem op te slaan en dat screenshot vervolgens in de python-applicatie in te lezen.


Ik heb gekeken naar pyscreenshot maar dat lijkt vooral voor linux te zijn.
Tot nu toe ben ik nog geen powershellscreenshotscript tegengekomen waarbij je een pid of window-naam op kan geven.
imagemagick kan met import wel wat maar dan krijg je alsnog het hele beeldscherm.
Ik ga nog even kijken naar de screenCapture.bat van deze superuser.com (https://superuser.com/que...m-command-line-in-windows) , dus die staat op de lijst.

Heeft iemand vaker met dit bijltje gehakt en een gouden tip voor me?

i3 + moederbord + geheugen kopen?

Alle reacties


Acties:
  • 0 Henk 'm!

  • Josk79
  • Registratie: September 2013
  • Laatst online: 21-07 23:45
In het verleden gebruikte ik wel eens Autoit voor zulke dingen. Bijv: https://www.autoitscript....eenCapture_CaptureWnd.htm

Acties:
  • 0 Henk 'm!

  • Kobus Post
  • Registratie: September 2010
  • Laatst online: 01-07 15:33
Bedoel je zoiets?
https://gallery.technet.m...90-4f6b-a586-11eea6fc5eb8

En dat met Bing omdat Google hier niet bereikbaar is :p

No trees were harmed in the creation of this message, but several thousand electrons were mildly inconvenienced.


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Josk79 schreef op woensdag 28 augustus 2019 @ 22:42:
In het verleden gebruikte ik wel eens Autoit voor zulke dingen. Bijv: https://www.autoitscript....eenCapture_CaptureWnd.htm
Ah dat zou wellicht een optie zijn, moet ik alleen wel autoit installeren en de handle naar dat window fixen. moet te doen zijn maar wellicht wat lastiger.
Kobus Post schreef op woensdag 28 augustus 2019 @ 22:46:
Bedoel je zoiets?
https://gallery.technet.m...90-4f6b-a586-11eea6fc5eb8

En dat met Bing omdat Google hier niet bereikbaar is :p
Dat zou prachtig zijn, alleen ben ik net 20 mins bezig geweest met dat script werkend te krijgen maar krijg ik gewoon nooit output.
code:
1
2
3
PS C:\Users\john\Downloads> powershell.exe -executionpolicy bypass  -File  C:\Users\john\Downloads\Take-ScreenShot.ps1 -
screen -file "C:\Users\john\image.png"
PS C:\Users\john\Downloads>

Ik doe nooit wat met powershell maar dit zou volgens mij gewoon moeten werken. Heb voor de zekerheid maar even de executionpolicy systeembreed wat lager gezet, en draai dit als admin.

i3 + moederbord + geheugen kopen?


  • Tijntje
  • Registratie: Februari 2000
  • Laatst online: 09:36

Tijntje

Hello?!

Volgens mij moet dit met ShareX kunnen.
https://getsharex.com/docs/command-line-arguments

Als het niet gaat zoals het moet, dan moet het maar zoals het gaat.


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Ga ik straks even naar kijken, dank voor de tip :).

i3 + moederbord + geheugen kopen?


  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Boudewijn schreef op donderdag 29 augustus 2019 @ 19:39:
[...]


Dat zou prachtig zijn, alleen ben ik net 20 mins bezig geweest met dat script werkend te krijgen maar krijg ik gewoon nooit output.
code:
1
2
3
PS C:\Users\john\Downloads> powershell.exe -executionpolicy bypass  -File  C:\Users\john\Downloads\Take-ScreenShot.ps1 -
screen -file "C:\Users\john\image.png"
PS C:\Users\john\Downloads>
Waarom niet gewoon:
code:
1
2
PS C:\Users\john\Downloads> .\Take-ScreenShot.ps1 -screen -file "C:\Users\john\image.png"
PS C:\Users\john\Downloads>

Ik ken het script verder niet maar het lijkt me nutteloos om binnen Powershell weer een nieuwe Powershell instance te starten, en dan ook nog eens de -file parameter 2 keer te vullen.

Acties:
  • +1 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 15:32

DataGhost

iPL dev

downtime schreef op donderdag 29 augustus 2019 @ 19:47:
[...]


Waarom niet gewoon:
code:
1
2
PS C:\Users\john\Downloads> .\Take-ScreenShot.ps1 -screen -file "C:\Users\john\image.png"
PS C:\Users\john\Downloads>

Ik ken het script verder niet maar het lijkt me nutteloos om binnen Powershell weer een nieuwe Powershell instance te starten, en dan ook nog eens de -file parameter 2 keer te vullen.
Omdat iemand in z'n alwetende verhevenheid ooit heeft bedacht dat het uitvoeren van "code" met dezelfde rechten als die je al hebt wel eens gevaarlijk zou kunnen zijn, en het derhalve behoorlijk onmogelijk gemaakt om "even snel gekluste" powershell-scriptjes uit te voeren. De sleutel hier is -ExecutionPolicy bypass.

@Boudewijn het zal er ongetwijfeld aan liggen dat inderdaad de -File parameter tweemaal wordt meegegeven. Ik ben nog net niet zo'n powershell-held dat ik weet hoe je dat fixt maar onder Linux kan je met "--" aangeven dat alles wat volgt geen argumenten voor het eerste commando meer zijn, waarschijnlijk is er ook een powershell-equivalent.

[ Voor 18% gewijzigd door DataGhost op 29-08-2019 19:54 ]


Acties:
  • +1 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

DataGhost schreef op donderdag 29 augustus 2019 @ 19:51:
[...]

Omdat iemand in z'n alwetende verhevenheid ooit heeft bedacht dat het uitvoeren van "code" met dezelfde rechten als die je al hebt wel eens gevaarlijk zou kunnen zijn, en het derhalve behoorlijk onmogelijk gemaakt om "even snel gekluste" powershell-scriptjes uit te voeren.
Wat is er "behoorlijk onmogelijk" aan het invoeren van één commando? Set-ExecutionPolicy Unrestricted

En de reden is simpel: VBS kreeg een slechte reputatie door alle malware die erin geschreven is. En dus voert PowerShell by default niet zomaar alles uit. Dezelfde reden als waarom een .ps1 file standaard niet wordt uitgevoerd als je erop dubbelklikt maar opent in Notepad. Het is nu eenmaal niet bedoeld voor de argeloze eindgebruiker maar voor mensen die iets meer kennis van hun systeem hebben.

De helpfunctie zegt trouwens dit:
-File
Runs the specified script in the local scope ("dot-sourced"), so that the
functions and variables that the script creates are available in the
current session. Enter the script file path and any parameters.
File must be the last parameter in the command, because all characters
typed after the File parameter name are interpreted
as the script file path followed by the script parameters.
Klikt alsof escapen niet nodig is omdat de tweede -File parameter gewoon als parameter voor het script wordt gezien.

[ Voor 24% gewijzigd door downtime op 29-08-2019 20:12 ]


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
downtime schreef op donderdag 29 augustus 2019 @ 19:47:
[...]


Waarom niet gewoon:
code:
1
2
PS C:\Users\john\Downloads> .\Take-ScreenShot.ps1 -screen -file "C:\Users\john\image.png"
PS C:\Users\john\Downloads>

Ik ken het script verder niet maar het lijkt me nutteloos om binnen Powershell weer een nieuwe Powershell instance te starten, en dan ook nog eens de -file parameter 2 keer te vullen.
Omdat je met die execution policy zit te knoeien dan. Op een productiebak ga ik dat niet systeembreed uit (mogen/willen) zetten ;).
DataGhost schreef op donderdag 29 augustus 2019 @ 19:51:
[...]

Omdat iemand in z'n alwetende verhevenheid ooit heeft bedacht dat het uitvoeren van "code" met dezelfde rechten als die je al hebt wel eens gevaarlijk zou kunnen zijn, en het derhalve behoorlijk onmogelijk gemaakt om "even snel gekluste" powershell-scriptjes uit te voeren. De sleutel hier is -ExecutionPolicy bypass.
Dat dus.
@Boudewijn het zal er ongetwijfeld aan liggen dat inderdaad de -File parameter tweemaal wordt meegegeven. Ik ben nog net niet zo'n powershell-held dat ik weet hoe je dat fixt maar onder Linux kan je met "--" aangeven dat alles wat volgt geen argumenten voor het eerste commando meer zijn, waarschijnlijk is er ook een powershell-equivalent.
Hmm ik ga er toch maar even induiken. Desnoods die hele parameter eruit slopen, ik weet toch altijd wel hoe het window heet O-)
downtime schreef op donderdag 29 augustus 2019 @ 20:08:
[...]

Wat is er "behoorlijk onmogelijk" aan het invoeren van één commando? Set-ExecutionPolicy Unrestricted
Het is een productiesysteem, dus ik wil alleen voor dit script die rechten. Verderniet.
En de reden is simpel: VBS kreeg een slechte reputatie door alle malware die erin geschreven is. En dus voert PowerShell by default niet zomaar alles uit. Dezelfde reden als waarom een .ps1 file standaard niet wordt uitgevoerd als je erop dubbelklikt maar opent in Notepad. Het is nu eenmaal niet bedoeld voor de argeloze eindgebruiker maar voor mensen die iets meer kennis van hun systeem hebben.
Yup dat is prima.
De helpfunctie zegt trouwens dit:

[...]

Klikt alsof escapen niet nodig is omdat de tweede -File parameter gewoon als parameter voor het script wordt gezien.
Ja maar als het niet het argument escapen is, wat gaat er dan wel mis?

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • Xantios
  • Registratie: Maart 2006
  • Laatst online: 20-07 17:49
Boudewijn schreef op donderdag 29 augustus 2019 @ 19:39:
[...]

Ah dat zou wellicht een optie zijn, moet ik alleen wel autoit installeren en de handle naar dat window fixen. moet te doen zijn maar wellicht wat lastiger.

[...]
Je kan van autoIt ook nog wel een exe bouwen :)

Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 15:32

DataGhost

iPL dev

Sterker nog, voor zover ik weet is er python-integratie mogelijk met autoit :)

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Zo ik ben hier weer mee verder gegaan en ik heb een prachtig stukje code gevonden:
https://stackoverflow.com...-in-python-3k-without-pil


Die code werkt deels: je kunt een window-handle vinden maar de screenshot-optie werkt niet. Verder zoeken en wat knutselen heeft me dit opgeleverd, dit werkt op een win64 machine (ondanks de win32 referenties):
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import win32gui
import win32ui
import win32con
from time import sleep


class Screenshotter():

    @staticmethod
    def make_screenshot(window_title, screenshot_location):
        toplist, winlist = [], []

        def enum_cb(hwnd, results):
            winlist.append((hwnd, win32gui.GetWindowText(hwnd)))

        win32gui.EnumWindows(enum_cb, toplist)

        target_window = [(hwnd, title) for hwnd, title in winlist if window_title.lower() in title.lower()]
        target_window = target_window[0]
        hwnd = target_window[0]

        if not hwnd:
            hwnd = win32gui.GetDesktopWindow()
        l, t, r, b = win32gui.GetWindowRect(hwnd)
        h = b - t
        w = r - l
        hDC = win32gui.GetWindowDC(hwnd)
        myDC = win32ui.CreateDCFromHandle(hDC)
        newDC = myDC.CreateCompatibleDC()

        myBitMap = win32ui.CreateBitmap()
        myBitMap.CreateCompatibleBitmap(myDC, w, h)

        newDC.SelectObject(myBitMap)

        win32gui.SetForegroundWindow(hwnd)
        sleep(.2) 
        newDC.BitBlt((0, 0), (w, h), myDC, (0, 0), win32con.SRCCOPY)
        myBitMap.Paint(newDC)
        myBitMap.SaveBitmapFile(newDC, screenshot_location)


De sleep(.2) is een beetje ruk maar goed genoeg.
Ik accepteer dat het dus een halve seconde kost, het venster naar voren springt, het vast niet goed werkt als het venster half buiten beeld hangt (dus rechtsonder in beeld de linkerbovenhoek van het venster begint) of als er meerdere vensters zijn met dezelfde naam.


Dank voor het meedenken allen (@DataGhost @downtime @Tijntje @Kobus Post @Josk79 @Xantios )

[ Voor 6% gewijzigd door Boudewijn op 12-09-2019 18:52 ]

i3 + moederbord + geheugen kopen?

Pagina: 1