Приложение C #, загруженное без фокуса, все еще крадет его при первом введенном событии мыши - PullRequest
3 голосов
/ 19 августа 2010

У меня есть два приложения, первое - полное приложение DirectX, написанное на C ++, второе приложение - на C # и воспроизводящее флэш-видео, AVI, PDF и т. Д. С использованием ActiveX COM-объектов.Первое приложение затем захватывает содержимое этого приложения на c # и отображает его в трехмерной среде в виде текстуры.Все это работает как задумано, и у меня есть код в приложении DirectX, позволяющий мне отправлять события клавиш и мыши в приложение c # через SendMessage и PostMessage.

Моя проблема заключается в первоначальном запуске.У меня есть приложение c # для запуска без активации, используя:

protected override bool ShowWithoutActivation
{
    get { return true; }
}

, что эквивалентно SW_SHOWNOACTIVATE в вызове CreateProcess.Приложение запускается нормально и хорошо отрисовывается на текстуре приложения c ++.Однако, самый первый щелчок мыши заставляет приложение c # украсть фокус, и таким образом отбрасывает мой контекст DirectX.Кто-нибудь знает, почему это происходит, или если есть какой-то способ обойти это?

Если я запускаю приложение c # и никогда не нажимаю на него, приложение c ++ при запуске все еще работает как задумано, только при запуске черезкод:

STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
ZeroMemory(&pi, sizeof(pi));

si.cb   = sizeof(si);
si.dwFlags  = STARTF_USESHOWWINDOW | STARTF_USESIZE;
si.wShowWindow = SW_SHOWNORMAL;
si.dwXSize  = 400;
si.dwYSize  = 400;
if(!::CreateProcess(program, arguments, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
    return false;
}
else
{
    // use EnumWindows to conforim the app is open and get its HANDLE
}

Заранее спасибо за любую помощь, Уэйн

Ответы [ 2 ]

0 голосов
/ 04 сентября 2010

Отправка нажатий клавиш не похожа на правильный способ связи между двумя программами. Не могли бы вы установить какой-то интерфейс COM между двумя программами? Вот страница Microsoft на Межпроцессное взаимодействие с некоторыми другими методами.

0 голосов
/ 04 сентября 2010

Вы также можете попытаться скрыть главную форму c #, установив ее свойства как WindowState = Minimized и ShowInTaskbar = false.

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

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

...