1

自動的に閉じることによって更新呼び出しに応答する必要がある VB6 アプリケーションがあります。アプリケーションを閉じるためにユーザーの操作は必要ありません。システムダイアログが開かれている場合を除いて、これはすべて正常に機能します。このダイアログを使用して、ファイルを開いたり、プリンターのプロパティを設定したりできます。このようなもの:


(出典: tweakers.net )

[印刷設定] ウィンドウは正常に閉じますが、プロパティ ダイアログはシステム ダイアログであり、プログラムを閉じても閉じません。その結果、アプリケーションは閉じず、(目に見えない) アクティブなままになります。タスクマネージャーを使用して強制的に閉じる必要があります。

開いているフォームは、次のようなコードで検出できます。

For Each Form In Forms
    ...
Next Form

これらのダイアログは、開いているフォームのこの配列には表示されません。アプリケーションによって開かれたすべてのシステム ダイアログを検出し、それらを適切な方法で閉じる方法はありますか?

4

4 に答える 4

1

私自身の質問に半分答えています。私はまだより良い解決策を探していますが、これはこれまでのところうまくいきました。

EnumWindowsと一緒に使用して、表示されているすべてIsWindowVisibleのウィンドウの Hwnd を取得します。次に、祖先フォーム (開始フォーム) から Hwnd を取得するために使用します。すべてのフォームをループして、その祖先 Hwnd が自分のアプリケーションに属しているかどうかを確認します。それが私のアプリケーションに属している場合、WM_CLOSE by でウィンドウを閉じます。GetAncestorPostMessage

実行中のすべてのアプリケーションから開いているすべてのウィンドウを確認する必要があるため、これはおそらく最善の解決策ではありません。誰かがより良い解決策を持っているなら、私はそれを聞きたい. 自分のアプリケーション用に開いているウィンドウの Hwnd を単純に教えてくれるものは、おそらくスピードアップするでしょう。

于 2012-04-18T12:10:10.460 に答える
1

完全な答えを考案する時間はありませんが、ここにいくつかのヒントがあります。

1つの解決

  1. VB6 プログラムに属するすべてのトップレベル ウィンドウを反復処理します。
  2. それぞれの hWnd を見つけます
  3. PostMessage を使用して、それぞれにWM_CLOSEを送信します。

Karl Peterson の記事 には、現在のスレッドに属するすべてのウィンドウを反復処理して hWnd を決定するコードが含まれています。

手斧を持ってきてください!:)

于 2012-04-17T19:45:44.427 に答える
1

Sendkeys "{esc}"巨大なハックとして、フォームが keypress イベントを取得するまで呼び出すことができます。

于 2012-04-18T14:57:18.770 に答える
1

もう 1 つの意見は、ダイアログが閉じられるまでシャットダウンを保留することです (ダイアログを表示するタイミングと戻るタイミングがわかっているので、単純なフラグで十分です)。

于 2012-04-18T14:58:22.950 に答える