1. How to write graphics to MS Windows clipboard

Does win32Lib support the writing of graphics to MS Windows clipboard?

In the documentation, I saw some functions dealing with DIBs, and I saw some
functions dealing with text to the clipboard.

I am looking for a way for my program, which generates graphics, to copy it so
that Paint can paste it.

Andy Katz

B.S. Computer Science, 1978
Rensselaer Polytechnic Institute (RPI)

new topic     » topic index » view message » categorize

2. Re: How to write graphics to MS Windows clipboard

Andrew Katz wrote:
> 
> Does win32Lib support the writing of graphics to MS Windows clipboard?
> 
> In the documentation, I saw some functions dealing with DIBs, and I saw some
> functions dealing with text to the clipboard.
> 
> I am looking for a way for my program, which generates graphics, to copy it
> so that Paint can paste it.
> 
> Andy Katz
> 
> B.S. Computer Science, 1978
> Rensselaer Polytechnic Institute (RPI)

new topic     » goto parent     » topic index » view message » categorize

3. Re: How to write graphics to MS Windows clipboard

I made a mini library, it's not tested and allows you to only paste DIB and
BITMAPs.

-- File: clipboard.ew
include dll.e
include msgbox.e

constant
    -- Borrowed from win32lib (file w32user.ew)
    user32 = open_dll("user32.dll"),
cOpenClipboard      =
    define_c_func(user32,"OpenClipboard",{C_POINTER},C_INT),
    cCloseClipboard     = define_c_func(user32,"CloseClipboard",{},C_INT),
    cEmptyClipboard     = define_c_func(user32,"EmptyClipboard",{},C_INT),
cSetClipboardData   =
    define_c_func(user32,"SetClipboardData",{C_UINT,C_POINTER},C_POINTER)
    -- End borrow

atom IsClipboardOpen -- Clipboard handle

-- window must be a valid handle to a window, from win32lib, use getHWND(window)
to get the real window handle
-- hDIB must be a handle to a dib, as a example, the value returned by createDIB
or loadBitmapFromFile in win32lib
global procedure ClipboardPasteDIB(atom window, atom hDIB)
	IsClipboardOpen = c_func(cOpenClipboard, {window})

	if not IsClipboardOpen then
if message_box("Failed to open clipboard.","Error",MB_ICONERROR+MB_OK) then
end if
	end if
	if c_func(cEmptyClipboard,{}) then end if
	if c_func(cSetClipboardData,{CF_DIB,hDIB}) != hDIB then
		if c_func(cSetClipboardData,{CF_BITMAP,hDIB}) != hDIB then
if message_box("Failed to paste DIB in
clipboard.","Error",MB_ICONERROR+MB_OK) then end if
		end if
	end if
	if c_func(cCloseClipboard,{}) then end if
end procedure


-- File: test.exw
include win32lib.ew
include clipboard.ew

constant win = create( Window, "Test Clipboard", 0, Default, Default, 400, 400,
0 ),
	btn = create(PushButton, "Copy to clipboard", win, 1, 1, 40, 30, 0)

atom hBit
hBit = loadBitmapFromFile("test.bmp")}
-- Code borrowed from a win32lib example
          -- create a bitmap, and display it
          atom hBitmap
          sequence pixels, pal

          -- the pixels data
          pixels = {
              { 0,0,0,0 },        -- scan line 1
              { 0,1,1,0 },        -- scan line 2
              { 0,1,1,0 },        -- scan line 3
              { 0,0,0,0 } }       -- scan line 4

          -- the pal data (color tuples)
          pal = {
                { 255, 0, 0 },    -- color 0 is bright red
                { 0, 0, 255 } }   -- color 1 is bright blue

          -- create the DIB
          hBitmap = createDIB( {pal, pixels} )
-- End borrow

procedure onClickbtn(integer s, integer e, sequence p)
	ClipboardPasteDIB(getHWND(win),hBitmap)
-- ClipboardPasteDIB(getHWND(win),hBit) -- Create a test.bmp file to
        test this
end procedure
setHandler(btn,w32HClick,routine_id("onClickbtn"))

WinMain(win,Normal)


Any suggestions, questions, just do it :)

Best regards,
    Guillermo Bonvehi

new topic     » goto parent     » topic index » view message » categorize

