Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SendMessage c WM_COPYDATA в C#, адрес на структуру!! 
V
    Опции темы
qweasd
Дата 3.8.2007, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



     
Код


 [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));


Мне нужно передавать именно адрес а не всю структуру!!!!
PM MAIL   Вверх
anonym
Дата 3.8.2007, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 27.11.2006

Репутация: 3
Всего: 3



можно попробовать написать ref cds
PM MAIL   Вверх
Stepan_Lameroff
Дата 3.8.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 16.12.2006

Репутация: 9
Всего: 14



Попробуйте так, должно работать.
Код

    [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);
    ...

PM MAIL   Вверх
qweasd
Дата 3.8.2007, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



Спасибо. 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. 


что я только не пытался сделать((( хелп плз
PM MAIL   Вверх
Stepan_Lameroff
Дата 4.8.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 16.12.2006

Репутация: 9
Всего: 14



Поставьте 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 
PM MAIL   Вверх
Stepan_Lameroff
Дата 4.8.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 16.12.2006

Репутация: 9
Всего: 14



Я так понимаю, Вы Winamp мучаете  smile 
Это должно помочь.

Присоединённый файл ( Кол-во скачиваний: 23 )
Присоединённый файл  WinampController.zip 3,32 Kb
PM MAIL   Вверх
qweasd
Дата 4.8.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



Сделал вот так
Код


...
        [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 - 5.8.2007, 13:27
PM MAIL   Вверх
qweasd
Дата 18.8.2007, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



Сделал вот так(и все заработало!!!!):

Код

        [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);


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0858 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.