トップ回答者
スクリーンセーバー起動中のPostMessage

質問
回答
-
YUZUKE さんからの引用 御回答ありがとうございます。
ある通信用アプリを試作中ですが、このアプリからスクリーンセーバーを起動しています。
そして、スクリーンセーバー起動中に裏でいろいろ処理をしたいのですが、その一つにPostMessage関数が含まれております。
詳細を申し上げますと、PostMessageが実行されるのはワーカスレッドからです。
また、PostMessageの目的は同アプリ内のボタンのクリックです。
(スレッドを直ちに終了させたいため、PostMessageを使用しています)
ワーカースレッドというのは,「ある通信用アプリ」「このアプリ」と呼ばれるプロセスのスレッドなのですか?
(追記) 最初の質問と併せて読むと,「ある通信用アプリ」「このアプリ」と呼ばれるプロセスのスレッドであることが分かるのですね.
スクリーンセーバー起動中は別のデスクトップがアクティブになっている訳ですが,その間元のデスクトップのメッセージポンプが働いているのかどうかは調べてみた方がいいのかもしれませんね.
(追記2) 「ある通信用アプリ」やワーカースレッドが影響している可能性を除外するために,PostMessage を定期的に行う簡単なテストアプリケーションを作成し,そのアプリケーションを起動しながらスクリーンセーバーを起動してみてはいかがでしょうか.スクリーンセーバーの起動も,プロセス内から行うのではなく,スクリーンセーバーの設定ダイアログから起動することで,余計な可能性を排除できるかと思います.
すべての返信
-
YUZUKE さんからの引用 スクリーンセーバー起動中は何か制約でもあるのでしょうか。
スクリーンセーバー起動中に何か制限があるという話は知りません.
ただ,スクリーンセーバーが所属するデスクトップ (OS が管理するデスクトップオブジェクト) と,通常我々がログオンした後にみるデスクトップ (に対応するデスクトップオブジェクト) は,セキュリティ上の理由で別なものが使われます.
そして異なるデスクトップに所属するウィンドウ間でのメッセージ送信には,制限があるかもしれません.
スクリーンセーバーのプロセスから,他のプロセスにPostMessageを行っているのでしょうか?
-
YUZUKE さんからの引用 御回答ありがとうございます。
ある通信用アプリを試作中ですが、このアプリからスクリーンセーバーを起動しています。
そして、スクリーンセーバー起動中に裏でいろいろ処理をしたいのですが、その一つにPostMessage関数が含まれております。
詳細を申し上げますと、PostMessageが実行されるのはワーカスレッドからです。
また、PostMessageの目的は同アプリ内のボタンのクリックです。
(スレッドを直ちに終了させたいため、PostMessageを使用しています)
ワーカースレッドというのは,「ある通信用アプリ」「このアプリ」と呼ばれるプロセスのスレッドなのですか?
(追記) 最初の質問と併せて読むと,「ある通信用アプリ」「このアプリ」と呼ばれるプロセスのスレッドであることが分かるのですね.
スクリーンセーバー起動中は別のデスクトップがアクティブになっている訳ですが,その間元のデスクトップのメッセージポンプが働いているのかどうかは調べてみた方がいいのかもしれませんね.
(追記2) 「ある通信用アプリ」やワーカースレッドが影響している可能性を除外するために,PostMessage を定期的に行う簡単なテストアプリケーションを作成し,そのアプリケーションを起動しながらスクリーンセーバーを起動してみてはいかがでしょうか.スクリーンセーバーの起動も,プロセス内から行うのではなく,スクリーンセーバーの設定ダイアログから起動することで,余計な可能性を排除できるかと思います.
-
スクリーンセーバー起動後にPostMessageをコールすると関数自体は"正常"を返しますが、ポストできず
スクリーンセーバーの解除を待つようです。(手動でスクリーンセーバーを解除すると処理が再開されます)
このことから、スクリーンセーバー起動中は、デフォルトのデスクトップのメッセージポンプが働いていないといえるでしょうか。
スクリーンセーバーをプロセスから解除するコードを参照すると、通常のデスクトップから別次元にあたるスクリーンセーバーに
PostMessageでメッセージをなげているようでしたので、スクリーンセーバー起動中にOpenDeskTopで"default"
(通常のデスクトップ)を指定し、EnumDesktopWindowsから実行されるコールバックからPostMessageをコールしましたが、
結果はダメでした。
-
YUZUKE さんからの引用 スクリーンセーバー起動後にPostMessageをコールすると関数自体は"正常"を返しますが、ポストできず
スクリーンセーバーの解除を待つようです。(手動でスクリーンセーバーを解除すると処理が再開されます)
このことから、スクリーンセーバー起動中は、デフォルトのデスクトップのメッセージポンプが働いていないといえるでしょうか。
スクリーンセーバーをプロセスから解除するコードを参照すると、通常のデスクトップから別次元にあたるスクリーンセーバーに
PostMessageでメッセージをなげているようでしたので、スクリーンセーバー起動中にOpenDeskTopで"default"
(通常のデスクトップ)を指定し、EnumDesktopWindowsから実行されるコールバックからPostMessageをコールしましたが、
結果はダメでした。
どういったテストコードを使ってその実験行われたのでしょうか?
メッセージを送受信するためだけ機能のみを実装した最低限の機能のテストコードでしょうか?
それとも,YUZUKIさんが開発中のアプリケーションを使って実験されたのでしょうか?
-
御指摘の通り、開発中のアプリを変更して実験しておりました。
その後、サンプルアプリにて実験したところ、スクリーンセーバーの裏でPostMessageは問題なく動作しました。
<サンプルアプリの動作概要>
①ボタン1を押下すると、ボタン2をクリックするメッセージをPostMessageでポストします。
手順①は10回繰り返されます。速度調整のため、1回毎に3秒Sleepします。
②ボタン2では、押下された回数をカウントしEditBoxに表示します。
③10回の繰り返しが終了するとスクリーンセーバーを解除します。
ボタン1を押下し、すぐさまスクリーンセーバーを手動で起動します。
処理が終わったか分からないため、スクリーンセーバー解除はプログラム内から行っております。