3

編集: 質問を言い換えました。以下のコメントはすべて無視してください (5 月 7 日まで)。

まず、問題を説明します。
私のプロセスは、ITrayDeskBand::ShowDeskBand を使用してプログラムでデスクバンドを表示しようとしています。
OSがすべてのプロセスをロードしているとき(リセットまたはログアウト後)を除いて、いつでもうまく機能します。

Windows が起動し、さまざまなアプリケーションやサービスの読み込みを開始した後、マウス カーソルは数秒間待機するように設定されます (実行中のアプリケーションの数やすべての速度によって異なります)。

マウス カーソルが待機するように設定されていて、その間にプロセスが実行されている場合、呼び出しは失敗します。
ただし、プロセスが数秒待機してから (その後、カーソルが通常の状態になります)、呼び出しを呼び出すと、すべてがうまく機能します。

この動作は、Windows 7 と Windows Vista の両方で再現されました。

だから基本的に私が求めているのは:

1)基本的な知識のために、カーソルがビジーに設定されているときにOSは何をしますか?
2) より重要な質問: このプロセスが終了したことをプログラムで検出するにはどうすればよいですか?

最初は、エクスプローラーが正しくロードされていないと思ったので、WaitForInputIdleを使用しましたが、そうではありませんでした。

後で、ビジー カーソルは CPU がビジーであることを示していると考えたので、使用してプロセスを作成しましたIDLE_PRIORITY_CLASSが、カーソルがビジーである間にアイドル時間が受信されました。

4

3 に答える 3

5

失敗した場合ITrayDeskBand::ShowDeskBandは、メッセージを待ってからTaskbarCreated再試行してください。(これは、通知アイコンで使用されるのと同じ手法です。)

于 2012-05-09T02:16:52.600 に答える
5

Windows は、アプリケーションやサービスの読み込みを停止することはありません!

実際のところ、アプリケーションは行き来しますが、ユーザーの操作なしで対話的に使用できるものもあります。サービスでさえ、さまざまな時点でロードされます (設定と外部条件によって異なります。たとえば、Smard Card Resource Manager サービスは、Smard Card デバイスが接続されたことを OS が検出した場合にのみ開始される場合があります)。アプリケーションは自動的に停止できます (ただし停止してはなりません)。一部のサービスも同様です。

Windows がすべてのアプリケーションやサービスのロードをいつ停止するかはわかりません。

于 2012-05-08T11:57:41.430 に答える
1

明らかなアプローチは、ShowDeskbandが機能したかどうかを確認し、機能しなかった場合は、数秒後に再試行することです。私はあなたがすでにこのオプションを検討して拒否したと仮定しています。

カーソルを表示する基準を絞り込んだようですので、特定のカーソルを待ってみてはいかがでしょうか。次のように表示されているカーソルを見つけることができます。

CURSORINFO cinfo;
ICONINFOEX info;

cinfo.cbSize = sizeof(cinfo);
if (!GetCursorInfo(&cinfo)) fail();

info.cbSize = sizeof(info);
if (!GetIconInfoEx(cinfo.hCursor, &info)) fail();

printf("szModName = %ws\n", info.szModName);
printf("wResID = %u\n", info.wResID);

単純なカーソルのほとんどは、モジュールUSER32にあります。関連するリソースIDは、GetIconInfoの記事にリストされています。

どうやら、標準の矢印カーソルが表示されるのを待ちたいようです。これはモジュールUSER32にあり、リソースIDは32512(IDC_ARROW)です。

カーソルの種類を1秒間に10回確認することをお勧めします。矢印カーソルが10回続けて(つまり、1秒間)表示される場合、Explorerの起動が終了している可能性があります。

于 2012-05-09T02:05:43.777 に答える