Thanks a million.  When I ran your verb the last character was not put 
on the clipboard - I'm guessing it's a NUL-termination problem which I 
fixed with

setclipdata=: 4 : 0
NB. following line changed
h=. dllrv 'kernel32 GlobalAlloc x i x'&cd (2+16b2000) ; ms=. >:#x
mp=. dllrv 'kernel32 GlobalLock x x'&cd <h
NB. following line changed
(, x) memw mp, 0, ms , 2
'kernel32 GlobalUnlock i x'&cd <h
'user32 OpenClipboard i x'&cd <0
'user32 EmptyClipboard i'&cd ''
'user32 SetClipboardData x i x'&cd y ; h
'user32 CloseClipboard i'&cd ''
)

Henry Rich

bill lam wrote:
> I can reproduce the error, I guess there is a bug in wd'clipcopy'
> Using setclipdate below will set clipboard data to the latest
> version.  Beware of possible extra trailing null.
> 
> setclipdata=: 4 : 0
> h=. dllrv 'kernel32 GlobalAlloc x i x'&cd (2+16b2000) ; ms=. #x
> mp=. dllrv 'kernel32 GlobalLock x x'&cd <h
> (, x) memw mp, 0, ms
> 'kernel32 GlobalUnlock i x'&cd <h
> 'user32 OpenClipboard i x'&cd <0
> 'user32 EmptyClipboard i'&cd ''
> 'user32 SetClipboardData x i x'&cd y ; h
> 'user32 CloseClipboard i'&cd ''
> )
> 
>  CF_TEXT setclipdata~ 'aaaa'
> 
> On Sun, 07 Jun 2009, Henry Rich wrote:
>> Thanks.  Using your program I was able to deduce that the problem was 
>> coming from
>>
>> wd 'clipcopy'
>>
>> followed by a write to the clipboard in another window.  Then, the 
>> subsequent call to
>>
>> wd 'clippaste'
>>
>> gives domain error.
>>
>> I experimented with variations on
>>
>> wd'clipcopy xxx' [ 6!:3(5)
>>
>> where I would hit ENTER in J, and then during the 5-second delay I would 
>> switch to another window and then do different things there.  I find 
>> that the clipcopy succeeds if I do nothing in the other window; it fails 
>> if I CTRL-C to copy text to the clipboard in the other window; it 
>> succeeds if I do both CTRL-C and CTRL-V in the other window.  From which 
>> it appears that there is some notion of the owner of the clipboard, and 
>> the active window gets ownership by ctrl-c; and if it's the owner, a 
>> write to the clipboard fails.
>>
>> When I enhanced the test to
>>
>> wd 'clippaste'  [ 6!:3 (5) [ wd 'clipcopy' [ 6!:3 (5)
>>
>> I found that if I waited until after the clipcopy (at which time J had 
>> become the clipboard owner), and then went to another window and did 
>> CTRL-C, the clipboard seems to be marked as damaged.  Sbsequent 
>> clippaste fails, and the other window doesn't allow a PASTE operation 
>> either.
>>
>> So, it appears that this is how Windows works, and I just have to work 
>> around it.
>>
>>
>>
>> In your verb, the call to GetClipboardData also fails in this situation. 
>>   The failure seems to be harmless, but here is a version that checks 
>> for it (upgraded to new dll syntax)
>>
>> NB. y is a clipboard format
>> getclipdata=: 3 : 0
>> 'user32 OpenClipboard >i x'&cd <0
>> if. h=. 'user32 GetClipboardData >x i'&cd <y do.
>>    ms=. 'kernel32 GlobalSize >x x'&cd <h
>>    mp=. 'kernel32 GlobalLock >x x'&cd <h
>>    data =. memr mp, 0, ms
>>    'kernel32 GlobalUnlock >i x'&cd <h
>> else.
>>    data =. ''
>> end.
>> 'user32 CloseClipboard >i'&cd ''
>> data
>> )
>>
>>
>> bill lam wrote:
>>> On Sat, 06 Jun 2009, bill lam wrote:
>>>> I guess that might be a bug in wd.  In general wd implicitly works on the
>>>> current parent form so that you may try using wd'psel ..' before clippaste.
>>>>
>>>> Winapi for getting clipboard data.
>>>>
>>>> getclipdata=: 3 : 0
>>>> 'user32 OpenClipboard i x'&cd <0
>>>> h=. dllrv 'user32 GetClipboardData x i'&cd <y
>>>> ms=. dllrv 'kernel32 GlobalSize x x'&cd <h
>>>> mp=. dllrv 'kernel32 GlobalLock x x'&cd <h
>>>> data=. memr mp, 0, ms
>>>> 'kernel32 GlobalUnlock i x'&cd <h
>>>> 'user32 CloseClipboard i'&cd ''
>>>> data
>>>> )
>>>>
>>>> where dllrv is >@{. because it was written for older J.
>>> I forget to list the argument for getclipdata, eg.
>>>
>>> getclipdata CF_TEXT
>>> 6 u: getclipdata CF_UNICODETEXT
>>>
>>> NB. Predefined Clipboard Formats
>>> CF_TEXT=: 1
>>> CF_BITMAP=: 2
>>> CF_METAFILEPICT=: 3
>>> CF_SYLK=: 4
>>> CF_DIF=: 5
>>> CF_TIFF=: 6
>>> CF_OEMTEXT=: 7
>>> CF_DIB=: 8
>>> CF_PALETTE=: 9
>>> CF_PENDATA=: 10
>>> CF_RIFF=: 11
>>> CF_WAVE=: 12
>>> CF_UNICODETEXT=: 13
>>> CF_ENHMETAFILE=: 14
>>>
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
> 
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to