Отправка WM_COPYDATA, но получение WM_ACTIVATEAPP на принимающей стороне

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

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

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

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

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

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

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

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

1 ответ

Решение

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

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

Другие вопросы по тегам