MyApp(.NET c#)由OtherApp(c ++)触发。
触发后,我的应用程序将占据整个屏幕并为用户提供两个选项。一个选项退出MyApp并返回到OtherApp主屏幕。第二个选项退出初始屏幕并显示另一个用户输入屏幕 - 输入后退出并返回到OtherApp。
有时候,OtherApp屏幕不会重新绘制(只能看到背景,而不能看到按钮) - 我无法轻易复制这个(当我这样做时看起来像是侥幸),但我已经在很多应用程序上看到了它。
有没有办法MyApp可以强制屏幕重绘OtherApp?
可能导致这种情况的原因是什么?
澄清 - 其他应用不是我们的。我们的客户使用OtherApp。 MyApp由filewatcher事件触发。当我们看到一个文件时,我们会处理它。如果这是我们要查找的文件,我们会为用户提供两个选项。 OtherApp不知道MyApp存在。
答案 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属性来获取句柄。