101

Re: AHK: Сохранить маленький произвольный кусок экрана

я про первый вариант. Ответом же является 2-й вариант. Он просто чудесен! Конечно простите меня за мой нижнегородский, пока в процессе самоизлечение
Было необходимо не использовать Microsoft Paint, по причине его отсутствия на некоторых моих ОС.

Просто мне ваша программа необходима, чтобы её использовать в своей программе. Об авторских правах я не забуду. Хотя программу пишу чисто для себя, ну может быть, если кому понравится, будет её использовать.

102 (изменено: pant-79, 2010-06-09 22:37:40)

Re: AHK: Сохранить маленький произвольный кусок экрана

Программа получилась классная, но есть некоторые заморочки.
Для того, чтобы постоянно использовать ее как инструмент, как это обычно делается с клавишей PrintScreen, желательно, чтобы она была запущена постоянно в фоновом режиме, т.е. окно должно быть скрытым, а появляться по вызову - неудобно каждый раз лезть куда-то, чтобы открыть программу и сделать скрин. Также исходя из постоянства работы не должны быть "завешены" стандартные системные клавиши - Pause, Scrollock и т.п. (кстати, с ужасом обнаружил, что на моей навороченной беспроводной клаве отсутствует клавиша Scrollock ).
Все это, конечно, только мое ИМХО, и я сам все это прикручу лично для себя (если это больше никому не надо), но все равно некоторые вопросы к разрабу есть, вот и хочу спросить.
Прошерстил весь код, но не обнаружил в нем "второго" окна, есть только 1е, 3е, 4е и 5е. Вопрос: что за окно предполагается на втором номере?
Я это не просто так спрашиваю.
Вот <a href="http://www.fiastarta.com/PrtScr/">здесь</a> описана прога, которая реализует помимо всех заморочек со скриншотами еще и отображение результата в виде 3D-листочка с изображением скриншота, который можно перетаскиванием сохранять в файл/отправлять по почте/опубликовывать в сети и т.п.
Но до конца эта программа меня не устраивает, а здесь можно сваять некий аналог, устраивающий по всем параметрам.
Конечно, на 3D я не замахиваюсь, но отображение скрина в отдельном окне, которое еще и таскать можно, меня привлекло и я добавлю такой обвес к этому скрипту, но вот с нумерацией окон хотел уточнить...

Со ссылкой заморочки. Исправьте, пожалуйста:P

103 (изменено: teadrinker, 2010-06-10 00:37:58)

Re: AHK: Сохранить маленький произвольный кусок экрана

pant-79 пишет:

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

Окно можно скрыть-показать нажатием средней кнопки мыши, либо через трей-меню. Кроме того, можно просто повесить скрипт на горячую клавишу — загружается он моментально, все настройки сохраняются.

pant-79 пишет:

Также исходя из постоянства работы не должны быть "завешены" стандартные системные клавиши - Pause, Scrollock и т.п.

Ну, тут на всех не угодишь! Я, например, этими клавишами не пользуюсь никогда. Единственный выход — сделать так, чтобы горячие клавиши можно было назначать. Собственно, программу эту я писал, ориентируясь на пожелания конкретного человека. Сейчас, кстати, ещё добавил возможность выбора, куда сохранять скриншот — в файл, в буфер обмена, или сразу отправлять на принтер, если кого-то заинтересует, могу выложить.

pant-79 пишет:

Прошерстил весь код, но не обнаружил в нем "второго" окна, есть только 1е, 3е, 4е и 5е. Вопрос: что за окно предполагается на втором номере?

Уже не помню, что предполагалось. Номера окон ведь не обязательно должны соответствовать их порядковому номеру, это просто способ к ним обращаться.
На счёт 3D окна — наворотить, конечно, всего можно (я, кстати, изучал GDI+), но не совсем понимаю, зачем такое окно нужно, ведь изображение в нём в точности будет соответствовать тому, что мы видим под окном скрипта, в крайнем случае можно увеличить его прозрачность. Зато появится необходимость совершать лишнее действие — скрывать это дополнительное окно.

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

104

Re: AHK: Сохранить маленький произвольный кусок экрана

teadrinker пишет:

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

Возможно, сие предполагается делать для preview-оценки того, насколько точно мы выделили то, что хотели?!

105

Re: AHK: Сохранить маленький произвольный кусок экрана

Ну, если доли миллиметра имеют значение, тогда, может, есть смысл.

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

106

Re: AHK: Сохранить маленький произвольный кусок экрана

Ну, насчет 3D это я для информации сказал, он то как раз не нужен, просто это в программе реализовано.
А насчет нужности такого окна вообще, то это не только preview-оценка, но и сравнение, т.е. когда пользователь хочет сравнить 2 состояния экрана, напр. до и после какого-либо действия, то это наиболее удобный подход - подвесить рядом скрин предыдущего состояния, перетащить его, если надо, да и прозрачность бы не помешало подкручивать, но это уже навороты, конечно.

107

Re: AHK: Сохранить маленький произвольный кусок экрана

Если отойти от AHK (коль речь зашла о сторонних программах), то есть много программ для подобных целей.
Вот парочка
http://www.jingproject.com/
http://clip2net.com/

108

Re: AHK: Сохранить маленький произвольный кусок экрана

Да да. Но это все не то. Если бы в них было все как нам надо, мы бы не обмусоливали эта тему на скриптовом форуме.

109

Re: AHK: Сохранить маленький произвольный кусок экрана

pant-79, понял, подумаю, руки дойдут — попробую!

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

110

Re: AHK: Сохранить маленький произвольный кусок экрана

Заинтересовало плавное появление окна в ScreenCatcher'e, искал в самом коде как это реализовано, так и не нашел, может кто то расскажет?

111

Re: AHK: Сохранить маленький произвольный кусок экрана

Не ясна функция Melt, подозрение на нее)))

112

Re: AHK: Сохранить маленький произвольный кусок экрана

Если попроще, то так:

Gui, +LastFound +ToolWindow -Caption
Gui, Color, FFBE00
Gui, Show, w200 h200 Hide
WinSet, Transparent, 0
Gui, Show, NA

Melt(5)
Sleep 500
Melt(-5)
ExitApp

