1 (изменено: creature.ws, 2012-01-22 13:50:34)

Тема: AHK: Расширение функциональности буфера обмена

Тема не нова, но возможно кого-либо заинтересует.
В наличии скрипт предоставляющий возможность оперировать 4-мя позициями «истории текстового содержимого буфера обмена».
Имеется желание добавить к нему «классическую» графическую оболочку вида "traytip window", но отсутствует необходимый опыт.


; 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

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

#SingleInstance Ignore
#KeyHistory 0
#NoEnv
OnExit, ExitSub
DllCall("AddClipboardFormatListener", "Int", A_ScriptHwnd)
OnMessage(0x031D, "ClipSave")
OnMessage(0x404, "TrayIconClick")

maxLines := 10
clipHistory := []
Return

ShowClip:
    If (Row := clipHistory.MaxIndex()) {
        Gui, +AlwaysOnTop +LastFound -Caption +Toolwindow -Resize
        Gui, Font, s8, Verdana
        Gui, Margin, 0, 0
        Gui, Add, ListView, +AltSubmit -Hdr -Multi gLV_Event R%Row%, Clip
        For index, clip in clipHistory
            LV_Add("", clip)
        Gui, Show, AutoSize
    }
Return

LV_Event:
    If (A_GuiEvent = "Normal") {
        Clipboard := clipHistory[Index := A_EventInfo]
        Gui, Destroy
    } Else If (A_GuiEvent == "f") {
        Gui, Destroy
    }
Return

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

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

TrayIconClick(wParam, lParam)
{
    If (lParam = 0x202) {
        SetTimer, ShowClip, -1
        Return
    }
    If (lParam = 0x207) {
        SetTimer, ExitSub, -1
        Return
    }
}

2

Re: AHK: Расширение функциональности буфера обмена

creature.ws пишет:
    SendMessage, 0x302,,,%FClassNN%, A
    SendMessage, 0x8  ,,,%FClassNN%, A
    SendMessage, 0x7  ,,,%FClassNN%, A

Желательно указывать расшифровку кодов сообщений.
Не могу оценить, к сожаленью, у меня ещё XP. У кого 7 — проверьте работоспособность, пожалуйста.

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

3 (изменено: creature.ws, 2012-01-29 13:40:39)

Re: AHK: Расширение функциональности буфера обмена

Буквально через  час после публикации топика наткнулся в документации на прежде не замечаемую метку OnClipboardChange:, которая предоставляет ту же функциональность, что и отслеживание WM_CLIPBOARDUPDATE. Потому вышеприведенный скрипт ничем не примечателен.


SendMessage, WM_PASTE     := 0x302,,,%FClassNN%, A
SendMessage, WM_KILLFOCUS := 0x8  ,,,%FClassNN%, A
SendMessage, WM_SETFOCUS  := 0x7  ,,,%FClassNN%, A