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
--
regards,
====================================================
GPG key 1024D/4434BAB3 2008-08-24
gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3
唐詩174 崔曙 九日登望仙臺呈劉明府
漢文皇帝有高臺 此日登臨曙色開 三晉雲山皆北向 二陵風雨自東來
關門令尹誰能識 河上仙翁去不回 且欲竟尋彭澤宰 陶然共醉菊花杯
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm