Как использовать WM_Close в C #? - PullRequest
5 голосов
/ 15 июля 2009

Может ли кто-нибудь дать мне пример использования WM_CLOSE для закрытия небольшого приложения, такого как Блокнот?

Ответы [ 2 ]

11 голосов
/ 15 июля 2009

Если у вас уже есть дескриптор для отправки.

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

//I'd double check this constant, just in case
static uint WM_CLOSE = 0x10;

public void CloseWindow(IntPtr hWindow)
{
  SendMessage(hWindow, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
}
...Continue Class...

Получить ручку может быть сложно. Управляющие классы-потомки (в основном WinForms) имеют дескрипторы, и вы можете перечислять все окна верхнего уровня с помощью EnumWindows (что требует более сложного p / invoke, хотя и незначительно).

1 голос
/ 15 июля 2009

Предположим, вы хотите закрыть блокнот. следующий код сделает это:

    private void CloseNotepad(){
        string proc = "NOTEPAD";

        Process[] processes = Process.GetProcesses();
        var pc = from p in processes
                 where p.ProcessName.ToUpper().Contains(proc)
                 select p;
        foreach (var item in pc)
        {
            item.CloseMainWindow();
        }
    }

Вопросы:

Если в блокноте есть несохраненный текст, появится всплывающее окно «Хотите сохранить ....?» диалоговое окно или, если процесс не имеет пользовательского интерфейса, он выдает следующее исключение

 'item.CloseMainWindow()' threw an exception of type 
 'System.InvalidOperationException' base {System.SystemException}: 
    {"No process is associated with this object."}

Если вы хотите немедленно завершить процесс, замените

item.CloseMainWindow()

с

item.Kill();

Если вы хотите пойти по пути PInvoke, вы можете использовать дескриптор из выбранного элемента.

item.Handle; //this will return IntPtr object containing handle of process.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...