Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用c关闭来自其他程序的消息框#_C# - Fatal编程技术网

C# 使用c关闭来自其他程序的消息框#

C# 使用c关闭来自其他程序的消息框#,c#,C#,我的问题是:我们的产品有一个自动化的构建过程。在编译其中一个VB6项目的过程中,会弹出一个消息框,要求用户单击“确定”,然后才能继续。作为一个自动化流程,这是一件坏事,因为它可能会在那里停留数小时,直到有人单击“确定”后才会移动。我们已经研究了VB6代码,试图抑制消息框,但是现在似乎没有人知道如何抑制它。因此,作为一个临时补丁,我正在开发一个程序,该程序将在后台运行,当消息框弹出时,关闭它。到目前为止,我能够检测到消息何时弹出,但我似乎找不到一个函数来正确关闭它。程序是用C#编写的,我使用use

我的问题是:我们的产品有一个自动化的构建过程。在编译其中一个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;                  
         }    
    }
} 

当您找到消息框时,尝试使用单击的
BN>类型和确定按钮的ID发送它。

您必须找到窗口,这是第一步。之后,您可以使用
SendMessage
发送
SC\u CLOSE
消息

样品 更多信息

@reggie:再看一遍这个问题。听起来好像消息框是由VB6编译器创建的,他们不知道是什么代码使编译器发出呜呜声。您能给它发送一个密钥吗?此外,您是否确定消息框中出现的内容没有“静默”或“静默”模式?如果您知道该事件是什么,我想您可以在ok按钮上引发click事件。SC_CLOSE消息将相当于单击窗口右上角的“X”。请注意,有些窗口没有“X”-因此如果SC_CLOSE不起作用,请尝试下面Ben Voigt的解决方案,告诉用户默认按钮已被单击。是的,但在这种情况下它应该起作用。Ben应该告诉OP如何找到OK按钮的ID。一个样本会很有趣。同意-我已经很久没有写过Petzold-C了,我记不起解决方案了。是这个吗?对我来说也是很久以前的事了。链接看起来不错,但不是c。@ChrisJones很乐意帮忙!祝您有个美好的一天!
[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);  
}