Brauche Hilfe bei GDIP

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Brauche Hilfe bei GDIP

Re: Brauche Hilfe bei GDIP

Post by fump2000 » 21 Apr 2016, 05:30

wir nutzen hier den IE11 nicht den Edge.

Danke jNizM, werd ich mir anschauen.

Re: Brauche Hilfe bei GDIP

Post by jNizM » 21 Apr 2016, 03:38

Nur ne schnell-Übersetzung aus dem Forum ins aktuelle ahk 1.1 (von skrommel)

Code: Select all

#NoEnv
#SingleInstance Force
SetBatchLines, -1
DetectHiddenWindows, On

; ===============================================================================================================================

WinGet, source, Id, A
MsgBox % source
Gui, Show, w800 h800
Gui, +LastFound
WinGet, target, Id, A
DetectHiddenWindows, On

DWM(target, source, 0.8)

; ===============================================================================================================================

DWM(target, source, zoom := 1, flags := 0x13, opacity := 150)
{
    VarSetCapacity(thumbnail, A_PtrSize, 0)
    if (DllCall("dwmapi.dll\DwmRegisterThumbnail", "ptr", target, "ptr", source, "ptr", &thumbnail) != 0)
        return (ErrorLevel := 1) & 0
    thumbnail := NumGet(thumbnail, 0, "ptr")

    WinGetPos, wx, wy, ww, wh, % "ahk_id " target
    VarSetCapacity(DWM_THUMBNAIL_PROPERTIES, 45, 0)
    NumPut(flags,   DWM_THUMBNAIL_PROPERTIES,  0, "uint")
    NumPut(0,       DWM_THUMBNAIL_PROPERTIES,  4, "int")
    NumPut(0,       DWM_THUMBNAIL_PROPERTIES,  8, "int")
    NumPut(ww,      DWM_THUMBNAIL_PROPERTIES, 12, "int")
    NumPut(wh,      DWM_THUMBNAIL_PROPERTIES, 16, "int")
    NumPut(0,       DWM_THUMBNAIL_PROPERTIES, 20, "int")
    NumPut(0,       DWM_THUMBNAIL_PROPERTIES, 24, "int")
    NumPut(ww/zoom, DWM_THUMBNAIL_PROPERTIES, 28, "int")
    NumPut(wh/zoom, DWM_THUMBNAIL_PROPERTIES, 32, "int")
    NumPut(opacity, DWM_THUMBNAIL_PROPERTIES, 36, "uchar")
    NumPut(1,       DWM_THUMBNAIL_PROPERTIES, 37, "int")
    NumPut(1,       DWM_THUMBNAIL_PROPERTIES, 41, "int")
    if (DllCall("dwmapi.dll\DwmUpdateThumbnailProperties", "ptr", thumbnail, "ptr", &DWM_THUMBNAIL_PROPERTIES) != 0)
        return (ErrorLevel := 2) & 0
    return 1
}
Lässt sich bestimmt mit spielen
Noch mehr hier: AeroThumbnail by maul.esel

Re: Brauche Hilfe bei GDIP

Post by just me » 21 Apr 2016, 02:44

fump2000 wrote:Die Hardwarebschleunigung ist anscheinend der Knackpunkt. ... Warum die dabei wohl Probleme macht?
Wenn man sich Chrome bei aktivierter Hardwarebeschleunigung mit 'Active Window Info' anschaut, taucht recht weit oben in der Hierarchie ein Control der Klasse Intermediate D3D Window auf. Daraus kann man wohl schließen, dass Chrome dann "DirectDraw" Routinen nutzt, um die Fenster zu zeichnen. Die wiederum zeichnen direkt auf dem Bildschirm bzw. in den Speicher der Grafikkarte, und eben nicht in den 'device context (DC)' des Controls.

Beim IE stellt sich die Frage, welcher bei Euch überhaupt läuft. 'Edge' ist eine 'Windows App' und macht entsprechende Probleme, das 'korrekte' Anwendungsfenster zu ermitteln.

Re: Brauche Hilfe bei GDIP

Post by fump2000 » 20 Apr 2016, 09:03

Ja... Da bin ich dann mal raus :D

Re: Brauche Hilfe bei GDIP

Post by jNizM » 20 Apr 2016, 08:20

Re: Brauche Hilfe bei GDIP

Post by fump2000 » 20 Apr 2016, 08:08

Ja, auch mit aktiver Hardwarebeschleunigung kann dieses Tool das Bild abgreifen.
Aber lässt sich das in AHK Verwenden? Wie denn?

Re: Brauche Hilfe bei GDIP

Post by jNizM » 20 Apr 2016, 07:49

Macht OnTopReplica das, was du brauchst?
Source Code ist auch enthalten und basiert auf DWM Thumbnails.

Re: Brauche Hilfe bei GDIP

Post by fump2000 » 20 Apr 2016, 07:28

Die Hardwarebschleunigung ist anscheinend der Knackpunkt.
Beim Chrome klappt es mit deinem Testscript. Beim IE nicht.
Hardwarebesschleunigung habe ich bei beiden abgeschaltet.
Warum die dabei wohl Probleme macht?

