1 (изменено: Gh0sTG0, 2022-10-28 15:55:46)

Тема: AHK: Поломался Gdip_BitmapFromHWND.

Добрый день.
Есть код, который должен мне делать скриншот ldplayer9'а в неактивном окне.
Использую библиотеку gdip.

Gdip_DisposeImage(bmpHaystack)
bmpHaystack := Gdip_BitmapFromHWND(hwnd := WinExist("LDPlayer"))
Gdip_SaveBitmapToFile(bmpHaystack,"D:\test.png") ; сохранение скрина для отладки.

Вчера вечером работало нормально, сегодня утром я вместо скрина актуального окна получаю скрин загружающегося лдплеера (то что оно мне Gdip_SaveBitmapToFile прикладываю (проценты каждый раз разные, хз откуда он их берет)).

Кто то в курсе, чего это вообще может быть? Возможно ли это как то починить без переустановки ОС? В одну игрушку без автоподтыкивания играть стало весьма некомфортно.

Чего пробовал: переустановил ldplayer9, переустановил драйвера на видеокарту, не помогло. Перезагрузки в процессе естественно были.

+ открыть спойлер

http://forum.script-coding.com/misc.php?action=pun_attachment&item=2293&download=0

Post's attachments

test.png 755.93 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

2

Re: AHK: Поломался Gdip_BitmapFromHWND.

Проблема, скорее всего, где-то в другой части кода. Попробуйте создать отдельный скрипт, который не делает ничего, кроме скриншота и только один раз.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Поломался Gdip_BitmapFromHWND.

teadrinker
Закрыл прям все ахк что у меня есть и.т.п.
Написал, отдельный .ahk файл, полный код файла:

#Include GDIP.ahk


F1::
{
	gdipToken := Gdip_Startup()
	bmpHaystack := Gdip_BitmapFromHWND(hwnd := WinExist("LDPlayer"))
	Gdip_SaveBitmapToFile(bmpHaystack,"D:\test1.png")
	Gdip_Shutdown(gdipToken)
	Return
}


^Esc::Reload

По нажатии на F1 мне оно записало ту же самую картинку.

4

Re: AHK: Поломался Gdip_BitmapFromHWND.

Значит, проблемы с кодом нет.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: Gh0sTG0, 2022-10-28 18:04:25)

Re: AHK: Поломался Gdip_BitmapFromHWND.

teadrinker
Блин, это мне чего, ось переставлять или чего? ЧОРД!!!
Вчера вечером же все отлично работало...
Печально.
Спасибо за попытку помочь.

6

Re: AHK: Поломался Gdip_BitmapFromHWND.

Gh0sTG0
Как я понял, судя по описанию, у вас за место окна плеера, скриншот окна загрузки делает.
Есть вероятность того, что окон у плеера два, просто один под Hide'ом.
То есть если он существует, то это решает ряд проблем.

7

Re: AHK: Поломался Gdip_BitmapFromHWND.

Clannad5
И как это проверить?

8 (изменено: Clannad5, 2022-10-28 18:48:00)

Re: AHK: Поломался Gdip_BitmapFromHWND.

Gh0sTG0
Вроде я когда-то встречал скрипт, который обнаруживает подобные скрытые окна и раскрывает их.
Либо же попробуйте сами написать его. HWID этого окна вы прекрасно получаете.

Попробуйте скрин сделать активного окна плеера, так же будет или нет?

9 (изменено: Gh0sTG0, 2022-10-28 18:57:38)

Re: AHK: Поломался Gdip_BitmapFromHWND.

Clannad5
У меня вот только один вопрос: если у нас есть такое скрытое окно, сколько их будет всего?

Loop %WindowList%
	{
		WinUID := WindowList%A_Index%
		WinGetTitle, WinTitle, ahk_id %WinUID%
		if InStr(WinTitle, "LDPlayer")
		{
			LDLength += 1
			if (LDLength > 1)
			{
				MsgBox, More then 1 LD's???
				Reload
				Return
			}
		}
	}

PS делал и активного, и нет. Разница 0.
PPS MsgBox'а я не видел, сохранение скрина ниже окончания этого цикла.

ВООООООУ, кто хочет психодела?
Я тут решил побаловаться с дубликатом кода, в ходе чутка уменьшил и сместил окно плеера, в общем вотЪ:

