在程序之间切换时重新绘制问题

时间:2011-07-05 05:48:02

标签: c# .net c++ repaint

MyApp(.NET c#)由OtherApp(c ++)触发。

触发后,我的应用程序将占据整个屏幕并为用户提供两个选项。一个选项退出MyApp并返回到OtherApp主屏幕。第二个选项退出初始屏幕并显示另一个用户输入屏幕 - 输入后退出并返回到OtherApp。

有时候,OtherApp屏幕不会重新绘制(只能看到背景,而不能看到按钮) - 我无法轻易复制这个(当我这样做时看起来像是侥幸),但我已经在很多应用程序上看到了它。

有没有办法MyApp可以强制屏幕重绘OtherApp?

可能导致这种情况的原因是什么?

澄清 - 其他应用不是我们的。我们的客户使用OtherApp。 MyApp由filewatcher事件触发。当我们看到一个文件时,我们会处理它。如果这是我们要查找的文件,我们会为用户提供两个选项。 OtherApp不知道MyApp存在。

3 个答案:

答案 0 :(得分:3)

在OtherApp中,添加Application.DoEvents()的C ++等价物。它显然不处理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 :(得分:3)

尝试获取OtherApp主窗口的hwnd并使整个事件无效:

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

答案 2 :(得分:1)

由于OtherApp不是您的应用程序,您可以使用Win32 SendMessage Function修改MyApp并向OtherApp发送消息。要在C#中执行此操作,请查看C# Win32 messaging with 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属性来获取句柄。