Re: Brauche Hilfe bei GDIP

Post by just me » 20 Apr 2016, 04:46

OK, so bekomme ich mit beiden Varianten (wenn auch leicht unterschiedliche) Bilder von Chrome, wenn die Hardwarebeschleunigung abgeschaltet und das Chrome-Fenster im Vordergrund ist!:

Code: Select all

#NoEnv
SetBatchLines, -1
pToken := Gdip_Startup()
HWIN := WinExist("ahk_exe Chrome.exe")
WinActivate
; PBITMAP := Gdip_BitmapFromHWND(HWIN) ; Alternative 1
PBITMAP := Gdip_BitmapFromScreen("HWND:" . HWIN) ; Alternative 2
HBITMAP := Gdip_CreateHBITMAPFromBitmap(PBITMAP)
Gdip_DisposeImage(PBITMAP)
Gui, Add, Pic, w800 h-1, HBITMAP:%HBITMAP%
Gui, Show, , Test
Return
GuiClose:
Gui, Destroy
Gdip_Shutdown(pToken)
ExitApp
#Include GDIP.ahk

Re: Brauche Hilfe bei GDIP

Post by fump2000 » 20 Apr 2016, 01:15

Mmh heißt für mich, es gibt keinen anderen Weg mehr per HWND ein Bild zu bekommen?

Re: Brauche Hilfe bei GDIP

Post by just me » 19 Apr 2016, 15:58

nnnik wrote:Ein Fenster muss nicht unbedingt auf die PrintWindow Funktion/Nachricht reagieren.
Ja, witzigerweise wird aber eine Bitmap erzeugt. Und ich frage mich, woher die Win 7 Titelleiste kommt.
nnnik wrote:Eventuell kann es auch ein Hinweis darauf sein, dass ein anderes Fenster das eigentliche Zeichnen übernimmt und man einfach nur dieses Fenster finden müsste.
Genau das wollte ich damit sagen. ;)

Re: Brauche Hilfe bei GDIP

Post by nnnik » 19 Apr 2016, 12:31

P.S.: Wegen GDIP.ahk läft das nur mit 32 Bit AHK.
Wieso dann nicht die GDIP_all Version verwenden?
Also, Google (und vielleicht auch Microsoft) scheinen unter Win 10 mit den Fenstern merkwürdige Sachen zu veranstalten. Wenn ich das folgende Skript hier laufen lasse und mir per Ctrl+LButton die Fenster-ID (HWND) von Chrome hole, ergibt das eine Titelleiste im Win 7 Stil und viel Schwarz:
Das war aber nicht nur unter Win 10 so.
Ein Fenster muss nicht unbedingt auf die PrintWindow Funktion/Nachricht reagieren.
Eventuell kann es auch ein Hinweis darauf sein, dass ein anderes Fenster das eigentliche Zeichnen übernimmt und man einfach nur dieses Fenster finden müsste.

Re: Brauche Hilfe bei GDIP

Post by just me » 19 Apr 2016, 10:45

Also, Google (und vielleicht auch Microsoft) scheinen unter Win 10 mit den Fenstern merkwürdige Sachen zu veranstalten. Wenn ich das folgende Skript hier laufen lasse und mir per Ctrl+LButton die Fenster-ID (HWND) von Chrome hole, ergibt das eine Titelleiste im Win 7 Stil und viel Schwarz:

Code: Select all

#NoEnv
SetBatchLines, -1
pToken := Gdip_Startup()
Return
^LButton::
MouseGetPos, , , HWIN
PBITMAP := Gdip_BitmapFromHWND(HWIN)
HBITMAP := Gdip_CreateHBITMAPFromBitmap(PBITMAP)
Gui, Add, Pic, w800 h-1, HBITMAP:%HBITMAP%
Gui, Show, , Test
Return
GuiClose:
Gdip_Shutdown(pToken)
ExitApp
#Include GDIP.ahk
Das Fensters, dessen ID AHK ermittelt, scheint nicht das zu enthalten, was auf dem Bildschirm erscheint.

Firefox verhält sich übrigens noch wie früher.

P.S.: Wegen GDIP.ahk läft das nur mit 32 Bit AHK.

Re: Brauche Hilfe bei GDIP

Post by nnnik » 19 Apr 2016, 10:12

Hi
Ich kann dir nicht sagen, wieso deine HWND Version nicht mehr funktioniert.
Aber ich kann dir deine Angst über die Genauigkeit der übergebenen Parameter nehmen.
Ich habe mir angeschaut was die gdip Funktion bei mir genau macht, und wie sie die HWND verwendet.
Das einzige was die funktion macht ist die XY-Koordinaten des Fensters zu bestimmen und dann einen Screenshot davon zu machen:

Code: Select all

