C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

AcrobatReaderのウィンドウをアクティブにする

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■89114 / inTopicNo.1)  AcrobatReaderのウィンドウをアクティブにする
  
□投稿者/ k3user (55回)-(2018/10/31(Wed) 17:23:03)

分類:[.NET 全般] 

  AspのWEB画面からリクエストを送信し、サーバ上で作成されたPDFファイルを
  クライアントのAcrobatReaderにて起動する際にAcrobatのウィンドウを最前面に
  表示しようと思い、dobon.netさんのページを参考にウィンドウを最前面に
  しようとしたのですが、リクエスト送信1回目は背面になり
  リクエスト送信2回目以降は最前面になります。
  この現象はWin10では発生せず、Win7,Win8.1の環境にて発生します。
  https://msdn.microsoft.com/ja-jp/magazine/cc411039.aspx
  のSetForegroundWindowメソッドのフォアグラウンドウィンドウを設定することはできない条件
  を確認しましたが、Win10では発生せず、Win7,Win8.1で発生するのかがわかりません。
  明確な理由があればご教示していただきたいです。
  
  
●処理概要  
 ・サーバ上のPDFをSystem.Net.WebClientを使用してローカルにダウンロード
 ・ShellExecuteメソッドでPDFファイルをAcrobatReaderでオープン
 ・該当のAcroBatのプロセスを検索し、そのウィンドウハンドルを取得
 ・ウィンドウ最前面処理を実行
   下記URLの「できるだけ確実に指定したウィンドウをフォアグラウンドにする」を踏襲   
   https://dobon.net/vb/dotnet/process/appactivate.html

引用返信 編集キー/
■89115 / inTopicNo.2)  Re[1]: AcrobatReaderのウィンドウをアクティブにする
□投稿者/ 魔界の仮面弁士 (1911回)-(2018/10/31(Wed) 17:56:38)
No89114 (k3user さん) に返信
> AspのWEB画面からリクエストを送信し、サーバ上で作成されたPDFファイルを

ASP.NET ではなく、ASP なのですね。

…あれ? 「WEB画面からリクエストを送信」、ということは
リクエストの送信元は クライアント アプリケーションではなく、
HTML ページを表示しているブラウザーから行いたいのでしょうか。

それとも、「Web サーバーにリクエストを送信」の間違い?


> リクエスト送信2回目以降は最前面になります。

アプリケーションによっては、二重起動を禁止するために、
「自身が既に開かれている場合、以前のインスタンスにドキュメントを渡して
 アクティブ化し、呼び出された自分自身は何もせずに終了する」
という動作になっているものがあります。

Adobe Acrobat Reader / Adobe Reader シリーズがどうであるかは未確認。


> Win10では発生せず、Win7,Win8.1で発生するのかがわかりません。

それぞれの環境で、Reader のバージョンは同じなのですね?


> 下記URLの「できるだけ確実に指定したウィンドウをフォアグラウンドにする」を踏襲
> https://dobon.net/vb/dotnet/process/appactivate.html
ちなみに、Visual Studio 2010 / 2012 は、開発環境の起動時に
SPI_GETFOREGROUNDLOCKTIMEOUT の値を破壊する不具合を抱えているのでご注意を。

https://support.microsoft.com/ja-jp/help/2763075
http://bbs.wankuma.com/index.cgi?mode=one&namber=63484&KLOG=107
引用返信 編集キー/
■89118 / inTopicNo.3)  Re[2]: AcrobatReaderのウィンドウをアクティブにする
□投稿者/ k3user (57回)-(2018/10/31(Wed) 18:26:06)
魔界の仮面弁士様

返信ありがとうございます。


>ASP.NET ではなく、ASP なのですね。
Classic ASPになります。

>HTML ページを表示しているブラウザーから行いたいのでしょうか。
>それとも、「Web サーバーにリクエストを送信」の間違い?
申し訳ございません。細かく説明をしていませんでした。
以下のような処理になります。

・クライアント(IE)からサーバの画面(Classic ASP)にて帳票作成を指示
・サーバ側のそのリクエストを受け取ると、データ作成、PDF作成を実行
・別画面(帳票を作成中です...のような画面)に遷移し、その中で
クライアント側にあるActiveXDLLを起動
・サーバ側は作成されたPDFのURLをActiveXDLLに渡す。
・ActiveXDLLにてPDFファイルをローカルにダウンロード
・AcroBatReaderでそのPDFファイルを起動

