1

Тема: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

WinGet, hwnd, ID, PLAYERUNKNOWN'S BATTLEGROUNDS
bmpHaystack := Gdip_BitmapFromHWND(hwnd)
Gdip_SaveBitmapToFile(bmpHaystack, FileName)

В файле чёрный экран. Программа запущена в окне и не свёрнута. Можно ли это исправить (тестил в других прогах везде всё ок)

2

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Если аэро включен, то пробуйте так: Gdip_BitmapFromScreen("hwnd:" hwnd).
Если аэро выключен или всё-равно выдает не то, что надо, пробуйте эту же функцию при активном окне.
Если при активном окне выдает правильную картинку, то можно поменять z-order окна, делать скрин и после этого вернуть его на то же место в z-order.
А чтобы не было этого видно перекрывать всё гуи с принтскрином:
http://forum.script-coding.com/viewtopi … 62#p113562
Либо создавать виртуальный монитор и держать окно в нём:
http://forum.script-coding.com/viewtopic.php?id=12531

3

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Malcev Aero включен. Чёрная картинка даже при активном окне. Gdip_BitmapFromScreen("hwnd:" hwnd) тоже не помогает.

4 (изменено: Malcev, 2017-08-31 13:04:21)

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Можно попробовать использовать BitBlt.

f1::
pToken := Gdip_Startup()
raster := 0x40000000 + 0x00CC0020
bmpHaystack := Gdip_BitmapFromScreen("hwnd:" hwnd, raster)
Gdip_SaveBitmapToFile(bmpHaystack, "test.bmp")
Gdip_DisposeImage(bmpHaystack)
Gdip_Shutdown(pToken)

https://msdn.microsoft.com/en-us/librar … s.85).aspx

; BLACKNESS = 0x00000042
; NOTSRCERASE = 0x001100A6
; NOTSRCCOPY = 0x00330008
; SRCERASE = 0x00440328
; DSTINVERT = 0x00550009
; PATINVERT = 0x005A0049
; SRCINVERT = 0x00660046
; SRCAND = 0x008800C6
; MERGEPAINT = 0x00BB0226
; MERGECOPY = 0x00C000CA
; SRCCOPY = 0x00CC0020
; SRCPAINT = 0x00EE0086
; PATCOPY = 0x00F00021
; PATPAINT = 0x00FB0A09
; WHITENESS = 0x00FF0062
; CAPTUREBLT = 0x40000000
; NOMIRRORBITMAP = 0x80000000

5 (изменено: Xuli4, 2017-08-31 14:49:42)

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Malcev Раза 4-5 сработало а затем опять чёрный экран
Раньше показывало рамку приложения а в ней черный квадрат а теперь просто чёрный квадрат

6

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Значит у приложения стоит  защита.
Попробуйте отключить desktop composition.
https://www.sevenforums.com/tutorials/1 … sable.html

7 (изменено: Xuli4, 2017-08-31 15:49:18)

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Malcev пишет:

Значит у приложения стоит  защита.

Но ведь раза 4 получилось)) Сейчас попробую отключить

8

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Очень странная дичь. С выключенной прозрачностью заработал, но не обновлялась картинка. Включил прозрачность, всё равно одну и туже картинку показывает. Свернул и развернул приложение, опять чёрный квадрат...

9 (изменено: Malcev, 2017-08-31 17:27:53)

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Наверное при событии появления окна, приложение посылает SetWindowDisplayAffinity с WDA_MONITOR.
https://msdn.microsoft.com/en-us/librar … s.85).aspx
То есть у вас есть 2 варианта.
1) Инжектить autohotkey.dll в процесс приложения отслеживать появление окна и посылать SetWindowDisplayAffinity c WDA_NONE.
https://autohotkey.com/board/topic/8530 … ntry544650
2) Отключить desktop composition.
Почему картинка не обновляется, странно.
Попробуйте такой код (каждый раз новое название)

f1::
pToken := Gdip_Startup()
raster := 0x40000000 + 0x00CC0020
bmpHaystack := Gdip_BitmapFromScreen("hwnd:" hwnd, raster)
Gdip_SaveBitmapToFile(bmpHaystack, A_Now ".bmp")
Gdip_DisposeImage(bmpHaystack)
Gdip_Shutdown(pToken)

10

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Malcev Инжектить что-то в процесс не вариант(могут забанить). Попробовал 2ой вариант. Просто маленькие чёрные прямоугольники получаются (как будто свёрнуто приложение)

11

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Теперь стало работать через раз. Но картинка обновляется! (вернул Gdip_BitmapFromHWND(hwnd)) но нужно раз 5 запустить скрипт и в 1ом из 5и случаев выдаёт картинку

12 (изменено: Malcev, 2017-08-31 18:21:52)

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Постом выше вы писали, что у вас не обновлялась картинка, сейчас пишите, что маленькие черные прямоугольники.
А разница в коде только в том, что картинки сохраняются под новыми именами.
Вам надо отключить desktop composition как в 6 посте.
Запустить код из 9 поста, запустить программу, активировать окно программы и нажать f1.

