none
スクリーンセーバー起動中のPostMessage RRS feed

  • 質問

  • スクリーンセーバーを起動中に、起動中アプリのボタンをPostMessage()でクリックさせようとしております。

    しかし、うまく動作してくれません。ちなみにスクリーンセーバーを一時的に解除するとPostMessage()が問題なく

    動作します。スクリーンセーバー起動中は何か制約でもあるのでしょうか。

    よろしくお願いします。

    2007年8月20日 2:09

回答

  •  YUZUKE さんからの引用

    御回答ありがとうございます。

     

    ある通信用アプリを試作中ですが、このアプリからスクリーンセーバーを起動しています。

    そして、スクリーンセーバー起動中に裏でいろいろ処理をしたいのですが、その一つにPostMessage関数が含まれております。

    詳細を申し上げますと、PostMessageが実行されるのはワーカスレッドからです。

    また、PostMessageの目的は同アプリ内のボタンのクリックです。

    (スレッドを直ちに終了させたいため、PostMessageを使用しています)

     

    ワーカースレッドというのは,「ある通信用アプリ」「このアプリ」と呼ばれるプロセスのスレッドなのですか?

     

    (追記) 最初の質問と併せて読むと,「ある通信用アプリ」「このアプリ」と呼ばれるプロセスのスレッドであることが分かるのですね.

    スクリーンセーバー起動中は別のデスクトップがアクティブになっている訳ですが,その間元のデスクトップのメッセージポンプが働いているのかどうかは調べてみた方がいいのかもしれませんね.

     

    (追記2) 「ある通信用アプリ」やワーカースレッドが影響している可能性を除外するために,PostMessage を定期的に行う簡単なテストアプリケーションを作成し,そのアプリケーションを起動しながらスクリーンセーバーを起動してみてはいかがでしょうか.スクリーンセーバーの起動も,プロセス内から行うのではなく,スクリーンセーバーの設定ダイアログから起動することで,余計な可能性を排除できるかと思います.

    2007年8月20日 4:20

