2016-07-01 1 views
-1

こんにちはみんなは、私はもっとして2日、私は私のprogrameはスペシフィックアプリケーションを監視し、それがために待つようにしたいDOにこだわりましたので、ここでループ

のためにこのコードブロックで立ち往生して以来、私の問題がありながら、昼食私が試した「DOとしながらループ」が、その私がチェックし、再チェックしている動作していないと私は窓「」

 HWND hwnd = FindWindow(0,("my programme window name")); 

     do { 
     if(hwnd == nullptr) {   /* if the window has not beign found */ 
     cout << "window not found!" << endl; 
     Sleep(1000); 
     system("cls"); 
     } 
     }while(hwnd == nullptr); 

    /*******************************************************************/ 

starting the next code once the window of the programe has been found 

ので、私の問題は、私が得続けるでこの問題の解決策を見つけるcouldntのではありません私が自分のプログラムを最初に起動し、次に昼食を願うときに見つけた私は監視しようとするが、私はプログラムを起動したとき、私はそう、私は私自身のプログラムのすべてが編集の問題は、あなたのループで

+1

ループ内のhwndは変更されないので、決して終了しません。 – drescherjm

答えて

1

最初のもの:ポーリングが間違っています。

特定のウィンドウが作成されたことを知らせる必要がある場合は、このために特別に調整されたツールを使用します。 EVENT_OBJECT_CREATEイベントをリッスンするWinEventsフック(SetWinEventHook)を設定します。 WinEventProcコールバックでは、ウィンドウタイトル、ウィンドウクラス、特定のスタイル(およびそれらの組み合わせ)を調べることで、目的のウィンドウをフィルタリングできます。

これは、1秒ごとにポーリングするようなリソースを無駄にせず、競合条件も表示しません(たとえば、サンプリングポイント間で作成されて破棄されたウィンドウがないなど)。

+0

私はすでに問題を解決するためにthxを修正しました。私はWinEventを使用しようとします。 –

1

何をslovedないhwndを変更する---あなたの助けのために罰金

TNKS仕事起動監視したいですあなたが見たようにループから抜け出すことは不可能です。

hwndのループ内に何かを作成して、最終的にhwnd== nullptrにならないようにする必要があります。例えばhwnd = FindWindow(0,("my programme window name"));

私がにリファクタリングしたい:それはループに入ったときhwndの値がnullptrだったと仮定すると

HWND hwnd = FindWindow(0,("my programme window name")); 
while(hwnd == nullptr) 
{ 
    cout << "window not found!" << endl; 
    Sleep(1000); 
    system("cls"); 
    hwnd = FindWindow(0,("my programme window name")); 
} 
+0

私はちょうどまだ動作していないこの1つを試みたが、まだコードの最初のブロックのループに詰め込まれている –

1

。ループ内の値は変更されません。条件hwnd == nullptrは常に真であるため、無限ループが発生します。

この問題を解決するには、ループ内でhwndの値を変更する必要があります。

5

ループの内側にhwndを変更していません。ループ内でFindWindow()に電話する必要があります。 do-whileの代わりに通常のwhileループを使用することができます。したがって、コールを2回行う必要はありません。

while ((hwnd = FindWindow(0, "my programme window name")) == nullptr) { 
    cout << "window not found!" << endl; 
    Sleep(1000); 
    system("cls"); 
} 
+0

Thxの男は、私はちょうどテストし、その仕事が、私のコードの残りの部分は、 loop –

+0

これは質問された質問に対処(および解決)していますが、間違った方法を完全に実装するのに役立ちます。 [ポーリングが間違っている](http://stackoverflow.com/a/38141932/1889329)。 – IInspectable

-2

HWNDは、Windows内部のデータ構造体へのポインタです。これは、ウィンドウが作成された後にのみ使用可能です。だからあなたは必要なハンドルを返さない時までウィンドウをルックアップする必要があります。 Barmarは、このチェックを行うための非常に簡潔な方法を提供しました。

ウィンドウが見つかると、whileループから抜け出す必要があります。おそらくこれがあなたの後続のロジックが呼び出されないように思われる理由かもしれません。

また、このコードをメインスレッド内で実行していますか?はいの場合は、スリープを使用する必要がありますか?代わりにWM_TIMERイベントを使用することをお勧めします。メインスレッドは他のシステムイベントを処理するために自由になり、スリープ状態にはなりません。

-1

私はあなたが次のようにDO-whileループを実装勧め:

HWND hwnd = FindWindow(0,("my programme window name")); 

while(hwnd == nullptr) { 
    cout << "window not found!" << endl; 
    Sleep(1000); 
    system("cls"); 
    hwnd = FindWindow(0,("my programme window name")); 
} 

hwndの値のためのループチェックをし、それがループに入るnullptrに等しい場合、エラーメッセージを出力し、 1秒間待ってから画面をクリアし、指定されたウィンドウの存在を再確認します。

ところで、多くのIDEにはがトレースしてプログラムを実行する機能(MSVCでは「ステップイン」)があります。この機能を使用すると、実行時に問題がどこにあるかを確認できます。ソリューションを構築するだけで(まだ実行しないでください)、F11 key(MSVCでは - 残りの部分についてはわかりません)を押してこの機能を使用してください。

-2

問題は "FindWindow(0、("私のプログラムウィンドウ名 "))"は利用可能なhwndを返すことができないのでループが止まっていると思います。

おそらく、hwndがまだヌルだった場合は、10回試すことができます。ループを解除するか、プログラムを終了してください。

#define MAX_COUNT 10 
HWND hwnd = FindWindow(0,("my programme window name")); 
int count = 0; 
while(hwnd == nullptr && count < MAX_COUNT) { 
    count++; 
    cout << "window not found!" << endl; 
    Sleep(1000); 
    system("cls"); 
    hwnd = FindWindow(0,("my programme window name")); 
} 
関連する問題