アプリ版:「スタンプのみでお礼する」機能のリリースについて

WaitForSingleObjectを使って対象のアプリケーションが終了するまで
無限ループして対象のアプリケーションが終了したら無限ループを
抜ける事はできるでしょうか?あまりWaitForSingleObjectを理解していないので
意味がわからない質問かもしれませんが、よろしくお願いします。

A 回答 (4件)

>補足にかけなかったのですがfor(;WaitForSingleObject(hProcess, 1000) == WAIT_TIMEOUT;) {


>でfor文のループを回したらGetAsyncKeyStateを使えますが1秒で終了してしまいます

で、今はどう書いているんです?
# まぁ、内容がアレなのでforループではなくwhileループでもいいんですけどね。

while(WaitForSingleObject(hProcess, 1000) == WAIT_TIMEOUT) {
 //終了待ちの間に実行したい処理(間隔はWaitForSingleObject()の第2引数の値次第)
}
って感じですかねぇ。
    • good
    • 0
この回答へのお礼

すみませんでした。
1秒で終了するのは書き間違えでした。
うまく対象のアプリケーションが終了するまで起動して
GetAsyncKeyStateを使えるようになりました。
本当に感謝です(^^)
またお世話になるかもしれませんがその時は、よろしくお願い致します。m(__)m

お礼日時:2013/05/25 22:37

>WaitForSingleObject()を使って対象のアプリケーションが終了するまでProgramを実行することは出来るようになったのですが


>待機している間GetAsyncKeyStateを使ってF1を押すとMessageが出るようにすることは可能ですか?
>考えたプログラムは↓のようにしたのですがダメでした。

そりゃ、指定したプロセスが終了(シグナル状態)になるまでWaitForSingleObject()から戻って来ません(INFINITE=無限待ち)から無理ですわな。
WaitForSingleObject()の第2引数を指定して、ループで回すようにすることで対処できるでしょう。
具体的な例は回答済みですけどね。
#1のコードだと終了までの間、おおよそ1秒毎に"."が表示されるようになってます。
# ちなみに、MessageBox()だと表示中に終了された場合はすぐに検出できませんよ。

この回答への補足

とても丁寧に説明していただきありがとうございます(^^)
ですが無知すぎて申し訳ないのですが
>>WaitForSingleObject()の第2引数を指定して、ループで回すようにすることで対処できるでしょう。
WaitForSingleObject(hProcessHandle,○○○)
○○○のところとwhile文の()のなかどどうやって書けばいい出ようか?

補足日時:2013/05/25 21:16
    • good
    • 0
この回答へのお礼

補足にかけなかったのですがfor(;WaitForSingleObject(hProcess, 1000) == WAIT_TIMEOUT;) {
でfor文のループを回したらGetAsyncKeyStateを使えますが1秒で終了してしまいますGetAsyncKeyStateを使えてなおかつ対象のアプリケーションが終了するまでプログラムを実行するにはどうしたらよいでしょうか?

お礼日時:2013/05/25 21:38

>printf("\nメモ帳がしました。

\n");

printf("\nメモ帳が終了しました。\n");
です。
くだらない間違いですが。

実際に使用する場合には別にスレッド起動して、WaitForMultipleObjects()辺りを使うべきでしょう。
# 監視スレッドを終了させる為のイベントオブジェクトとか設定して。

まかり間違ってもプロシージャ内で無限ループしないように。
「(応答無し)」とかのラベルを授与されますからね。
    • good
    • 0

「WaitForSingleObject プロセス 終了待ち」で検索すれば、そこそこ見つけられるかと。


ただし…
http://oshiete.goo.ne.jp/qa/8101869.html
で指摘されているように自分で起動したものではないプロセス…の場合は面倒かも知れません。
OpenProcess()でハンドルが取れるかどうか…とか。
# 実行ファイル名が同名の別アプリかも知れない。という問題もありますし。

あとは…WaitForSingleObject()の待ち時間を無限に設定したりすると、
自分のアプリの終了に不具合があるかも知れませんので注意が必要かもしれません。

ということで前回の質問の#1さんのプログラムを改造してみました。
# WinExec()で起動したメモ帳は待てましたが…他から起動したメモ帳だとGetModuleBaseName()で実行ファイル名が取得できませんでした。
# 権限の問題かも知れませんな。

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <psapi.h>

#define MAX_STR 500
#define MAX_ARRAY 1024

int main() {
DWORD procIdList[MAX_ARRAY];
DWORD retSize;
int nProc;
int i;
char procName[MAX_STR];
HANDLE hProcess;
HMODULE hMod;

//メモ帳を起動してやる
WinExec("notepad.exe", SW_SHOWNORMAL);

//プロセスIDの一覧を取得
if (!EnumProcesses(procIdList, sizeof(procIdList), &retSize)) {
printf("EnumProcesses関数が失敗\n");
return 1;
}

nProc = retSize / sizeof(DWORD);
//printf("%d個のプロセス\n", nProc);

for (i = 0; i < nProc; i++) {
strcpy(procName, "");

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | SYNCHRONIZE, FALSE, procIdList[i]);

if (hProcess != NULL) {
//プロセス名の取得
retSize = sizeof(hMod);
if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &retSize)) {
GetModuleBaseName(hProcess, hMod, procName, MAX_STR / sizeof(char));
}
}

//メモ帳が起動中かどうか確認する
if (strcmp(procName, "notepad.exe") == 0) {
//メモ帳を確認
break;
}
CloseHandle(hProcess);
hProcess = NULL;
}

if (hProcess != NULL) {
printf("メモ帳が起動しています。\n終了を待ちます。\n");
for(;WaitForSingleObject(hProcess, 1000) == WAIT_TIMEOUT;) {
printf(".");
}
printf("\nメモ帳がしました。\n");
CloseHandle(hProcess);
} else {
printf("メモ帳を確認できません。終了します。\n");
}

return 0;
} //end of main

この回答への補足

WaitForSingleObject()を使って対象のアプリケーションが終了するまでProgramを実行することは出来るようになったのですが
待機している間GetAsyncKeyStateを使ってF1を押すとMessageが出るようにすることは可能ですか?
考えたプログラムは↓のようにしたのですがダメでした。
他にありますでしょうか?
#include <windows.h>
#include<tchar.h>

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
{
DWORD proccess_ID;
HWND hWnd = FindWindow("classname" ,"windowtitle");
GetWindowThreadProcessId(hWnd, &proccess_ID);
HANDLE hProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, NULL, proccess_ID);
if(hProcessHandle != 0){
if( GetAsyncKeyState( VK_F1 ) & 1 ){
MessageBox(NULL, "起動中でもキーが押せます", "F1を押しました。", MB_OK + MB_ICONINFORMATION);

}

WaitForSingleObject(hProcessHandle,INFINITE);
CloseHandle(hProcessHandle);
MessageBox(NULL, "対象のアプリケーション終了", "Success", MB_OK + MB_ICONINFORMATION);
}
}

補足日時:2013/05/25 20:33
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!