Click to See Complete Forum and Search --> : COPYDATASTRUCT IPC reading data out


flavour404
May 4th, 2009, 09:10 PM
Hi,

In a c++ dll I am setting up a copydatastruct as follows:



enum MessageType
{
HCBT
//I will add more messages later
};

//CBT Action - what happened to the window, moved, resized etc.
enum HCBTAction
{
ACTIVATE,
CLICKSKIPPED,
CREATEWND,
DESTROYWND,
KEYSKIPPED,
MINMAX,
MOVESIZE,
QS,
SETFOCUS,
SYSCOMMAND,
Unknown
};


LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{

WPARAM xParam = 'x';
HCBTAction ha;

if (nCode < 0) // do not process message
return CallNextHookEx(hcbthook, nCode, wParam, lParam);

switch (nCode)
{
case HCBT_ACTIVATE:
ha = ACTIVATE; break;
case HCBT_CLICKSKIPPED:
ha = CLICKSKIPPED; break;
case HCBT_CREATEWND:
ha = CREATEWND; break;
case HCBT_DESTROYWND:
ha = DESTROYWND; break;
case HCBT_KEYSKIPPED:
ha = KEYSKIPPED; break;
case HCBT_MINMAX:
ha = MINMAX; break;
case HCBT_MOVESIZE:
ha = MOVESIZE; break;
case HCBT_QS:
ha = QS; break;
case HCBT_SETFOCUS:
ha = SETFOCUS; break;
case HCBT_SYSCOMMAND:
ha = SYSCOMMAND; break;
default:
ha = Unknown; break;
}

HCBTMessage(tWindow, ha);

return CallNextHookEx(hcbthook, nCode, wParam, lParam);
}

void HCBTMessage(HWND hTable, HCBTAction hAction)
{
if (hProcessCenter)
{
COPYDATASTRUCT cds;
::ZeroMemory(&cds, sizeof(COPYDATASTRUCT));
cds.dwData = HCBT;
cds.lpData = (PVOID)&hAction;
cds.cbData = sizeof(hAction);
::SendMessage(hProcessCenter, WM_COPYDATA, (WPARAM)hTable, (LPARAM)&cds);
}
}


And on my C# end I have:



const int WM_COPYDATA = 0x4A;

// Get access to the WM_COPYDATA message
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_COPYDATA)
{
//MessageBox.Show("got one");
OnCopyData(ref m);
}

base.WndProc(ref m);
}


public struct COPYDATASTRUCT
{
public int dwData;
public int cbData;
public IntPtr lpData;
};

enum MessageType
{
HCBT
};

//CBT Action - what happened to the window, moved, resized etc.
enum HCBTAction
{
ACTIVATE,
CLICKSKIPPED,
CREATEWND,
DESTROYWND,
KEYSKIPPED,
MINMAX,
MOVESIZE,
QS,
SETFOCUS,
SYSCOMMAND,
Unknown
};


private void OnCopyData(ref Message m)
{
// Get the COPYDATASTRUCT
COPYDATASTRUCT cds = new COPYDATASTRUCT();
cds = (COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT));

int intTmp;

// If the target moved, was resized etc.
if (cds.dwData == (int)MessageType.HCBT)
{
//what do I do here?

how do i actually get my data, in this case an int out of the struct?
}
}



The problem I am having is actually getting my int value out of the copydatastruct structure so that I can then do something with it?

Having real problems with the conceptually!

Thanks.

cilu
May 5th, 2009, 01:24 AM
Here some links:
http://www.koders.com/csharp/fid47D396D37237BF6C0E17E571F516BA72EDB8E02B.aspx
http://www.eggheadcafe.com/community/aspnet/2/10072331/capp-wmcopydata-and-s.aspx
http://www.codeproject.com/KB/threads/InterprocessCommunicator.aspx?display=Print