Melt(i)
{
   WinGet, Trans, Transparent
   While i > 0 ? (Trans += i) < 255 : (Trans += i) > 0
   {
      WinSet, Transparent, % Trans
      Sleep, 10
   }
   WinSet, Transparent, % i > 0 ? 255 : 0
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

113 (изменено: ROLF, 2010-11-25 07:21:36)

Re: AHK: Сохранить маленький произвольный кусок экрана

Круто, интересная штука, Спасибо!

Просто в ScreenCatcher'e сначала не понял "Melt(ID4, 255, 1)", а теперь увидел в самом начале Melt(ID, Trans, 1) стало понятно

114

Re: AHK: Сохранить маленький произвольный кусок экрана

Я тут немного модернизировал скрипт.
ScreenCatcher
Все новые функции прописаны в справке.
Глюка у меня пока-что два:
1. В окне хелпа добавлена пятая метка перехода, но работает она неадекватно.
Авторские все работают правильно. Может, автор просветит, где я допустил ошибку.
2. Не уверен, что дело вообще в коде, но вполне может быть. Некоторые скриншоты вообще не отображаются. Повторяемость глюка - 1 на 10 скриншотов. Некоторые разносит на весь экран. Тоже где-то с такой же повторяемостью. В чем глюк, понять не могу.
Авось кто разберется, в чем тут проблема.

115

Re: AHK: Сохранить маленький произвольный кусок экрана

Прежде всего нужно отметить, что отображение скриншота устроено не вполне логично: скриншот отображается уже после сохранения его в файл, тогда как по логике должно быть наоборот, ведь там предлагается либо сохранить его, либо выйти без сохранения. Для помещения скриншота в окно GUI не обязательно предварительно сохранять его в файл, достаточно иметь bitmap. Потом, при сохранении твой скрипт упорно предлагает папку "Мои документы", хотя в основном меню конкретно указывается директория сохранения. И название по моменту создания не отображается. Если же в диалоге указать временный файл, в который скриншот уже сохранён, то он просто уничтожается, и сохранения не происходит.

pant-79 пишет:

1. В окне хелпа добавлена пятая метка перехода, но работает она неадекватно.

Нужно в переменной HelpText поменять каждое `n на `r`n, т. к. в контроле Edit перевод строки выглядит именно так, и число символов при вычислении позиции перехода считается неправильно. Я так понял, за основу взят первый вариант скрипта (а напрасно), т. к. во втором это уже исправлено.

pant-79 пишет:

Некоторые скриншоты вообще не отображаются.

И не только это. У меня скриншоты иногда отображаются на весь экран, вместо реального размера.

Ctrl + C - Копирование выделенной области в буфер обмена.

— никакого копирования в буфер обмена не происходит, да и комбинация неудачно выбрана. А если в этот момент нужно скопировать какой-то текст?

pant-79 пишет:

При перетаскивании окна скриншота к левому краю экрана выводится
диалог сохранения полученного скриншота в файл.
При перетаскивании окна скриншота к правому краю экрана в буфер
обмена копируется файл со скриншотом.
При перетаскивании окна скриншота к верхнему краю экрана в буфер
обмена копируется само изображение.
При перетаскивании окна скриншота к нижнему краю экрана окно
скриншота уничтожается без сохранения куда-либо.

Имхо, экзотика. Запутаешься, куда и когда чего перетаскивать. А если скриншот УЖЕ находится у края экрана? А если нужно его просто сдвинуть, потому что он что-то перекрывает, а тут у тебя какой-то диалог вылезет?
Есть мелкие недочёты типа

Win + левый клик мыши – скрыть/показать окно.

а между тем так можно только показать окно.

pant-79 пишет:

Авось кто разберется, в чем тут проблема.

Не могу одобрить такую позицию. Если уж взялся, доделывай до конца сам. Мне, к примеру, куда проще было бы написать всё начисто, чем разбираться в чужих ошибках (тем более, что я бы сделал принципиально иначе). По работе каких-либо функций GDI+ могу проконсультировать. Или могу написать пример отбражения скриншота в окне GUI.

Вердикт: скрипт сырой, для публикации пока не годится. Хотя сама идея вполне здравая, особенно понравилась возможность увеличивать изображение. Но не очень понравилось, что при этом происходит мелькание, некрасиво как-то.

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

116 (изменено: pant-79, 2011-01-22 13:59:06)

Re: AHK: Сохранить маленький произвольный кусок экрана

teadrinker пишет:

Прежде всего нужно отметить, что отображение скриншота устроено не вполне логично: скриншот отображается уже после сохранения его в файл, тогда как по логике должно быть наоборот, ведь там предлагается либо сохранить его, либо выйти без сохранения. Для помещения скриншота в окно GUI не обязательно предварительно сохранять его в файл, достаточно иметь bitmap.

Ну напиши такую функцию/процедуру, т.к. мне она не знакома. 

teadrinker пишет:

Потом, при сохранении твой скрипт упорно предлагает папку "Мои документы", хотя в основном меню конкретно указывается директория сохранения. И название по моменту создания не отображается.

Да, это забыл прописать.

teadrinker пишет:

Если же в диалоге указать временный файл, в который скриншот уже сохранён, то он просто уничтожается, и сохранения не происходит.

Ну вообще-то папка для временных файлов и файлы в ней изначально не предназначены, чтобы пользователь ими оперировал. Это что-то вроде кэша для самой программы. А пользователь волен выбирать рабочую директорию сам, под себя, как говорится. И потом, ежели как ты утверждаешь, такой кэш в принципе не нужен, значит при реализации вышеописанной функции вопрос отпадет сам собой.

teadrinker пишет:

И не только это. У меня скриншоты иногда отображаются на весь экран, вместо реального размера.

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

teadrinker пишет:

Ctrl + C - Копирование выделенной области в буфер обмена.

— никакого копирования в буфер обмена не происходит, да и комбинация неудачно выбрана. А если в этот момент нужно скопировать какой-то текст?

Нифига подобного. Комбинация клавиш работает ТОЛЬКО если активно главное окно. Выделил область, нажал Ctrl + C и все уже в буфере. А если надо копировать что-то из другого окна, так при этом оно должно быть активно. И это не я придумал, а в винде так сделано.

teadrinker пишет:

Имхо, экзотика. Запутаешься, куда и когда чего перетаскивать. А если скриншот УЖЕ находится у края экрана? А если нужно его просто сдвинуть, потому что он что-то перекрывает, а тут у тебя какой-то диалог вылезет?

Во первых, это не экзотика а переделка стандартной функции виндовс 7 при перетаскивании окон.
И срабатывает она только в том случае, если не просто окно к краю подтащить, а только если при этом курсор упрется в край экрана. В семерке это реализовано и функционирует без сучка и задоринки. Но для окон со скриншотами совершенно не нужно, чтобы при таком таскании они разворачивались на весь экран или там на полэкрана. Поэтому и предусмотрена такая замена.

teadrinker пишет:

Есть мелкие недочёты типа

Win + левый клик мыши – скрыть/показать окно.

а между тем так можно только показать окно.

Спасибо, исправим.

teadrinker пишет:

По работе каких-либо функций GDI+ могу проконсультировать. Или могу написать пример отбражения скриншота в окне GUI.

Чего я, собсно, и спрашивал.

teadrinker пишет:

Вердикт: скрипт сырой, для публикации пока не годится. Хотя сама идея вполне здравая, особенно понравилась возможность увеличивать изображение. Но не очень понравилось, что при этом происходит мелькание, некрасиво как-то.

Дык я его и не публикую. Потому сюда и сбросил, что он сырой, но я лично уже уперся в некий барьер, поэтому и хотелось усовершенствовать, так сказать, коллективным разумом.

117

Re: AHK: Сохранить маленький произвольный кусок экрана

pant-79 пишет:

хотелось усовершенствовать, так сказать, коллективным разумом.

Насчёт "коллективного разума" — это слегка перебор, ибо весь коллектив в данном случае — это ты и я. И в GDI+ из данного коллектива более или менее разбирается только половина. Примерчик напишу.

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

118

Re: AHK: Сохранить маленький произвольный кусок экрана

Вот пример. Для сокращения кода я воспользовался Gdip.ahk, он должен быть в пользовательской библиотеке. При двойном клике по основному окну делает скриншот и показывает в отдельном окне, при двойном клике по окну скриншота сохраняет bitmap в файл .png на рабочий стол. Размеры окна скриншота можно менять, когда оно активно, вращая колесо мыши.

   If !pToken := Gdip_Startup()
   {
      MsgBox, 48, Ошибка GDI+!
         , Убедитесь в наличии gdiplus.dll в вашей системе!
      ExitApp
   }

   SetBatchLines, -1
   OnExit, Exit

   Gui, +LastFound +ToolWindow -Caption +AlwaysOnTop ; +Resize
   WinGet, ID
   Gui, Color, FFBE00
   WinSet, Transparent, 130
   Gui, Show, w200 h200 NA

   WS_EX_LAYERED = 0x80000
   Gui, 2: -Caption +E%WS_EX_LAYERED% +LastFound +AlwaysOnTop +ToolWindow +Owner1
   WinGet, ID2
   Gui, 2: Show, NA, ScreenShot

   OnMessage(0x201, "WM_LBUTTONDOWN")
   OnMessage(0x203, "WM_LBUTTONDBLCLK")
   Return

GuiEscape:
   ExitApp

2GuiEscape:
   WinHide, ahk_id %ID2%
   Return

Exit:
   if pBitmap
      Gdip_DisposeImage(pBitmap)
   Gdip_Shutdown(pToken)
   ExitApp

#IfWinActive ScreenShot ahk_class AutoHotkeyGUI
WheelUp::
WheelDown::
   WinGetPos, X, Y, W, H, ahk_id %ID2%
   Shift := A_ThisHotkey = "WheelUp" ? 10 : -10
   _W := W + Shift, _H := H + Shift

   hbm := CreateDIBSection(_W, _H)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromHDC(hdc)

   Gdip_DrawImage(G, pBitmap, 0, 0, _W, _H, 0, 0
      , Gdip_GetImageWidth(pBitmap), Gdip_GetImageHeight(pBitmap))

   UpdateLayeredWindow(ID2, hdc, X, Y, _W, _H)

   SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc), Gdip_DeleteGraphics(G)
   Return

WM_LBUTTONDOWN()
{
   WM_NCLBUTTONDOWN := 0xA1, HTCAPTION := 2
   PostMessage, WM_NCLBUTTONDOWN, HTCAPTION
}

WM_LBUTTONDBLCLK(wp, lp, msg, hwnd)
{
   global pBitmap, ID, ID2
   static Now

   SRCCOPY := 0x00CC0020, CAPTUREBLT := 0x40000000

   if (hwnd = ID2)
   {
      WinHide, ahk_id %ID2%
      Gdip_SaveBitmapToFile(pBitmap, A_Desktop "\" Now ".png")
      Gdip_DisposeImage(pBitmap), pBitmap := ""
      Return
   }

   Now := A_Now
   WinGetPos, X, Y, W, H, ahk_id %ID%
   Gui, 1: Hide
   if pBitmap
      Gdip_DisposeImage(pBitmap), pBitmap := ""
   pBitmap := BitmapFromScreen(X "|" Y "|" W "|" H, CAPTUREBLT|SRCCOPY)

   hbm := CreateDIBSection(W, H)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromHDC(hdc)

   Gdip_DrawImage(G, pBitmap, 0, 0, W, H, 0, 0, W, H)

   Gui, Show
   UpdateLayeredWindow(ID2, hdc, X, Y, W, H)
   Gui, 2: Show

   SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc), Gdip_DeleteGraphics(G)

   SetWinDelay, 10
   Loop 10
      WinMove, ahk_id %ID2%,, X+A_Index, Y-A_Index
}

BitmapFromScreen(Coords, Raster="")      ; в аналогичной функции tic'а — баг, пишу свою
{
   StringSplit, S, Coords, |
   x := S1, y := S2, w := S3, h := S4

   chdc := CreateCompatibleDC(), hbm := CreateDIBSection(w, h, chdc)
   obm := SelectObject(chdc, hbm), hhdc := GetDC()
   BitBlt(chdc, 0, 0, w, h, hhdc, x, y, Raster)
   ReleaseDC(hhdc)

   pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm)
   SelectObject(chdc, obm), DeleteObject(hbm), DeleteDC(hhdc), DeleteDC(chdc)
   return pBitmap
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

119

Re: AHK: Сохранить маленький произвольный кусок экрана

%-(
Расшифруй, пожалуйста, разницу между

CreateDIBSection(w, h, hdc="", bpp=32, ByRef ppvBits=0)
{
    hdc2 := hdc ? hdc : GetDC()
    VarSetCapacity(bi, 40, 0)
    NumPut(w, bi, 4), NumPut(h, bi, 8), NumPut(40, bi, 0), NumPut(1, bi, 12, "ushort"), NumPut(0, bi, 16), NumPut(bpp, bi, 14, "ushort")
    hbm := DllCall("CreateDIBSection", "uint" , hdc2, "uint" , &bi, "uint" , 0, "uint*", ppvBits, "uint" , 0, "uint" , 0)

    if !hdc
        ReleaseDC(hdc2)
    return hbm
}

и

CreateDIBSection(hDC, nW, nH, bpp = 32, ByRef pBits = "")
{
    NumPut(VarSetCapacity(bi, 40, 0), bi)
    NumPut(nW, bi, 4)
    NumPut(nH, bi, 8)
    NumPut(bpp, NumPut(1, bi, 12, "UShort"), 0, "Ushort")
    NumPut(0,  bi,16)
    Return    DllCall("gdi32\CreateDIBSection", "Uint", hDC, "Uint", &bi, "Uint", 0
                                                                            , "UintP", pBits, "Uint", 0, "Uint", 0)
}

Первая в gdip.ahk, а вторую брал из твоего же начального кода.

120

Re: AHK: Сохранить маленький произвольный кусок экрана

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

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

121 (изменено: pant-79, 2011-01-26 15:14:47)

Re: AHK: Сохранить маленький произвольный кусок экрана

Вобщем, как я понял, из скрипта можно сносить все функции, аналог которых есть в gdip, от этого работоспособность не ухудшится...
Но вообще пока такой код для меня - темный лес. Еще мало что понимаю.
Вы мне тут всю парадигму АНК рушите
Кстати, какое свойство добавляет окну параметр

+E%WS_EX_LAYERED%

?
Я так понял, тут создается окно без каких бы то ни было элементов управления.
Пустое, но в нем есть рисунок, размерами (вообще непонятно где задаваемыми) которого и надо рулить, а потом просто перерисовывать окно.
%( Это уже что-то совсем не АНКшное...
Про DC я понял только, что это device context, то есть контекст устройства.
Но что есть контекст устройства? Мне это понятие незнакомо.

122

Re: AHK: Сохранить маленький произвольный кусок экрана

pant-79 пишет:

Вобщем, как я понял, из скрипта можно сносить все функции, аналог которых есть в gdip, от этого работоспособность не ухудшится...

Да, конечно. Я не хотел использовать сторонние файлы, чтобы скрипт проще было запускать.

pant-79 пишет:

Кстати, какое свойство добавляет окну параметр +E%WS_EX_LAYERED%

При добавлении этого расширенного стиля (WS_EX_LAYERED) создаётся так называемое "слоёное окно". Такие окна используются для реализации разных графических эффектов, элементы управления в них не добавляются. В момент создания в нём ещё нет никакого рисунка и вообще размеров. Всё это появляется после выполнения функции UpdateLayeredWindow().

pant-79 пишет:

Но что есть контекст устройства?

Контекст устройства

pant-79 пишет:

Вы мне тут всю парадигму АНК рушите

Да, AHK — это больше, чем обычно принято думать!

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

123 (изменено: pant-79, 2011-01-26 19:00:26)

Re: AHK: Сохранить маленький произвольный кусок экрана

teadrinker пишет:

Такие окна используются для реализации разных графических эффектов, элементы управления в них не добавляются.

Мдя. Это, конечно, усложняет ситуацию.
В своей версии скрипта я использовал скрытый элемент управления text.
Для чего я это делал:
На мой взгляд, это наиболее удобный способ сохранить дополнительные параметры окна, а потом и при необходимости использовать.
В моей версии скрипта можно делать кучу скриншотов одновременно и каждый из них будет размещен в отдельном окне, и каждым можно отдельно управлять (перемещать, менять размер, сохранять, скрывать).
Мое личное ИМХО по поводу изменения размеров скриншота - точкой привязки должен быть не левый верхний угол картинки, а место, где сейчас находится курсор.
Такжа долна быть некая привязка к последней позиции окна (той, которая обновляется после его перетаскивания). И все это желательно привязать к каждому из окон.
С двухмерными массивами АНК не дружит, а извращаться, чтобы это как-то эмулировать, что-то не очень хочется. Потому я и запихал этот скрытый text, в котором прописываются эти параметры для данного конкретного окна, а потом считываются.
Получается более естественный зум.
А вот как теперь что-то подобное реализовать для окна, в котором вообще никаких контролов нет, ума не приложу...
Кстати, таких окон сколько можно одновременно создать?

А контекст устройства, это, конечно, жесть. Некая абстрактная философия, реализованная в программе...

124

Re: AHK: Сохранить маленький произвольный кусок экрана

pant-79 пишет:

А вот как теперь что-то подобное реализовать для окна, в котором вообще никаких контролов нет, ума не приложу...

Не вижу никаких сложностей. Можно создать переменную-псевдомассив вида

Var = ...,...,...|...,...,...|...,...,...

и, если нужно, ассоциировать её с каждым окном.

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

125

Re: AHK: Сохранить маленький произвольный кусок экрана

pant-79 пишет:

Кстати, таких окон сколько можно одновременно создать?

В каждом скрипте может быть одновременно до 99 окон GUI.

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

126

Re: AHK: Сохранить маленький произвольный кусок экрана

pant-79 пишет:

Такжа долна быть некая привязка к последней позиции окна

Не нужно запоминать последнюю позицию каждого окна. Достаточно просто использовать перед изменением его размеров WinGetPos.

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

127

Re: AHK: Сохранить маленький произвольный кусок экрана

Этого было бы достаточно, если бы окно было только одно.
А когда их много - добро пожаловать в массив.
Сама-то WinGetPos может определить только текущую позицию конкретного окна, а если его увеличивали/уменьшали - позиция изменится (см. привязка к текущей позиции курсора).
А если потом меняли позицию другого окна-скриншота?
Да что я говорю. Посмотри, как это реализовано в моем варианте, и сравни со своим последним.

128

Re: AHK: Сохранить маленький произвольный кусок экрана

Опять же не понимаю, в чём сложность. Можно определять позицию активного окна при каждом повороте колеса мыши и после этого прибавлять-уменьшать нужные значения. Запоминать ничего не нужно. Попробую видоизменить мой пример с учётом твоих пожеланий.

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

129

Re: AHK: Сохранить маленький произвольный кусок экрана

В этом варианте скрипта можно создать до 98 изображений скриншотов одновременно. Сведения о каждом существующем окне скриншота (номер GUI, идентификатор, время создания и адрес Bitmap) сохраняются в переменную GuiArray. При необходимости любые из этих данных можно получить через RegExReplace(). С массивами было бы, конечно, удобнее. В AHK_L они, вроде, есть, пока не разбирался с ними. После закрытия каждого из окон скриншотов сведения о нём из переменной удаляются, номер GUI освобождается (в отличие от твоего варианта) и соответствующая битовая карта удаляется из памяти.
Требует наличия Gdip.ahk в пользовательской библиотеке.

   If !pToken := Gdip_Startup()
   {
      MsgBox, 48, Ошибка GDI+!
         , Убедитесь в наличии gdiplus.dll в вашей системе!
      ExitApp
   }

   SetBatchLines, -1
   OnExit, Exit

   Gui, +LastFound +ToolWindow -Caption +AlwaysOnTop +Resize
   WinGet, ID

   Gui, Color, FFBE00
   WinSet, Transparent, 130
   Gui, Show, w200 h200 NA

   OnMessage(0x201, "WM_LBUTTONDOWN")
   OnMessage(0x203, "WM_LBUTTONDBLCLK")
   Return

GuiEscape:
   ExitApp

Exit:
   if GuiArray
   {
      StringTrimRight, GuiArray, GuiArray, 1
      Loop, parse, GuiArray, |
      {
         pBM := RegExReplace(A_LoopField, ".*pBM=(.*)", "$1")
         Gdip_DisposeImage(pBM)
      }
   }
   Gdip_Shutdown(pToken)
   ExitApp

#IfWinActive ScreenShot ahk_class AutoHotkeyGUI
WheelUp::
WheelDown::
   WinGet, ScrID,, A
   pBM := RegExReplace(GuiArray, ".*ID\d+=" ScrID ".*?pBM=(.*?)\|.*", "$1")
   W_BM := Gdip_GetImageWidth(pBM)
   H_BM := Gdip_GetImageHeight(pBM)
   RatioBM := W_BM/H_BM
   SquareBM := W_BM*H_BM

   WinGetPos, X, Y, W, H, ahk_id %ScrID%
   Divisor := A_ThisHotkey = "WheelUp" ? 10 : 11
   ShiftW := A_ThisHotkey = "WheelUp" ? Round(W/Divisor) : - Round(W/Divisor)

   _W := W + ShiftW
   if (W != W_BM && _W/W_BM < 1.09 && _W/W_BM > 0.91)
      _W := W_BM
   _H := Round(_W/RatioBM)
   _X := X - Round(ShiftW/2)
   _Y := Y - Round((_H - H)/2)
   if (_W*_H > 13000000 || (A_ThisHotkey = "WheelDown" && _W*_H < 1000 && _W*_H < SquareBM))
      _W := W, _H := H, _X := X, _Y := Y

   hbm := CreateDIBSection(_W, _H)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromHDC(hdc)
   Gdip_SetInterpolationMode(G, 5)

   Gdip_DrawImage(G, pBM, 0, 0, _W, _H, 0, 0, W_BM, H_BM)

   UpdateLayeredWindow(ScrID, hdc, _X, _Y, _W, _H)

   SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc), Gdip_DeleteGraphics(G)
   Return

Esc::
   WinGet, ScrID,, A
   NGui := RegExReplace(GuiArray, ".*ID(\d+)=" ScrID ".*", "$1")
   Gui, %NGui%: Destroy
   pBM := RegExReplace(GuiArray, ".*ID\d+=" ScrID ".*?pBM=(.*?)\|.*", "$1")
   Gdip_DisposeImage(pBM)
   GuiArray := RegExReplace(GuiArray, "ID\d+=" ScrID ".*?\|")   ; удаляем из переменной сведения о данном окне
   Return

WM_LBUTTONDOWN()
{
   WM_NCLBUTTONDOWN := 0xA1, HTCAPTION := 2
   PostMessage, WM_NCLBUTTONDOWN, HTCAPTION
}

WM_LBUTTONDBLCLK()
{
   global ID, GuiArray

   SRCCOPY := 0x00CC0020, CAPTUREBLT := 0x40000000, WS_EX_LAYERED := 0x80000

   if A_Gui >= 2
   {
      Gui, %A_Gui%: Destroy
      pBM := RegExReplace(GuiArray, ".*ID" A_Gui "=.*?pBM=(.*?)\|.*", "$1")
      Now := RegExReplace(GuiArray, ".*ID" A_Gui "=.*?Now=(\d+).*", "$1")
      Gdip_SaveBitmapToFile(pBM, A_Desktop "\" Now ".png")
      Gdip_DisposeImage(pBM)
      GuiArray := RegExReplace(GuiArray, "ID" A_Gui "=.*?\|")   ; удаляем из переменной сведения о данном окне
      Return
   }

   While InStr(GuiArray, "ID" (i := A_Index + 1) "=")
      Continue
   
   if i > 99
   {
      MsgBox, 48, Слишком много окон, Превышено допустимое количество окон в скрипте (99)!
      Return
   }

   WinGetPos, X, Y, W, H, ahk_id %ID%
   Gui, 1: Hide

   Gui, %i%: -Caption +E%WS_EX_LAYERED% +LastFound +AlwaysOnTop +ToolWindow +Owner
   WinGet, ID%i%
   Gui, %i%: Show, NA, ScreenShot

   pBitmap := BitmapFromScreen(X "|" Y "|" W "|" H, CAPTUREBLT|SRCCOPY)

   hbm := CreateDIBSection(W, H)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromHDC(hdc)
   Gdip_DrawImage(G, pBitmap, 0, 0, W, H, 0, 0, W, H)
   Gui, Show

   UpdateLayeredWindow(ID%i%, hdc, X, Y, W, H)
   WinActivate, % "ahk_id " ID%i%

   GuiArray .= "ID" i "=" ID%i% ",Now=" A_Now ",pBM=" pBitmap "|"   ; добавляем в переменную сведения о данном окне

   SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc), Gdip_DeleteGraphics(G)

   SetWinDelay, 10
   Loop 10
      WinMove, % "ahk_id " ID%i%,, X+A_Index, Y-A_Index
}

BitmapFromScreen(Coords, Raster="")      ; в аналогичной функции tic'а — баг, пишу свою
{
   StringSplit, S, Coords, |
   x := S1, y := S2, w := S3, h := S4

   chdc := CreateCompatibleDC(), hbm := CreateDIBSection(w, h, chdc)
   obm := SelectObject(chdc, hbm), hhdc := GetDC()
   BitBlt(chdc, 0, 0, w, h, hhdc, x, y, Raster)
   ReleaseDC(hhdc)

   pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm)
   SelectObject(chdc, obm), DeleteObject(hbm), DeleteDC(hhdc), DeleteDC(chdc)
   return pBitmap
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

130 (изменено: pant-79, 2011-01-28 15:29:10)

Re: AHK: Сохранить маленький произвольный кусок экрана

Да, ядро получилось шикарное. Осталось только рюшечками обвешать.

Понял я в этом коде процентов 90. Непонятки, опять же, с особенностями  этих многослойных окон.
Ну ничего, разберемся.
Во всяком случае, прикрутить сюда сохранение и считывание настроек, контекстное меню на окна, клавиатурные комбинации труда не составит.
Настройки и хелп попробую запихнуть в одно окно, чтоб удобнее пользоваться было.
Насколько я правильно понял из примеров по gdip, туда даже инструменты "маркер" и "карандаш" присобачить можно. Это вдохновляет на подвиги.
Конечно, полоска по краю окна напрягает. Как бы заменяющую ее функцию присобачить, ума не приложу.
А guidropfiles такие окна поддерживают?

131

Re: AHK: Сохранить маленький произвольный кусок экрана

Ну, это не то, чтобы ядро, это просто пример, как можно реализовать твою идею с множественными окнами скриншотов через GDI+, избежав ограничений встроенных команд AHK. За ядро лучше брать предыдущий, более юзабельный вариант, там и полосок нет. Полоски возникают при добавлении стиля +Resize, в том скрипте его нет, а алгоритм изменения размеров организован через горячую клавишу LButton, которая включается при приближении курсора к границам окна, а при удалении отключается.

pant-79 пишет:

А guidropfiles такие окна поддерживают?

GuiDropFiles не пробовал, но думаю, что да.

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

132

Re: AHK: Сохранить маленький произвольный кусок экрана

teadrinker пишет:

За ядро лучше брать предыдущий, более юзабельный вариант, там и полосок нет. Полоски возникают при добавлении стиля +Resize, в том скрипте его нет, а алгоритм изменения размеров организован через горячую клавишу LButton, которая включается при приближении курсора к границам окна, а при удалении отключается.

Это я все знаю. Я его, по-моему, и брал за основу своей версии скрипта, которую ты обругал. Но в последнем коде это все как-то короче и изящнее.
Я считаю, что чем короче код, тем лучше, хоть и не добился пока в этом деле таких результатов, как ты. Так что встает вопрос - что проще: Или прикрутить все это дело к новому ядру, или улучшать старое? Я пока затрудняюсь заценить, что лучше...

133

Re: AHK: Сохранить маленький произвольный кусок экрана

pant-79 пишет:

которую ты обругал

Я не обругал, а просто указал на недостатки.

pant-79 пишет:

Я считаю, что чем короче код, тем лучше

Да, но не за счёт функциональности!

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

134

Re: AHK: Сохранить маленький произвольный кусок экрана

Ну, судя по такому примеру, как раз у таких окон функционал-то и выше. Я просто в шоке был, когда это увидел.
Разве ТАКОЕ можно сотворить с обычным окном?

135

Re: AHK: Сохранить маленький произвольный кусок экрана

pant-79 пишет:

Ну, судя по такому примеру, как раз у таких окон функционал-то и выше.

Только в том, что касается графических эффектов, обычные контролы в них нормально работать не будут, и размер такого окна мышью не изменишь.

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

136

Re: AHK: Сохранить маленький произвольный кусок экрана

То есть, на них нельзя прикрутить ни метки по наведению курсора, ни горячие клавиши?

137

Re: AHK: Сохранить маленький произвольный кусок экрана

В смысле, "на них прикрутить"? В такое окно можно добавить +Resize, и курсор при наведении на границу будет модифицироваться, но изменение размера нужно будет организовывать, как при вращении колеса мыши, с пересчётом изображения. Пока не пробовал, но теоретически возможно.

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

138

Re: AHK: Сохранить маленький произвольный кусок экрана

Ну, я вижу решение проблемы в модификации данной функции

SetCursor(pShape, pCtrl="") { 
   return SetCursor_(pShape, pCtrl, 0, 0) 
} 

SetCursor_(wparam, lparam, msg, hwnd) { 
   static WM_SETCURSOR := 0x20, WM_MOUSEMOVE := 0x200 
   static APPSTARTING := 32650,HAND := 32649 ,ARROW := 32512,CROSS := 32515 ,IBEAM := 32513 ,NO := 32648 ,SIZE := 32640 ,SIZEALL := 32646 ,SIZENESW := 32643 ,SIZENS := 32645 ,SIZENWSE := 32642 ,SIZEWE := 32644 ,UPARROW := 32516 ,WAIT := 32514 
   static SIZEWE_BIG := 32653, SIZEALL_BIG := 32654, SIZEN_BIG := 32655, SIZES_BIG := 32656, SIZEW_BIG := 32657, SIZEE_BIG := 32658, SIZENW_BIG := 32659, SIZENE_BIG := 32660, SIZESW_BIG := 32661, SIZESE_BIG := 32662
   static hover, curOld=32512, cursor, ctrls="`n", init 

   if !init
      init := 1, OnMessage(WM_SETCURSOR, "SetCursor_"),  OnMessage(WM_MOUSEMOVE, "SetCursor_") 

   if A_Gui = 
   { 
      if wparam is not Integer 
            If InStr( wparam, ".cur" ) || InStr( wparam, ".ani" ) {   ;LoadCursorFromFile 
                 IfNotExist, % WPARAM  ; verify existance 
                    return 
                 cursor := DllCall("LoadCursorFromFile", "Str", WPARAM) 
            } 
            Else cursor := DllCall("LoadCursor", "Uint", 0, "Int", %WPARAM%, "Uint") 

      if lparam = 
            curOld := cursor 
      else  ctrls .= lparam "=" cursor "`n" 
   } 

   If (msg = WM_SETCURSOR) 
      ifEqual, hover, 1,   return 1 

   if (msg = WM_MOUSEMOVE) 
   { 
      MouseGetPos, ,,,c 
      If j := InStr(ctrls, "`n" c "=") 
      { 
         hover := true, 
         j += 2+StrLen(c) 
         j := SubStr(ctrls, j, InStr(ctrls, "`n", 0, j)-j+1) 
         DllCall("SetCursor", "uint",j) 
      } 
      else DllCall("SetCursor", "uint", curOld), hover := "" 
   } 
    
}