すべての返信

  •  YUZUKE さんからの引用

    スクリーンセーバー起動中は何か制約でもあるのでしょうか。

     

    スクリーンセーバー起動中に何か制限があるという話は知りません.

    ただ,スクリーンセーバーが所属するデスクトップ (OS が管理するデスクトップオブジェクト) と,通常我々がログオンした後にみるデスクトップ (に対応するデスクトップオブジェクト) は,セキュリティ上の理由で別なものが使われます.

    そして異なるデスクトップに所属するウィンドウ間でのメッセージ送信には,制限があるかもしれません.

    スクリーンセーバーのプロセスから,他のプロセスにPostMessageを行っているのでしょうか?

     

    2007年8月20日 3:36
  • 御回答ありがとうございます。

     

    ある通信用アプリを試作中ですが、このアプリからスクリーンセーバーを起動しています。

    そして、スクリーンセーバー起動中に裏でいろいろ処理をしたいのですが、その一つにPostMessage関数が含まれております。

    詳細を申し上げますと、PostMessageが実行されるのはワーカスレッドからです。

    また、PostMessageの目的は同アプリ内のボタンのクリックです。

    (スレッドを直ちに終了させたいため、PostMessageを使用しています)

    2007年8月20日 4:05
  •  YUZUKE さんからの引用

    御回答ありがとうございます。

     

    ある通信用アプリを試作中ですが、このアプリからスクリーンセーバーを起動しています。

    そして、スクリーンセーバー起動中に裏でいろいろ処理をしたいのですが、その一つにPostMessage関数が含まれております。

    詳細を申し上げますと、PostMessageが実行されるのはワーカスレッドからです。

    また、PostMessageの目的は同アプリ内のボタンのクリックです。

    (スレッドを直ちに終了させたいため、PostMessageを使用しています)

     

    ワーカースレッドというのは,「ある通信用アプリ」「このアプリ」と呼ばれるプロセスのスレッドなのですか?

     

    (追記) 最初の質問と併せて読むと,「ある通信用アプリ」「このアプリ」と呼ばれるプロセスのスレッドであることが分かるのですね.

    スクリーンセーバー起動中は別のデスクトップがアクティブになっている訳ですが,その間元のデスクトップのメッセージポンプが働いているのかどうかは調べてみた方がいいのかもしれませんね.

     

    (追記2) 「ある通信用アプリ」やワーカースレッドが影響している可能性を除外するために,PostMessage を定期的に行う簡単なテストアプリケーションを作成し,そのアプリケーションを起動しながらスクリーンセーバーを起動してみてはいかがでしょうか.スクリーンセーバーの起動も,プロセス内から行うのではなく,スクリーンセーバーの設定ダイアログから起動することで,余計な可能性を排除できるかと思います.

    2007年8月20日 4:20
  • スクリーンセーバー起動後にPostMessageをコールすると関数自体は"正常"を返しますが、ポストできず

    スクリーンセーバーの解除を待つようです。(手動でスクリーンセーバーを解除すると処理が再開されます)

    このことから、スクリーンセーバー起動中は、デフォルトのデスクトップのメッセージポンプが働いていないといえるでしょうか。

     

    スクリーンセーバーをプロセスから解除するコードを参照すると、通常のデスクトップから別次元にあたるスクリーンセーバーに

    PostMessageでメッセージをなげているようでしたので、スクリーンセーバー起動中にOpenDeskTopで"default"

    (通常のデスクトップ)を指定し、EnumDesktopWindowsから実行されるコールバックからPostMessageをコールしましたが、

    結果はダメでした。

    2007年8月20日 5:54
  •  YUZUKE さんからの引用

    スクリーンセーバー起動後にPostMessageをコールすると関数自体は"正常"を返しますが、ポストできず

    スクリーンセーバーの解除を待つようです。(手動でスクリーンセーバーを解除すると処理が再開されます)

    このことから、スクリーンセーバー起動中は、デフォルトのデスクトップのメッセージポンプが働いていないといえるでしょうか。

     

    スクリーンセーバーをプロセスから解除するコードを参照すると、通常のデスクトップから別次元にあたるスクリーンセーバーに

    PostMessageでメッセージをなげているようでしたので、スクリーンセーバー起動中にOpenDeskTopで"default"

    (通常のデスクトップ)を指定し、EnumDesktopWindowsから実行されるコールバックからPostMessageをコールしましたが、

    結果はダメでした。

     

    どういったテストコードを使ってその実験行われたのでしょうか?

    メッセージを送受信するためだけ機能のみを実装した最低限の機能のテストコードでしょうか?

    それとも,YUZUKIさんが開発中のアプリケーションを使って実験されたのでしょうか?

    2007年8月20日 6:42
  • 御指摘の通り、開発中のアプリを変更して実験しておりました。

    その後、サンプルアプリにて実験したところ、スクリーンセーバーの裏でPostMessageは問題なく動作しました。

     

    <サンプルアプリの動作概要>

    ①ボタン1を押下すると、ボタン2をクリックするメッセージをPostMessageでポストします。

     手順①は10回繰り返されます。速度調整のため、1回毎に3秒Sleepします。

    ②ボタン2では、押下された回数をカウントしEditBoxに表示します。

    ③10回の繰り返しが終了するとスクリーンセーバーを解除します。

     

    ボタン1を押下し、すぐさまスクリーンセーバーを手動で起動します。

    処理が終わったか分からないため、スクリーンセーバー解除はプログラム内から行っております。

     

    2007年8月20日 7:17
  • サンプルアプリのボタン1の動作をワーカスレッドで行ったところ、問題なく動作しました。

    そして問題の開発中アプリですが、スクリーンセーバーを起動し、次にPostMessageをコールすると問題なく動作し、

    スクリーンセーバー起動の次に、少し重たい処理が入り、その後PostMessageをコールすると、スクリーンセーバー

    解除(手動で)と同時にPostMessage以降が走りだすようです。

    とりあえず、処理の順番を変更して、この問題を回避しようかと思います。

     

    いろいろアドバイスありがとうございました。

    2007年8月20日 7:36