配置 Windows XP Embedded 以自动关闭意外的消息框

配置 Windows XP Embedded 以自动关闭意外的消息框

我需要配置 Windows XP Embedded 系统以便使用默认回复关闭模态消息框。

我知道启用默认回复功能,但我需要更有选择性地关闭哪些消息框或根据某些标准选择默认答复(例如:窗口名称)。

我现在最大的问题是:

  • 如果不启用 EnableDefaultReply 功能:某些后台服务会弹出永不关闭的对话框并阻止应用程序
  • 如果我启用 EnableDefaultReply 功能:如果有其他用户登录,我将无法再登录系统(会弹出一个 MessageBox 询问您是否要窃取登录信息,默认答案为否)。

您有解决此问题的经验可以分享吗?

答案1

我在 .net 2.0 时代写过一个 C# 应用,所以它应该可以工作,因为嵌入式可以获得 3.0

这是我刚开始写代码时写的丑陋代码,但你可以写一些代码来使用这里提供的 api 调用,并且大部分时间都处于休眠状态,除非它看到需要关闭的窗口。否则你可能需要授权一个本质上做同样事情的应用程序。:) 另外,如果你不能在那里放 .net,这些是标准的 windows 调用,所以商店里的任何 c++ 程序员都可以在大约 2 小时内为你完成这些。

using System;
using System.Collections;
using System.Threading;               
using System.Runtime.InteropServices;   //  Dllimport

namespace osconfig
{
/// <summary>
/// Summary description for WindowHiding.
/// </summary>
public class WindowHiding
{
    ArrayList windowNames;
    private const int sleepTime = 100;

    //  For findind the windows dialogs that popup when devices are detected
    [DllImport ("user32.dll")]
    public static extern int ShowWindow (IntPtr hWnd, int nCmdShow);

    [DllImport("User32.dll", CharSet=CharSet.Auto)]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    //private const int SW_SHOW = 5;
    private const int SW_HIDE = 0;
    private const short WM_COPYDATA = 74;

    public WindowHiding(ArrayList wNames)
    {
        this.windowNames = wNames;
    }

    //  Spin a thread that hunts down and hides windows
    public void hideWindows()
    {
        //  Run until we are told to stop
        while (true)
        {
            IntPtr foundHardwareWindowHandle;
            int result;

            //  Look for each of the window names.
            foreach (string wName in this.windowNames)
            {
                try 
                {
                    foundHardwareWindowHandle = FindWindow(null, wName);

                    if (foundHardwareWindowHandle.ToInt32() > 0)
                    {
                        //  Found it.  Hide it.
                        result = ShowWindow(foundHardwareWindowHandle, SW_HIDE);
                    }
                }
                catch 
                {
                    //  Do nothing...
                }   
            }

            //  Go to sleep
            Thread.Sleep(sleepTime);
        }
    }
}

}

答案2

这不是对您的问题的直接回答,而是一种可能的解决方法的建议。

当我使用 Windows XP Embedded 机器时,我总是安装超级 VNC用于远程访问。这意味着我可以控制机器,而无需锁定本地操作员。这也意味着我只需连接即可查看正在发生的事情。这在与客户或现场服务工程师讨论他们遇到的问题时非常有用。

我对 UVNC 的另一个喜欢之处是,如果主机端启用了加密,那么您可以确保没有人能够意外建立不安全的连接。

相关内容