<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Получение информации у медиа с WinRT API и MediaControl Class.]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=17687</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=17687&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Получение информации у медиа с WinRT API и MediaControl Class.».]]></description>
		<lastBuildDate>Thu, 23 Mar 2023 22:28:44 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Получение информации у медиа с WinRT API и MediaControl Class.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=157383#p157383</link>
			<description><![CDATA[<p>Добавил пример отлова событий.</p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Thu, 23 Mar 2023 22:28:44 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=157383#p157383</guid>
		</item>
		<item>
			<title><![CDATA[AHK: Получение информации у медиа с WinRT API и MediaControl Class.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=157157#p157157</link>
			<description><![CDATA[<p><a href="https://learn.microsoft.com/en-us/uwp/api/windows.media.control.globalsystemmediatransportcontrolssessionmanager?view=winrt-22621">https://learn.microsoft.com/en-us/uwp/a … inrt-22621</a><br />Данный код получает название, артиста и hbitmap обложки проигрываемого медиа в фаерфоксе.<br />Но можно получать еще много чего, а также управлять медиа.<br /><a href="https://learn.microsoft.com/en-us/uwp/api/windows.media.control.globalsystemmediatransportcontrolssession?view=winrt-22621">https://learn.microsoft.com/en-us/uwp/a … inrt-22621</a><br /></p><div class="codebox"><pre><code>app := &quot;firefox.exe&quot;
CreateClass(&quot;Windows.Media.Control.GlobalSystemMediaTransportControlsSessionManager&quot;, IGlobalSystemMediaTransportControlsSessionManagerStatics := &quot;{2050c4ee-11a0-57de-aed7-c97c70338245}&quot;, GlobalSystemMediaTransportControlsSessionManagerStatics)
DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionManagerStatics+0)+6*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSessionManagerStatics, &quot;ptr*&quot;, GlobalSystemMediaTransportControlsSessionManager)   ; GlobalSystemMediaTransportControlsSessionManager.RequestAsync
WaitForAsync(GlobalSystemMediaTransportControlsSessionManager)
DllCall(&quot;LoadLibrary&quot;, &quot;str&quot;, &quot;gdiplus&quot;)
VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0) ; sizeof(GdiplusStartupInput) = 16, 24
NumPut(0x1, si, &quot;uint&quot;)
DllCall(&quot;gdiplus\GdiplusStartup&quot;, &quot;ptr*&quot;, pToken:=0, &quot;ptr&quot;, &amp;si, &quot;ptr&quot;, 0)
return

f11::
title := artist := &quot;&quot;
DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionManager+0)+7*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSessionManager, &quot;ptr*&quot;, GlobalSystemMediaTransportControlsSessionList)   ; GlobalSystemMediaTransportControlsSessionManager.GetSessions
DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionList+0)+7*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSessionList, &quot;int*&quot;, count)   ; count
loop % count
{
   DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionList+0)+6*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSessionList, &quot;int&quot;, A_Index-1, &quot;ptr*&quot;, GlobalSystemMediaTransportControlsSession)
   DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSession+0)+6*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSession, &quot;ptr*&quot;, SourceAppUserModelId)   ; GlobalSystemMediaTransportControlsSession.get_SourceAppUserModelId
   buffer := DllCall(&quot;Combase.dll\WindowsGetStringRawBuffer&quot;, &quot;ptr&quot;, SourceAppUserModelId, &quot;uint*&quot;, length, &quot;ptr&quot;)
   if (StrGet(buffer, &quot;UTF-16&quot;) = app)
   {
      DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSession+0)+7*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSession, &quot;ptr*&quot;, GlobalSystemMediaTransportControlsSessionMediaProperties)   ; GlobalSystemMediaTransportControlsSession.TryGetMediaPropertiesAsync
      WaitForAsync(GlobalSystemMediaTransportControlsSessionMediaProperties)
      DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionMediaProperties+0)+6*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSessionMediaProperties, &quot;ptr*&quot;, hTitle)   ; GlobalSystemMediaTransportControlsSessionMediaProperties.get_Title
      buffer := DllCall(&quot;Combase.dll\WindowsGetStringRawBuffer&quot;, &quot;ptr&quot;, hTitle, &quot;uint*&quot;, length, &quot;ptr&quot;)
      title := StrGet(buffer, &quot;UTF-16&quot;)
      DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionMediaProperties+0)+9*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSessionMediaProperties, &quot;ptr*&quot;, hTitle)   ; GlobalSystemMediaTransportControlsSessionMediaProperties.get_Artist
      buffer := DllCall(&quot;Combase.dll\WindowsGetStringRawBuffer&quot;, &quot;ptr&quot;, hTitle, &quot;uint*&quot;, length, &quot;ptr&quot;)
      artist := StrGet(buffer, &quot;UTF-16&quot;)
      DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionMediaProperties+0)+15*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSessionMediaProperties, &quot;ptr*&quot;, RandomAccessStreamReference)   ; GlobalSystemMediaTransportControlsSessionMediaProperties.get_Thumbnail
      if (DllCall(NumGet(NumGet(RandomAccessStreamReference+0)+6*A_PtrSize), &quot;ptr&quot;, RandomAccessStreamReference, &quot;ptr*&quot;, RandomAccessStreamWithContentType) = 0)   ; IRandomAccessStreamReference.OpenReadAsync
      {
         WaitForAsync(RandomAccessStreamWithContentType)
         VarSetCapacity(CLSID, 16, 0)
         DllCall(&quot;ole32\CLSIDFromString&quot;, &quot;wstr&quot;, IID_IStream := &quot;{0000000C-0000-0000-C000-000000000046}&quot;, &quot;ptr&quot;, &amp;CLSID)
         DllCall(&quot;ShCore\CreateStreamOverRandomAccessStream&quot;, &quot;ptr&quot;, RandomAccessStreamWithContentType, &quot;ptr&quot;, &amp;CLSID, &quot;ptr*&quot;, Stream, &quot;uint&quot;)
         DllCall(&quot;gdiplus\GdipCreateBitmapFromStream&quot;, &quot;ptr&quot;, Stream, &quot;ptr*&quot;, pBitmap)
         DllCall(&quot;gdiplus\GdipCreateHBITMAPFromBitmap&quot;, &quot;ptr&quot;, pBitmap, &quot;ptr*&quot;, hBitmap, &quot;uint&quot;, 0xffffffff)
         DllCall(&quot;Gdiplus.dll\GdipDisposeImage&quot;, &quot;ptr&quot;, pBitmap)
         ObjReleaseClose(Stream)
         ObjReleaseClose(RandomAccessStreamWithContentType)
      }
      ObjReleaseClose(RandomAccessStreamReference)
      ObjReleaseClose(GlobalSystemMediaTransportControlsSessionMediaProperties)
      ObjReleaseClose(GlobalSystemMediaTransportControlsSession)
      break
   }
   ObjReleaseClose(GlobalSystemMediaTransportControlsSession)
}
ObjReleaseClose(GlobalSystemMediaTransportControlsSessionList)
msgbox % &quot;title: &quot; title &quot;`nartist: &quot; artist &quot;`nhbitmap: &quot; hbitmap
if hbitmap
{
   DllCall(&quot;DeleteObject&quot;, &quot;ptr&quot;, hBitmap)
   hBitmap := &quot;&quot;
}
return

CreateClass(string, interface := &quot;&quot;, ByRef Class := &quot;&quot;)
{
   CreateHString(string, hString)
   if (interface = &quot;&quot;)
      result := DllCall(&quot;Combase.dll\RoActivateInstance&quot;, &quot;ptr&quot;, hString, &quot;ptr*&quot;, Class, &quot;uint&quot;)
   else
   {
      VarSetCapacity(GUID, 16)
      DllCall(&quot;ole32\CLSIDFromString&quot;, &quot;wstr&quot;, interface, &quot;ptr&quot;, &amp;GUID)
      result := DllCall(&quot;Combase.dll\RoGetActivationFactory&quot;, &quot;ptr&quot;, hString, &quot;ptr&quot;, &amp;GUID, &quot;ptr*&quot;, Class, &quot;uint&quot;)
   }
   if (result != 0)
   {
      if (result = 0x80004002)
         msgbox No such interface supported
      else if (result = 0x80040154)
         msgbox Class not registered
      else
         msgbox error: %result%
      ExitApp
   }
   DeleteHString(hString)
}

CreateHString(string, ByRef hString)
{
    DllCall(&quot;Combase.dll\WindowsCreateString&quot;, &quot;wstr&quot;, string, &quot;uint&quot;, StrLen(string), &quot;ptr*&quot;, hString)
}