под свои нужды.
Но функции - мое слабое место. Как это правильно модифицировать?

139

Re: AHK: Сохранить маленький произвольный кусок экрана

Не совсем понял, какой именно проблемы, и чего бы ты хотел добиться от данной функции.

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

140 (изменено: pant-79, 2011-02-01 15:46:05)

Re: AHK: Сохранить маленький произвольный кусок экрана

Ну, чтобы она срабатывала не над конкретным контролом, а над конкретными координатами окна.
А дальше уже метку на ресайзинг прописать - не проблема.

141

Re: AHK: Сохранить маленький произвольный кусок экрана

А ты этот пост внимательно читал? Вообще, о каком окне идёт речь? Об окне скриншота, или о главном?

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

142

Re: AHK: Сохранить маленький произвольный кусок экрана

Внимательно. Просто получается, что добавление к такому окну опции +resize мало что дает.
Только и дает эту уродскую полоску по краю. А дальше все равно приходится самому код под ресайзинг писать.
То бишь, в данном случае от этой опции пользы, как от козла молока.
Потому и не думал на ней заморачиваться...

Ты, кстати, эту самую gdip.ahk хорошо знаешь?
Попробовал в ней разобраться, мать честная! Там 125 функций, из которых только на 60 есть более менее внятные описания. Причем, из-за незнания английского языка и двухсмысленности терминов, половину этих описаний довольно трудно понять. Гугловский переводчик такой бред выдает