+ открыть спойлер

https://cdn.screencast.com/uploads/g000302B0iysvT332lxj8xfre6Vqr/LWR_Recording.png?sv=2021-08-06&st=2022-10-28T14%3A51%3A31Z&se=2022-10-29T14%3A51%3A31Z&sr=b&sp=r&sig=84qx%2F8JD7U0EsKWhzZquQxzB3qCofuGRX0SOGZehn8o%3D

PS и опять таки, была найдена всего одна штука ldplayer'а, при том что winspy мне пишет именно так:

LDPlayer
ahk_class LDPlayerMainFrame
ahk_exe dnplayer.exe
ahk_pid 13532

10

Re: AHK: Поломался Gdip_BitmapFromHWND.

Я бы попробовал перед получением скриншота заставить окно перерисоваться с помощью WinSet, Redraw или WinHide-WinShow.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Поломался Gdip_BitmapFromHWND.

teadrinker
Redraw 0 реакции, winhide/show выдал то же самое, только с белым местом вместо психодела.
Такое ощущение, будто бы он почему то хватает ТОЛЬКО gui плеера, без его содержимого, хммм.

12

Re: AHK: Поломался Gdip_BitmapFromHWND.

teadrinker
Я тут химичу, Спасибо большое за вот эту тему: ваш код из первого ответа натолкнул меня на мысль, что можно попробовать сделать так и дальше уже тыкать.
Правда реализовал я это на gdip.ahk:


			Gdip_DisposeImage(bmpHaystack)
			
			; bmpHaystack := Gdip_BitmapFromHWND(hwnd := WinExist(ld_name)) меняем эту строку на пару других:

			WinGetPos, LDx, LDy, LDw, LDh, LDPlayer
			bmpHaystack := Gdip_BitmapFromScreen(LDx . "|" . LDy . "|" . LDw . "|" . LDh)

			Gdip_SaveBitmapToFile(bmpHaystack,"D:\test.png")

Ну, и дальше уже можно это скармливать Gdip_ImageSearch.

13

Re: AHK: Поломался Gdip_BitmapFromHWND.

Пробуйте заменить в gdip.ahk это:

PrintWindow(hwnd, hdc, Flags=0)

на это:

PrintWindow(hwnd, hdc, Flags=2)

14 (изменено: Gh0sTG0, 2022-10-28 20:58:20)

Re: AHK: Поломался Gdip_BitmapFromHWND.

Я уже там расписал работу через скриншот экрана, но тут приходит Malcev и советует. А оно возьми, и сработай...
Спасибо за решение!
PS Мне теперь типа для других целей надо будет держать отдельный файл с флаг=0? Или оно не должно особо повлиять?

15

Re: AHK: Поломался Gdip_BitmapFromHWND.

Надо проверять, по идее не должно влиять.
PW_RENDERFULLCONTENT := 2 дает возможность захватывать окна с аппаратным ускорением.

16

Re: AHK: Поломался Gdip_BitmapFromHWND.

Malcev пишет:

PW_RENDERFULLCONTENT := 2 дает возможность захватывать окна с аппаратным ускорением.

https://learn.microsoft.com/ru-ru/windo … rintwindow
Блин, а ты где опять справки находишь.)
Там же только PW_CLIENTONLY.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.34.01 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

17

Re: AHK: Поломался Gdip_BitmapFromHWND.

На англ.форуме обсуждалось. Я забыл уже, потому что никогда этим не пользуюсь.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

18

Re: AHK: Поломался Gdip_BitmapFromHWND.

serzh82saratov, когда изучал различные варианты сохранения окон, то где-то наверное на stackoverfkow прочитал.
На текущий момент msdn дает 2 api для их захвата PrintWindow с PW_RENDERFULLCONTENT и WindowsGraphicsCapture uwp.
WindowsGraphicsCapture работает быстрее, но на win 10 выводит желтую рамку, информируя что окно записывается.
На Win11 это можно убрать, я как-раз на ноутбуке поставил Win11 - надо будет потестировать.
http://forum.script-coding.com/viewtopic.php?id=16694

19

Re: AHK: Поломался Gdip_BitmapFromHWND.

Malcev пишет:

На текущий момент msdn дает 2 api для их захвата PrintWindow с PW_RENDERFULLCONTENT

