Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > SendMessage c WM_COPYDATA в C#


Автор: qweasd 3.8.2007, 17:55
     
Код


 [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
....

   private struct COPYDATASTRUCT
        {
            public int dwData;
            public char[] lpData;
            public IntPtr cbData;

        }

....
            
COPYDATASTRUCT cds;
            cds.dwData = IPC;
            cds.lpData = "filename".ToCharArray();
            cds.cbData = (IntPtr)(cds.lpData.Length + 1);
 

SendMessage(hwnd,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds); <-- КОД НА СИ++ 
<-- Как это переписать чтоб работало в си шарп??

Первые 3 параметра знаю как! а вот последний??:

SendMessage(hwnd, WM_COPYDATA, nul, (IntPtr)(&cds));


Мне нужно передавать именно адрес а не всю структуру!!!!

Автор: anonym 3.8.2007, 18:46
можно попробовать написать ref cds

Автор: Stepan_Lameroff 3.8.2007, 18:59
Попробуйте так, должно работать.
Код

    [StructLayout(LayoutKind.Sequential)]
    public struct COPYDATASTRUCT
    {
        public IntPtr dwData;
        public int cbData;
        public IntPtr lpData;
    }

    public const int WM_COPYDATA = 0x4a; // 74

    [DllImport("user32", CharSet=CharSet.Auto)]
    public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, ref COPYDATASTRUCT lParam);

    ...
    // хэндл окна, которому отправляем ???
    IntPtr hWnd = IntPtr.Zero;
    COPYDATASTRUCT lParam = new COPYDATASTRUCT();
    string str = "blablabla";

    lParam.cbData = str.Length * Marshal.SystemDefaultCharSize;
    lParam.dwData = IntPtr.Zero;
    lParam.lpData = Marshal.StringToHGlobalAuto(str);
    SendMessage(hWnd, WM_COPYDATA, 0, ref lParam);
    Marshal.FreeHGlobal(lParam.lpData);
    ...

Автор: qweasd 3.8.2007, 23:31
Спасибо. SendMessage выполняется но 

Код


...
SendMessage(m_hMainWinamp, WM_COPYDATA, nul, ref cds);///addr1);
           
            Marshal.FreeHGlobal(cds.lpData);

            int i = Marshal.GetLastWin32Error();
....


i = 1008
=
ERROR_NO_TOKEN = 
1008  = An attempt was made to reference a token that does not exist. 


что я только не пытался сделать((( хелп плз

Автор: Stepan_Lameroff 4.8.2007, 11:15
Поставьте SetLastError=true (по умолчанию false)
Код

    [DllImport("user32", CharSet=CharSet.Auto, SetLastError=true)]
    public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, ref COPYDATASTRUCT lParam);

и, если можно, побольше кода в студию  smile 

Автор: Stepan_Lameroff 4.8.2007, 11:35
Я так понимаю, Вы Winamp мучаете  smile 
Это должно помочь.

Автор: qweasd 4.8.2007, 12:27
Сделал вот так
Код


...
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern int SendMessage(IntPtr hwnd,
                                              int wMsg,
                                              int wParam,
                                              [In] ref COPYDATASTRUCT lParam);
....
        [StructLayout(LayoutKind.Sequential)]
        private struct COPYDATASTRUCT
        {
            public int cbData;
            public IntPtr dwData;

            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }
....
        const int IPC_PLAYFILE = 100;
        const int WM_COPYDATA = 0x004A;
...

            COPYDATASTRUCT cds;
            string filename = "D:\\12.mp3";
            cds.dwData = (IntPtr)IPC_PLAYFILE;
            cds.lpData = filename;
            cds.cbData = filename.Length + 1;

            //IntPtr hwnd = FindWindow(m_windowName, null);

            SendMessage(m_hMainWinamp, WM_COPYDATA, 0, ref cds);

int i = Marshal.GetLastWin32Error();


i = 1008
=
ERROR_NO_TOKEN = 
1008  = An attempt was made to reference a token that does not exist. 

Не работает((((

Автор: qweasd 18.8.2007, 12:48
Сделал вот так(и все заработало!!!!):

Код

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
....

        #region Nested type: COPYDATASTRUCT

        [StructLayout(LayoutKind.Sequential)]
        private struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }

        #endregion
...

            COPYDATASTRUCT cds;
            cds.dwData = (IntPtr)IPC_PLAYFILE;
            cds.lpData = filename;
            cds.cbData = filename.Length + 1;

            IntPtr buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(cds));
            Marshal.StructureToPtr(cds, buffer, false);
            SendMessage(m_hMainWinamp, WM_COPYDATA, nul, buffer);


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)