143

Re: AHK: Сохранить маленький произвольный кусок экрана

pant-79 пишет:

Только и дает эту уродскую полоску по краю. ... Потому и не думал на ней заморачиваться...

А напрасно. Как раз у слоёных окон полоски не возникает, а курсор модифицируется.

pant-79 пишет:

Причем, из-за незнания английского языка...

Ну, эта проблема, как показывает опыт, решаема! Если нужно что-то конкретное, спрашивай, попытаюсь помочь. Но я, конечно, пока пользовался далеко не всеми из этих функций.

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

144

Re: AHK: Сохранить маленький произвольный кусок экрана

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

+E%WS_EX_LAYERED%

полоску видно не будет. На практике она осталась.
Так что расшифруй, что ты имел в виду.

А насчет функций gdip это слишком большой объем вопросов, чтобы его в этой теме обсуждать.
Я лучше тогда новую тему заведу...

145

Re: AHK: Сохранить маленький произвольный кусок экрана

pant-79 пишет:

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

Да, действительно. А я проэкспериментировал с окном скриншота, добавив к нему +Resize. Оно появляется после вызова UpdateLayeredWindow() (т. е. после применения к нему конкретной битовой карты) без полоски. Если вопрос касается главного окна, то ведь проблема модификации курсора решена в моём скрипте, зачем ещё что-то придумывать?

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

