1 (изменено: concept.ru, 2023-05-14 10:59:37)

Тема: AHK: Изображение из xls в GUI

Здравствуйте!
Задача: взять изображение с листа xls и поместить в GUI.
Делаю через буфер обмена и не могу взять изображение.

ExcelObj := ComObjCreate("Excel.Application")
SoWB := ExcelObj.Workbooks.Open(A_ScriptDir "\pic.xlsb")
ExcelObj.Visible := False
GUI, Show, w444 h444, %ScriptName%
ExcelObj.WorkSheets(1).Shapes("pic").Copy
;Run %windir%\system32\mspaint.exe %Clipboard%
GUI, Add, Picture, x22 y22 h333, %Clipboard%

;ToDo
SoWB.save
SoWB := ExcelObj.Workbooks.Close
return

GUIEscape:
GUIClose:
ExitApp

Что-то копируется, но не то, что нужно.
1. Что не верно в

ExcelObj.WorkSheets(1).Shapes("pic").Copy

?
2. Что копируется сейчас?

Post's attachments

pic.xlsb 85.89 kb, 3 downloads since 2023-05-14 

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

2

Re: AHK: Изображение из xls в GUI

В буфер обмена можно скопировать так:

Workbook := ComObjGet("D:\Downloads\pic.xlsb")
Workbook.Application.Windows(Workbook.Name).Visible := true
Worksheet := Workbook.Worksheets(1)
Shape := Worksheet.Pictures(1)
Shape.CopyPicture(xlScreen := 1, xlBitmap := 2)
Workbook.Close(false)

Но, судя по всему, вы взялись за непосильную задачу.

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

3

Re: AHK: Изображение из xls в GUI

teadrinker пишет:

судя по всему, вы взялись за непосильную задачу

Не судите, да не судимы будете.

teadrinker пишет:

В буфер обмена можно скопировать так:

Так не годится из-за Visible := true.
Спасибо за ответ, нашёл в нём две подсказки.
Копировать получается, не получается вставить. Научите, пожалуйста.

ExcelObj := ComObjCreate("Excel.Application")
SoWB := ExcelObj.Workbooks.Open(A_ScriptDir "\pic.xlsb").WorkSheets(1).Shapes("pic").CopyPicture(,2)
ExcelObj.Visible := False
ClipWait, 2
if (!ErrorLevel) {
	MsgBox, Попытка копирования в буфер обмена неудачна.
	Return
}
SoWB.Close(false)
ExcelObj:=SoWB:=0

;Run %windir%\system32\mspaint.exe %ClipboardAll%
GUI, Add, Picture, x22 y22 h256 w256, %ClipboardAll%
GUI, Show, w444 h444, %ScriptName%
return

GUIEscape:
GUIClose:
ExitApp

4

Re: AHK: Изображение из xls в GUI

concept.ru пишет:

Так не годится из-за Visible := true.

Почему? Вы запускали код?

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

5 (изменено: concept.ru, 2023-05-14 21:37:53)

Re: AHK: Изображение из xls в GUI

teadrinker, конечно, запускал. Помимо Visible ещё и Эксель не закрылся.

6

Re: AHK: Изображение из xls в GUI

Эксель должен быть изначально закрыт, информация берётся не из окна.
Сделайте так:

  • Откройте Диспетчер задач, убедитесь, что нет зависших после ваших предыдущих экспериментов процессов Экселя, если есть — закройте их

  • Запустите мой код, как он есть, ничего не меняя, и не добавляя его в другой скрипт

  • Загляните в Диспечер задач, убедитесь, что не появилось зависших процессов Экселя

  • Откройте MSPaint, сделайте Ctrl + V, чтобы узнать, есть ли в буфере обмена картинка

Никаких окон в процессе работы скрипта появляться не должно.

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

7 (изменено: concept.ru, 2023-05-14 22:47:11)

Re: AHK: Изображение из xls в GUI

teadrinker,

  • Да, я всегда чищу Диспетчер задач.

  • Запускаю Ваш код, как он есть, ничего не меняя (кроме пути к xls), и не добавляю его в другой скрипт.

  • В Диспетчере задач нет зависших процессов Экселя, но есть процесс Эксель, появившийся после выполнения Вашего кода.

  • В Paint можно вставить изображение из БО, оно то самое, из xls. Проще посмотреть БО по Win+V

Это не важно, почему у меня не работает Ваш код так, как он работает у Вас.
Повторю просьбу объяснить, как вставить изображение в GUI из Clipboard при условии, что в Clipboard не файл с изображением, а само изображение.

8

Re: AHK: Изображение из xls в GUI

concept.ru пишет:

Это не важно, почему у меня не работает Ваш код так, как он работает у Вас.

Так важно же прояснить, что с ним не так, может его надо как-то поменять. Так он у вас всё-таки работает некорректно? Я проверял на двух компьютерах с Windows 7 и Windows 10, всё было в порядке.

