Тема: 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
}
}