DeleteHString(hString)
{
   DllCall(&quot;Combase.dll\WindowsDeleteString&quot;, &quot;ptr&quot;, hString)
}

WaitForAsync(ByRef Object)
{
   AsyncInfo := ComObjQuery(Object, IAsyncInfo := &quot;{00000036-0000-0000-C000-000000000046}&quot;)
   loop
   {
      DllCall(NumGet(NumGet(AsyncInfo+0)+7*A_PtrSize), &quot;ptr&quot;, AsyncInfo, &quot;uint*&quot;, status)   ; IAsyncInfo.Status
      if (status != 0)
      {
         if (status != 1)
         {
            DllCall(NumGet(NumGet(AsyncInfo+0)+8*A_PtrSize), &quot;ptr&quot;, AsyncInfo, &quot;uint*&quot;, ErrorCode)   ; IAsyncInfo.ErrorCode
            msgbox AsyncInfo status error: %ErrorCode%
            ExitApp
         }
         ObjRelease(AsyncInfo)
         break
      }
      sleep 10
   }
   DllCall(NumGet(NumGet(Object+0)+8*A_PtrSize), &quot;ptr&quot;, Object, &quot;ptr*&quot;, ObjectResult)   ; GetResults
   ObjReleaseClose(Object)
   Object := ObjectResult
}

ObjReleaseClose(ByRef Object)
{
   if Object
   {
      if (Close := ComObjQuery(Object, IClosable := &quot;{30D5A829-7FA4-4026-83BB-D75BAE4EA99E}&quot;))
      {
         DllCall(NumGet(NumGet(Close+0)+6*A_PtrSize), &quot;ptr&quot;, Close)   ; Close
         ObjRelease(Close)
      }
      ObjRelease(Object)
   }
   Object := &quot;&quot;
}</code></pre></div><p>Пример отлова событий:<br /></p><div class="codebox"><pre><code>app := &quot;firefox.exe&quot;
GoSub init
return

Connected:
Disconnected:
Closed:
Opened:
Changing:
Stopped:
Playing:
Paused:
msgbox % a_thislabel
return

init:
#Persistent
OnExit, ExitSub
Events := [3 ;QueryInterface
          ,1 ;AddRef
          ,1 ;Release
          ,3] ;Invoke
VarSetCapacity(vtbl1, A_PtrSize*Events.MaxIndex(), 0)
For Index, ParameterCount In Events
   NumPut(RegisterCallback(&quot;PlaybackInfoChangedEvent&quot;, &quot;Fast&quot;, ParameterCount, A_Index-1), vtbl1, A_PtrSize*(A_Index-1))
PlaybackInfoChangedEvent := DllCall(&quot;GlobalAlloc&quot;, &quot;uint&quot;, 0, &quot;ptr&quot;, A_PtrSize, &quot;ptr&quot;)
NumPut(&amp;vtbl1, PlaybackInfoChangedEvent+0, 0)

