101

Re: AHK: Запись экрана в видеофайл Directx9/11+Microsoft Media Foundation

Malcev пишет:

это апи используется только для ретранслирования изображения с Thumbnail  в наше окно

Значит я не понял в каком контексте по ссылке на гитхабе оно упоминалось. Просто вспомнил что как то использовал для отображения сразу нескольких окон, и нагрузки на проц совсем не было.
А апи лупы обсуждалось чтобы потом в колбеке битмап получать?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

102

Re: AHK: Запись экрана в видеофайл Directx9/11+Microsoft Media Foundation

Да.

103

Re: AHK: Запись экрана в видеофайл Directx9/11+Microsoft Media Foundation

Понадобилось тут исключить окно из записи экрана и оказалось, что SetWindowDisplayAffinity не работает с окнами использующими UpdateLayeredWindow.

104

Re: AHK: Запись экрана в видеофайл Directx9/11+Microsoft Media Foundation

Как оказалось SetWindowDisplayAffinity просто меняет флаги на DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY и DXGI_SWAP_CHAIN_FLAG_HW_PROTECTED соответственно.
https://docs.microsoft.com/en-us/window … chain_flag

teadrinker пишет:

Пока не нашёл, где WDA_EXCLUDEFROMCAPTURE определено.

Тут. ))

nothing special, just a trick that makes WDA_MONITOR window transparent instead of black rekted (tested on win10 version 10.0.17763.973)

    auto c1(xParseByteArray("48 89 5C 24 08 57 48 83 EC 30 49 8B C0 48 8B FA 48 8B D0 4C 8D 05 CC CC CC CC 48 8B CF E8 CC CC CC CC 8B D8 85 C0 78 09"));
     
    auto c2(xParseByteArray("48 89 5C 24 08 57 48 83 EC 30 49 8B C0 48 8B FA 48 8B D0 4C 8D 05 CC CC CC CC 48 8B CF B8 00 00 00 00 8B D8 85 C0 78 09"));
     
    xPatchProcess(L"dwm.exe", c1, c2, NULL, 0);

https://www.unknowncheats.me/forum/gene … nitor.html

105

Re: AHK: Запись экрана в видеофайл Directx9/11+Microsoft Media Foundation

В смысле, нужно как-то пропатчить существующий процесс dwm.exe? Ты пробовал?

Malcev пишет:

Как оказалось SetWindowDisplayAffinity просто меняет флаги на DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY и DXGI_SWAP_CHAIN_FLAG_HW_PROTECTED соответственно

Эта фраза понятна только тому, кто погружён в тему. Какие именно флаги меняет, и где?

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

106

Re: AHK: Запись экрана в видеофайл Directx9/11+Microsoft Media Foundation

teadrinker пишет:

В смысле, нужно как-то пропатчить существующий процесс dwm.exe? Ты пробовал?

Если версия Виндовса ниже чем Windows 10 Version 2004, то можно и пропатчить, но я не пробовал.

teadrinker пишет:

Эта фраза понятна только тому, кто погружён в тему. Какие именно флаги меняет, и где?

Да я и сам только поверхностно пробежался.
Как я понимаю у обычных приложений изображение показывается через DWM swapchain  и соответственно на те окна на которые наложены SetWindowDisplayAffinity, dwm устанавливает в swapchain  нужные флаги.
Вот тут есть кое-какая информация.
https://jackmin.home.blog/2018/12/14/sw … t-latency/

107

Re: AHK: Запись экрана в видеофайл Directx9/11+Microsoft Media Foundation

Добавлен пример с запуском/остановкой записи и выбором области захвата с помощью горячих клавиш.

108

Re: AHK: Запись экрана в видеофайл Directx9/11+Microsoft Media Foundation

Malcev пишет:

Понадобилось тут исключить окно из записи экрана и оказалось, что SetWindowDisplayAffinity не работает с окнами использующими UpdateLayeredWindow.

Не копал больше по теме исключения окон?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

109

Re: AHK: Запись экрана в видеофайл Directx9/11+Microsoft Media Foundation

Malcev
Привет!
У меня ошибка при отрицательных координатах, возможно как то исправить?

DirectX 11 + DXGI.ahk
---------------------------
ID3D11DeviceContext_Map error: -2005270523
ErrorLevel: 0

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

110

Re: AHK: Запись экрана в видеофайл Directx9/11+Microsoft Media Foundation

А как координаты огут быть отрицательными?
Если несколько дисплеев, то их перечисление происходит тут:

