StrClb
From NSIS Wiki
Jump to navigationJump to search
Author: deguix (talk, contrib) |
Description
Requires: LogicLib header file and System plug-in.
Version: 2.0.1.
Makes an action with the clipboard. This function can clean the clipboard, set or get a value to/from clipboard or swap values.
How To Use
Syntax
${StrClb} "ResultVar" "String" "Action"
or
Push "String" Push "Action" Call StrClb Pop "ResultVar"
Parameters
- ResultVar
- Variable where the value from the clipboard is retrieved when Action is "<" or "<>". If the clipboard is empty or filled with non-recognizable data as text at the time, an empty value is returned.
- WARNING: This value requires a variable, even when it's not needed. In this occasion, the return value is an empty string. You should reserve a variable for this occasion.
- String
- String to set to the clipboard when Action is ">" or "<>".
- NOTE: The value will always be considered text.
- Action
- Specifies an action to do with the clipboard. The value of this parameter can be the following:
- empty value
- Clear clipboard.
- >
- Set the value from the String parameter to the clipboard.
- <
- Get the value from the clipboard to ResultVar parameter.
- <>
- Swap the value from the String parameter with the clipboard's, which is returned to ResultVar parameter.
Example
${StrClb} $0 "This is just an example" ">" ${StrClb} $0 "" "<" ;$0 = "This is just an example" ${StrClb} $0 "This is another example" "<>" ;$0 = "This is just an example" ${StrClb} $0 "" "" ;$0 = ""
Function Code
!define StrClb "!insertmacro StrClb" !macro StrClb ResultVar String Action Push "${String}" Push "${Action}" Call StrClb Pop "${ResultVar}" !macroend Function StrClb /*After this point: ------------------------------------------ $0 = String (input) $1 = Action (input) $2 = Lock/Unlock (temp) $3 = Temp (temp) $4 = Temp2 (temp)*/ ;Get input from user Exch $1 Exch Exch $0 Exch Push $2 Push $3 Push $4 StrCpy $2 "" StrCpy $3 "" StrCpy $4 "" ;Open the clipboard to do the operations the user chose (kichik's fix) System::Call 'user32::OpenClipboard(i $HWNDPARENT)' ${If} $1 == ">" ;Set ;Step 1: Clear the clipboard System::Call 'user32::EmptyClipboard()' ;Step 2: Allocate global heap StrLen $2 $0 IntOp $2 $2 + 1 System::Call 'kernel32::GlobalAlloc(i 2, i r2) i.r2' ;Step 3: Lock the handle System::Call 'kernel32::GlobalLock(i r2) i.r3' ;Step 4: Copy the text to locked clipboard buffer System::Call 'kernel32::lstrcpyA(i r3, t r0)' ;Step 5: Unlock the handle again System::Call 'kernel32::GlobalUnlock(i r2)' ;Step 6: Set the information to the clipboard System::Call 'user32::SetClipboardData(i 1, i r2)' StrCpy $0 "" ${ElseIf} $1 == "<" ;Get ;Step 1: Get clipboard data System::Call 'user32::GetClipboardData(i 1) i .r2' ;Step 2: Lock and copy data (kichik's fix) System::Call 'kernel32::GlobalLock(i r2) t .r0' ;Step 3: Unlock (kichik's fix) System::Call 'kernel32::GlobalUnlock(i r2)' ${ElseIf} $1 == "<>" ;Swap ;Step 1: Get clipboard data System::Call 'user32::GetClipboardData(i 1) i .r2' ;Step 2: Lock and copy data (kichik's fix) System::Call 'kernel32::GlobalLock(i r2) t .r4' ;Step 3: Unlock (kichik's fix) System::Call 'kernel32::GlobalUnlock(i r2)' ;Step 4: Clear the clipboard System::Call 'user32::EmptyClipboard()' ;Step 5: Allocate global heap StrLen $2 $0 IntOp $2 $2 + 1 System::Call 'kernel32::GlobalAlloc(i 2, i r2) i.r2' ;Step 6: Lock the handle System::Call 'kernel32::GlobalLock(i r2) i.r3' ;Step 7: Copy the text to locked clipboard buffer System::Call 'kernel32::lstrcpyA(i r3, t r0)' ;Step 8: Unlock the handle again System::Call 'kernel32::GlobalUnlock(i r2)' ;Step 9: Set the information to the clipboard System::Call 'user32::SetClipboardData(i 1, i r2)' StrCpy $0 $4 ${Else} ;Clear ;Step 1: Clear the clipboard System::Call 'user32::EmptyClipboard()' StrCpy $0 "" ${EndIf} ;Close the clipboard System::Call 'user32::CloseClipboard()' /*After this point: ------------------------------------------ $0 = ResultVar (output)*/ ;Return result to user Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 FunctionEnd
Versions History
- 2.0.1
- Fixed the return of text when Action parameter value was equal to "<>".
Credits
Author: Diego Pedroso (deguix)
Based on CopyToClipboard and CopyFromClipboard functions.