4. Re: How to write graphics to MS Windows clipboard

Andrew Katz wrote:
> 
> Does win32Lib support the writing of graphics to MS Windows clipboard?
> 
> In the documentation, I saw some functions dealing with DIBs, and I saw some
> functions dealing with text to the clipboard.
> 
> I am looking for a way for my program, which generates graphics, to copy it
> so that Paint can paste it.
> 
> Andy Katz
> 
> B.S. Computer Science, 1978
> Rensselaer Polytechnic Institute (RPI)

I assume your graphics are displayed on some window.

include win32lib.ew
--  first a simplified version of Guillermo's code
constant
cOpenClipboard      =
    define_c_func(user32,"OpenClipboard",{C_POINTER},C_INT),
    cCloseClipboard     = define_c_func(user32,"CloseClipboard",{},C_INT),
    cEmptyClipboard     = define_c_func(user32,"EmptyClipboard",{},C_INT),
cSetClipboardData   =
    define_c_func(user32,"SetClipboardData",{C_UINT,C_POINTER},C_POINTER),
xGetWindowDC        =
    define_c_func(user32,"GetWindowDC",{C_POINTER},C_POINTER)


-- hBmp must be a bitmap handle

integer void
global procedure bmpToClipboard(atom hBmp)
        if not c_func(cOpenClipboard, {NULL}) then
