Hi,

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

Code:
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:

Code:
       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.