concept.ru пишет:

Повторю просьбу объяснить, как вставить изображение в GUI из Clipboard при условии, что в Clipboard не файл с изображением, а само изображение.

Попробуйте так:

hBitmap := GetBitmapFromClipboard()
Gui, Add, Pic,, HBITMAP: %hBitmap%
Gui, Show

GuiClose() {
   ExitApp
}

GetBitmapFromClipboard() {
   static CF_BITMAP := 2, CF_DIB := 8, SRCCOPY := 0x00CC0020
   if !DllCall("IsClipboardFormatAvailable", "UInt", CF_BITMAP)
      throw "There is no image in the Clipboard"
   if !DllCall("OpenClipboard", "Ptr", 0)
      throw "OpenClipboard failed"
   hDIB := DllCall("GetClipboardData", "UInt", CF_DIB, "Ptr")
   hBM  := DllCall("GetClipboardData", "UInt", CF_BITMAP, "Ptr")
   DllCall("CloseClipboard")
   if !hDIB
      throw "GetClipboardData failed"
   pDIB := DllCall("GlobalLock", "Ptr", hDIB, "Ptr")
   width  := NumGet(pDIB +  4, "UInt")
   height := NumGet(pDIB +  8, "UInt")
   bpp    := NumGet(pDIB + 14, "UShort")
   DllCall("GlobalUnlock", "Ptr", pDIB)
   
   hDC := DllCall("CreateCompatibleDC", "Ptr", 0, "Ptr")
   oBM := DllCall("SelectObject", "Ptr", hDC, "Ptr", hBM, "Ptr")
   
   hMDC := DllCall("CreateCompatibleDC", "Ptr", 0, "Ptr")
   hNewBM := CreateDIBSection(width, -height,, bpp)
   oPrevBM := DllCall("SelectObject", "Ptr", hMDC, "Ptr", hNewBM, "Ptr")
   DllCall("BitBlt", "Ptr", hMDC, "Int", 0, "Int", 0, "Int", width, "Int", height
                   , "Ptr", hDC , "Int", 0, "Int", 0, "UInt", SRCCOPY)
   DllCall("SelectObject", "Ptr", hDC, "Ptr", oBM, "Ptr")
   DllCall("DeleteDC", "Ptr", hDC), DllCall("DeleteObject", "Ptr", hBM)
   DllCall("SelectObject", "Ptr", hMDC, "Ptr", oPrevBM, "Ptr")
   DllCall("DeleteDC", "Ptr", hMDC)
   Return hNewBM
}

CreateDIBSection(w, h, ByRef ppvBits := 0, bpp := 32) {
   hDC := DllCall("GetDC", "Ptr", 0, "Ptr")
   VarSetCapacity(BITMAPINFO, 40, 0)
   NumPut(40 , BITMAPINFO,  0)
   NumPut( w , BITMAPINFO,  4)
   NumPut( h , BITMAPINFO,  8)
   NumPut( 1 , BITMAPINFO, 12)
   NumPut(bpp, BITMAPINFO, 14)
   hBM := DllCall("CreateDIBSection", "Ptr", hDC, "Ptr", &BITMAPINFO, "UInt", 0
                                    , "PtrP", ppvBits, "Ptr", 0, "UInt", 0, "Ptr")
   DllCall("ReleaseDC", "Ptr", 0, "Ptr", hDC)
   return hBM
}

Но я опасаюсь, что вы скажате, что и этот код код делает что-то не то.

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

9

Re: AHK: Изображение из xls в GUI

teadrinker пишет:

Так важно же прояснить, что с ним не так, может его надо как-то поменять.

С удовольствием. Руководите.

10

Re: AHK: Изображение из xls в GUI

Что происходит, если его запустить, выполняя все инструкции из этого поста?

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

11

Re: AHK: Изображение из xls в GUI

teadrinker пишет:

опасаюсь, что вы скажате, что и этот код код делает что-то не то

Напрасны были Ваши опасенья. Код отработал, получил ожидаемое.
И понял, что

teadrinker пишет:

вы взялись за непосильную задачу

оказалось правдой. Ваш код мне бы ни написать самому в ближайший год, ни найти в интернетах.
Большое спасибо.

12 (изменено: concept.ru, 2023-05-14 23:30:04)

Re: AHK: Изображение из xls в GUI

teadrinker пишет:

Что происходит, если его запустить, выполняя все инструкции из этого поста?

То, что описано в ответе.

13

Re: AHK: Изображение из xls в GUI

В смысле, процесс Экселя, который появляется после работы скрипта, не завершается? Теоретически, он может завершиться не сразу, а через какое-то время, секунд через 20.

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

14

Re: AHK: Изображение из xls в GUI

Ещё надо бы проверить, корректно ли открывается сам файл.

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

15

Re: AHK: Изображение из xls в GUI

teadrinker пишет:

через какое-то время, секунд через 20

Ни через 20, ни через 200с Эксель не закрывается.

teadrinker пишет:

проверить, корректно ли открывается сам файл

Предполагаю, корректно, если лист с изображением мелькает на экране, и в БО копируется изображение.

16

Re: AHK: Изображение из xls в GUI

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

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

17 (изменено: concept.ru, 2023-05-15 00:03:54)

Re: AHK: Изображение из xls в GUI

teadrinker, да, открывается Эксель с книгой pic.xlsb на мгновение, потом книга закрывается, а Эксель так и остаётся на экране без открытой книги.
Файл (экселевская книга) pic.xlsb из Проводника двойным ЛКМ открывается как обычно.
Удивился бы, если бы на экране не было Экселя при Workbook.Application.Windows(Workbook.Name).Visible := true

18

Re: AHK: Изображение из xls в GUI

А какая версия Экселя у вас?

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

19 (изменено: concept.ru, 2023-05-15 00:52:21)

Re: AHK: Изображение из xls в GUI

teadrinker, 2016 на W10.
Поменял Visible := true на Visible := false, и всё стало хорошо: ничто не мелькает, Эксель не появляется и закрывается, в БО изображение.

20

Re: AHK: Изображение из xls в GUI

Ясно, спасибо!

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

21

Re: AHK: Изображение из xls в GUI

teadrinker, спасибо Вам, без Вас я бы не продвигался.
К торту Ваших советов добавьте вишенку: как не получать на экране кракозябры вместо кириллицы в, например,

MsgBox, Попытка копирования в буфер обмена неудачна.

?

22

Re: AHK: Изображение из xls в GUI

Сохраняйте скрипт в кодировке UTF-8 с BOM (в некоторых редакторах может называться UTF-8 со спецификацией).

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

23 (изменено: concept.ru, 2023-05-15 03:57:10)

Re: AHK: Изображение из xls в GUI

teadrinker, спасибо.
Такое сохранение нельзя сделать в SciTE4AutoHotkey, в этой IDE нет такой возможности?
Если нет, посоветуйте IDE для  AHK. Notepad++?

24

Re: AHK: Изображение из xls в GUI

Я SciTE4AutoHotkey не пользуюсь, не знаю. Для AHK v1 использую Notepad++.

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

25

Re: AHK: Изображение из xls в GUI

concept.ru, советую для AHK - Visual Studio Code.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

26

Re: AHK: Изображение из xls в GUI

Phoenixxx_Czar, а какой плагин для AHK v1 вы используете? AutoHotkey Plus Plus?

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

27 (изменено: Phoenixxx_Czar, 2023-05-15 20:39:49)

Re: AHK: Изображение из xls в GUI

Использовал AutoHotKey Simple Support, но натолкнулся на AutoHotkey NekoHelp.
Второй мне нравится больше, хоть и не хватает автокомплита для стандартных функций. Зато есть подсказки с документацией + есть поддержка некого JSDoc. Но я сейчас мало кодю на ахк, по этому потестить толком не могу. Но есть одна проблема, оно не подтягивает функции из инклудов, только если файлы открыты во вкладках. Но там есть вроде поддержка мульти-воркспейсов:

If you need to place .ahk in other folders, this Extensions support Multi-root Workspaces.

Если вам нужно разместить .ahk в других папках, это расширение поддерживает многокорневые рабочие пространства.

Я уже попросил, чтобы он добавил возможность включить сканирование из файлов которые подключены через #include.
В любом случае вы можете потестить и написать свое Issue на гитхабе.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

28

Re: AHK: Изображение из xls в GUI

Спасибо, попробую, а то я пока что v1 и v2 в разных редакторах открываю, потому что то, что я пробовал для v1 в VSCode мне не нравилось, а для v2 есть неплохой плагин от thqby.

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

29

Re: AHK: Изображение из xls в GUI

В первом вроде делают поддержку v2, но точно не знаю.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

30

Re: AHK: Изображение из xls в GUI

Всё-таки пока что не нашёл ни одного плагина, который для v1 делает простую вещь — открывает справку на слове, на котором каретка.

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

31

Re: AHK: Изображение из xls в GUI

teadrinker
А ты в NPP какой плагин используешь?

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

32

Re: AHK: Изображение из xls в GUI

Самописный.

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

33

Re: AHK: Изображение из xls в GUI

teadrinker пишет:

открывает справку на слове, на котором каретка

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

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

34

Re: AHK: Изображение из xls в GUI

Поздно, уже сам написал.
А что, кроме меня, это никому было не нужно?

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

35

Re: AHK: Изображение из xls в GUI

Ну может и нет, может всем лень писать issue).
Да и автор же видит со своей точки зрения и может не замечать нужды в каком-то функционале. Лично мне редко нужна справка по каким-то функциям и я бы этим не пользовался.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)