CreateClass(&quot;Windows.Media.Control.GlobalSystemMediaTransportControlsSessionManager&quot;, IGlobalSystemMediaTransportControlsSessionManagerStatics := &quot;{2050c4ee-11a0-57de-aed7-c97c70338245}&quot;, GlobalSystemMediaTransportControlsSessionManagerStatics)
DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionManagerStatics+0)+6*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSessionManagerStatics, &quot;ptr*&quot;, GlobalSystemMediaTransportControlsSessionManager)   ; GlobalSystemMediaTransportControlsSessionManager.RequestAsync
WaitForAsync(GlobalSystemMediaTransportControlsSessionManager)
ObjReleaseClose(GlobalSystemMediaTransportControlsSessionManagerStatics)
DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionManager+0)+7*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSessionManager, &quot;ptr*&quot;, GlobalSystemMediaTransportControlsSessionList)   ; GlobalSystemMediaTransportControlsSessionManager.GetSessions
DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionList+0)+7*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSessionList, &quot;int*&quot;, count)   ; count
loop % count
{
   DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionList+0)+6*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSessionList, &quot;int&quot;, A_Index-1, &quot;ptr*&quot;, GlobalSystemMediaTransportControlsSession)
   DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSession+0)+6*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSession, &quot;ptr*&quot;, SourceAppUserModelId)   ; GlobalSystemMediaTransportControlsSession.get_SourceAppUserModelId
   buffer := DllCall(&quot;Combase.dll\WindowsGetStringRawBuffer&quot;, &quot;ptr&quot;, SourceAppUserModelId, &quot;uint*&quot;, length, &quot;ptr&quot;)
   if (StrGet(buffer, &quot;UTF-16&quot;) = app)
   {
      DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSession+0)+27*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSession, &quot;ptr&quot;, PlaybackInfoChangedEvent, &quot;int64*&quot;, PlaybackInfoChangedEventToken)   ; GlobalSystemMediaTransportControlsSession.add_PlaybackInfoChanged
      GlobalSystemMediaTransportControlsSessionCurrent := GlobalSystemMediaTransportControlsSession
      SetTimer, Connected, -1
      break
   }
   ObjReleaseClose(GlobalSystemMediaTransportControlsSession)
}
ObjReleaseClose(GlobalSystemMediaTransportControlsSessionList)

VarSetCapacity(vtbl2, A_PtrSize*Events.MaxIndex(), 0)
For Index, ParameterCount In Events
   NumPut(RegisterCallback(&quot;SessionsChangedEvent&quot;, &quot;Fast&quot;, ParameterCount, A_Index-1), vtbl2, A_PtrSize*(A_Index-1))
SessionsChangedEvent := DllCall(&quot;GlobalAlloc&quot;, &quot;uint&quot;, 0, &quot;ptr&quot;, A_PtrSize*3+8+StrLen(app)+1, &quot;ptr&quot;)
NumPut(&amp;vtbl2, SessionsChangedEvent+0, 0)
NumPut(PlaybackInfoChangedEvent, SessionsChangedEvent+0, A_PtrSize)
NumPut(GlobalSystemMediaTransportControlsSessionCurrent, SessionsChangedEvent+0, A_PtrSize*2)
NumPut(PlaybackInfoChangedEventToken, SessionsChangedEvent+0, A_PtrSize*3, &quot;int64&quot;)
StrPut(app, SessionsChangedEvent+A_PtrSize*3+8, &quot;utf-8&quot;)
DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionManager+0)+10*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSessionManager, &quot;ptr&quot;, SessionsChangedEvent, &quot;int64*&quot;, SessionsChangedEventToken)   ; GlobalSystemMediaTransportControlsSessionManager.add_SessionsChanged
return

