Configure o Windows XP Embedded para descartar automaticamente MessageBoxes inesperados

1

Eu tenho a necessidade de configurar um sistema Windows XP Embedded para descartar Messageboxes modais com uma resposta padrão.

Estou ciente do recurso EnableDefaultReply , mas preciso estar mais seletiva em quais MessageBoxes descartar ou selecionar a resposta padrão em alguns critérios (exemplo: nome da janela).

Meu maior problema agora é:

  • Se não ativar o Recurso EnableDefaultReply: alguns serviços de fundo aparecer caixas de diálogo que nunca são descartadas e bloquear o aplicativo
  • Se eu ativar o recurso EnableDefaultReply: não posso mais fazer logon ao sistema se outro usuário estiver logado (um popups MessageBox perguntando se você quiser roubar o logon e a resposta padrão é NÃO).

Você tem alguma experiência que possa compartilhar com esse problema?

    
por Pokot0 10.03.2010 / 17:34

2 respostas

1

Eu escrevi um aplicativo C # no .net 2.0 dias, então isso deve funcionar, já que o embedded pode ter 3.0

Este é um código feio de quando eu era um iniciante, mas você poderia escrever algo que usa as chamadas api encontradas aqui e passa a maior parte do tempo dormindo a menos que veja uma janela que precisa matar. Outros casos em que você pode precisar licenciar um aplicativo que essencialmente faz a mesma coisa. :) Além disso, se você não pode colocar .net lá, estas são chamadas padrão do Windows, então qualquer programador C ++ na loja poderia colocar isso junto para você em cerca de 2 horas.

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

}

    
por 14.08.2010 / 22:45
0

Esta não é uma resposta direta à sua pergunta, mas a sugestão de uma possível solução alternativa.

Quando estava trabalhando com máquinas Windows XP Embedded, sempre instalava Ultra VNC para acesso remoto. Isso significava que eu poderia assumir o controle de uma máquina sem bloquear o operador local. Também significava que eu poderia me conectar para observar o que estava acontecendo. Isso foi muito útil ao falar com clientes ou engenheiros de serviço de campo por meio de problemas que eles estavam tendo.

A outra coisa que eu gosto no UVNC é que, se a criptografia estiver habilitada no lado do host, você pode ter certeza de que ninguém será capaz de acidentalmente fazer uma conexão insegura.

    
por 30.03.2010 / 12:23

Tags