This worked for me. Have WordPad open with some formatted text ready, including the word 'qwerty'.
Code: Select all
q:: ;copy RTF to clipboard, edit RTF, paste
WinActivate, ahk_class WordPadClass
Clipboard := ""
Send, ^a^c
ClipWait, 3
if ErrorLevel
{
MsgBox, % "error"
return
}
vRtf := JEE_ClipboardGetRtf()
;MsgBox, % "[" vRtf "]"
vRtf := StrReplace(vRtf, "qwerty", "QWERTY")
Clipboard := ""
;MsgBox, % "[" vRtf "]"
JEE_ClipboardSetRtf(vRtf)
Send, ^v
return
;==================================================
JEE_ClipboardGetText(vFormat:=0xD, vEnc:="")
{
;CF_LOCALE := 0x10 ;CF_UNICODETEXT := 0xD
;CF_OEMTEXT := 0x7 ;CF_TEXT := 0x1
if !DllCall("user32\IsClipboardFormatAvailable", UInt,vFormat)
return
if !DllCall("user32\OpenClipboard", Ptr,0)
return
if !hBuf := DllCall("user32\GetClipboardData", UInt,vFormat, Ptr)
{
DllCall("user32\CloseClipboard")
return
}
pBuf := DllCall("kernel32\GlobalLock", Ptr,hBuf, Ptr)
vSize := DllCall("kernel32\GlobalSize", Ptr,hBuf, UPtr)
VarSetCapacity(vOutput, vSize, 0)
DllCall("msvcrt\memcpy", Ptr,&vOutput, Ptr,pBuf, UPtr,vSize, "Cdecl Int")
if !(vEnc = "")
vOutput := StrGet(&vOutput, vSize, vEnc)
VarSetCapacity(vOutput, -1)
DllCall("kernel32\GlobalUnlock", Ptr,hBuf)
DllCall("user32\CloseClipboard")
return vOutput
}
;==================================================
JEE_ClipboardGetRtf(vEnc:="CP0")
{
vFormat := DllCall("user32\RegisterClipboardFormat", Str,"Rich Text Format", UInt)
return JEE_ClipboardGetText(vFormat, vEnc)
}
;==================================================
;q::
;FormatTime, vDate
;vRtf := "{\rtf{\b " vDate "}}"
;JEE_ClipboardSetRtf(vRtf, "e")
;vHtml := "<b>" vDate "</b>"
;JEE_ClipboardSetHtml(vHtml)
;SendInput, ^v
;return
;vOpt: e (empty clipboard before setting contents)
JEE_ClipboardSetRtf(vRtf, vOpt:="")
{
vFormat := DllCall("user32\RegisterClipboardFormat", Str,"Rich Text Format", UInt)
vSize := StrPut(vRtf, "CP0")
VarSetCapacity(vData, vSize, 0)
StrPut(vRtf, &vData, vSize, "CP0")
;GMEM_ZEROINIT := 0x40, GMEM_MOVEABLE := 0x2
hBuf := DllCall("kernel32\GlobalAlloc", UInt,0x42, UPtr,vSize, Ptr)
pBuf := DllCall("kernel32\GlobalLock", Ptr,hBuf, Ptr)
;DllCall("kernel32\RtlMoveMemory", Ptr,pBuf, Ptr,&vData, UPtr,vSize)
DllCall("msvcrt\memcpy", Ptr,pBuf, Ptr,&vData, UPtr,vSize, "Cdecl Int")
hWnd := A_ScriptHwnd ? A_ScriptHwnd : WinExist("ahk_pid " DllCall("kernel32\GetCurrentProcessId", UInt))
DllCall("kernel32\GlobalUnlock", Ptr,hBuf)
DllCall("user32\OpenClipboard", Ptr,hWnd)
if InStr(vOpt, "e")
DllCall("user32\EmptyClipboard")
DllCall("user32\SetClipboardData", UInt,vFormat, Ptr,hBuf, Ptr)
DllCall("user32\CloseClipboard")
}
;==================================================