13

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Xuli4, предложения должны начинаться с заглавной буквы и заканчиваться знаками препинания. Исправьте в своих сообщениях.
http://forum.script-coding.com/viewtopi … 83#p116383
http://forum.script-coding.com/viewtopi … 41#p118941
http://forum.script-coding.com/viewtopi … 55#p118955
http://forum.script-coding.com/viewtopi … 57#p118957
http://forum.script-coding.com/viewtopi … 60#p118960
http://forum.script-coding.com/viewtopi … 79#p118979
http://forum.script-coding.com/viewtopi … 81#p118981
http://forum.script-coding.com/viewtopi … 92#p118992
http://forum.script-coding.com/viewtopi … 94#p118994

14

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Gdip_BitmapFromHWND(hwnd) обращается к PrintWindow, которая в свою очередь посылает сообщения WM_PRINT, на котоые ваша программа отправляет пустоту.

15 (изменено: Xuli4, 2017-08-31 18:26:36)

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Malcev Ладно решил проблему с чёрными мелкими прямоугольниками. В общем осталась одна проблема. И мой первый код и код из вашего поста работают через раз. Иногда выдаёт нормальную картинку, иногда чёрный прямоугольник. Как можно увеличить "стабильность" работы?
И да как-то странно работает

raster := 0x40000000 + 0x00CC0020
bmpHaystack := Gdip_BitmapFromScreen("hwnd:" hwnd, raster)

Выдаёт не картинку приложения а окон над ним(к примеру кусок гугла которым было перекрыто приложение)

16

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Gdip_BitmapFromScreen, при выключенном desktop composition получает видимую зону месторасположения окна.
То есть, окно должно быть поверх остальных.

17

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Попробовал воссоздать ситуацию:
1ый скрипт:

Gui, Add, Text,, Please enter your name:
Gui, Add, Edit, vName
Gui, +hwndhGui
Gui, Show
dllcall("SetWindowDisplayAffinity", ptr, hGui, int, 0x01)

Второй:

f1::
hwnd := WinExist("A")
pToken := Gdip_Startup()
raster := 0x40000000 + 0x00CC0020
bmpHaystack := Gdip_BitmapFromScreen("hwnd:" hwnd, raster)
Gdip_SaveBitmapToFile(bmpHaystack, A_Now ".bmp")
Gdip_DisposeImage(bmpHaystack)
Gdip_Shutdown(pToken)

При активации гуи и нажатии f1 при включенном desktop composition всегда получаю черный квадрат вместо целого окна.
Если же desktop composition выключу, то всегда получаю картинку с гуи.

18 (изменено: Xuli4, 2017-08-31 18:58:14)

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Malcev http://imgur.com/a/z8ehu как засунуть сюда изображение я не знаю. Выложил ссылку на imgur. Я же правильно отключил? Я немного пошаманил, в итоге сделал так:

F1::
WinGet, hwnd, ID, PLAYERUNKNOWN'S BATTLEGROUNDS
while (ret != 0){
pToken := Gdip_Startup()
bmpHaystack := Gdip_BitmapFromHWND(hwnd)
bmpNeedle := Gdip_CreateBitmapFromFile("erro.bmp") 
RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,LIST,0,0,0,0,0,0xFFFFFF,1,0)
if (RET = 0){
Gdip_SaveBitmapToFile(bmpHaystack, "lol.bmp")
TrayTip,, updated, 0.1, 0.1
}
Gdip_DisposeImage(bmpHaystack)
Gdip_DisposeImage(bmpNeedle)
Gdip_Shutdown(pToken)
}
ret :=""
;MsgBox, % "Returned: " RET "`n`n" LIST
Return

В файле erro.bmp чёрный прямоугольник) Но это немного не практично и долговато( Но в принципе работает)
И да можно ли прямо в скрипте отключить desktop composition а после завершения - врубить обратно? Ато постоянно включать и отключать его не кайф))

19

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Отключили-то правильно.
Только зачем вы используете функцию Gdip_BitmapFromHWND если она возвращает вам чёрный прямоугольник?

20 (изменено: Xuli4, 2017-08-31 19:17:48)

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Malcev Мне нужна картинка не активного окна(перекрытого), а как вы и говорили "Gdip_BitmapFromScreen, при выключенном desktop composition получает видимую зону месторасположения окна.
То есть, окно должно быть поверх остальных." Это мне не подходит. А если включить desktop composition для этого способа - застывает картинка, а потом - бесконечный чёрный экран...

21

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

А с помощью этого кода при активном окне программы при выключенном desktop composition вы получаете нормальную картинку?

f2::
hwnd := WinExist("A")
pToken := Gdip_Startup()
bmpHaystack := Gdip_BitmapFromHWND(hwnd)
Gdip_SaveBitmapToFile(bmpHaystack, "hwnd" A_Now ".bmp")
Gdip_DisposeImage(bmpHaystack)
Gdip_Shutdown(pToken)
return

22 (изменено: Xuli4, 2017-08-31 19:33:21)

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Malcev Иногда проскакивает чёрный экран но реже чем в моём коде. А так вроде работает. А может и не реже..(получил 6 чёрных экранов подряд)

23

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Открывайте приложение на виртуальном мониторе и ищите с помощью Gdip_BitmapFromScreen либо imagesearch.

24 (изменено: Xuli4, 2017-08-31 19:53:28)

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Как я понял виртуальный монитор запускать так? https://superuser.com/questions/62051/i … nd-monitor
Не могу найти где включить 2ой монитор в тимвивере на телефоне

25

Re: AHK: Gdip_BitmapFromHWND выдаёт чёрный прямоугольник

Добрый день интересуюсь новыми скриптами для PUBG
можете подсказать какого эффекта вы хотите добиться?