2012-02-12 22 views
11

私はいくつかの名前(任意のアプリケーション、例えば電卓など)でウィンドウを閉じたいです。どのようにC#でそれを行うには? WinAPI関数をインポートしますか?ウィンドウを名前で閉じるにはどうすればいいですか?

+3

http://www.codeproject.com/Articles/22257/Find-and-Close-the-Window-using-Win-API ... google roxあなたが知っている – m0s

+0

重複している可能性があります。 http://stackoverflow.com/questions/116090/how-do-i-kill-a-process-using-vb-net-or-c – Lloyd

+0

@Lloyd:重複ではなく、プロセスを強制終了することはウィンドウを閉じる。 –

答えて

23

はい、Windows API関数をインポートする必要があります。FindWindow()SendMessage();定数はWM_CLOSEです。 Windows API関数の

ネイティブの定義:

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

/// <summary> 
/// Find window by Caption only. Note you must pass IntPtr.Zero as the first parameter. 
/// </summary> 
[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); 

const UInt32 WM_CLOSE = 0x0010; 

クライアントコード:

IntPtr windowPtr = FindWindowByCaption(IntPtr.Zero, "Untitled - Notepad"); 
if (windowPtr == IntPtr.Zero) 
{ 
    Console.WriteLine("Window not found"); 
    return; 
} 

SendMessage(windowPtr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); 
+1

はい、これはメモ帳でうまくいきます(もちろん、ウィンドウのタイトルはあなたがここで与えたものと完全に同じですが、おそらくこれは大部分ではありません)。しかし、単一のトップレベルウィンドウを閉じた後にアプリケーション全体を閉じるように特別に設計されていない限り、複数のトップレベルウィンドウを持つアプリケーションでは機能しません。それ以外の場合は、アプリが閉じられるように、最上位のウィンドウのそれぞれに 'WM_CLOSE'を送る必要があります。 –

+1

さらに、アプリはWM_CLOSEに応答することもできますが、好きです。たとえば、一部のプログラムでは、実際に閉じるのではなく、このメッセージの受信時にタスクバーの通知領域に最小限に抑えることを選択します。アプリケーションがメッセージにどのように応答するかを制御することはできないので、このメソッドを広範囲にテストし、未知のアプリケーションや未テストのアプリケーションを扱う際に、脆弱な可能性を認識する必要があります。 –

+0

この 'CloseWindow(windowPtr)'のように正しいですか? –

1

あなたが他のプロセスに属するウィンドウを閉じますしようとしています。それはあなたが信頼できると思うものではありません。まず、あなたはこれらのウィンドウを所有していないので、他のプロセスのウィンドウに移動して混乱させる自動資格はありません。

もう1つの答えが示すように、ウィンドウにWM_CLOSEを送信してみることはできますが、他のプロセスが実際にそれを尊重する権利がないという警告が付属しています。 WM_CLOSEへの応答は、受け入れられるものであれば何でもかまいません。後者の場合は、本当に選択肢がありません。それはあなたのプロセスではありません。間には、あなたが見たように、どんな種類の中間ウィンドウやダイアログボックスなどもあります。

ここで何を達成しようとしていますか?なぜ他のプロセスに属するウィンドウを閉じようとしていますか?目的が何であるかを明確にするのに役立つかもしれません。

関連する問題