Отправка WM_COPYDATA, но получение WM_ACTIVATEAPP на принимающей стороне - PullRequest
0 голосов
/ 16 декабря 2010

У меня есть следующий сценарий:

Мое приложение получает некоторые данные из командной строки.

После первого запуска мое приложение всегда запускает один экземпляр, и этот экземпляр будет находиться в памяти до тех пор, пока использование явно не скажет ему завершить работу, вместо того, чтобы просто скрывать форму, когда она не нужна.

Когда пользователь пытается запустить приложение во второй раз, процесс запускается, проверяет, есть ли еще одно в памяти, и если это правда, он отправляет сообщение WM_COPYDATA процессу в памяти с данными, полученными из командная строка и выходы.

Это хорошо работает, когда пользователь запускает приложение.

Мне нужно было запустить его с панели инструментов Microsoft Word 2003, поэтому я использовал для этого «Надстройку». Проблема в том, что когда мое приложение запускается из этой надстройки (с использованием класса Process), кажется, что процесс, уже находящийся в памяти, получает сообщение WM_ACTIVATEAPP вместо сообщения WM_COPYDATA, поэтому я не могу получить необходимые данные, отправленные из процесс запущен надстройкой.

Понятия не имею, почему это происходит и как это исправить. Я часами гуглил и ничего не помогало ...

Может кто-нибудь помочь?

1 Ответ

1 голос
/ 16 декабря 2010

Получение сообщения WM_ACTIVATEAPP вполне нормально, часть обычных уведомлений, которые отправляет Windows.Не думайте, что первое сообщение, которое вы получите, - WM_COPYDATA, продолжайте искать.Если вы не получили его вообще, значит, дескриптор окна, который вы использовали для отправки сообщения, был неверным.Что является очень распространенной проблемой, не так просто точно найти окно назад.

.NET Framework уже имеет очень хорошую поддержку для приложений с одним экземпляром, которые могут извлечь командную строку из второго экземпляра.Попробуйте использовать его вместо.Проверьте это сообщение в блоге .

...