>Adobe Acrobat Reader / Adobe Reader シリーズがどうであるかは未確認。
クライアントの環境はすべてAdobe Acrobat Reader DCになります。

> Win10では発生せず、Win7,Win8.1で発生するのかがわかりません。
> それぞれの環境で、Reader のバージョンは同じなのですね?
確認した所、以下のようになっていました。
Win10:2019.008.20080
Win8.1:2019.008.20080
Win7:2018.011.20058

>ちなみに、Visual Studio 2010 / 2012 は、開発環境の起動時に
>SPI_GETFOREGROUNDLOCKTIMEOUT の値を破壊する不具合を抱えているのでご注意を。
開発環境はVisual Studio 2015を使用しています。

>アプリケーションによっては、二重起動を禁止するために、
>「自身が既に開かれている場合、以前のインスタンスにドキュメントを渡して
> アクティブ化し、呼び出された自分自身は何もせずに終了する」
>という動作になっているものがあります。

AcrobatReaderのバージョンによる動作の違いを疑いましたが、
Win8.1とWin10は同じバージョンなので、バージョンによる動作の
違いでは無いようです。ということはOSによる違いなのでしょうか...
引用返信 編集キー/
■89119 / inTopicNo.4)  Re[3]: AcrobatReaderのウィンドウをアクティブにする
□投稿者/ 魔界の仮面弁士 (1913回)-(2018/10/31(Wed) 19:02:09)
No89118 (k3user さん) に返信
> ・AcroBatReaderでそのPDFファイルを起動

どうでも良いことですが、Reader の前にスペースが無い点や、
B が大文字表記されている点などが気になってしまう…。


> https://msdn.microsoft.com/ja-jp/magazine/cc411039.aspx
> のSetForegroundWindowメソッド

念のために docs の方も辿ってみましたが、
2000→XP 移行期以外の仕様変更点は見当たらず。
https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setforegroundwindow


レジストリ エントリ ForegroundLockTimeout について書かれていた
サポート技術情報の KB886217 は、更新されていないどころか、既に削除されている模様。

一応、下記の古い MSDN Library には KB886217 も残っていましたが、
Vista 世代の情報なので、情報源にはなりえませんでした。
https://www.microsoft.com/ja-jp/download/details.aspx?id=20955



> AcrobatReaderのバージョンによる動作の違いを疑いましたが、
> Win8.1とWin10は同じバージョンなので、バージョンによる動作の
> 違いでは無いようです。ということはOSによる違いなのでしょうか...

そうかもしれませんし、そうではないかもしれません。
現時点では、OS 以外の要因を否定する材料も無いので、自分には何とも言えないです。

Acrobat Reader DC 以外のアプリケーションの場合でも、
フォアグラウンド化について、同様の動作になりますか?


ちなみに、HKEY_CURRENT_USER\Control Panel\Desktop\ForegroundLockTimeout については、
Windows Vista 以前では利用できたが、7 以降では使えないという情報もありました。
http://d.hatena.ne.jp/shouh/20160108/1452261668

しかし当時、自分は Win7 環境で ForegroundLockTimeout のレジストリ設定において
動作が変更されていたことを確認していますし、他にも 7 で利用できたという
情報もあるため、本当に Vista 〜 7 間で仕様変更があったかどうかは、判断しかねています。
(その後の Windows Update で動作が変わった可能性もあるかもしれない)
https://social.technet.microsoft.com/Forums/ja-JP/6bd7b820-0fa2-4e2d-b638-c26095f87b33/263682106938754123953492031034foregroundlocktimeout

8.1 〜 10 間での仕様変更については分からないです。
引用返信 編集キー/
■89133 / inTopicNo.5)  Re[4]: AcrobatReaderのウィンドウをアクティブにする
□投稿者/ makoto (1回)-(2018/11/01(Thu) 10:44:22)
No89119 (魔界の仮面弁士 さん) に返信

返信ありがとうございます。

> どうでも良いことですが、Reader の前にスペースが無い点や、
> B が大文字表記されている点などが気になってしまう…。
気をつけておきます。 ^^;

