Как убить окно предупреждения в Windows, используя C #? - PullRequest
3 голосов
/ 23 июня 2010

Я использую пространство имен System.Diagnostics.Process в C # для запуска системного процесса, иногда этот новый созданный процесс не запускается должным образом, в этих случаях Windows отображает окно с предупреждением, предоставляющее информацию о сбойном процессе. Мне нужен способ закрыть (убить) это окно предупреждений программно. Я попробовал следующий код, но он не работает, потому что окно предупреждения не появится в списке Process.GetProcesses ().

foreach (Process procR in Process.GetProcesses())
{
    if (procR.MainWindowTitle.StartsWith("alert window text"))
    {
        procR.Kill();
        continue;
    } 
} 

Буду признателен за любую помощь в этом. Спасибо!

UPDATE : Просто хотел сообщить, что этот пример сработал для меня. Большое спасибо. Ниже приведен код, который может помочь кому-то еще. Код был протестирован с Visual Studio 2008, вам все еще нужны winform и кнопка, чтобы он работал.

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
/* More info about Window Classes at http://msdn.microsoft.com/en-us/library/ms633574(VS.85).aspx */

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        const uint WM_CLOSE = 0x10;

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

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);


        public Form1()
        {
            InitializeComponent();
        }

        /* This event will silently kill any alert dialog box */
        private void button2_Click(object sender, EventArgs e)
        {
            string dialogBoxText = "Rename File"; /* Windows would give you this alert when you try to set to files to the same name */
            IntPtr hwnd = FindWindow("#32770", dialogBoxText);
            SendMessage(hwnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
        }

    }
}

Ответы [ 2 ]

2 голосов
/ 23 июня 2010

Вы можете попробовать использовать PInvoke для вызова API FindWindow () по параметрам, таким как имя и / или класс окна, а затем PInvoke API SendMessage (window, WM_CLOSE, 0, 0), чтобы закрыть его.

0 голосов
/ 23 июня 2010

Правильно, потому что окно предупреждения (которое правильно называется окном сообщения) не является главным окном приложения.

Я думаю, вам нужно изучить окна процесса, используя EnumThreadWindows и GetWindowText .

...