loop
{
   IDXGIFactory_EnumAdapters(IDXGIFactory, A_Index-1, IDXGIAdapter)
   loop
   {
      hr := IDXGIAdapter_EnumOutputs(IDXGIAdapter, A_Index-1, IDXGIOutput)
      if (hr = "DXGI_ERROR_NOT_FOUND")
         break
      VarSetCapacity(DXGI_OUTPUT_DESC, 88+A_PtrSize, 0)
      IDXGIOutput_GetDesc(IDXGIOutput, &DXGI_OUTPUT_DESC)
      Width := NumGet(DXGI_OUTPUT_DESC, 72, "int")
      Height := NumGet(DXGI_OUTPUT_DESC, 76, "int")
      AttachedToDesktop := NumGet(DXGI_OUTPUT_DESC, 80, "int")
      if (AttachedToDesktop = 1)
         break 2         
   }
}

Скрипт берет первый.

111

Re: AHK: Запись экрана в видеофайл Directx9/11+Microsoft Media Foundation

Malcev пишет:

А как координаты огут быть отрицательными?

Экранные, относительно главного монитора.

Malcev пишет:

Если несколько дисплеев, то их перечисление происходит тут:

Тут только первый берётся. А не сложно поправить на все мониторы? Так понял надо как то получить все мониторы, и потом координаты относительно монитора и сам монитор указывать для записи.
Попробовал так. второй MsgBox выдаёт ноль.

loop
{
	IDXGIFactory_EnumAdapters(IDXGIFactory, A_Index-1, IDXGIAdapter)
	loop
	{
		hr := IDXGIAdapter_EnumOutputs(IDXGIAdapter, A_Index-1, IDXGIOutput)
		if (hr = "DXGI_ERROR_NOT_FOUND")
			break
		VarSetCapacity(DXGI_OUTPUT_DESC, 88+A_PtrSize, 0)
		IDXGIOutput_GetDesc(IDXGIOutput, &DXGI_OUTPUT_DESC)
		Width := NumGet(DXGI_OUTPUT_DESC, 72, "int")
		Height := NumGet(DXGI_OUTPUT_DESC, 76, "int")
		AttachedToDesktop := NumGet(DXGI_OUTPUT_DESC, 80, "int")
		; if (AttachedToDesktop = 1)
			; break           
		MsgBox % Width
	}
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

112 (изменено: Malcev, 2023-05-13 20:40:23)

Re: AHK: Запись экрана в видеофайл Directx9/11+Microsoft Media Foundation

Надо типа так:

loop
{
   hr := IDXGIFactory_EnumAdapters(IDXGIFactory, A_Index-1, IDXGIAdapter)
   if (hr = "DXGI_ERROR_NOT_FOUND")
      break
   loop
   {
      hr := IDXGIAdapter_EnumOutputs(IDXGIAdapter, A_Index-1, IDXGIOutput)
      if (hr = "DXGI_ERROR_NOT_FOUND")
         break
      VarSetCapacity(DXGI_OUTPUT_DESC, 88+A_PtrSize, 0)
      IDXGIOutput_GetDesc(IDXGIOutput, &DXGI_OUTPUT_DESC)
      AttachedToDesktop := NumGet(DXGI_OUTPUT_DESC, 80, "int")
      if (AttachedToDesktop = 1)
      {
         width := NumGet(DXGI_OUTPUT_DESC, 72, "int") - NumGet(DXGI_OUTPUT_DESC, 64, "int")
         height := NumGet(DXGI_OUTPUT_DESC, 76, "int") - NumGet(DXGI_OUTPUT_DESC, 68, "int")
         list .= IDXGIAdapter "," IDXGIOutput "," width "," height "`n"
      }
   }
}
msgbox % list

IDXGIFactory_EnumAdapters(this, Adapter, ByRef ppAdapter)
{
   hr := DllCall(NumGet(NumGet(this+0)+7*A_PtrSize), "ptr", this, "uint", Adapter, "ptr*", ppAdapter)
   if hr or ErrorLevel
   {
      if !ErrorLevel
      {
         if (hr&=0xFFFFFFFF) = 0x887A0002   ; DXGI_ERROR_NOT_FOUND
            return "DXGI_ERROR_NOT_FOUND"
      }
      _Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
   }
}

IDXGIAdapter_EnumOutputs(this, Output, ByRef ppOutput)
{
   hr := DllCall(NumGet(NumGet(this+0)+7*A_PtrSize), "ptr", this, "uint", Output, "ptr*", ppOutput)
   if hr or ErrorLevel
   {
      if !ErrorLevel
      {
         if (hr&=0xFFFFFFFF) = 0x887A0002   ; DXGI_ERROR_NOT_FOUND
            return "DXGI_ERROR_NOT_FOUND"
      }
      _Error(A_ThisFunc " error: " hr "`nErrorLevel: " ErrorLevel)
   }
}

Только не нужно забывать вызывать ObjRelease для неиспользуемых IDXGIAdapter и IDXGIOutput.
Я их в коде забыл прописать. Сейчас прописал.

113

Re: AHK: Запись экрана в видеофайл Directx9/11+Microsoft Media Foundation

О, спасибо!
Тут бы методом тыка не получилось бы добавить.)

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui