1 (изменено: teadrinker, 2021-02-03 17:49:53)

Тема: AHK: UWP, Clipboard Class

Решил тоже немного попробовать в UWP.
Частичная имплементация класса Clipboard из Windows Runtime API.
Класс ClipboardHistory реализует возможности:

  • узнавать, включена ли история буфера обмена в Windows 10

  • узнавать количество элементов в истории

  • стирать историю буфера обмена

  • получать текст элемента истории по индексу

  • помещать в Clipboard элемент из истории по индексу

а так же демонстрирует принципы использования классов и интерфейсов Windows Runtime в AHK.

; помещает в Clipboard второй элемент из истории буфера обмена Windows 10 и возвращает статус успеха
MsgBox, % (new ClipboardHistory).PutHistoryItemIntoClipboard(2)

; получаем текст элементов истории буфера обмена по индексу
ClipHist := new ClipboardHistory
Loop % ClipHist.Count
   MsgBox,, Item %A_Index%, % ClipHist.GetHistoryItemText(A_Index), .7

class ClipboardHistory
{
; https://is.gd/bYyogJ ; Clipboard Class (MSDN)
; https://is.gd/2z2Y9G ; Windows.ApplicationModel.DataTransfer.0.h (GitHub)
; https://is.gd/T4Lb7b ; asyncinfo.h (GitHub)
   __New() {
      static IID_IClipboardStatics2 := "{D2AC1B6A-D29F-554B-B303-F0452345FE02}"
      if (A_OSVersion ~= "^\D") {
         MsgBox, This class requires Windows 10 or later!
         Return
      }
      WrtStr := new WrtString("Windows.ApplicationModel.DataTransfer.Clipboard")
      riid := CLSIDFromString(IID_IClipboardStatics2, _)
      WrtStr.CreateInterface(riid, pIClipboardStatics2)
      this.ClipboardStatics2 := new IClipboardStatics2( pIClipboardStatics2 )
   }
   
   __Delete() {
      this.ClipboardStatics2 := ""
   }
   
   IsHistoryEnabled[] {
      get {
         Return this.ClipboardStatics2.IsHistoryEnabled
      }
   }
   
   Count[] {
      get {
         Return this._GetClipboardHistoryItems()
      }
   }
   
   ClearHistory() {
      Return this.ClipboardStatics2.ClearHistory()
   }
   
   GetHistoryItemText(index) { ; 1 based
      if !pIClipboardHistoryItem := this._GetClipboardHistoryItemByIndex(index)
         Return
      ClipboardHistoryItem := new IClipboardHistoryItem( pIClipboardHistoryItem )
      pIDataPackageView := ClipboardHistoryItem.Content
      DataPackageView := new IDataPackageView( pIDataPackageView )
      pIReadOnlyList := DataPackageView.AvailableFormats
      ReadOnlyList := new IReadOnlyList( pIReadOnlyList )
      Loop % ReadOnlyList.Count
         pString := ReadOnlyList.Item[A_Index - 1]
      until (new WrtString(pString, true)).GetText() = "Text" && textFound := true
      if !textFound
         Return
      DataPackageView.GetTextAsync(pIAsyncOperation)
      pString := this._AsyncOperationGetResults(pIAsyncOperation)
      Return (new WrtString(pString, true)).GetText()
   }
   
   PutHistoryItemIntoClipboard(index) { ; 1 based
      static SetHistoryItemAsContentStatus := ["Success", "AccessDenied", "ItemDeleted"]
      if !pIClipboardHistoryItem := this._GetClipboardHistoryItemByIndex(index)
         Return
      ClipboardHistoryItem := new IClipboardHistoryItem( pIClipboardHistoryItem )
      status := this.ClipboardStatics2.SetHistoryItemAsContent( pIClipboardHistoryItem )
      Return SetHistoryItemAsContentStatus[ status + 1 ]
   }
   
   _GetClipboardHistoryItemByIndex(index) { ; 1 based
      count := this._GetClipboardHistoryItems(ReadOnlyList)
      if (count < index) {
         MsgBox, 48, % " ", Index "%index%" exceeds items count!
         Return
      }
      Return pIClipboardHistoryItem := ReadOnlyList.Item[index - 1]
   }
   
   _GetClipboardHistoryItems(ByRef ReadOnlyList := "") {
      this.ClipboardStatics2.GetHistoryItemsAsync( pIAsyncOperation )
      pIClipboardHistoryItemsResult := this._AsyncOperationGetResults(pIAsyncOperation)
      ClipboardHistoryItemsResult := new IClipboardHistoryItemsResult( pIClipboardHistoryItemsResult )
      pIReadOnlyList := ClipboardHistoryItemsResult.Items
      ReadOnlyList := new IReadOnlyList( pIReadOnlyList )
      Return ReadOnlyList.Count
   }
   
   _AsyncOperationGetResults(pIAsyncOperation) {
      static AsyncStatus  := ["Started", "Completed", "Canceled", "Error"]
      AsyncOperation := new IAsyncOperation( pIAsyncOperation )
      AsyncOperation.QueryIAsyncInfo(pIAsyncInfo)
      AsyncInfo := new IAsyncInfo( pIAsyncInfo )
      Loop {
         Sleep, 10
         status := AsyncStatus[ AsyncInfo.Status + 1 ]
      } until status != "Started"
      if (status != "Completed")
         throw "AsyncInfo error, status: """ . status . """"
      AsyncOperation.GetResults( pResult )
      Return pResult
   }
}

class IClipboardStatics2 extends _InterfaceBase
{
   GetHistoryItemsAsync(ByRef pIAsyncOperation) {
      hr := DllCall(this.VTable(6), "Ptr", this.ptr, "UIntP", pIAsyncOperation)
      this.IsError(A_ThisFunc, hr)
   }
   ClearHistory() {
      hr := DllCall(this.VTable(7), "Ptr", this.ptr, "UIntP", res)
      this.IsError(A_ThisFunc, hr)
      Return res
   }
   SetHistoryItemAsContent(pIClipboardHistoryItem) {
      hr := DllCall(this.VTable(9), "Ptr", this.ptr, "Ptr", pIClipboardHistoryItem, "UIntP", res)
      this.IsError(A_ThisFunc, hr)
      Return res
   }
   IsHistoryEnabled[] {
      get {
         hr := DllCall(this.VTable(10), "Ptr", this.ptr, "UIntP", res)
         this.IsError(A_ThisFunc, hr)
         Return res
      }
   }
}

class IClipboardHistoryItemsResult extends _InterfaceBase
{
   Items[] {
      get {
         hr := DllCall(this.VTable(7), "Ptr", this.ptr, "PtrP", pIReadOnlyList)
         this.IsError(A_ThisFunc, hr)
         Return pIReadOnlyList
      }
   }
}

class IClipboardHistoryItem extends _InterfaceBase
{
   Content[] {
      get {
         hr := DllCall(this.VTable(8), "Ptr", this.ptr, "PtrP", pIDataPackageView)
         this.IsError(A_ThisFunc, hr)
         Return pIDataPackageView
      }
   }
}

class IDataPackageView extends _InterfaceBase
{
   AvailableFormats[] {
      get {
         hr := DllCall(this.VTable(9), "Ptr", this.ptr, "PtrP", pIReadOnlyList)
         this.IsError(A_ThisFunc, hr)
         Return pIReadOnlyList
      }
   }
   GetTextAsync(ByRef pIAsyncOperation) {
      hr := DllCall(this.VTable(12), "Ptr", this.ptr, "UIntP", pIAsyncOperation)
      this.IsError(A_ThisFunc, hr)
   }
}

class IReadOnlyList extends _InterfaceBase
{
   Item[index] {
      get {
         hr := DllCall(this.VTable(6), "Ptr", this.ptr, "Int", index, "PtrP", pItem)
         this.IsError(A_ThisFunc, hr)
         Return pItem
      }
   }
   Count[] {
      get {
         hr := DllCall(this.VTable(7), "Ptr", this.ptr, "UIntP", count)
         this.IsError(A_ThisFunc, hr)
         Return count
      }
   }
}

class IAsyncOperation extends _InterfaceBase
{
   QueryIAsyncInfo(ByRef pIAsyncInfo) {
      static IID_IAsyncInfo := "{00000036-0000-0000-C000-000000000046}"
      pIAsyncInfo := ComObjQuery(this.ptr, IID_IAsyncInfo)
   }
   GetResults(ByRef pResult) {
      hr := DllCall(this.VTable(8), "Ptr", this.ptr, "PtrP", pResult)
      this.IsError(A_ThisFunc, hr)
   }
}

class IAsyncInfo extends _InterfaceBase
{
   Status[] {
      get {
         hr := DllCall(this.VTable(7), "Ptr", this.ptr, "UIntP", status)
         this.IsError(A_ThisFunc, hr)
         Return status
      }
   }
}

class _InterfaceBase {
   __New(ptr) {
      this.ptr := ptr
   }
   __Delete() {
      ObjRelease(this.ptr)
   }
   VTable(idx) {
      Return NumGet(NumGet(this.ptr + 0) + A_PtrSize*idx)
   }
   IsError(method, result, exc := true) {
      if (result = 0)
         Return 0
      error := StrReplace(method, ".", "::") . " failed.`nResult: "
                              . ( result = "" ? "No result" : SysError(Format("{:#x}", result & 0xFFFFFFFF)) )
                              . "`nErrorLevel: " . ErrorLevel
      if !exc
         Return error
      throw error
   }
}

class WrtString {
   __New(string, isHandle := false) {
      if isHandle
         this.hString := string
      else {
         DllCall("Combase\WindowsCreateString", "WStr", string, "UInt", StrLen(string), "PtrP", hString)
         this.hString := hString
      }
   }
   __Delete() {
      DllCall("Combase\WindowsDeleteString", "Ptr", this.hString)
   }
   GetText() {
      pBuff := DllCall("Combase\WindowsGetStringRawBuffer", "Ptr", this.hString, "UIntP", len, "Ptr")
      Return StrGet(pBuff, len, "UTF-16")
   }
   CreateInterface(riid, ByRef pInterface) {
      hr := DllCall("Combase\RoGetActivationFactory", "Ptr", this.hString, "Ptr", riid, "PtrP", pInterface)
      if (hr != 0)
         throw SysError(hr)
   }
}

CLSIDFromString(IID, ByRef CLSID) {
   VarSetCapacity(CLSID, 16, 0)
   if hr := DllCall("ole32\CLSIDFromString", "WStr", IID, "Ptr", &CLSID, "UInt")
      throw "CLSIDFromString failed. Error: " . Format("{:#x}", hr)
   Return &CLSID
}

SysError(ErrorNum = "")
{ 
	static flag := (FORMAT_MESSAGE_ALLOCATE_BUFFER := 0x100) | (FORMAT_MESSAGE_FROM_SYSTEM := 0x1000)
	(ErrorNum = "" && ErrorNum := A_LastError)
	DllCall("FormatMessage", "UInt", flag, "UInt", 0, "UInt", ErrorNum, "UInt", 0, "PtrP", pBuff, "UInt", 512, "Str", "")
	Return (str := StrGet(pBuff)) ? str : ErrorNum
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

2

Re: AHK: UWP, Clipboard Class

Круто.
А как перебрать все элементы и получить их текст?

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

3

Re: AHK: UWP, Clipboard Class

Получение количества элементов в этом классе реализовано: ReadOnlyList.Count
Также там есть метод _GetClipboardHistoryItemByIndex(index). Он возвращает указатель на IClipboardHistoryItem, который используется в классе ClipboardHistoryItem. В нём есть метод Content. Только надо сначала определить тип контента.

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

4

Re: AHK: UWP, Clipboard Class

teadrinker пишет:

определить тип контента.

В классе есть что то про это?

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

5 (изменено: serzh82saratov, 2021-01-29 13:05:41)

Re: AHK: UWP, Clipboard Class

Я правильно понял что ClipboardHistoryItem.Content должен вернуть DataPackageView Class в котором нужен AvailableFormats или Contains?

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

6

Re: AHK: UWP, Clipboard Class

Точно.

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

7

Re: AHK: UWP, Clipboard Class

А просвяти пожалуйста насчёт смещений в VTable. Например почему в IClipboardStatics2 у SetHistoryItemAsContent = 9?

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

8

Re: AHK: UWP, Clipboard Class

Там в начале класса есть ссылка на Windows.ApplicationModel.DataTransfer.h, где определяется IClipboardStatics2. Они там все устроены одинаково, я, честно говоря, методом тыка определил, что начинается с оффсета 6, лень было узнавать, почему.

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

9

Re: AHK: UWP, Clipboard Class

Не, не понял. Вот например в тут понятно, какой по порядку метод в классе, такой и индекс.
А тут не ясно от чего считать.

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

10

Re: AHK: UWP, Clipboard Class

Так и там так же, только начинать с 6.

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

11

Re: AHK: UWP, Clipboard Class

То есть здесь, если считать с нуля он третий и плюс 6.


    template <typename D>
    struct produce<D, Windows::ApplicationModel::DataTransfer::IClipboardStatics2> : produce_base<D, Windows::ApplicationModel::DataTransfer::IClipboardStatics2>
    {
        int32_t __stdcall GetHistoryItemsAsync(void** operation) noexcept final try
        {
            clear_abi(operation);
            typename D::abi_guard guard(this->shim());
            *operation = detach_from<Windows::Foundation::IAsyncOperation<Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResult>>(this->shim().GetHistoryItemsAsync());
            return 0;
        }
        catch (...) { return to_hresult(); }
        int32_t __stdcall ClearHistory(bool* result) noexcept final try
        {
            typename D::abi_guard guard(this->shim());
            *result = detach_from<bool>(this->shim().ClearHistory());
            return 0;
        }
        catch (...) { return to_hresult(); }
        int32_t __stdcall DeleteItemFromHistory(void* item, bool* result) noexcept final try
        {
            typename D::abi_guard guard(this->shim());
            *result = detach_from<bool>(this->shim().DeleteItemFromHistory(*reinterpret_cast<Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem const*>(&item)));
            return 0;
        }
        catch (...) { return to_hresult(); }
        int32_t __stdcall SetHistoryItemAsContent(void* item, int32_t* result) noexcept final try
        {
            typename D::abi_guard guard(this->shim());
            *result = detach_from<Windows::ApplicationModel::DataTransfer::SetHistoryItemAsContentStatus>(this->shim().SetHistoryItemAsContent(*reinterpret_cast<Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem const*>(&item)));
            return 0;
        }
        catch (...) { return to_hresult(); }
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

Re: AHK: UWP, Clipboard Class

Ну да, только зачем с нуля, сразу с шести и начинай.

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

13

Re: AHK: UWP, Clipboard Class

А есть вообще способы использовать в AutoHotkey объекты из WinAPI в нормальном виде, как в С++. В примере Clipboard Class код на JavaScript как то их использует?

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

14 (изменено: teadrinker, 2021-01-29 13:59:20)

Re: AHK: UWP, Clipboard Class

В AHK такой синтаксис можно использовать только с интерфейсами, унаследованными от IDispatch, например IAccessible interface:

The IAccessible interface inherits from the IDispatch interface

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

15

Re: AHK: UWP, Clipboard Class

teadrinker пишет:

Они там все устроены одинаково, я, честно говоря, методом тыка определил, что начинается с оффсета 6, лень было узнавать, почему.

Методом тыка не совсем надежно.
Смотрим:
https://github.com/GitTorre/InetSpeedCp … r.0.h#L428
Видим:

struct __declspec(novtable) type : inspectable_abi

Смотрим:
https://devblogs.microsoft.com/oldnewth … /?p=104275
Видим:

System ABI struct ISomething : ::IInspectable
{
virtual HRESULT
  Method1(INT32 param1) = 0;
virtual HRESULT
  Method2(HSTRING* result) = 0;
};
C++/WinRT ABI struct ISomething : inspectable_abi
{
virtual int32_t
  Method1(int32_t param1) = 0;
virtual int32_t
  Method2(void** result) = 0;
};

Смотрим:
https://github.com/tpn/winsdk-10/blob/m … ble.h#L116
Видим интерфейс состоит из 6 методов.

16 (изменено: serzh82saratov, 2021-01-30 19:47:34)

Re: AHK: UWP, Clipboard Class

  • А у UWP какой интерфейс?

  • Только IDispatch в AutoHotkey, потому что в нём встроена только его реализация, или по другим причинам?

  • CLR это про это?

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

17

Re: AHK: UWP, Clipboard Class

Malcev пишет:

Видим интерфейс состоит из 6 методов.

А, ну вот, спасибо. Они там все type : inspectable_abi.

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

18

Re: AHK: UWP, Clipboard Class

serzh82saratov
UWP — это такая технология, там всякие интерфейсы используются.
Я так понимаю, что да, только его реализация.
CLR — это про это.

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

19

Re: AHK: UWP, Clipboard Class

Malcev пишет:

Смотрим:
Видим:

Для слабых духом, тут понадобятся ещё не изданные книги "Почему я начал смотреть именно тут" и "Почему я увидел это на фоне всего остального".

teadrinker пишет:

там всякие интерфейсы используются.

В данном случае как можно понять какой используется?

teadrinker пишет:

Я так понимаю, что да, только его реализация.

В JavaScript значит таких реализаций больше.

teadrinker пишет:

CLR — это про это.

Если вернуть объект Windows.ApplicationModel.DataTransfer.Clipboard выполнив код С++ (так понимаю из трёх строк) через CLR, разве он не будет работать?

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

20

Re: AHK: UWP, Clipboard Class

Выполнить код С++ через CLR нельзя, в среде CLR выполняется код ЯП, имеющих отношение к .NET, например C#. Другое дело, что на C# подобные интерфейсы как раз имеют удобную реализацию. Не знаю, может быть, через библиотеку, на которую ты ссылаешься, и можно использовать интерфейсы UWP, но, боюсь, это получится обёртка в обёртке. Хотя, ради интереса можно было бы изучить этот вопрос, особенно если знаешь C#.

serzh82saratov пишет:

В данном случае как можно понять какой используется?

Чаще всего они перечислены на странице описания класса.

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

21

Re: AHK: UWP, Clipboard Class

serzh82saratov пишет:

В примере Clipboard Class код на JavaScript как то их использует

На автохотки, наверное, можно через chakra.dll попробовать.
https://github.com/Lexikos/ActiveScript … _Toast.ahk

22

Re: AHK: UWP, Clipboard Class

Попробовал запустить строку

var dataPackageView = Windows.ApplicationModel.DataTransfer.Clipboard.getContent();

выбрасывает исключение.

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

23

Re: AHK: UWP, Clipboard Class


#NoEnv
#Include ActiveScript.ahk
#Include JsRT.ahk
 
js := new JsRT.Edge

js.ProjectWinRTNamespace("Windows.ApplicationModel.DataTransfer")

code =
(
	var objClip = Windows.ApplicationModel.DataTransfer.Clipboard  
)


js.Exec(code)
oClip := js.Eval("objClip") 

1::
	MsgBox % oClip.isHistoryEnabled() 
	Return

Так реагирует на настройку в виндовс. Когда включена почему то -1.
https://i.imgur.com/f4ea1Ow.png
Методы надо писать верблюдом. При выходе всегда "Critical Error:  Invalid memory read/write", хотя в примерах не видел касаемо OnExit.

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

24 (изменено: teadrinker, 2021-01-29 18:48:13)

Re: AHK: UWP, Clipboard Class

serzh82saratov пишет:
js.ProjectWinRTNamespace("Windows.ApplicationModel.DataTransfer")

Ага, в этом была проблема.
Теперь вроде работает.
Так работает, как OnClipboardChange:

#Persistent
#Include C:\Users\mi\Documents\AutoHotkey\Lib\ActiveScript.ahk
#Include C:\Users\mi\Documents\AutoHotkey\Lib\JsRT.ahk

js := new JsRT.Edge
js.AddObject("MsgBox", Func("MyMsgBox"))
js.ProjectWinRTNamespace("Windows.ApplicationModel.DataTransfer")
code =
(
Windows.ApplicationModel.DataTransfer.Clipboard.addEventListener("contentchanged", function (event) {
    var dataPackageView = Windows.ApplicationModel.DataTransfer.Clipboard.getContent();
    if (dataPackageView.contains(Windows.ApplicationModel.DataTransfer.StandardDataFormats.text)) {
        dataPackageView.getTextAsync().then(function (text) {
           MsgBox("Clipboard now contains: " + text);
        });
    }
});
)
js.Exec(code)
Return

MyMsgBox(s) {
    MsgBox 0, JScript, %s%
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

25

Re: AHK: UWP, Clipboard Class

Ну нормально!
А получится это же сделать на AutoHotkey, получив от JS один раз Windows.ApplicationModel.DataTransfer?

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

26

Re: AHK: UWP, Clipboard Class

Не знаю. У меня пока что не получилось даже ClearHistory() сделать, опять выбрасывает исключение:

#Include C:\Users\mi\Documents\AutoHotkey\Lib\ActiveScript.ahk
#Include C:\Users\mi\Documents\AutoHotkey\Lib\JsRT.ahk

js := new JsRT.Edge
js.ProjectWinRTNamespace("Windows.ApplicationModel.DataTransfer")
code := "Windows.ApplicationModel.DataTransfer.Clipboard.ClearHistory();"
js.Exec(code)

Похоже, js вовне ничего изменить не может.

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

27

Re: AHK: UWP, Clipboard Class

ClearHistory вроде из AutoHotkey тоже не работает.

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

28

Re: AHK: UWP, Clipboard Class

Почему, у меня работает.

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

29

Re: AHK: UWP, Clipboard Class

Уже на этом шаге затык:

#Include C:\Users\mi\Documents\AutoHotkey\Lib\ActiveScript.ahk
#Include C:\Users\mi\Documents\AutoHotkey\Lib\JsRT.ahk

js := new JsRT.Edge
js.ProjectWinRTNamespace("Windows.ApplicationModel.DataTransfer")
code =
(
   Windows.ApplicationModel.DataTransfer.Clipboard.GetHistoryItemsAsync().then( test => {
   });
)
js.Exec(code)
Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

30

Re: AHK: UWP, Clipboard Class

teadrinker пишет:

Почему, у меня работает.

У меня не очищает историю. Возвращает 1.


В общем решение js для .NET выглядит максимально странно для обёртки анк, особенно в виду наличия С#, и CLR которое для этого писалось. Осталось написать 3 строчки на С# и проверить (у меня не получилось).

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

31

Re: AHK: UWP, Clipboard Class

Добавил получение текста.

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

32

Re: AHK: UWP, Clipboard Class

serzh82saratov пишет:

У меня не очищает историю. Возвращает 1.

Если возвращает 1, значит должно очищать.

serzh82saratov пишет:

В общем решение js для .NET выглядит максимально странно для обёртки анк, особенно в виду наличия С#, и CLR которое для этого писалось. Осталось написать 3 строчки на С# и проверить (у меня не получилось).

А смысл, когда можно вызывать методы напрямую?

teadrinker пишет:

Не знаю. У меня пока что не получилось даже ClearHistory() сделать, опять выбрасывает исключение:

#Include C:\Users\mi\Documents\AutoHotkey\Lib\ActiveScript.ahk
#Include C:\Users\mi\Documents\AutoHotkey\Lib\JsRT.ahk

js := new JsRT.Edge
js.ProjectWinRTNamespace("Windows.ApplicationModel.DataTransfer")
code := "Windows.ApplicationModel.DataTransfer.Clipboard.ClearHistory();"
js.Exec(code)

Похоже, js вовне ничего изменить не может.

Надо методы с маленькой буквы писать.

code := "Windows.ApplicationModel.DataTransfer.Clipboard.clearHistory();"

33

Re: AHK: UWP, Clipboard Class

Malcev пишет:

А смысл, когда можно вызывать методы напрямую?

Я представляю это как: сделать на С# шаблон, в который можно просто прописать нужное пространство имён, и далее использовать объект, а не искать для каждого метода смещения и оборачивать его, или писать DllCall(NumGet(NumGet(.

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

34

Re: AHK: UWP, Clipboard Class

Угу. Только где ты дллки достанешь?

35

Re: AHK: UWP, Clipboard Class

Зачем дллки?

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

36

Re: AHK: UWP, Clipboard Class

А как по твоему работает CLR?

37

Re: AHK: UWP, Clipboard Class

Ты имеешь ввиду что должен быть установлен .NET?

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

38

Re: AHK: UWP, Clipboard Class

Я имею в виду, что для того, чтобы скомпилировать код, нужны dll.

39

Re: AHK: UWP, Clipboard Class

Malcev пишет:

Надо методы с маленькой буквы писать

Ах, вот оно в чём дело! А я не допёр.

serzh82saratov пишет:

Методы надо писать верблюдом

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

40 (изменено: serzh82saratov, 2021-01-30 13:57:05)

Re: AHK: UWP, Clipboard Class

Malcev
https://www.autohotkey.com/boards/viewt … amp;t=4633
Тут они где берутся?

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

41

Re: AHK: UWP, Clipboard Class

C:\Windows\Microsoft.NET\Framework

42

Re: AHK: UWP, Clipboard Class

Malcev пишет:

чтобы скомпилировать код

Ты про как скомпилировать AutoHotkey?

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

43 (изменено: Malcev, 2021-01-30 14:08:20)

Re: AHK: UWP, Clipboard Class

Не понимаю о чем ты.
Для того, чтобы выполнить этот код

c# =
(
    using System.Windows.Forms;
    class Foo {
        public void Test() {
            MessageBox.Show("Hello, world, from C#!");
        }
    }
)
asm := CLR_CompileC#(c#, "System.dll | System.Windows.Forms.dll")
obj := CLR_CreateObject(asm, "Foo")
obj.Test()

Нам нужны 2 dll - System.dll | System.Windows.Forms.dll.
Вот я и спрашиваю, где ты достанешь Windows.ApplicationModel.DataTransfer.dll?

44

Re: AHK: UWP, Clipboard Class

Вот тут что-то пишут:
https://stackoverflow.com/questions/605 … mespace-in
Можешь покопаться - у меня студия не стоит.

45

Re: AHK: UWP, Clipboard Class

То есть UWP как то проблемно подключается в C#.

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

46 (изменено: Malcev, 2021-01-30 18:55:26)

Re: AHK: UWP, Clipboard Class

У меня не на чем проверить.
Можешь у lexikosа спросить.
Он как-раз на форуме активировался.
То есть на VB должно работать как-то так.

vb =
(
   Imports System
   Imports Windows.ApplicationModel.DataTransfer
   Class Foo
      Public Sub Test()
         Windows.ApplicationModel.DataTransfer.Clipboard.clear()
     End Sub
   End Class
)
asm := CLR_CompileVB(vb, "System.dll | Windows.ApplicationModel.DataTransfer.dll")
obj := CLR_CreateObject(asm, "Foo")
obj.Test()

Но из-за того что нету dll выводит ошибку.
Может можно что-нибудь и прикрутить.

47

Re: AHK: UWP, Clipboard Class

Спросил.
https://www.autohotkey.com/boards/viewt … 62#p379062

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

48

Re: AHK: UWP, Clipboard Class

serzh82saratov пишет:

difficult to use for each DllCall method (NumGet (NumGet (

Там (NumGet (NumGet только в одном месте.

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

49

Re: AHK: UWP, Clipboard Class

Я понимаю, я образно, у тебя всё обёрнуто как надо.

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

50

Re: AHK: UWP, Clipboard Class

Привел бы ему готовый код на VB или на С#.
И спросил бы возможно ли подключить нужные dll.

51

Re: AHK: UWP, Clipboard Class

Сделал.
А ты чего стесняешься, мне кажется если он увидит двоих вопрошающих на один вопрос, то шансов больше.

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

52

Re: AHK: UWP, Clipboard Class

Если честно, неохота во всем этом копаться.

53

Re: AHK: UWP, Clipboard Class

Для того и спрашиваем, что не охота, или сами не можем.

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

54

Re: AHK: UWP, Clipboard Class

Согласен, но это когда есть интерес.
А у меня его в этой плоскости нету, так как подход через RoGetActivationFactory вполне устраивает.

55 (изменено: serzh82saratov, 2021-01-30 22:19:59)

Re: AHK: UWP, Clipboard Class

Ясно. А тебе VB несложно подправить, тот пример не совсем верно отражает цель вопроса. Надо как то так.


vb =
( 
   Imports System
   Imports Windows
   Class Foo
      Public Function GetWA()
         Return Windows.ApplicationModel
     End Function
   End Class
)
asm := CLR_CompileVB(vb, "System.dll | Windows.dll")
Foo := CLR_CreateObject(asm, "Foo")
WA := Foo.GetWA()
WA.DataTransfer.Clipboard.clear()
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

56

Re: AHK: UWP, Clipboard Class

Не, не смогу.
Я на VB и на C# не пишу, могу только понять какие-то части кода.

57

Re: AHK: UWP, Clipboard Class

Выкладываю версию класса ClipboardHistory для AHK v2. Обратите внимание, насколько удобнее во второй версии организована работа с виндосовскими COM-интерфейсами (ComCall).

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

58

Re: AHK: UWP, Clipboard Class

Во второй версии можно всё сделать еще проще через winrt.ahk.
https://github.com/Lexikos/winrt.ahk/bl … pboard.ahk

59

Re: AHK: UWP, Clipboard Class

Можешь пояснить, что именно там проще? Вроде тоже самое, нет?

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

60

Re: AHK: UWP, Clipboard Class

Не надо интерфейсы прописывать.

61

Re: AHK: UWP, Clipboard Class

Не очень понял. Там какой-то другой принцип?

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

62

Re: AHK: UWP, Clipboard Class

Я не вдавался в подробности, но он их получает напрямую:
https://github.com/Lexikos/winrt.ahk/bl … tadata.ahk

63

Re: AHK: UWP, Clipboard Class

Я тоже пока не смотрел внимательно (не у компа), но их никак нельзя получить "напрямую". Там просто немного другой дизайн.

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

64

Re: AHK: UWP, Clipboard Class

Я просто хотел повторить структуру интерфейсов в явном виде так, как они устроены в UWP.

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

65 (изменено: Malcev, 2023-04-03 17:14:31)

Re: AHK: UWP, Clipboard Class

teadrinker пишет:

но их никак нельзя получить "напрямую".

Почему нельзя?
Тут он в общих чертах пишет как:
https://www.autohotkey.com/boards/viewt … 18#p426718

66

Re: AHK: UWP, Clipboard Class

Подробнее позже посмотрю. Но у меня с нуля реализуется только один статический интерфейс — IClipboardStatics2, и его методы используются в дальнейшем, чтобы получать ссылки на другие (динамические) интерфейсы. Можешь сказать конкретнее, как это проще организовать?

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

67

Re: AHK: UWP, Clipboard Class

Как-то через парсинг метадаты, конкретно не знаю - надо его код изучать.

68

Re: AHK: UWP, Clipboard Class

Так а почему ты думаешь, что это будет как-то проще? Я иду ровно по той схеме, которая явно описана в MSDN.

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

69

Re: AHK: UWP, Clipboard Class

Потому что, не надо читать исходники MSDN, находить интерфейсы, считать методы, достоточно вызывать нужные функции через готовый враппер всех winrt namespaces.

70

Re: AHK: UWP, Clipboard Class

А что это за "готовый враппер всех winrt namespaces"?

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

71

Re: AHK: UWP, Clipboard Class

https://github.com/Lexikos/winrt.ahk

72

Re: AHK: UWP, Clipboard Class

А, ну примерно понял, надо поизучать.

Malcev пишет:

Во второй версии можно всё сделать еще проще через winrt.ahk

Но по-моему это никак с версией AHK не связано, то же самое можно и для первой версии написать, просто текста будет больше.

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

73

Re: AHK: UWP, Clipboard Class

Уверен, что можно - но, думаю, что вряд ли кто-то будет во всём этом разбираться и писать.

74

Re: AHK: UWP, Clipboard Class

Ну, вот ещё один резон переходить на вторую версию.

Malcev пишет:

не надо читать исходники MSDN, находить интерфейсы, считать методы

С другой стороны, придётся в каждый скрипт тащить все эти инклуды. Считать методы (в смысле оффсеты) можно скриптом.

Lexikos пишет:

This set of scripts provides an AutoHotkey v2 "language projection" for the Windows Runtime (WinRT). In other words, it hides the details of interop between AutoHotkey and WinRT, allowing WinRT objects to be used like native AutoHotkey objects.

Вот если он это всё добавит в исходник AHK, тогда будет действительно проще.

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

75 (изменено: Malcev, 2023-04-03 19:41:50)

Re: AHK: UWP, Clipboard Class

Может и добавит.
Ну а пока стоит ли тратить время на изучение интерфейсов и методов если есть готовый враппер?

teadrinker пишет:

Ну, вот ещё один резон переходить на вторую версию.

Я вижу, что с появлением 2 версии появилось некоторое количество разработчиков, которые переносят интересные библиотеки, что не может не радовать.

76

Re: AHK: UWP, Clipboard Class

Да, главное, чтобы они не пропали со временем.

Malcev пишет:

Ну а пока стоит ли тратить время на изучение интерфейсов и методов если есть готовый враппер?

Не знаю, думаю, что никогда не помешает понять, как оно работает изнутри. А когда понимаешь принцип, то уже не так много времени уходит.

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