146

Re: AHK: Сохранить маленький произвольный кусок экрана

teadrinker пишет:

Если вопрос касается главного окна, то ведь проблема модификации курсора решена в моём скрипте, зачем ещё что-то придумывать?

Да, по ходу придется на этом остановиться. Но именно в плане главного окна. Но со скриншотами все-таки лучше многослойные рулят.

147

Re: AHK: Сохранить маленький произвольный кусок экрана

Тогда их ресайзинг традиционным способом (растягиванием за активные точки) не имеет смысла, ведь должны сохраняться пропорции окна. И уже есть изменение размеров вращением колеса мыши.

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

148

Re: AHK: Сохранить маленький произвольный кусок экрана

Именно, что не имеет. Так что надо делать золотую середину из двух версий.

Так вот, хотел завести тему про gdi+, в которой все вопросы хотел сгруппировать в таблице. Но то ли форум не поддерживает таблицы в сообщениях, то ли я что-то неправильно сделал, но опубликовать таблицу не получилось.
Поэтому выкладываю ее в таком виде.
Посмотри, как это можно оформить в отдельную тему, чтоб нормально выглядело.

149

Re: AHK: Сохранить маленький произвольный кусок экрана

Я думаю, что проще всего создать тему "Вопросы по GDI+". Просто перевод описания функций не внесёт полной ясности, нужны примеры использования. Но писать скрипты под все функции — работа довольно трудоёмкая, поэтому отталкиваться нужно от конкретно поставленных задач: как сделать то-то и то-то. А насчёт переводов — я считаю, что они нужны только для начинающих, а тема GDI+ уже для "продвинутых" скриптописателей, которым неплохо бы и знать язык на техническом уровне.

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

150

Re: AHK: Сохранить маленький произвольный кусок экрана

Значит, я не настолько продвинутый, чтобы однозначно понимать значение понятий "объект RectF", "объект PointF", "матрица" и т.п., а также однозначно видеть разницу между "Graphics", "Bitmap" и "Region".
А раз я их не понимаю, то и не знаю, где их необходимо применять, а где они не нужны.
А ведь еще надо знать, какие функции требуют для своей работы предварительного вызова других функций.
Я, конечно, могу понять, что перед вызовом любой функции желательно сначала вызвать gdip_Startup(), а после завершения работы с любой функцией желательно вызвать Gdip_Shutdown(pToken)
То есть минимум для вызова любой функции должен выглядеть приблизительно так:

gdip_Startup()
КакаяТоФункцияgdip()
Gdip_Shutdown(pToken)

а это уже какая никакая а структура.
Ясно как день, что общая структура гораздо сложнее.
Уже можно предположить, что для вызова какой-нибудь Gdip_DrawRectangle(pGraphics, pPen, x, y, w, h)
надо еще сначала вызвать SelectObject(hdc, hgdiobj), чтобы эта самая pPen появилась.
Но это, опять же, только предположения.
А без точного знания структуры программирование невозможно.
С классическим АНК все было гораздо проще - была (и есть) великая страница Command List, в которой все систематизировано и разложено по полочкам. Там все удобно именно из-за ее табличного вида. Очень хорошо было бы иметь аналог для gdip. Иначе получится, что человек вроде бы правильно вызывает функцию и указывает все параметры, но все равно бьется лбом об стену.
Так что, наверное, следовало бы завести тему "Структура gdip", чтобы не только продвинутые кодеры могли эффективно ее использовать...

151

Re: AHK: Сохранить маленький произвольный кусок экрана

Ну, я ведь тоже не родился с этим знанием! Начнём с того, что даже не понимая структуры GDI+, можно сообразить, как решить большинство задач, всего лишь изучив логику использования функций в приведённых примерах (собственно, с чего я и начинал). Всё же, значение базовых понятий (bitmap, graphics, device context, brush и т. п.) неплохо бы усвоить. В этом вполне может помочь Google, а иногда и Википедия. Иногда значение термина становится интуитивно понятным в результате анализа примеров его применения. Что касается структуры GDI+, то перевод статей на эту тему присутствует в русском разделе MSDN. Вряд ли есть смысл переносить это всё сюда, да и кто за это возьмётся (ещё и предварительно адаптировав к AHK)? Тема слишком обширна. Поэтому разбор примеров — единственный реально возможный вариант в данном случае, как мне кажется.

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

152

Re: AHK: Сохранить маленький произвольный кусок экрана

teadrinker пишет:

перевод статей на эту тему присутствует в русском разделе MSDN.

Да, посмотрел на эту жесть. Свихнуться можно. Действительно, работа для профессиональных программеров.
Остается только благодарить tic'а за перевод этого добра на АНК.

P.S. Как оказалось, проще перенести многослойные окна в твой последний вариант (хотя, что меня удивляет? Это естественно.)
Единственное, что смущает в том варианте - обилие всяческих окон. Зачем было так мудрить?
Нельзя было все настройки поместить в одно окно? С вкладками, например...
Я, конечно, впадаю в критику, мол, множат тут сущности без необходимости, но я и сам такое окно могу сварганить, если мне никто возражать не будет.