void=message_box("Failed to open
            clipboard.","Error",MB_ICONERROR+MB_OK)
            return
	end if
        -- current thread now has exclusive access to clipboard
	c_proc(cEmptyClipboard,{})
	if c_func(cSetClipboardData,{CF_BITMAP,hBmp}) != hBmp then
void=message_box("Failed to copy bitmap to
clipboard.","Error",MB_ICONERROR+MB_OK)
	end if
	c_proc(cCloseClipboard,{})
end procedure

global procedure captureToClipboard(integer id,integer x,integer y,integer
cx,integer cy,integer client)
-- id is the surce window; copy rectangle at {x,y}, cx pixel wide and cy poxel
high
-- if client is true, x and y are client coordinates, else absolute window
coordinates
atom hDC,hMemDC,hOldBmp,hBmp,hWnd
-- where's the pic?
hWnd=getHandle(id)
if client then
    hDC=getDC(id)
else
    hDC=c_func(xGetWindowDC,{hWnd})
end if
        if not hDC then
            void=message_box("Not a valid window.","Error",MB_ICONERROR+MB_OK)
            return
        end if
-- create a memory target DC
hMemDC=w32Func(xCreateCompatiblzDC,{hDC})
        if not hMemDC then
void=message_box("Failed to create temporary
            bitmap.","Error",MB_ICONERROR+MB_OK)
            return
        end if
-- create the bitmap we'll send to clipboard, with supplied dimensions.
-- It will be written to using hMemDC.
hBmp=w32Func(xCreateCompatibleBitmap,{hMemDC,cx,cy})
        if not hBmp then
void=message_box("Failed to create temporary
            bitmap.","Error",MB_ICONERROR+MB_OK)
            return
        end if
-- use hMemDC o write to it.
hOldBmp=w32Func(xSelectObject,{hMemDC,hBmp})
-- now copy source rectangle to it
bitBlt(hMemDC,0,0,hDC,x,y,cx,cy,SrcCopy)
-- deselect the bitmap so as to own it
hBmp=w32Func(xSelectObject,{hMemDC,hOldBmp})
-- send bitmap to clipboard
bmpToClipBoard(id,hBmp)
-- now we no longer own it
-- clean up
deleteObject(hOldBmp)
hMemDC=w32Func(xDeleteDC,{hMemDC})
hDC=w32Func(xReleaseDC,{hWnd,hDC})
end procedure

Didn't test it; part of cleanup may be redundant.

CChris

new topic     » goto parent     » topic index » view message » categorize

5. Re: How to write graphics to MS Windows clipboard

CChris wrote:
> 

> 
> I assume your graphics are displayed on some window.
> 
> Didn't test it; part of cleanup may be redundant.
> 
> CChris



-- from my global code:
constant ptx = 1
constant pty = 2
--

atom hDC,hMemDC,hOldBmp,hBmp
atom void
sequence DRAWINsize

-- place my child window control DRAWIN in clipboard

hDC=getDC(DRAWIN)
-- create a memory target DC
hMemDC=w32Func(xCreateCompatibleDC,{hDC})
if not hMemDC then
void=message_box("Failed to create temporary
bitmap.","Error",MB_ICONERROR+MB_OK)
else
-- create the bitmap we'll send to clipboard, with supplied dimensions.
-- It will be written to using hMemDC.
DRAWINsize = getCtlSize(DRAWIN)
hBmp=w32Func(xCreateCompatibleBitmap,{hMemDC,DRAWINsize[ptx],DRAWINsize[pty]})
if not hBmp then
void=message_box("Failed to create temporary
bitmap.","Error",MB_ICONERROR+MB_OK)
else
-- use hMemDC o write to it.
hOldBmp=w32Func(xSelectObject,{hMemDC,hBmp})
-- now copy source rectangle to it
void=w32Func( xBitBlt, {hMemDC, 0, 0, DRAWINsize[ptx], DRAWINsize[pty], hDC, 0,
0, SrcCopy} )
-- send bitmap to clipboard
if not w32Func(xOpenClipboard, {NULL}) then
	void=message_box("Failed to open clipboard.","Error",MB_ICONERROR+MB_OK)
else
-- current thread now has exclusive access to clipboard
void=w32Func(xEmptyClipboard,{})
if w32Func(xSetClipboardData,{CF_BITMAP,hBmp}) != hBmp then
void=message_box("Failed to copy bitmap to
clipboard.","Error",MB_ICONERROR+MB_OK)
end if
w32Proc(xCloseClipboard,{})

-- now we no longer own it
-- clean up
-- releaseDC(hMemDC) Not sure how to clean up
-- deselect the bitmap so as to own it
hBmp=w32Func(xSelectObject,{hMemDC,hOldBmp})
releaseDC(DRAWIN)
end if
end if
end if


I have made many small changes to CChris's code and tested it. And I have
managed to get the drawing into Paint with Paste. Except that it only has 2
colors - white or black - and any color is being seen as black. So, where do we
go from here?

Andy Katz
B.S. Computer Science, 1978
Rensselaer Polytechnic Institute (RPI)

new topic     » goto parent     » topic index » view message » categorize

6. Re: How to write graphics to MS Windows clipboard

Andrew Katz wrote:
> 
> CChris wrote:
> > 
> 
> > I assume your graphics are displayed on some window.
> > 
> > Didn't test it; part of cleanup may be redundant.
> > 
> > CChris
> 
> 
> }}}
<eucode>
> -- from my global code:
> constant ptx = 1
> constant pty = 2
> --
> 
> atom hDC,hMemDC,hOldBmp,hBmp
> atom void
> sequence DRAWINsize
> 
> -- place my child window control DRAWIN in clipboard
> 
> hDC=getDC(DRAWIN)
> -- create a memory target DC
> hMemDC=w32Func(xCreateCompatibleDC,{hDC})
> if not hMemDC then
> 	void=message_box("Failed to create temporary
> bitmap.","Error",MB_ICONERROR+MB_OK)
> else
> -- create the bitmap we'll send to clipboard, with supplied dimensions.
> -- It will be written to using hMemDC.
> DRAWINsize = getCtlSize(DRAWIN)
> -- Wrong:
> hBmp=w32Func(xCreateCompatibleBitmap,{hMemDC,DRAWINsize[ptx],DRAWINsize[pty]})
hBmp=w32Func(xCreateCompatibleBitmap,{hDC,DRAWINsize[ptx],DRAWINsize[pty]})
> if not hBmp then
> 	void=message_box("Failed to create temporary
> bitmap.","Error",MB_ICONERROR+MB_OK)
> else
> -- use hMemDC o write to it.
> hOldBmp=w32Func(xSelectObject,{hMemDC,hBmp})
> -- now copy source rectangle to it
> void=w32Func( xBitBlt, {hMemDC, 0, 0, DRAWINsize[ptx], DRAWINsize[pty], hDC,
> 0, 0, SrcCopy} )
> -- send bitmap to clipboard
> if not w32Func(xOpenClipboard, {NULL}) then
> 	void=message_box("Failed to open clipboard.","Error",MB_ICONERROR+MB_OK)
> else
> -- current thread now has exclusive access to clipboard
> void=w32Func(xEmptyClipboard,{})
> if w32Func(xSetClipboardData,{CF_BITMAP,hBmp}) != hBmp then
> 	void=message_box("Failed to copy bitmap to
> clipboard.","Error",MB_ICONERROR+MB_OK)
> end if
> w32Proc(xCloseClipboard,{})
> 
> -- now we no longer own it
> -- clean up
> -- releaseDC(hMemDC) Not sure how to clean up
> -- deselect the bitmap so as to own it
> hBmp=w32Func(xSelectObject,{hMemDC,hOldBmp})
> releaseDC(DRAWIN)
> end if
> end if
> end if
> </eucode>
{{{

> 
> I have made many small changes to CChris's code and tested it. And I have
> managed
> to get the drawing into Paint with Paste. Except that it only has 2 colors -
> white or black - and any color is being seen as black. So, where do we go from
> here?
> 

I found the problem:



B.S. Computer Science, 1978
Rensselaer Polytechnic Institute (RPI)

new topic     » goto parent     » topic index » view message » categorize

7. Re: How to write graphics to MS Windows clipboard

Andrew Katz wrote:
> 
> Andrew Katz wrote:
> > 
> > CChris wrote:
> > > 

The following example code was tested and works for me, with colors and all:
include win32lib.ew
--  first a simplified version of Guillermo's code
constant
xGetWindowDC        =
    registerw32Function(user32,"GetWindowDC",{C_POINTER},C_POINTER)

integer void
global procedure bmpToClipboard(atom hBmp) 
-- hBmp must be a bitmap handle
    if not w32Func(xOpenClipboard, {NULL}) then
        void=message_box("Failed to open clipboard.","Error",MB_ICONERROR+MB_OK)
        return
    end if
-- current thread now has exclusive access to clipboard
    void=w32Func(xEmptyClipboard,{})
    if w32Func(xSetClipboardData,{CF_BITMAP,hBmp}) != hBmp then
void=message_box("Failed to copy bitmap to
clipboard.","Error",MB_ICONERROR+MB_OK)
    end if
-- release clipboard
    w32Proc(xCloseClipboard,{})
end procedure

global procedure captureToClipboard(integer id,integer x,integer y,integer
cx,integer cy,integer
client)
-- id is the surce window; copy rectangle at {x,y}, cx pixel wide and cy poxel
high
-- if client is true, x and y are client coordinates, else absolute window
coordinates
atom hDC,hBmp,hWnd,hMemDC,hOldBmp
    -- where's the pic?
    hWnd=getHandle(id)
    if client then
        hDC=getDC(id)
    else
        hDC=w32Func(xGetWindowDC,{hWnd})
    end if
    if not hDC then
        void=message_box("Not a valid window.","Error",MB_ICONERROR+MB_OK)
        return
    end if
-- create a target compatible DC
    hMemDC=w32Func(xCreateCompatibleDC,{hDC})
-- create the bitmap we'll send to clipboard, with supplied dimensions.
-- It will be written to using hMemDC.
    hBmp=w32Func(xCreateCompatibleBitmap,{hDC,cx,cy})
    if not hBmp then
void=message_box("Failed to create temporary
        bitmap.","Error",MB_ICONERROR+MB_OK)
        return
    end if
-- select bitmap into tempDC
    hOldBmp=w32Func(xSelectObject,{hMemDC,hBmp})
-- now copy source rectangle to it
    void=w32Func(xBitBlt,{hMemDC,0,0,cx,cy,hDC,x,y,SrcCopy})
-- send bitmap to clipboard
    bmpToClipboard(hBmp)
-- now we no longer own it
-- clean up
    hOldBmp=w32Func(xSelectObject,{hMemDC,hOldBmp})
    deleteObject(hOldBmp)
    void=w32Func(xDeleteDC,{hMemDC})
    if client then
        releaseDC(id)
    else
        hDC=w32Func(xReleaseDC,{hWnd,hDC})
    end if
end procedure

constant
w=create(Window,"test",0,50,50,300,300,0)
,b=create(Button,"push",w,20,200,60,30,0)

procedure q(integer self,integer event,sequence data)
setWindowBackColor(w,Green)
setPenColor(w,Red)
drawRectangle(w,w32True,100,100,200,200)
end procedure
setHandler(w,w32HActivate,routine_id("q"))

procedure p(integer self,integer event,sequence data)
captureToClipboard(w,30,80,100,120,1)
end procedure
setHandler(b,w32HClick,routine_id("p"))

WinMain(w,Normal)

Perhaps using a temporary Pixmap will cut down on raw API calls, I'll check
that later. Using the currently undocumented replaceObject() procedure will
help too. But at least this is a correct starting point.

CChris

new topic     » goto parent     » topic index » view message » categorize

8. Re: How to write graphics to MS Windows clipboard

Andrew Katz wrote:
> 
> Andrew Katz wrote:
> > 
> > CChris wrote:
> > > 
> > 
> > > I assume your graphics are displayed on some window.
> > > 

A way nicer version using a Pixmap:
include win32lib.ew

integer void
global procedure bmpToClipboard(atom hBmp) 
-- hBmp must be a bitmap handle
    if not w32Func(xOpenClipboard, {NULL}) then
        void=message_box("Failed to open clipboard.","Error",MB_ICONERROR+MB_OK)
        return
	end if
        -- current thread now has exclusive access to clipboard
	void=w32Func(xEmptyClipboard,{})
	if w32Func(xSetClipboardData,{CF_BITMAP,hBmp}) != hBmp then
void=message_box("Failed to copy bitmap to
clipboard.","Error",MB_ICONERROR+MB_OK)
	end if
	w32Proc(xCloseClipboard,{})
end procedure

global procedure captureToClipboard(integer id,integer x,integer y,integer
cx,integer cy)
-- id is the source window; copy rectangle at {x,y}, cx pixel wide and cy poxel
high
    integer tmpx
-- create a temporary area for the bitmap
    tmpx=create(Pixmap,"",0,0,0,cx,cy,0)
-- copy pic
    bitBlt(tmpx,0,0,id,x,y,cx,cy,SrcCopy)
-- send bitmap to clipboard
    bmpToClipboard(getHandle(tmpx))
-- clean up
    destroy(tmpx)
end procedure

constant
xGetWindowDC        =
    registerw32Function(user32,"GetWindowDC",{C_POINTER},C_POINTER)
global procedure captureToClipboardEx(integer id,integer x,integer y,integer
cx,integer cy,integer
client)
-- id is the surce window; copy rectangle at {x,y}, cx pixel wide and cy poxel
high
-- if client is true, x and y are client coordinates, else absolute window
coordinates
    atom hDC,hWnd
    integer tmpx
    -- where's the pic?
    hWnd=getHandle(id)
    if client then
        hDC=getDC(id)
    else
        hDC=w32Func(xGetWindowDC,{hWnd})
    end if
    if not hDC then
        void=message_box("Not a valid window.","Error",MB_ICONERROR+MB_OK)
        return
    end if
    tmpx=create(Pixmap,"",0,0,0,cx,cy,0)
-- create a target compatible DC
    void=w32Func(xBitBlt,{getDC(tmpx),0,0,cx,cy,hDC,x,y,SrcCopy})
-- send bitmap to clipboard
    bmpToClipboard(getHandle(tmpx))
-- now we no longer own it
-- clean up
    destroy(tmpx)
    if client then
        releaseDC(id)
    else
        hDC=w32Func(xReleaseDC,{hWnd,hDC})
    end if
end procedure   

constant
w=create(Window,"test",0,50,50,300,300,0)
,b=create(Button,"push",w,20,200,60,30,0)

procedure q(integer self,integer event,sequence data)
setWindowBackColor(w,Green)
setPenColor(w,Red)
drawRectangle(w,w32True,100,100,200,200)
end procedure
setHandler(w,w32HActivate,routine_id("q"))

procedure p(integer self,integer event,sequence data)
captureToClipboard(w,30,80,100,120)
end procedure
setHandler(b,w32HClick,routine_id("p"))

WinMain(w,Normal)

Both routine work and the clipboard holds he expected value.

I'll have to add support for full window DCs in the library so that the
distinction wbetween the non -Ex and -Ex routines is no longer necessary.

Also, I had noticed earlier, and forgotten, that if you call
registerw32function() on some dll routine, then define_c_func() returns -1
if invoked on the same routine thereafter. I'll have to investigate.
Derek, any idea?

CChris

new topic     » goto parent     » topic index » view message » categorize

9. Re: How to write graphics to MS Windows clipboard

CChris wrote:
> A way nicer version using a Pixmap:
> }}}
<eucode>
> include win32lib.ew
> 
> integer void
> global procedure bmpToClipboard(atom hBmp) 
> -- hBmp must be a bitmap handle
>     if not w32Func(xOpenClipboard, {NULL}) then
>         void=message_box("Failed to open
>         clipboard.","Error",MB_ICONERROR+MB_OK)
>         return
> 	end if
<SNIP>
> constant
> w=create(Window,"test",0,50,50,300,300,0)
> ,b=create(Button,"push",w,20,200,60,30,0)
> 
> procedure q(integer self,integer event,sequence data)
> setWindowBackColor(w,Green)
> setPenColor(w,Red)
> drawRectangle(w,w32True,100,100,200,200)
> end procedure
> setHandler(w,w32HActivate,routine_id("q"))
> 
> procedure p(integer self,integer event,sequence data)
> captureToClipboard(w,30,80,100,120)
> end procedure
> setHandler(b,w32HClick,routine_id("p"))
> 
> WinMain(w,Normal)
> </eucode>
{{{

> Both routine work and the clipboard holds he expected value.
> 
> I'll have to add support for full window DCs in the library so that the
> distinction wbetween the non -Ex and -Ex routines is no longer necessary.
> 
> Also, I had noticed earlier, and forgotten, that if you call
> registerw32function() on some dll routine, then define_c_func() returns -1
> if invoked on the same routine thereafter. I'll have to investigate.
> Derek, any idea?
> 
> CChris

Thanks, that works like a charm.

Do you think a bitmap-in-memory can be sent (with OLE or DDE or whatever) to
be pasted into some other program?  It isn't uncommon to see programs do
this, such as IrfanView's send of an image that does not exist as a disk file
to some other graphic editor.

--Quark

new topic     » goto parent     » topic index » view message » categorize

10. Re: How to write graphics to MS Windows clipboard

DB James wrote:
> 
> CChris wrote:
> > A way nicer version using a Pixmap:
> > }}}
<eucode>
> > include win32lib.ew
> > 
> > integer void
> > global procedure bmpToClipboard(atom hBmp) 
> > -- hBmp must be a bitmap handle
> >     if not w32Func(xOpenClipboard, {NULL}) then
> >         void=message_box("Failed to open
> >         clipboard.","Error",MB_ICONERROR+MB_OK)
> >         return
> > 	end if
> <SNIP>
> > constant
> > w=create(Window,"test",0,50,50,300,300,0)
> > ,b=create(Button,"push",w,20,200,60,30,0)
> > 
> > procedure q(integer self,integer event,sequence data)
> > setWindowBackColor(w,Green)
> > setPenColor(w,Red)
> > drawRectangle(w,w32True,100,100,200,200)
> > end procedure
> > setHandler(w,w32HActivate,routine_id("q"))
> > 
> > procedure p(integer self,integer event,sequence data)
> > captureToClipboard(w,30,80,100,120)
> > end procedure
> > setHandler(b,w32HClick,routine_id("p"))
> > 
> > WinMain(w,Normal)
> > </eucode>
{{{

> > Both routine work and the clipboard holds he expected value.
> > 
> > I'll have to add support for full window DCs in the library so that the
> > distinction wbetween the non -Ex and -Ex routines is no longer necessary.
> > 
> > Also, I had noticed earlier, and forgotten, that if you call
> > registerw32function() on some dll routine, then define_c_func() returns -1
> > if invoked on the same routine thereafter. I'll have to investigate.
> > Derek, any idea?
> > 
> > CChris
> 
> Thanks, that works like a charm.
> 
> Do you think a bitmap-in-memory can be sent (with OLE or DDE or whatever) to
> be pasted into some other program?  It isn't uncommon to see programs do
> this, such as IrfanView's send of an image that does not exist as a disk file
> to some other graphic editor.
> 
> --Quark

There is a dedicated Windows message for that, which is WM_COPYDATA.
The trick there is that the data you pass must be accessible from the
process you are sending this message to, so it must not contain private
pointers. Here is the reference for this message:
<quote>
WM_COPYDATA 
wParam = (WPARAM) (HWND) hwnd;            // handle of sending window 
lParam = (LPARAM) (PCOPYDATASTRUCT) pcds; // pointer to structure with data 
 
The WM_COPYDATA message is sent when an application passes data to another
application. 

Parameters
hwnd:
  Identifies the window passing the data. 
pcds:
   Points to a COPYDATASTRUCT structure that contains the data to be passed. 

Return Value

If the receiving application processes this message, it should return TRUE;
otherwise, it should return FALSE. 

Remarks

An application must use the SendMessage function to send this message, not
the PostMessage function. 
The data being passed must not contain pointers or other references to
objects not accessible to the application receiving the data. 
While this message is being sent, the referenced data must not be changed by
another thread of the sending process. 
The receiving application should consider the data read-only. The pcds
parameter is valid only during the processing of the message. The receiving
application should not free the memory referenced by pcds. If the receiving
application must access the data after SendMessage returns, it must copy the
data into a local buffer. 
</quote>

The COPYDATASTRUCT referred here is very simple:
    DWORD dwData -- single dword to pass: used only if lpData is 0 
    DWORD cbData -- number of bytes pointed by lpData 
    PVOID lpData -- pointer to data

The constant WM_COPYDATA is #004A.
The copying of data must take place inside the raw message handler you'll
set for WM_COPYDATA.
Google for the WM_COPYDATA for more articles on using this message for
interprocess communication.

CChris

new topic     » goto parent     » topic index » view message » categorize

11. Re: How to write graphics to MS Windows clipboard

CChris wrote:
> 
> DB James wrote:
> > 
> > CChris wrote:
> > > A way nicer version using a Pixmap:
<SNIP>
> > Thanks, that works like a charm.
> > 
> > Do you think a bitmap-in-memory can be sent (with OLE or DDE or whatever) to
> > be pasted into some other program?  It isn't uncommon to see programs do
> > this, such as IrfanView's send of an image that does not exist as a disk
> > file
> > to some other graphic editor.
> > 
> > --Quark
> 
> There is a dedicated Windows message for that, which is WM_COPYDATA.
> The trick there is that the data you pass must be accessible from the
> process you are sending this message to, so it must not contain private
> pointers. Here is the reference for this message:
> <quote>
> WM_COPYDATA 
> wParam = (WPARAM) (HWND) hwnd;            // handle of sending window 
> lParam = (LPARAM) (PCOPYDATASTRUCT) pcds; // pointer to structure with data
> 
>  
> The WM_COPYDATA message is sent when an application passes data to another
> application. 
> 
> Parameters
> hwnd:
>   Identifies the window passing the data. 
> pcds:
>    Points to a COPYDATASTRUCT structure that contains the data to be passed.
> 
> 
> Return Value
> 
> If the receiving application processes this message, it should return TRUE;
> otherwise, it should return FALSE. 
> 
> Remarks
> 
> An application must use the SendMessage function to send this message, not
> the PostMessage function. 
> The data being passed must not contain pointers or other references to
> objects not accessible to the application receiving the data. 
> While this message is being sent, the referenced data must not be changed by
> another thread of the sending process. 
> The receiving application should consider the data read-only. The pcds
> parameter is valid only during the processing of the message. The receiving
> application should not free the memory referenced by pcds. If the receiving
> application must access the data after SendMessage returns, it must copy the
> data into a local buffer. 
> </quote>
> 
> The COPYDATASTRUCT referred here is very simple:
>     DWORD dwData -- single dword to pass: used only if lpData is 0 
>     DWORD cbData -- number of bytes pointed by lpData 
>     PVOID lpData -- pointer to data
> 
> The constant WM_COPYDATA is #004A.
> The copying of data must take place inside the raw message handler you'll
> set for WM_COPYDATA.
> Google for the WM_COPYDATA for more articles on using this message for
> interprocess communication.
> 
> CChris

Thanks for that information.  After I sent my message I rooted around on the
MS site and, among many other things, saw the SendMessage and WM_COPYDATA
and wondered if that was a way to go.  Now that I know you think so, I'll
poke into it and do some testing.  Hold not thy breath,though.

Thanks again,

--Quark

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu