Shoutbox

[UPDATED] Clipboard Functions (that WORK) - Printable Version

-Shoutbox (https://shoutbox.menthix.net)
+-- Forum: MsgHelp Archive (/forumdisplay.php?fid=58)
+--- Forum: Messenger Plus! for Live Messenger (/forumdisplay.php?fid=4)
+---- Forum: Scripting (/forumdisplay.php?fid=39)
+----- Thread: [UPDATED] Clipboard Functions (that WORK) (/showthread.php?tid=63067)

[UPDATED] Clipboard Functions (that WORK) by deAd on 07-11-2006 at 09:27 PM

UPDATED: If you have added the readClipboard() function to your script, update it now. Fixed major bug that caused the clipboard to stay locked on certain occasions.


Here's some great functions I made to get the clipboard text and change the clipboard text! They are based off the non-functional code in these requests: Get Text and Set Text. They are fully functional, but BE CAREFUL when you modify them. I haven't had any problems yet.

Be careful when you modify these.
@Segosa - your problem was (1) no unicode and (2) you did it a bit wrong :P

Clear Text:
No return value.
code:
function clearClipboard(){
    if (Interop.Call("User32", "OpenClipboard", 0)){
        Interop.Call("User32", "EmptyClipboard");
        Interop.Call("User32", "CloseClipboard");
    }
}

Get Text:
Do not remove the try/catch statement. Your clipboard may lock up.
This function will return false if there are errors (including the text being too long. I don't know how long it can go.) or if the clipboard is currently in use by another program. Otherwise it will return the text :)
code:
function readClipboard() {
var CF_TEXT = 1;
var CF_OEMTEXT = 7;
var CF_UNICODETEXT = 13;
var toBeReturned = false;

try {
if (Interop.Call("User32", "OpenClipboard", 0)) {
if (Interop.Call("User32", "IsClipboardFormatAvailable", CF_TEXT | CF_OEMTEXT)) {
var hClipboardData = Interop.Call("User32", "GetClipboardData", CF_UNICODETEXT);
var pchData = Interop.Call("Kernel32", "GlobalLock", hClipboardData);
var size = Interop.Call("Kernel32", "GlobalSize", hClipboardData);
var str = Interop.Allocate(size+2);
Interop.Call("Kernel32", "RtlMoveMemory", str, pchData, size);
toBeReturned = str.ReadString(0);
var unlocked = Interop.Call("Kernel32", "GlobalUnlock", hClipboardData);
} else {
Interop.Call("User32", "CloseClipboard");
return false;
}
Interop.Call("User32", "CloseClipboard");
}
} catch(ex) {
Interop.Call("User32", "CloseClipboard");
return false;
}
return toBeReturned;
}

Set Text:
This function has no return value. To use it, type writeClipboard(String);.

code:
function writeClipboard(str){
    var size = str.length*2+2;
    var GMEM_MOVEABLE = 0x2;
    var GMEM_SHARE = 0x2000;
    var GMEM_ZEROINIT = 0x40;
    var memtype = GMEM_MOVEABLE | GMEM_SHARE | GMEM_ZEROINIT;
    if (Interop.Call("User32", "OpenClipboard", 0)){
        var heap = Interop.Call("Kernel32", "GlobalAlloc", 0, size);
        var p = Interop.Call("Kernel32", "GlobalLock", heap);
        Interop.Call('Kernel32','RtlMoveMemory',p,str,size);
        Interop.Call("Kernel32", "GlobalUnlock", heap);
        if (Interop.Call("User32", "OpenClipboard", 0)){
            Interop.Call("User32", "EmptyClipboard");
            Interop.Call("User32", "SetClipboardData", 13, heap);
            Interop.Call("User32", "CloseClipboard");
        }
    }
}

RE: Clipboard Functions (that WORK) by andrey on 07-11-2006 at 09:44 PM

wow,
i would have never figured that out myself, thank you! :cheesy:

do we actually have some kind of database for these code pieces?
would definately be useful to get them into one place..



uh..one thing I just noticed with the get Text code:
if the text in the clipboard is longer than 23 chars, it returns 'false'
if the text in the clipboard is longer than 23 chars, it returns

code:
Interop.Call failed to locate function "char23char24char25etc"
False

RE: Clipboard Functions (that WORK) by deAd on 07-11-2006 at 09:46 PM

quote:
Originally posted by andrey
uh..one thing I just noticed with the get Text code:
if the text in the clipboard is longer than 23 chars, it returns 'false'
if the text in the clipboard is longer than 23 chars, it returns
code:
Interop.Call failed to locate function "char23char24char25etc"
False

I got this when I started making it, but it went away. It works fine now, so I don't understand what's wrong. :S

About the database, there is no official one, but there is always http://www.mpwiki.net :D
RE: Clipboard Functions (that WORK) by ShawnZ on 07-11-2006 at 10:45 PM

what if the clipboard data isn't a string?


RE: Clipboard Functions (that WORK) by deAd on 07-11-2006 at 10:56 PM

The functions here deal with strings only. readClipboard() will return false if the data is not a string.


RE: [UPDATED] Clipboard Functions (that WORK) by alexp2_ad on 07-12-2006 at 12:32 AM

Very nice work! (Y)

Been wondering about this. :)


RE: [UPDATED] Clipboard Functions (that WORK) by andrey on 07-12-2006 at 02:58 AM

hmm..there's still something wrong with this, at some occasions my clipboard is still not getting closed again

save this as a new script:

code:
//ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ <-- for testing

Interop.Call("user32", "CloseClipboard");
Debug.Trace(readClipboard());

function readClipboard() {
var CF_TEXT = 1;
var CF_OEMTEXT = 7;
var CF_UNICODETEXT = 13;
try {
if (Interop.Call("User32", "OpenClipboard", 0)) {
if (Interop.Call("User32", "IsClipboardFormatAvailable", CF_TEXT | CF_OEMTEXT)) {
var hClipboardData = Interop.Call("User32", "GetClipboardData", CF_UNICODETEXT);
var pchData = Interop.Call("Kernel32", "GlobalLock", hClipboardData);
var size = Interop.Call("Kernel32", "GlobalSize", hClipboardData);
var str = "";
Interop.Call("Kernel32", "RtlMoveMemory", str, pchData, size);
var unlocked = Interop.Call("Kernel32", "GlobalUnlock", hClipboardData);
} else {
Interop.Call("User32", "CloseClipboard");
return false;
}
Interop.Call("User32", "CloseClipboard");
}
} catch(ex) {
Interop.Call("User32", "CloseClipboard");
return false;
}
return str;
}
now copy (to the clipboard)
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
and save the script, everything works fine and we get a 'False'
quote:
Originally posted by Script Debugging
Script has been stopped
Script is starting
Interop.Call failed to locate function "YZABCDEFGHIJKLMNOPQRSTUVWXYZ"
False
Script is now loaded and ready
but now delete the 3rd row
"Interop.Call("user32", "CloseClipboard");"
or put it as comment, again copy
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
and save the script. Now we get an error
quote:
Originally posted by Script Debugging
Script has been stopped
Script is starting
Interop.Call failed to locate function "YZABCDEFGHIJKLMNOPQRSTUVWXYZ"
Interop.Call failed to locate function "QRSTUVWXYZ"
Error: .
       Line: 26. Code: -2147467259.
Script has failed to start
the script fails, and the clipboard isn't closed.


Edit:
Thanks dt, that worked.
deAd, please update your post with dt's code

RE: [UPDATED] Clipboard Functions (that WORK) by -dt- on 07-12-2006 at 04:45 AM

try this

code:
function readClipboard() {
    var CF_TEXT = 1;
    var CF_OEMTEXT = 7;
    var CF_UNICODETEXT = 13;
    var toBeReturned = false;
   
    try {
        if (Interop.Call("User32", "OpenClipboard", 0)) {
                if (Interop.Call("User32", "IsClipboardFormatAvailable", CF_TEXT | CF_OEMTEXT)) {
                var hClipboardData = Interop.Call("User32", "GetClipboardData", CF_UNICODETEXT);
                var pchData = Interop.Call("Kernel32", "GlobalLock", hClipboardData);
                var size = Interop.Call("Kernel32", "GlobalSize", hClipboardData);
                var str = Interop.Allocate(size+2);
                Interop.Call("Kernel32", "RtlMoveMemory", str, pchData, size);
                toBeReturned = str.ReadString(0);
                var unlocked = Interop.Call("Kernel32", "GlobalUnlock", hClipboardData);
            } else {
                Interop.Call("User32", "CloseClipboard");
                return false;
            }
            Interop.Call("User32", "CloseClipboard");
        }
    } catch(ex) {
        Interop.Call("User32", "CloseClipboard");
        return false;
    }
    return toBeReturned;
}


RE: [UPDATED] Clipboard Functions (that WORK) by Dempsey on 07-12-2006 at 07:28 AM

quote:
Originally posted by andrey
do we actually have some kind of database for these code pieces?
would definately be useful to get them into one place..

There is MPWiki and the soon to be released MPScripts which has a code snippet database.