153

Re: AHK: Сохранить маленький произвольный кусок экрана

pant-79 пишет:

Единственное, что смущает в том варианте - обилие всяческих окон. Зачем было так мудрить?

Обилие — это два? Пойми простую вещь: удобно должно быть не программисту, а конечному пользователю (под которого, кстати, я её и делал). Окно с настройками jpg вызывается именно тогда, когда оно может понадобиться, а именно после установки данного типа файла для вывода. В остальных случаях эта информация будет просто лишней. Объединять же help с установками тоже не вижу смысла. Help может понадобиться один-два раза, а выскакивать будет постоянно? В общем, портить ничего не надо, я хотел, чтобы программка эта была не только удобной, но и красивой, в меру моего понимания. А ты — "сварганить"!

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

154

Re: AHK: Сохранить маленький произвольный кусок экрана

Ну да. У каждого мера понимания своя.
По мне, так запихнуть все это во вкладки одного окна, а потом уже из меню главного окна запускать данную конкретную вкладку окна настроек.
На вкус и цвет товарищей нет

Кстати, не 2, а 4. Для меня это уже обилие...

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

155

Re: AHK: Сохранить маленький произвольный кусок экрана

Я к этой идее отношусь несколько настороженно. Вот смотри: ты берёшь достаточно большой мой код и пытаешься его "модернизировать", при этом постоянно признаваясь в том, что знаний пока у тебя для этого не хватает. Боюсь, на выходе получится простыня кода с кучей ошибок и нестыковок, исправить которые ты предоставишь... кому? "Пользователям", или мне?

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

156 (изменено: pant-79, 2011-02-04 00:46:02)

Re: AHK: Сохранить маленький произвольный кусок экрана

Дык, я ж не в коллекцию выкладывать буду, а сюда.
Есть же разница.
Одно могу сказать точно - ты первый это увидишь и сможешь раскритиковать как и предыдущую версию.

157

Re: AHK: Сохранить маленький произвольный кусок экрана

Первый вопрос по скрипту:

В оригинальной функции tic'а  Gdip_SetBitmapToClipboard присутствует строка

DllCall("DeleteObject", "uint", hBitmap)

В твоей версии скрипта в аналогичной функции этой строки нету.
Это сделано намеренно? И если да, то для чего?

158

Re: AHK: Сохранить маленький произвольный кусок экрана

Здесь у tic'а всё правильно, ошибка у меня, в следующей версии поправлю.

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

159

Re: AHK: Сохранить маленький произвольный кусок экрана

Кстати, баг у tic'а, о котором я писал в коде из поста #129, в последней версии его скрипта исправлен.

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

160 (изменено: Bobby, 2012-04-14 12:10:57)

Re: AHK: Сохранить маленький произвольный кусок экрана

А как убрать желтое окно после снятия скриншота,  не выходя из программы? Скрипт из 16 поста. Добавлено только первые 3 строки.

teadrinker пишет:

А так работает? Требует gdiplus.dll

    
Gosub SCREEN22
Send, {PRINTSCREEN}
SCREEN22:
WM_LBUTTONDOWN = 0x201
    WM_NCLBUTTONDOWN = 0xA1

    DetectHiddenWindows, On
    Gui, +LastFound +Resize -Caption +AlwaysOnTop +Owner
    ID := WinExist()
    WinSet, Transparent, 130
    Gui, Color, Yellow
    Gui, Show, h100 w100
    OnMessage(WM_LBUTTONDOWN, "GuiMove")
    Return

Esc::
GuiClose:
    ExitApp

PrintScreen::
    WinGetPos, X, Y, W, H, ahk_id %ID%
    Gui, Hide
    Gui, 2:-Caption +LastFound
    Gui, 2:Show, x%X% y%Y% w%W% h%H% hide
    WinActivate
    Send, !{PrintScreen}
    Gui, 2:Destroy
    Gui, Show
    Convert("", A_Hour "." A_Min "." A_Sec ".bmp")
    Convert("", A_Hour "." A_Min "." A_Sec ".jpg")
    Return

GuiMove()
{
    global
    PostMessage, WM_NCLBUTTONDOWN, 2
}

Convert(sFileFr = "", sFileTo = "")
{
   If   sFileTo  =
      sFileTo := A_ScriptDir . "\screen.bmp"
   SplitPath, sFileTo, , sDirTo, sExtTo, sNameTo

   If Not   hGdiPlus := DllCall("LoadLibrary", "str", "gdiplus.dll")
      Return   sFileFr+0 ? SaveHBITMAPToFile(sFileFr, sDirTo . "\" . sNameTo . ".bmp") : ""
   VarSetCapacity(si, 16, 0), si := Chr(1)
   DllCall("gdiplus\GdiplusStartup", "UintP", pToken, "Uint", &si, "Uint", 0)

   If   !sFileFr
   {
      DllCall("OpenClipboard", "Uint", 0)
      If    DllCall("IsClipboardFormatAvailable", "Uint", 2) && (hBM:=DllCall("GetClipboardData", "Uint", 2)) {
         DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "Uint", hBM, "Uint", 0, "UintP", pImage)
      }
      DllCall("CloseClipboard")
   }
   Else If   (sFileFr Is Integer) {
      DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "Uint", sFileFr, "Uint", 0, "UintP", pImage)
   }
   Else {
      DllCall("gdiplus\GdipLoadImageFromFile", "Uint", Unicode4Ansi(wFileFr,sFileFr), "UintP", pImage)
   }

   DllCall("gdiplus\GdipGetImageEncodersSize", "UintP", nCount, "UintP", nSize)
   VarSetCapacity(ci, nSize)
   DllCall("gdiplus\GdipGetImageEncoders", "Uint", nCount, "Uint", nSize, "Uint", &ci)
   Loop,   %nCount%
   {
      If   !InStr(Ansi4Unicode(NumGet(ci, 76 * (A_Index - 1) + 44)), "." . sExtTo)
         Continue
      pCodec := &ci + 76 * (A_Index - 1)
         Break
   }

   If   pImage
      pCodec   ? DllCall("gdiplus\GdipSaveImageToFile", "Uint", pImage, "Uint", Unicode4Ansi(wFileTo,sFileTo), "Uint", pCodec, "Uint", 0) : DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", "Uint", pImage, "UintP", hBitmap, "Uint", 0) . SetClipboardData(hBitmap), DllCall("gdiplus\GdipDisposeImage", "Uint", pImage)

   DllCall("gdiplus\GdiplusShutdown" , "Uint", pToken)
   DllCall("FreeLibrary", "Uint", hGdiPlus)
}

SaveHBITMAPToFile(hBitmap, sFile)
{
   DllCall("GetObject", "Uint", hBitmap, "int", VarSetCapacity(oi,84,0), "Uint", &oi)
   hFile:=   DllCall("CreateFile", "Uint", &sFile, "Uint", 0x40000000, "Uint", 0, "Uint", 0, "Uint", 2, "Uint", 0, "Uint", 0)
   DllCall("WriteFile", "Uint", hFile, "int64P", 0x4D42|14+40+NumGet(oi,44)<<16, "Uint", 6, "UintP", 0, "Uint", 0)
   DllCall("WriteFile", "Uint", hFile, "int64P", 54<<32, "Uint", 8, "UintP", 0, "Uint", 0)
   DllCall("WriteFile", "Uint", hFile, "Uint", &oi+24, "Uint", 40, "UintP", 0, "Uint", 0)
   DllCall("WriteFile", "Uint", hFile, "Uint", NumGet(oi,20), "Uint", NumGet(oi,44), "UintP", 0, "Uint", 0)
   DllCall("CloseHandle", "Uint", hFile)
}

Unicode4Ansi(ByRef wString, sString)
{
   nSize := DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", 0, "int", 0)
   VarSetCapacity(wString, nSize * 2)
   DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", &wString, "int", nSize)
   Return   &wString
}

Ansi4Unicode(pString)
{
   nSize := DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "Uint", 0, "int",  0, "Uint", 0, "Uint", 0)
   VarSetCapacity(sString, nSize)
   DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "str", sString, "int", nSize, "Uint", 0, "Uint", 0)
   Return   sString
}

SetClipboardData(hBitmap)
{
   DllCall("GetObject", "Uint", hBitmap, "int", VarSetCapacity(oi,84,0), "Uint", &oi)
   hDIB :=   DllCall("GlobalAlloc", "Uint", 2, "Uint", 40+NumGet(oi,44))
   pDIB :=   DllCall("GlobalLock", "Uint", hDIB)
   DllCall("RtlMoveMemory", "Uint", pDIB, "Uint", &oi+24, "Uint", 40)
   DllCall("RtlMoveMemory", "Uint", pDIB+40, "Uint", NumGet(oi,20), "Uint", NumGet(oi,44))
   DllCall("GlobalUnlock", "Uint", hDIB)
   DllCall("DeleteObject", "Uint", hBitmap)
   DllCall("OpenClipboard", "Uint", 0)
   DllCall("EmptyClipboard")
   DllCall("SetClipboardData", "Uint", 8, "Uint", hDIB)
   DllCall("CloseClipboard")
}