Она тестовая, или просто забыли в справку добавить?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.34.01 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

20

Re: AHK: Поломался Gdip_BitmapFromHWND.

Недокументированная.
Кстати, думаю, есть еще один хакерский способ - получить hbitmap через dwmregisterthumbnail.
Если что накопаю, то создам тему.

21

Re: AHK: Поломался Gdip_BitmapFromHWND.

Malcev пишет:

dwmregisterthumbnail

Это тема, я его для вывода копии видео из окна использовал.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.34.01 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

22

Re: AHK: Поломался Gdip_BitmapFromHWND.

Malcev пишет:

Недокументированная

А с какой версии, хз?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.34.01 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

23

Re: AHK: Поломался Gdip_BitmapFromHWND.

в 7ке есть?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.34.01 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

24

Re: AHK: Поломался Gdip_BitmapFromHWND.

Нет.

25

Re: AHK: Поломался Gdip_BitmapFromHWND.

Про её возможности что то известно?

Malcev пишет:

Недокументированная.

Или всё таки тестовая, есть какие-то баги, и потому её документировать не хотят.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.34.01 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

26

Re: AHK: Поломался Gdip_BitmapFromHWND.

MSDN много чего документировать не хотят, но я ее не тестировал вдоль и поперек, так что сказать не могу.

27

Re: AHK: Поломался Gdip_BitmapFromHWND.

Так а что тестировать, когда ничего не обещают.)

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.34.01 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

28

Re: AHK: Поломался Gdip_BitmapFromHWND.

А цель какая?
Использовать PW_RENDERFULLCONTENT в массовом производстве?

29

Re: AHK: Поломался Gdip_BitmapFromHWND.

Да нет конечно, подошло к чему то, и хорошо.
Это я так, про термины тестовое или недокументированное. )

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.34.01 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

30 (изменено: Malcev, 2022-10-29 14:59:13)

Re: AHK: Поломался Gdip_BitmapFromHWND.

Так msdn ничего в своих api и не обещают.
С некоторыми окнами работают одни апи, с некоторыми другие, а с некоторыми только через инжект приложения, либо взлом dwmcore.dll.

31

Re: AHK: Поломался Gdip_BitmapFromHWND.

Ну они как то описывают их цель, о чём то предупреждают. Обещать за каждое окно они не могут.
Если например оно с DIRECTX не работает, то наверняка можно найти этому где то в справке объяснение. имхо.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.34.01 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

32

Re: AHK: Поломался Gdip_BitmapFromHWND.

Напрямую нигде не написано, но можно догадаться, что, например, не получится захватить окно созданное через updatelayeredwindow через getdc.

33

Re: AHK: Поломался Gdip_BitmapFromHWND.

Malcev пишет:

можно догадаться

Кстати, как?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.34.01 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

34 (изменено: Malcev, 2022-10-29 18:43:28)

Re: AHK: Поломался Gdip_BitmapFromHWND.

Потому что приложение само себя отрисовывает и перенаправляет.

UpdateLayeredWindow should be used primarily when the application must directly supply the shape and content of a layered window, without using the redirection mechanism the system provides through SetLayeredWindowAttributes. In addition, using UpdateLayeredWindow directly uses memory more efficiently, because the system does not need the additional memory required for storing the image of the redirected window.

https://learn.microsoft.com/en-us/windo … ed-windows
Если тебя механизм заинтересовал, то тут подробнее описывается.
https://dwayneneed.github.io/wpf/2008/0 … n-wpf.html
https://dwayneneed.github.io/wpf/2013/0 … tions.html
И вот познавательная статья про directcomposition:
https://learn.microsoft.com/en-us/archi … ion-engine

35 (изменено: Malcev, 2022-10-30 16:41:49)

Re: AHK: Поломался Gdip_BitmapFromHWND.

А насчет недокумментированности, возможно, что в будущих версиях виндовс этот параметр изменят либо вообще уберут.
Например, мне тут пришлось поизучать недокументированное virtual desktop api.
Вот там можно реально увидеть, как с каждой версией виндовс меняются guid интерфейсы, добавляются новые методы и вставляются не в конец, а между старыми, тем самым ,меняя очередность.
https://github.com/MScholtes/VirtualDesktop
Но тем не менее это api используется в коммерческих целях в массовом производстве.