ExitSub:
GlobalSystemMediaTransportControlsSessionCurrent := NumGet(SessionsChangedEvent+0, A_PtrSize*2)
PlaybackInfoChangedEventToken := NumGet(SessionsChangedEvent+0, A_PtrSize*3, &quot;int64&quot;)
if GlobalSystemMediaTransportControlsSessionCurrent
{
   DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionCurrent+0)+28*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSessionCurrent, &quot;int64&quot;, PlaybackInfoChangedEventToken)   ; GlobalSystemMediaTransportControlsSession.remove_PlaybackInfoChanged
   ObjReleaseClose(GlobalSystemMediaTransportControlsSessionCurrent)
}
DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionManager+0)+11*A_PtrSize), &quot;int64&quot;, SessionsChangedEventToken)   ; GlobalSystemMediaTransportControlsSessionManager.remove_SessionsChanged
ObjReleaseClose(GlobalSystemMediaTransportControlsSessionManager)
DllCall(&quot;GlobalFree&quot;, &quot;ptr&quot;, PlaybackInfoChangedEvent, &quot;ptr&quot;)
DllCall(&quot;GlobalFree&quot;, &quot;ptr&quot;, SessionsChangedEvent, &quot;ptr&quot;)
ObjReleaseClose(PlaybackInfoChangedEvent)
ObjReleaseClose(SessionsChangedEvent)
ExitApp

PlaybackInfoChangedEvent(this, guid = &quot;&quot;, ppvObject = &quot;&quot;)
{
   static IID_IUnknown, p1, p2, oPlaybackStatus := {0:&quot;Closed&quot;, 1:&quot;Opened&quot;, 2:&quot;Changing&quot;, 3:&quot;Stopped&quot;, 4:&quot;Playing&quot;, 5:&quot;Paused&quot;}
   if !IID_IUnknown
   {
      VarSetCapacity(p1, 16, 0)
      DllCall(&quot;ole32\CLSIDFromString&quot;, &quot;wstr&quot;, IID_IUnknown := &quot;{00000000-0000-0000-C000-000000000046}&quot;, &quot;ptr&quot;, &amp;p1)
      VarSetCapacity(p2, 16, 0)
      DllCall(&quot;ole32\CLSIDFromString&quot;, &quot;wstr&quot;, IID_IPlaybackInfoChangedEvent := &quot;{2bdf1426-d41f-5896-897f-efc0b0fa7392}&quot;, &quot;ptr&quot;, &amp;p2)
   }
   If (A_EventInfo = 0)
   {
      if DllCall(&quot;ole32\IsEqualGUID&quot;, &quot;ptr&quot;, guid, &quot;ptr&quot;, &amp;p1) or DllCall(&quot;ole32\IsEqualGUID&quot;, &quot;ptr&quot;, guid, &quot;ptr&quot;, &amp;p2)
      {
         NumPut(this, ppvObject+0)
         return 0
      }
      else
      {
         NumPut(0, ppvObject+0)
         return 0x80004002
      }
   }
   else if (A_EventInfo = 3)   ; Invoke
   {
      DllCall(NumGet(NumGet(guid+0)+9*A_PtrSize), &quot;ptr&quot;, guid, &quot;ptr*&quot;, GlobalSystemMediaTransportControlsSessionPlaybackInfo)   ; GlobalSystemMediaTransportControlsSession.GetPlaybackInfo
      DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionPlaybackInfo+0)+7*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSessionPlaybackInfo, &quot;int*&quot;, PlaybackStatus)   ; GlobalSystemMediaTransportControlsSessionPlaybackInfo.PlaybackStatus
      ObjReleaseClose(GlobalSystemMediaTransportControlsSessionPlaybackInfo)
      SetTimer, % oPlaybackStatus[PlaybackStatus], -1
      return 0
   }
   return 1
}

SessionsChangedEvent(this, guid = &quot;&quot;, ppvObject = &quot;&quot;)
{
   static IID_IUnknown, p1, p2, PlaybackInfoChangedEvent, GlobalSystemMediaTransportControlsSessionCurrent, PlaybackInfoChangedEventToken, app, oPlaybackStatus
   if !IID_IUnknown
   {
      VarSetCapacity(p1, 16, 0)
      DllCall(&quot;ole32\CLSIDFromString&quot;, &quot;wstr&quot;, IID_IUnknown := &quot;{00000000-0000-0000-C000-000000000046}&quot;, &quot;ptr&quot;, &amp;p1)
      VarSetCapacity(p2, 16, 0)
      DllCall(&quot;ole32\CLSIDFromString&quot;, &quot;wstr&quot;, IID_ISessionsChangedEvent := &quot;{2e2a8630-dc8c-530a-9746-bc984d4b029e}&quot;, &quot;ptr&quot;, &amp;p2)
      PlaybackInfoChangedEvent := NumGet(this+0, A_PtrSize)
      GlobalSystemMediaTransportControlsSessionCurrent := NumGet(this+0, A_PtrSize*2)
      PlaybackInfoChangedEventToken := NumGet(this+0, A_PtrSize*3, &quot;int64&quot;)
      app := strget(this+A_PtrSize*3+8, &quot;utf-8&quot;)
   }
   If (A_EventInfo = 0)
   {
      if DllCall(&quot;ole32\IsEqualGUID&quot;, &quot;ptr&quot;, guid, &quot;ptr&quot;, &amp;p1) or DllCall(&quot;ole32\IsEqualGUID&quot;, &quot;ptr&quot;, guid, &quot;ptr&quot;, &amp;p2)
      {
         NumPut(this, ppvObject+0)
         return 0
      }
      else
      {
         NumPut(0, ppvObject+0)
         return 0x80004002
      }
   }
   else if (A_EventInfo = 3)   ; Invoke
   {
      DllCall(NumGet(NumGet(guid+0)+7*A_PtrSize), &quot;ptr&quot;, guid, &quot;ptr*&quot;, GlobalSystemMediaTransportControlsSessionList)   ; GlobalSystemMediaTransportControlsSessionManager.GetSessions
      DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionList+0)+7*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSessionList, &quot;int*&quot;, count)   ; count
      loop % count
      {
         DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionList+0)+6*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSessionList, &quot;int&quot;, A_Index-1, &quot;ptr*&quot;, GlobalSystemMediaTransportControlsSession)
         DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSession+0)+6*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSession, &quot;ptr*&quot;, SourceAppUserModelId)   ; GlobalSystemMediaTransportControlsSession.get_SourceAppUserModelId
         buffer := DllCall(&quot;Combase.dll\WindowsGetStringRawBuffer&quot;, &quot;ptr&quot;, SourceAppUserModelId, &quot;uint*&quot;, length, &quot;ptr&quot;)
         if (StrGet(buffer, &quot;UTF-16&quot;) = app)
         {
            SessionFound := 1
            if !GlobalSystemMediaTransportControlsSessionCurrent
            {
               DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSession+0)+27*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSession, &quot;ptr&quot;, PlaybackInfoChangedEvent, &quot;int64*&quot;, PlaybackInfoChangedEventToken)   ; GlobalSystemMediaTransportControlsSession.add_PlaybackInfoChanged
               GlobalSystemMediaTransportControlsSessionCurrent := GlobalSystemMediaTransportControlsSession
               NumPut(GlobalSystemMediaTransportControlsSessionCurrent, this+0, A_PtrSize*2)
               NumPut(PlaybackInfoChangedEventToken, this+0, A_PtrSize*3, &quot;int64&quot;)
               SetTimer, Connected, -1
            }
            else
               ObjReleaseClose(GlobalSystemMediaTransportControlsSession)
            break
         }
         ObjReleaseClose(GlobalSystemMediaTransportControlsSession)
      }
      if !SessionFound and GlobalSystemMediaTransportControlsSessionCurrent
      {
         DllCall(NumGet(NumGet(GlobalSystemMediaTransportControlsSessionCurrent+0)+28*A_PtrSize), &quot;ptr&quot;, GlobalSystemMediaTransportControlsSessionCurrent, &quot;int64&quot;, PlaybackInfoChangedEventToken)   ; GlobalSystemMediaTransportControlsSession.remove_PlaybackInfoChanged
         ObjReleaseClose(GlobalSystemMediaTransportControlsSessionCurrent)
         NumPut(0, this+0, A_PtrSize*2)
         NumPut(0, this+0, A_PtrSize*3, &quot;int64&quot;)
         SetTimer, Disconnected, -1
      }
      ObjReleaseClose(GlobalSystemMediaTransportControlsSessionList)
      return 0
   }
   return 1
}