161

Re: AHK: Сохранить маленький произвольный кусок экрана

Pause::
   If IsEnable:=!IsEnable
      Gui, Destroy
   Else Goto, SCREEN22
   Return

162

Re: AHK: Сохранить маленький произвольный кусок экрана

И чуть изменить хоткей PrintScreen, чтобы можно было пользоваться этой клавишей, когда GUI нет.

$PrintScreen::
   If IsEnable
   {
      Send, {PrintScreen Down}
      KeyWait, PrintScreen
      Send, {PrintScreen Up}
   }
   Else
   {
      WinGetPos, X, Y, W, H, ahk_id %ID%
      Gui, Hide
      Gui, 2:-Caption +LastFound
      Gui, 2:Show, x%X% y%Y% w%W% h%H% hide
      WinActivate
      Send, !{PrintScreen}
      Gui, 2:Destroy
      Gui, Show
      Convert("", A_Hour "." A_Min "." A_Sec ".bmp")
      Convert("", A_Hour "." A_Min "." A_Sec ".jpg")
   }
   Return

163

Re: AHK: Сохранить маленький произвольный кусок экрана

Grey пишет:
Pause::
   If IsEnable:=!IsEnable
      Gui, Destroy
   Else Goto, SCREEN22
   Return

Горячая клавиша хорошо, но надо без нее удалить желтое окно.

164

Re: AHK: Сохранить маленький произвольный кусок экрана

Ну тогда как-то так:

PrintScreen::
   If IsEnable:=!IsEnable
   {
      WinGetPos, X, Y, W, H, ahk_id %ID%
      Gui, Hide
      Gui, 2:-Caption +LastFound
      Gui, 2:Show, x%X% y%Y% w%W% h%H% hide
      WinActivate
      Send, !{PrintScreen}
      Gui, 2:Destroy
      Gui, Destroy
      Convert("", A_Hour "." A_Min "." A_Sec ".bmp")
      Convert("", A_Hour "." A_Min "." A_Sec ".jpg")
   }
   Else Goto, SCREEN22
   Return

165 (изменено: Bobby, 2012-04-15 09:00:02)

Re: AHK: Сохранить маленький произвольный кусок экрана

Спасибо! Сработало!

166

Re: AHK: Сохранить маленький произвольный кусок экрана

Как запустить данный скрипт для снятия скриншотов в скрытом режиме с сохранением их в папку, которая будет иметь имя в качестве даты, а имя файла в качестве времени?

167

Re: AHK: Сохранить маленький произвольный кусок экрана

teadrinker,
расскажите, пожалуйста: как работает функция CaptureCursor()? её 2-ой и 3-ьий аргументы - что это?
Я пытаюсь в свой простенький скриншоттер приделать возможность отрисовки и курсора, но не получается.
В описании скрипта упоминается "модифицированный курсор мыши" - что это? почему он модифицированный?

168 (изменено: serzh82saratov, 2013-05-05 03:46:24)

Re: AHK: Сохранить маленький произвольный кусок экрана

Адаптировал в такой код, для снимка активного окна, фактически просто указанных координат:



 ; Автор базового кода- teadrinker
 ; http://forum.script-coding.com/viewtopic.php?pid=44439#p44439 
 ; Снимок активного окна

PrintScreen:: ScreenshootWinA()
 
ScreenshootWinA()
{ 
    WinGetPos, X, Y, W, H, A 
    If !pToken := Gdip_Startup()
        Throw "Ошибка GDI+!  Убедитесь в наличии gdiplus.dll в вашей системе!"
    chdc := CreateCompatibleDC(), hbm := CreateDIBSection(w, h, chdc)
    obm := SelectObject(chdc, hbm), hhdc := GetDC()
    BitBlt(chdc, 0, 0, w, h, hhdc, x, y,  0x40000000|0x00CC0020)
    ReleaseDC(hhdc) , FileName := A_Desktop "\" A_Now ".png"
    pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm) 
    SelectObject(chdc, obm), DeleteObject(hbm), DeleteDC(hhdc), DeleteDC(chdc)  
    Gdip_SaveBitmapToFile(pBitmap, FileName), Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)
    
    ; Далее необязательная часть
    
    Gui, +LastFound +ToolWindow -Caption +AlwaysOnTop 
    Gui, Color, 354EA3
    Gui, Show, x%X% y%Y% w%W% h%H% NA 
    WinSet, Transparent, 130 
    Sleep 444
    Gui,  Hide
    Run  % "Edit " FileName
}

прозрачное окошко оставил для визуализации действия.

Собствено вопрос: насколько правильно я адаптировал, не забыл ли что-то указать для очистки памяти, нет ли вызова лишних функций?
Gdip - тяжёлый случай для дилетанта.

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

169 (изменено: Bobby, 2013-05-16 10:18:18)

Re: AHK: Сохранить маленький произвольный кусок экрана

teadrinker На 32-разрядном процессоре твой скрипт из 16 поста работает отлично. А вот на 64-разрядном что-то не работает. Что надо  в скрипте изменить?

170

Re: AHK: Сохранить маленький произвольный кусок экрана

Bobby, работать будет на любом процессоре, но пока адаптировано только под 32-битную версию AHK, сам пока пользуюсь этим скриптом в таком виде на 64 процессоре, пока доделать просто руки не дошли.

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

171 (изменено: Mikki, 2013-05-20 20:02:09)

Re: AHK: Сохранить маленький произвольный кусок экрана

Я так понимаю, что скриншот неактивного(закрытого другими, свернутого) окна снять не возможно?

add: это я про то, чтобы сидеть в текстовом редакторе, а внизу, в углу, чтоб мне показывало маааленькое окно передающее прогресс другой программы рисующей график.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

172

Re: AHK: Сохранить маленький произвольный кусок экрана

Почему, вроде возможно, если окно не свернуто. Нашу попозже, если до меня никто не успеет.

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

173 (изменено: Bobby, 2013-05-22 08:42:32)

Re: AHK: Сохранить маленький произвольный кусок экрана

teadrinker пишет:

Bobby, работать будет на любом процессоре, но пока адаптировано только под 32-битную версию AHK, сам пока пользуюсь этим скриптом в таком виде на 64 процессоре, пока доделать просто руки не дошли.

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

174

Re: AHK: Сохранить маленький произвольный кусок экрана

Mikki пишет:

Я так понимаю, что скриншот неактивного(закрытого другими, свернутого) окна снять не возможно?

add: это я про то, чтобы сидеть в текстовом редакторе, а внизу, в углу, чтоб мне показывало маааленькое окно передающее прогресс другой программы рисующей график.

Скриншот свернутого окна точно невозможен.

175 (изменено: Mikki, 2013-05-28 15:06:14)

Re: AHK: Сохранить маленький произвольный кусок экрана

Пытался сам сделать....Вот как получилось ))))
edit: 3-й раз редактирую

#NoEnv
#Singleinstance force
SetTitleMatchMode 2

If !pToken := Gdip_Startup()
   {
      MsgBox, 48, Ошибка GDI+!
         , Убедитесь в наличии gdiplus.dll в вашей системе!
      ExitApp
   }

   SetBatchLines, -1
   OnExit, Exit
   
   exe_Name:="Ipc2000.exe"

   WS_EX_LAYERED = 0x80000
   Gui, 2: -Caption +E%WS_EX_LAYERED%  +ToolWindow  hwndID2  +AlwaysOnTop 
   Gui, 2: Show, NA, ScreenShot
   WinMove, ahk_id %ID2%,, 20, 500
   WinGet, ID,, ahk_exe%exe_Name% 
   SetTimer, ggg, 800
Return

2GuiEscape:
GuiEscape:
Exit:
   if pBitmap
      Gdip_DisposeImage(pBitmap)
   Gdip_Shutdown(pToken)
   ExitApp


ggg:

   SRCCOPY := 0x00CC0020, CAPTUREBLT := 0x40000000
   WinGetPos, X, Y, W, H, ahk_id%ID%
   if pBitmap
      Gdip_DisposeImage(pBitmap)
   hdc1 := CreateCompatibleDC(), hbm1 := CreateDIBSection(w, h, hdc1)
   obm1 := SelectObject(hdc1, hbm1), hhdc1 := GetDC(ID)
   ;BitBlt(hdc1, 0, 0, w, h, hhdc1, x, y, CAPTUREBLT|SRCCOPY)
   PrintWindow(ID, hdc1, Flags=1) 
   ReleaseDC(hhdc1)

   pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm1)
   SelectObject(hdc1, obm1), DeleteObject(hbm1), DeleteDC(hhdc1), DeleteDC(hdc1)

   hbm := CreateDIBSection(W, H)
   hdc := CreateCompatibleDC()
   obm := SelectObject(hdc, hbm)
   G := Gdip_GraphicsFromHDC(hdc)

   Gdip_DrawImage(G, pBitmap, 0, 0, 280, 200, 0, 0, W, H)
   WinGetPos,xx,yy,,, ahk_id%ID2%
   UpdateLayeredWindow(ID2, hdc, xx, yy, 280, 200)
   SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc), Gdip_DeleteGraphics(G)
