使用C#关闭另一个程序的消息框

9
这是我的问题:我们的产品有一个自动化构建过程。在编译VB6项目的过程中,会弹出一个消息框,需要用户点击“确定”才能继续。这对于自动化处理来说是个坏事,因为它可能会一直停留在那里,直到有人点击“确定”。我们已经研究了VB6代码,试图抑制消息框,但目前没有人能够解决。因此,作为一个临时解决方案,我正在开发一个程序,在后台运行,当消息框弹出时,关闭它。到目前为止,我能够检测到消息框何时弹出,但我似乎找不到一个正确关闭它的函数。该程序是用C#编写的,我使用user32.dll中的FindWindow函数获取窗口指针。到目前为止,我已经尝试了closeWindow、endDialog和postMessage等方法来关闭它,但都没有成功。closeWindow只是最小化它,endDialog会出现内存异常,而postMessage则无效。有没有人知道其他可以解决这个问题的函数,或者其他消除这个消息的方法?谢谢。

这是我目前拥有的代码:

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

     static void Main(string[] args)
     {
         IntPtr window = FindWindow(null, "Location Browser Error");
         while(window != IntPtr.Zero)
         {
             Console.WriteLine("Window found, closing...");

             //use some function to close the window    

             window = IntPtr.Zero;                  
         }    
    }
} 

2
@reggie:请再读一遍问题。听起来好像是VB6编译器创建了消息框,而他们不知道是什么代码让编译器发出警告。 - Ben Voigt
你能发送一个<enter>键吗?另外,你确定弹出消息框的程序没有“静默”或“安静”模式吗? - jglouie
如果你知道那个事件是什么,我想你可以在“确定”按钮上触发点击事件。 - Hogan
2个回答

13

你需要找到窗口,这是第一步。在那之后,你可以使用SendMessage发送SC_CLOSE消息。

示例

[DllImport("user32.dll")]
Public static extern int SendMessage(int hWnd,uint Msg,int wParam,int lParam);
public const int WM_SYSCOMMAND = 0x0112;
public const int SC_CLOSE = 0xF060;

IntPtr window = FindWindow(null, "Location Browser Error");
if (window != IntPtr.Zero)
{
   Console.WriteLine("Window found, closing...");

   SendMessage((int) window, WM_SYSCOMMAND, SC_CLOSE, 0);  
}

更多信息


SC_CLOSE消息相当于单击窗口右上角的“X”按钮。请注意,有些窗口没有“X”按钮 - 因此,如果SC_CLOSE无法正常工作,请尝试Ben Voigt的解决方案,告诉用户已单击默认按钮。 - Ted Spence
是的,但在这种情况下应该可以工作。Ben 应该告诉 OP 如何找到“确定”按钮的 ID。提供一个示例会很有趣。 - dknaack
同意 - 我已经很久没有写Petzold-C了,我记不得解决方案了。是这个吗?http://www.codeproject.com/Articles/11262/Enumerate-Controls-In-a-Dialog-Box-or-FormView - Ted Spence
对我来说也是很久以前的事了。这个链接看起来不错,但它是C而不是C#。 - dknaack
[DllImport("user32.dll", EntryPoint = "FindWindow")] private static extern IntPtr FindWindow(string lp1, string lp2); - Narayan
如果对话框的标题与应用程序的标题相同(例如:Microsoft Excel),它将关闭应用程序。 - D T

1
当您找到消息框时,请尝试使用WM_NOTIFYBN_CLICKED类型以及OK按钮的ID发送它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接