2009-07-27 4 views
0

私は以下のコードを使用してプログラムをプログラムから終了します。 私はこのコンセプトを初めて利用しています。このコードを以下に使用する方法を知りたい。C#でWM_Closeを使用する

ロジック:私は終了するプロセス名を持っています。私はこの機能に を割り当てます。

メモ帳を終了したい場合、[Process Name]パラメータをこの関数に渡すにはどうすればいいですか?

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

    public void CloseWindow(IntPtr hWindow) 
    { 
     SendMessage(hWindow, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); 
    } 
+0

Mehrdadの応答について: 'CloseMainWindow'はそれが仕事だ行うには、' WM_CLOSE'を使用しています。 'WM_CLOSE'の定数は0xF060ではなく0x10です。 – Thorarin

答えて

1

私はMehrdadの答えに同意しますが、実際にホイールを再発明したい場合は、これを行う方法です(これはエラーチェックなどなしで自分で追加してください)。ところで

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

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

static uint WM_CLOSE = 0x10; 

static bool CloseWindow(IntPtr hWnd) 
{ 
    SendMessage(hWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); 
    return true; 
} 


static void Main() 
{ 
    IntPtr hWnd = FindWindowByCaption(IntPtr.Zero, "Untitled - Notepad"); 
    bool ret = CloseWindow(hWnd); 
} 

Here is a good place to view Managed declarations of native API's

5

手動でメッセージを送信する代わりにProcess.CloseMainWindowを使用してください。あなたがProcessのメインウィンドウのハンドルを取得するためにMainWindowHandleを使用することができ、また

using System.Diagnostics; 
// ... 

foreach (var process in Process.GetProcessesByName("notepad.exe")) 
    process.CloseMainWindow(); 

とそれにメッセージを送信:これは、プロセスのメインウィンドウにメッセージを送信します

foreach (var process in Process.GetProcessesByName("notepad.exe")) 
    CloseWindow(process.MainWindowHandle); // CloseWindow is defined by OP. 

メインウィンドウを閉じる代わりにプロセスを直ちに終了したい場合は、これは良い方法ではありません。代わりにProcess.Killメソッドを使用する必要があります。

+0

@Mehrdad、私はWM_Closeを必要な目的のために使いたい。ありがとう – Anuya

+2

'CloseMainWindow'は' WM_Close'をプロセスのメインウィンドウに送ります。手動で行う場合は、 'MainWindowHandle'でハンドルを取得し、手動でそのHWNDにメッセージを送ります。しかし、このいわゆる所要量はかなりばかげていて、そのロジックでは、.NETライブラリから何も使用せず、すべてのものを再開発するべきではありません。 –

関連する問題