return


...ммммда, но облом: когда целевое окно в режиме регистрации графика - скрипт не изменяет содержимое окна пока я не изменю что-либо в целевом окне...

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

176

Re: AHK: Сохранить маленький произвольный кусок экрана

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

177

Re: AHK: Сохранить маленький произвольный кусок экрана

http://forum.script-coding.com/viewtopi … 888#p71888 это чем неподходит?

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

178

Re: AHK: Сохранить маленький произвольный кусок экрана

у меня почему то при запуске выдает ошибку и указывает на эту строку

    If !pToken := Gdip_Startup()

179

Re: AHK: Сохранить маленький произвольный кусок экрана

Наверное потому, что нет библиотеки Gdip...

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

180

Re: AHK: Сохранить маленький произвольный кусок экрана

gdiplus.dll есть в виндовских папках, скопировал в папку с autohotkey тоже самое выдает

181

Re: AHK: Сохранить маленький произвольный кусок экрана

Gdip.ahk

Post's attachments

Gdip.ahk 86.71 kb, 22 downloads since 2013-06-19 

You don't have the permssions to download the attachments of this post.
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

182

Re: AHK: Сохранить маленький произвольный кусок экрана

Положить в: C:\Program Files\AutoHotkey\Lib

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

183

Re: AHK: Сохранить маленький произвольный кусок экрана

спасибо, все запустилось.но теперь новая ошибка
failed attempt to launch programm or document
и указывает на  строку

Run  % "Edit " FileName

184

Re: AHK: Сохранить маленький произвольный кусок экрана

; Далее необязательная часть

Вам ни о чём неговорит?
В моём варианте, сделанный скриншот сразу открывается в редакторе. У вас нет связанного редактора, удалите эту строку. Оно на фотографирование невлияет! Если проявить ещё немного фантазии, то можно удалить и этот кусок:


    
    ; Далее необязательная часть
    
    Gui, +LastFound +ToolWindow -Caption +AlwaysOnTop 
    Gui, Color, 354EA3
    Gui, Show, x%X% y%Y% w%W% h%H% NA 
    WinSet, Transparent, 130 
    Sleep 444
    Gui,  Hide
    Run  % "Edit " FileName

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

185

Re: AHK: Сохранить маленький произвольный кусок экрана

необязательную часть удалил, скрипт стал выполнятся до конца
но в буфере обмена ничего нет, и в paint кнопка вставки неактивна.
и файл в этой папке  ReleaseDC(hhdc) , FileName := A_Desktop "\" A_Now ".png"   не появляется.

186

Re: AHK: Сохранить маленький произвольный кусок экрана

но в буфере обмена ничего нет

Про буфер обмена тут никто неговорил.

и в paint кнопка вставки неактивна.

Вы о чём вообще???

и файл в этой папке  ReleaseDC(hhdc) , FileName := A_Desktop "\" A_Now ".png"   не появляется

Папки с именем\путём:

ReleaseDC(hhdc) , FileName := A_Desktop "\" A_Now ".png"

не может существовать в виндовс.

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

187

Re: AHK: Сохранить маленький произвольный кусок экрана

так, а куда тогда фотографируется экран, если ни файл не создается ни в буфере нет?

188

Re: AHK: Сохранить маленький произвольный кусок экрана

Файл создаётся на рабочем столе...

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

189 (изменено: composter, 2013-06-19 13:42:32)

Re: AHK: Сохранить маленький произвольный кусок экрана

ну так я и написал что

и файл в этой папке  ReleaseDC(hhdc) , FileName := A_Desktop "\" A_Now ".png"   не появляется

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

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

190

Re: AHK: Сохранить маленький произвольный кусок экрана

Ещё раз повторяю - папки с именем\путём:

ReleaseDC(hhdc) , FileName := A_Desktop "\" A_Now ".png"

не может существовать в виндовс.
Что вы имели ввиду написав эту строку в качестве пути к файлу, можете знать только вы.

я наверно не так написал изначально

Не наверно, а точно.




ScreenshootWinA()
{ 
    WinGetPos, X, Y, W, H, A 
    If !pToken := Gdip_Startup()
        Throw "Ошибка GDI+!  Убедитесь в наличии gdiplus.dll в вашей системе!"
    chdc := CreateCompatibleDC(), hbm := CreateDIBSection(w, h, chdc)
    obm := SelectObject(chdc, hbm), hhdc := GetDC()
    BitBlt(chdc, 0, 0, w, h, hhdc, x, y,  0x40000000|0x00CC0020)
    ReleaseDC(hhdc) , pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm) 
    SelectObject(chdc, obm), DeleteObject(hbm), DeleteDC(hhdc), DeleteDC(chdc)  
    Gdip_SetBitmapToClipboard(pBitmap), Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken) 
}

То что строку WinGetPos, X, Y, W, H, A надо заменить на получение нужных вам координат, я наверняка зря уточняю.

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

191

Re: AHK: Сохранить маленький произвольный кусок экрана

A_Desktop The full path and name of the folder containing the current user's desktop files.
как раз таки эта переменная означает полный путь до рабочего стола пользователя.а Вы говорите что такой паки в виндовсе не может существовать.
теперь если зайти в paint то пишет что данные из буфера обмена нельзя вставить
WinGetPos, X, Y, W, H, A  заменил на

x := 360
y := 510
w := 200
h := 200

или опять я что то не то делаю?

192

Re: AHK: Сохранить маленький произвольный кусок экрана

А как заставить это все работать без компиляции В 32 бита на 64 бит автохотки?

193

Re: AHK: Сохранить маленький произвольный кусок экрана

Все. Понял. Нужно скачать эту библиотеку под 64 бит:
http://www.autohotkey.net/~Rseding91/Gd … ip_All.ahk
Может добавить эту сноску к посту в коллекции?

194

Re: AHK: Сохранить маленький произвольный кусок экрана

Заметил, что если сохранять скриншот через меню, то пункт меню тоже сохраняется. Имею в виду последний скрипт из темы в Коллекции.

http://savepic.su/6377936m.png

195

Re: AHK: Сохранить маленький произвольный кусок экрана

Да, есть такое, надо исправить.

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

196

Re: AHK: Сохранить маленький произвольный кусок экрана

У себя пока исправил так. Идея в том, что пока меню исчезает, цвет под мышью меняется. А когда исчезло, перестаёт меняться, тут и можно фоткать.

AreaScreenshot:
    CoordMode, Pixel, Screen
    MouseGetPos, mx, my
    prev_color := 0
    Loop {
        PixelGetColor, cur_color, %mx%, %my%
        If (cur_color = prev_color)
            Break
        prev_color := cur_color
        Sleep, 30
    }
F12::                   ; Скриншот области под окном скрипта

197

Re: AHK: Сохранить маленький произвольный кусок экрана

Да я вообще обнаружил что эта версия не работает под x64.

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

198 (изменено: size222, 2024-03-27 16:56:50)

Re: AHK: Сохранить маленький произвольный кусок экрана

Привет всем с далекого 24 года. Подскажите, есть ли рабочая версия этой программы на сегодня? Или может быть что-то подобное? Интересует именно скриншот экрана в определенном месте по нажатию кнопки. На виндовс 11 запускается, всё нормально, но при нажатии F12 не делает скриншот.

199

Re: AHK: Сохранить маленький произвольный кусок экрана

size222
Исправил код в Коллекции, на Windows 10 работает, на 11 не могу проверить, но тоже должен.

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

200 (изменено: Foma, 2024-09-21 13:42:47)

Re: AHK: Сохранить маленький произвольный кусок экрана

Попробовал переделать скрипт для постоянного снятия скриншотов по таймеру. Главная идея в том, чтобы не запускать каждый раз Paint, а работать с уже открытым скрытым окном.

#Persistent
SetTitleMatchMode, 2
SetTitleMatchMode, Fast
SetBatchLines, -1
DetectHiddenWindows, on


name := 0
SetTimer,T1,5132

Return


T1:
;проверяем окно
IfWinActive,Блокнот
	{
	;делаем снимок
	Send, !{PRINTSCREEN} ; снимок активного окна (Alt + PrtSc)		
	name := name + 1
	if (name = 1)
		{
		;создаём пустой файл
		FileAppend,, D:\1.bmp
		;открываем
		Run, mspaint D:\1.bmp,, Hide
		;ждём окна
		WinWait,1.bmp
		Alt_Name := 1
		}

	;переименовываем скрытое окно Paint
	WinSetTitle,%Alt_Name%.bmp,%name%.bmp
	;команда меню "Правка" - "Вставить"
	PostMessage, 0x111, 57637,0,,%name%.bmp
	;команда меню "Файл" - "Сохранить"
	PostMessage, 0x111, 57603, 0, ,D:\%Name%.bmp
	;запоминаем старое имя
	Alt_Name := name
	}
Return

Создаётся только один файл "1.bmp" и больше ничего. Проверил по ErrorLevel - команда на вставку всего раз даёт 0, потом ErrorLevel всегда 1. Причём даже первый файл, который создаётся - пустой. Значит вставка и первый раз не прошла. Не понимаю, что я не так  с этим кодом сделал. Подскажите, пожалуйста, в чём ошибка.