C++で外部アプリを終了させたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
DAICHI0922
記事: 26
登録日時: 5年前

C++で外部アプリを終了させたい

#1

投稿記事 by DAICHI0922 » 5年前

C++でCtrl+Delを押すと、フォアグラウンドの外部アプリを終了させるプログラムを書いています。

以下のようなプログラムなのですが、うまくいくときと行かないときがあります。
メモ帳のような単一のexeで動いているプログラムは終了できるのですが、その他のアプリは終了できないようです。以下のコードでは、PostMessageを使っていますがDestroyWindowやTerminateProcessなども使ってみましたが無理のようです。まるでメッセージを送っても処理する気が無いように...

このプログラムのどこがおかしいか指摘していただけると嬉しいです。

コード:

#include<Windows.h>
#include<thread>

using namespace std;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR CmdLine, int CmdShow) {
	MSG msg;
	LPSTR lpStr = 0;
	while (TRUE) {
		if (GetAsyncKeyState(VK_CONTROL) < 0 && GetAsyncKeyState(VK_DELETE) < 0) {
			HWND hWnd = GetForegroundWindow();
			if (hWnd == NULL) {
				MessageBox(hWnd, "ウィンドウを閉じることができませんでした", "エラー", MB_ICONERROR);
			}
			else {
				if (SendNotifyMessage(hWnd, WM_DESTROY, 0, 0) == 0) {
					MessageBox(hWnd, "ウィンドウを閉じることができませんでした", "エラー", MB_ICONERROR);
				}
				else this_thread::sleep_for(chrono::milliseconds(300)); //複数ウィンドウを閉じてしまうの防止
			}
		}

		if (GetAsyncKeyState(VK_CONTROL) < 0 && GetAsyncKeyState('Q') < 0) {
			HWND hWnd = GetForegroundWindow();
			int ret = MessageBox(hWnd, "終了しますか?", "ウィンドウ操作", MB_ICONINFORMATION | MB_YESNO);
			if (ret == IDYES)break;
		}
		this_thread::sleep_for(chrono::milliseconds(3)); //負荷を軽くするため?に少し止める
	}
	return 0;
}

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: C++で外部アプリを終了させたい

#2

投稿記事 by YuO » 5年前

基本的なこととして,WM_DESTROYDestroyWindowによって生成されるメッセージであって,
それを送ることでWindowを破棄するためのものではありません。
通常は,WM_CLOSEを送って処理を依頼します。
オフトピック
WM_CLOSEはWindowを閉じることの依頼
メモ帳などでは,WM_CLOSE→(確認)→DestroyWindow→WM_DESTROY→PostQuitMessageという流れで終了しているのだと思います。

DAICHI0922 さんが書きました:
5年前
メモ帳のような単一のexeで動いているプログラムは終了できるのですが、
だいたいは単一の.exeだと思うのですが……。
単一のexe→単一のWindowと読み替えるのであれば,該当するProcess内の全てのWindowにWM_CLOSEを送ればよいわけです。
つまり,GetWindowThreadProcessIdで目的のProcess IDを取得し,EnumWindowsで列挙したWindowのProcess IDを比較しながらWM_CLOSEを送っていく,という流れになります。
DAICHI0922 さんが書きました:
5年前
TerminateProcessなども使ってみましたが無理のようです。
TerminateProcessでプロセスが終了しない,は問題なのですが……。
無理と言うのは,TerminateProcessがTRUEを返したのに終了しなかった,ということですか?

DAICHI0922
記事: 26
登録日時: 5年前

Re: C++で外部アプリを終了させたい

#3

投稿記事 by DAICHI0922 » 5年前

ありがとうございます。
TerminateProcessは第一因数にウィンドウハンドルを渡してみたのですが、何一つ終了できませんでした。(エラーとなります)

GetWindowThreadProcessをつかってアルゴリズムの例、もう少し詳しく聞かしていただけませんか?

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: C++で外部アプリを終了させたい

#4

投稿記事 by あたっしゅ » 5年前

https://dobon.net/vb/dotnet/process/get ... title.html
ウィンドウのタイトルからプロセスを探す - DOBON.NET(ja)
ここでは、ウィンドウのタイトルバーに表示されているテキスト(タイトル、キャプション)、あるいは、ウィンドウが属しているクラス名から、そのウィンドウを作成したプロセスを探す方法を紹介します。

これで、どうだ。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: C++で外部アプリを終了させたい

#5

投稿記事 by あたっしゅ » 5年前

よく見たら、C++ じゃなくて、VB, C# だった。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: C++で外部アプリを終了させたい

#6

投稿記事 by あたっしゅ » 5年前

https://code.i-harness.com/ja-jp/q/1cd25f
c++ プロセスハンドル プロセスハンドル取得 - プロセスIDからメインウィンドウのハンドルを取得するには? - CODE Q&A 問題解決(ja)

http://akky.xrea.jp/mfc/appclose.html
起動したアプリケーションを終了させる(ja)
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

返信

“C言語何でも質問掲示板” へ戻る