Gdip_BitmapFromScreen(Screen=0, Raster="")
{
	if (Screen = 0)
	{
		Sysget, x, 76
		Sysget, y, 77	
		Sysget, w, 78
		Sysget, h, 79
	} ;--Siehe hier
	else if (SubStr(Screen, 1, 5) = "hwnd:")
	{
		Screen := SubStr(Screen, 6)
		if !WinExist( "ahk_id " Screen)
			return -2
		WinGetPos,x,y, w, h, ahk_id %Screen% 
	} ;--Bis hier
	else if (Screen&1 != "")
	{
		Sysget, M, Monitor, %Screen%
		x := MLeft, y := MTop, w := MRight-MLeft, h := MBottom-MTop
	}
	else
	{
		StringSplit, S, Screen, |
		x := S1, y := S2, w := S3, h := S4
	}

	if (x = "") || (y = "") || (w = "") || (h = "")
		return -1

	chdc := CreateCompatibleDC(), hbm := CreateDIBSection(w, h, chdc), obm := SelectObject(chdc, hbm), hhdc := hhdc ? hhdc : GetDC()
	BitBlt(chdc, 0, 0, w, h, hhdc, x, y, Raster)
	ReleaseDC(hhdc)
	
	pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm)
	SelectObject(chdc, obm), DeleteObject(hbm), DeleteDC(hhdc), DeleteDC(chdc)
	return pBitmap
}
Oder anders:

Code: Select all

GDIP_CopyHWNDAreaFromScreenToBitmap(HWND)
{
    if !WinExist( "ahk_id " . HWND)
        return -2
    WinGetPos,x,y, w, h, ahk_id %HWND%
    chdc := CreateCompatibleDC()
    hbm := CreateDIBSection(w, h, chdc)
    obm := SelectObject(chdc, hbm)
    hhdc := GetDC() ;Why should hhdc be true?
    BitBlt(chdc, 0, 0, w, h, hhdc, x, y, "")
    pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm)
    ReleaseDC(hhdc)
    SelectObject(chdc, obm), DeleteObject(hbm), DeleteDC(hhdc), DeleteDC(chdc)
    return pBitmap
}

Re: Brauche Hilfe bei GDIP

Post by fump2000 » 19 Apr 2016, 06:54

Ja mit der Druck taste bekomme ich ein Bild beider Monitorflächen in die Zwischenablage.

Re: Brauche Hilfe bei GDIP

Post by HinkerLoden » 19 Apr 2016, 06:43

bekommst du ein bild ins clipboard mit der standard Druck taste. das wäre das schnelle workaround. aber nicht wirklich eine lösung bzg. GDIP. Btw. welche version ist die aktuelle. Hab ein wenig damit schon herum gebastelt. Hab die libs mal angehangen.
Attachments
Gdip_ImageSearch.ahk
(33.17 KiB) Downloaded 135 times
Gdip_FastImageSearch.ahk
(19.94 KiB) Downloaded 132 times
Gdip_All.ahk
all systems
(95.38 KiB) Downloaded 124 times

Re: Brauche Hilfe bei GDIP

Post by fump2000 » 19 Apr 2016, 06:18

Das Ergebnis ist auch dann dasselbe siehe hier:
http://www.bilder-upload.eu/show.php?fi ... 065926.png

Damals hatte ich dasselbe problem mit Gdip_BitmapFromHWND(HWND) da hattest du mir empfohlen es mit Gdip_BitmapFromScreen("hwnd:" . HWND) zu machen was dann auch klappte. Nun geht anscheinend beides nicht... Aber kann das Fenster tatsächlich verhindern, dass man den Inhalt so abgreift? Die Funktion will doch nur ein Bild machen...

Re: Brauche Hilfe bei GDIP

Post by just me » 19 Apr 2016, 05:18

Das "Warum" kenne ich auch nicht. Ansonsten finde ich es eher unlogisch, wenn man einer Funktion mit Namen Gdip_BitmapFromScreen() ein HWND eines Fensters übergibt, das wohl auf dem aber nicht der Screen ist.

Hast Du mal Gdip_BitmapFromHWND() probiert?

Re: Brauche Hilfe bei GDIP

Post by fump2000 » 19 Apr 2016, 05:07

"genauso" war das falsche Wort. Aber bisher hat dies einwandfrei funktioniert. Jetzt plötzlich halt nicht mehr. Verwirrt mich eben.

Ich nutze AHK als 32 Bit Version. Windows selbst ist x64

Es ist in meinem Empfinden eine Präzisere Angabe wenn ich GDIP die HWND übergebe zum Bild erstellen anstatt Koordinaten. Auch in Punkto fehlerquote bzw. Verarbeitungszeit.
Die eigentliche Frage ist ja, warum klappt es jetzt nicht mehr?

Re: Brauche Hilfe bei GDIP

Post by just me » 19 Apr 2016, 03:56

Moin,

Gdip_BitmapFromScreen("hwnd:" . HWND) funktioniert aber nicht genauso. Wenn Du die Koordinaten übergibst, wird einfach dieser Teil des Desktops als Bild gespeichert. Wenn Du aber ein HWND für ein Fenster übergibst, wird versucht, die Daten genau dieses Fensters auszulesen. Anscheinend weigern sich aber diese Fenster, ihre Daten zu liefern, wenn sie so angesprochen werden.

Übrigens: Welches der GDIP-Skripte benutzt Du mit welchem Windows (x64 / x32)?

Top