> 念のために docs の方も辿ってみましたが、
> 2000→XP 移行期以外の仕様変更点は見当たらず。
> https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setforegroundwindow
> レジストリ エントリ ForegroundLockTimeout について書かれていた
> サポート技術情報の KB886217 は、更新されていないどころか、既に削除されている模様。
> 一応、下記の古い MSDN Library には KB886217 も残っていましたが、
> Vista 世代の情報なので、情報源にはなりえませんでした。
> https://www.microsoft.com/ja-jp/download/details.aspx?id=20955

> Acrobat Reader DC 以外のアプリケーションの場合でも、
> フォアグラウンド化について、同様の動作になりますか?
試しにメモ帳を開いてみたのですが、問題なく最前面表示されました。
Acrobat Readerのような初回だけ最前面表示されず
2回目以降は最前面に表示される現象は再現しませんでした。

> ちなみに、HKEY_CURRENT_USER\Control Panel\Desktop\ForegroundLockTimeout については、
> Windows Vista 以前では利用できたが、7 以降では使えないという情報もありました。
> http://d.hatena.ne.jp/shouh/20160108/1452261668
> しかし当時、自分は Win7 環境で ForegroundLockTimeout のレジストリ設定において
> 動作が変更されていたことを確認していますし、他にも 7 で利用できたという
> 情報もあるため、本当に Vista 〜 7 間で仕様変更があったかどうかは、判断しかねています。
> (その後の Windows Update で動作が変わった可能性もあるかもしれない)
> https://social.technet.microsoft.com/Forums/ja-JP/6bd7b820-0fa2-4e2d-b638-c26095f87b33/263682106938754123953492031034foregroundlocktimeout
> 8.1 〜 10 間での仕様変更については分からないです。

色々と調べていただき誠にありがとうございます。
今の所、解決にはいたっていませんが、もう少し試行錯誤してみます。





引用返信 編集キー/
■89136 / inTopicNo.6)  Re[1]: AcrobatReaderのウィンドウをアクティブにする
□投稿者/ PANG2 (237回)-(2018/11/01(Thu) 13:08:47)
No89114 (k3user さん) に返信
> ・ShellExecuteメソッドでPDFファイルをAcrobatReaderでオープン
> ・該当のAcroBatのプロセスを検索し、そのウィンドウハンドルを取得

どのように行っているのでしょうか?
初回は時間がかかるが、OSのバージョンというよりハードスペックが影響しそうな気がします。
引用返信 編集キー/
■89137 / inTopicNo.7)  Re[2]: AcrobatReaderのウィンドウをアクティブにする
□投稿者/ k3user (1回)-(2018/11/01(Thu) 13:14:23)
No89136 (PANG2 さん) に返信
> ■No89114 (k3user さん) に返信
> どのように行っているのでしょうか?
> 初回は時間がかかるが、OSのバージョンというよりハードスペックが影響しそうな気がします。

PANG2様
返信ありがとうございます。

プログラムを作成した当初にPCによりウィンドウハンドルが取得できない
事象がありましたので、sleep(2000)で待機しています。
(確実な方法ではありませんが)
引用返信 編集キー/
■89138 / inTopicNo.8)  Re[3]: AcrobatReaderのウィンドウをアクティブにする
□投稿者/ k3user (58回)-(2018/11/01(Thu) 13:52:08)
報告です。

PANG2様のご指摘をいただいた
PCのスペックに問題があるようです。
現象が起こらなかったPCは現象が起こったPCと
比べてかなり高スペックのものでした。
●修正後のプログラムに変更して動作確認した所、
現象は起こりませんでした。
これからもっと細かく検証をしていきますが、
おそらく解決していると思われるので、
解決済みとします。

回答を頂いた皆様、この度は誠にありがとうございました


●既存のプログラム
sleep(2000)
For each p as process in process.getProcess
    If p = 該当のプロセス Then
        最前面処理
        Exti for
    End If
Next

●修正後のプログラム
dim waitTime as integer = 0
While true
    sleep(1000)
    waitTime = waitTime + 1000

    ' 1分を超えたらタイムアウト
    If waitTime > 60000 then
        Exit While
    End If

    For each p as process in process.getProcess
        If p = 該当のプロセス Then
            最前面処理
            Exti for
        End If
    Next
End While

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