CreateClass(string, interface := &quot;&quot;, ByRef Class := &quot;&quot;)
{
   CreateHString(string, hString)
   if (interface = &quot;&quot;)
      result := DllCall(&quot;Combase.dll\RoActivateInstance&quot;, &quot;ptr&quot;, hString, &quot;ptr*&quot;, Class, &quot;uint&quot;)
   else
   {
      VarSetCapacity(GUID, 16)
      DllCall(&quot;ole32\CLSIDFromString&quot;, &quot;wstr&quot;, interface, &quot;ptr&quot;, &amp;GUID)
      result := DllCall(&quot;Combase.dll\RoGetActivationFactory&quot;, &quot;ptr&quot;, hString, &quot;ptr&quot;, &amp;GUID, &quot;ptr*&quot;, Class, &quot;uint&quot;)
   }
   if (result != 0)
   {
      if (result = 0x80004002)
         msgbox No such interface supported
      else if (result = 0x80040154)
         msgbox Class not registered
      else
         msgbox error: %result%
      ExitApp
   }
   DeleteHString(hString)
}

CreateHString(string, ByRef hString)
{
    DllCall(&quot;Combase.dll\WindowsCreateString&quot;, &quot;wstr&quot;, string, &quot;uint&quot;, StrLen(string), &quot;ptr*&quot;, hString)
}

DeleteHString(hString)
{
   DllCall(&quot;Combase.dll\WindowsDeleteString&quot;, &quot;ptr&quot;, hString)
}

WaitForAsync(ByRef Object)
{
   AsyncInfo := ComObjQuery(Object, IAsyncInfo := &quot;{00000036-0000-0000-C000-000000000046}&quot;)
   loop
   {
      DllCall(NumGet(NumGet(AsyncInfo+0)+7*A_PtrSize), &quot;ptr&quot;, AsyncInfo, &quot;uint*&quot;, status)   ; IAsyncInfo.Status
      if (status != 0)
      {
         if (status != 1)
         {
            DllCall(NumGet(NumGet(AsyncInfo+0)+8*A_PtrSize), &quot;ptr&quot;, AsyncInfo, &quot;uint*&quot;, ErrorCode)   ; IAsyncInfo.ErrorCode
            msgbox AsyncInfo status error: %ErrorCode%
            ExitApp
         }
         ObjRelease(AsyncInfo)
         break
      }
      sleep 10
   }
   DllCall(NumGet(NumGet(Object+0)+8*A_PtrSize), &quot;ptr&quot;, Object, &quot;ptr*&quot;, ObjectResult)   ; GetResults
   ObjReleaseClose(Object)
   Object := ObjectResult
}

ObjReleaseClose(ByRef Object)
{
   if Object
   {
      if (Close := ComObjQuery(Object, IClosable := &quot;{30D5A829-7FA4-4026-83BB-D75BAE4EA99E}&quot;))
      {
         DllCall(NumGet(NumGet(Close+0)+6*A_PtrSize), &quot;ptr&quot;, Close)   ; Close
         ObjRelease(Close)
      }
      hr := ObjRelease(Object)
   }
   Object := &quot;&quot;
   return hr
}</code></pre></div><p><a href="http://forum.script-coding.com/viewtopic.php?id=17688">Тема для обсуждения</a></p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Mon, 13 Mar 2023 09:36:26 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=157157#p157157</guid>
		</item>
	</channel>
</rss>
