Перекрасить проблемы при переключении между программами - PullRequest
7 голосов
/ 05 июля 2011

MyApp (.NET c #) запускается OtherApp (c ++).

При запуске мое приложение занимает весь экран и предоставляет пользователю две опции.Один из вариантов завершает работу MyApp и возвращает на главный экран OtherApp.Второй вариант выходит из начального экрана и показывает другой экран для ввода пользователем - после ввода он выходит и возвращается в OtherApp.

Иногда экран OtherApp не перерисовывается (можно видеть только фон, а не кнопки) - я не могу легко воспроизвести это (когда я делаю это похоже на случайность), но я видел его на рядеприложений.

Есть ли способ, которым MyApp может вызвать перерисовку экрана OtherApp?

Что может быть причиной этого?

РАЗЪЯСНЕНИЕ - ДРУГОЕ ПРИЛОЖЕНИЕ НЕ НАШЕ.Наш клиент использует OtherApp.MyApp запускается событием FileWatcher.Когда мы видим файл, мы обрабатываем его.Если это файл, который мы ищем, мы предоставляем пользователю два варианта.OtherApp не знает, что MyApp существует.

Ответы [ 3 ]

3 голосов
/ 06 июля 2011

Попробуй получить hwnd главного окна OtherApp и лишить законной силы все это:

[DllImport("user32.dll")]
static extern bool InvalidateRect(IntPtr hWnd, IntPtr lpRect, bool bErase);

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

static void InvalidateOtherApp()
{
  IntPtr hWnd = FindWindow(null, "OtherApp's Main Window's Title");
  if (hWnd != IntPtr.Zero)
    InvalidateRect(hWnd, IntPtr.Zero, true);
}
3 голосов
/ 05 июля 2011

В OtherApp добавьте C ++ эквивалент Application.DoEvents ().Это, очевидно, не обрабатывает сообщения Windows.Вы можете сделать это следующим образом, взятый из примера программы Microsoft Vterm:

void CMainFrame::DoEvents()
{
MSG msg;

// Process existing messages in the application's message queue.
// When the queue is empty, do clean up and return.
while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE) && !m_bCancel)
{
if (!AfxGetThread()->PumpMessage())

return;
}
}
1 голос
/ 06 июля 2011

Поскольку OtherApp не является вашим приложением, вы можете изменить свое MyApp и отправить сообщение в OtherApp с помощью Win32 SendMessage Function . Для этого в C # проверьте Обмен сообщениями C32 Win32 с SendMessage . Сообщение, которое вы хотите отправить: WM_PAINT . На сайте используется другое сообщение, но идея та же. Ваш код будет примерно таким:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
private static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam);

int WM_PAINT = 0xF;
SendMessage(hWnd, WM_PAINT, IntPtr.Zero, IntPtr.Zero);

Это отправит ваше сообщение о перерисовке в приложение. Вам необходимо предоставить hWnd дескриптор окна OtherApp. Чтобы получить дескриптор окна, вам нужно вызвать класс System.Diagnostics.Process, чтобы найти ваше приложение, и вызвать свойство MainWindowHandle , чтобы получить дескриптор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...