1 (изменено: Indomito, 2013-10-29 09:45:32)

Тема: AHK: Вставка в буфер обмена.

В своё время я у creature.ws "утянул" этот скрипт -

+ открыть спойлер
; Windows Vista+
; AHK-L
#SingleInstance Ignore
#KeyHistory 0
#NoEnv
#NoTrayIcon
OnExit, ExitSub
DllCall("AddClipboardFormatListener", "Int", A_ScriptHwnd)
OnMessage(WM_CLIPBOARDUPDATE := 0x031D, "ClipSave")
clipHistory := []

Esc & F1::
Esc & F2::
Esc & F3::
Esc & F4::
    Clipboard := clipHistory[Index := SubStr(A_ThisHotkey,0)]
    Controlgetfocus, FClassNN, A
    SendMessage, 0x302,,,%FClassNN%, A
    SendMessage, 0x8  ,,,%FClassNN%, A
    SendMessage, 0x7  ,,,%FClassNN%, A
Return

$Esc Up::Send {Blind}{Esc}
Return

ClipSave()
{
    global
    If (clipHistory[Index] = Clipboard)
        Return
    If !newIndex := clipHistory.MaxIndex()+1
        newIndex := 1
    If (newIndex > 4)
        clipHistory.Remove(1), newIndex--
    clipHistory.Insert(newIndex, Clipboard)
    Return
}

ExitSub:
    DllCall("RemoveClipboardFormatListener", "Int", A_ScriptHwnd)
    ExitApp
Return

Немного его поправил и дополнил (исправил реализацию с очереди на дек), но возникла проблема при нажатии на Ctrl+C ,etc, т.е. все, что может запихнуть, в буфер обмена попадает на неопределённую комбинацию  - на  Esc+ F1, Esc+F2, Esc+F3 и Esc+F4.
Это можно как то победить, т.е. вставка происходила на конкретную клавишу (элемент массива)

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

2

Re: AHK: Вставка в буфер обмена.

Прочитал вопрос 3 раза, но так и не понял. Кто может запихнуть? Что всё? В чём неопределённость комбинации? В чём должна заключаться конкретность клавиши?

3

Re: AHK: Вставка в буфер обмена.

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

У меня, после переделки, задействован NumPad и массив состоит из 9-ти элементов, и надо что бы попадало туда, куда нужно не стирая то, что было ранее, если я не позволил.

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

Может быть, стоит сделать так:
Вставка в буфер     - Ctrl+NumPad1(NumPad9)
Обратное действие - Shift+NumPad1(NumPad9)
Остальное попадает в NumPad0 по Ctrl+C или иным клавишам и мышке.

Как правильно реализовать функцию Ctrl+C по Ctrl+NumPad1(NumPad9) ?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

4 (изменено: YMP, 2013-10-29 11:26:13)

Re: AHK: Вставка в буфер обмена.

Ну, очевидно, по тому же принципу, как в скрипте выше. Берётся цифра с конца A_ThisHotkey и используется как индекс массива. Комбинации с Ctrl копируют, а с Shift вставляют.

5

Re: AHK: Вставка в буфер обмена.

YMP пишет:

Ну, очевидно, по тому же принципу, как в скрипте выше. Берётся цифра с конца A_ThisHotkey и используется как индекс массива.

Спасибо, попробую, может получится.
Кстати я не очень понял конструкцию Clipboard := clipHistory[Index := SubStr(A_ThisHotkey,0)] ведь

SubStr(String, StartingPos [, Length])  Copies a substring from String starting at StartingPos and proceeding rightward to include at most Length characters... For example, 0 extracts the last character and -1 extracts the two last characters.

при нуле идёт один символ, а для F1 = 0xB, F1 = 0xC, етс, как они связаны с индексом? Когда же я просто заменил  на NumPad скан-коды, из-за их двойных виртуальных кодов, то всё перестало работать.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

6

Re: AHK: Вставка в буфер обмена.

Там отрезается последний символ от названия хоткея, т.е. 1 от F1, 2 от F2 и т.д. Так получаются индексы от 1 до 4.

7 (изменено: Indomito, 2013-10-29 12:05:17)

Re: AHK: Вставка в буфер обмена.

И еще Ctrl-C вставляет в буфер обмена выделенный текст, а какая функция в AHK это реализует?

YMP пишет:

Там отрезается последний символ от названия хоткея, т.е. 1 от F1, 2 от F2 и т.д. Так получаются индексы от 1 до 4.

с NumPad такой "фокус" не пройдёт - надо будет исправить.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

8

Re: AHK: Вставка в буфер обмена.

Вставку в буфер обмена реализует приложение, в окно которого вы посылаете Ctrl-C. Про функцию АНК не понял. Что имеется в виду?

Почему фокус не пройдёт? Там же тоже цифра на конце.

9

Re: AHK: Вставка в буфер обмена.

YMP пишет:

Про функцию АНК не понял. Что имеется в виду?

т.е. если есть выделенный текст и я нажимаю Ctrl-Num1 то срабатывает нужный хоткей и текст в буфере обмена. Верно?

YMP пишет:

Почему фокус не пройдёт? Там же тоже цифра на конце.

не такая же. Num1 = 0xC это разве 1?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

10

Re: AHK: Вставка в буфер обмена.

Хоткей срабатывает, а что при этом произойдёт, зависит от кода хоткея.

А при чём здесь 0xC? Numpad1, Numpad2 и т.д. Цифры же на конце.

11

Re: AHK: Вставка в буфер обмена.

YMP пишет:

Хоткей срабатывает, а что при этом произойдёт, зависит от кода хоткея.

ясно, спасибо.

YMP пишет:

А при чём здесь 0xC? Numpad1, Numpad2 и т.д. Цифры же на конце.

если написать

NumPad1::
; код
return

то он сработает только при выключенном NumLock, а если написать

sc4f::
; код
return

он сработает всегда + сканкоды ещё идут не последовательно, т.е. сканкод Num1 не самая меньшая - Num4=0x4b

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

12

Re: AHK: Вставка в буфер обмена.

Indomito пишет:

+ сканкоды ещё идут не последовательно, т.е. сканкод Num1 не самая меньшая - Num4=0x4b

Это разве проблема? Трудно под каждым хоткеем написать что-то типа


Index = 1    ; 2, 3, 4 и т.д.

?

13

Re: AHK: Вставка в буфер обмена.

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

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro