DOBON.NETプログラミング道掲示板

[ 最新記事及び返信フォームをトピックトップへ ]

■35671 / inTopicNo.1)  AppActiveが正常に機能しない。
  
□投稿者/ 日研迷琉 一般人(1回)-(2025/04/10(Thu) 14:02:35)
  • アイコン環境/言語:[Windows11 Pro(24H2) VS2022 VB .NetFreamwork4.8] 
    分類:[.NET] 

    現在、PCから離れた位置で無線バーコードリーダによるエントリプログラムを作成しているのですが、アプリケーションからカーソルが離れるとPCにもって入力項目にカーソルを移動しなければなりません。
    但し、フォーム上の入力項目は1つなのでフォームがアクティブになっていれば問題はないのですが、なにぶん長時間、他数のエントリを行うためにフォームがアクティブ状態になっていない場合、取り返しがつきません。
    そこで、タイマーイベントで、アクティブフォームを取得し、自身がアクティブでない場合に自身をアクティブにするロジックを考えたのですがタスクバーが点滅するだけでアクティブになってくれません。(VSのデバック起動では動作します。)
    下記の様な記述をしています。どなたか御教授願えませんでしょうか?

    【環境】 Windows11 Pro(24H2)
    VS2022 VB .NetFreamwork4.8

    【Code】タイマーイベント内に記載
    Dim ActiveFmName As String = ""
    Try
    ActiveFmName = IIf(IsNothing(ActiveForm.Name), "", ActiveForm.Name)
    Catch ex As Exception
    End Try

    If Not ActiveFmName = Me.Name Then
    AppActivate(Process.GetCurrentProcess.Id)
    End If

    以上よろしくお願いします
マルチポストを報告
違反を報告
引用返信 削除キー/
■35672 / inTopicNo.2)  Re[1]: AppActiveが正常に機能しない。
□投稿者/ 魔界の仮面弁士 大御所(1589回)-(2025/04/10(Thu) 16:08:04)
  • アイコンNo35671に返信(日研迷琉さんの記事)
    > ActiveFmName = IIf(IsNothing(ActiveForm.Name), "", ActiveForm.Name)
    これについては
     ActiveFmName = If(ActiveForm?.Name, "")
    と書くべきかと。
    IIf だと As Object になってしまいますので、Option Strict On との相性も悪いですよね。


    > アプリケーションからカーソルが離れるとPCにもって入力項目にカーソルを移動しなければなりません。
    「PCにもって」という動作が何を指しているのか、
    ちょっとよくわからなかったのですが、ここでいう「カーソル」とは
    マウスカーソルの物理的な位置ではなく、アクティブウィンドウに対する
    入力位置のキャレットのことを指しているものと推察しました。


    キーボードデバイスとして扱わるタイプのリーダーであれば、
    RawInput API (WM_INPUT メッセージ + RegisterRawInputDevices)や
    SharpDX.RawInput を使うことで、アプリケーションが前面に無く
    非アクティブであった場合の入力も拾うことができます。
    複数のキーボードデバイスがあった場合に、それぞれの入力を別々に拾うこともできます。
    ただし、キー入力エミュレーションのリーダーの場合は使えない可能性があります。

    https://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=res&namber=35479&rev=&page=0&no=0



    > 自身がアクティブでない場合に自身をアクティブにするロジックを考えたのですが
    無線バーコードリーダによる入力が行われていなくても、
    タイマーで強制的にアクティブ化しようとしていますか?
    それはシステムの操作的に問題があるような…。


    > タスクバーが点滅するだけでアクティブになってくれません。(VSのデバック起動では動作します。)
    たとえば、何かキー入力を行っている最中にアクティブウィンドウを勝手に変更されたり、
    ウィンドウを切り替えたばかりなのに、勝手に別のウィンドウに変更されたりすると
    都合が悪いため、そういう時にはタスクバーを点滅させて通知する仕様になっています。

    このあたりの事情は、下記で説明されています。
    https://bit.ly/foregroundWindow

    上記に書かれた、ウィンドウをフォアグラウンドに表示できる条件を満たしていれば
    AppActivate で点滅することなく切り替わるかと思います。

    なお上記 URL には一応、強制的にアクティブ化するためのコードも提示されています。
    (過去記事のアーカイブなので、サンプルコードが崩れてしまっていますが…)

    とはいえ上記のサンプルだけでも厳密には不十分で、さらにあらかじめ、
    ForegroundLockTimeout を 0 にしておかなければならないケースもあります。
    こちらは KB886217 で解説されています。
    https://bit.ly/MSKB886217

    なお、「SPI_GETFOREGROUNDLOCKTIMEOUT」を使うことで、
    一時的にこのパラメーター(ForegroundLockTimeout)を変更することもできます。



    以下蛇足。今となって不要な情報ですが。
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=63230&KLOG=107
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=63230&page=20&KLOG=107

違反を報告
引用返信 削除キー/
■35673 / inTopicNo.3)  Re[2]: AppActiveが正常に機能しない。
□投稿者/ 魔界の仮面弁士 大御所(1590回)-(2025/04/11(Fri) 09:21:09)
  • アイコンNo35672に追記(魔界の仮面弁士の記事)
    >>タスクバーが点滅するだけでアクティブになってくれません。(VSのデバック起動では動作します。)

    こっちを紹介するべきだったかな。

    [DOBON.NET]
    ┗[外部アプリケーションのウィンドウをアクティブにする]
     ┗[ウィンドウがアクティブにならない時の対策]
    https://dobon.net/vb/dotnet/process/appactivate.html#section4
違反を報告
引用返信 削除キー/
■35674 / inTopicNo.4)  Re[3]: AppActiveが正常に機能しない。
□投稿者/ 日研迷琉 一般人(2回)-(2025/04/11(Fri) 12:05:21)
  • アイコンお世話になっております。
    早速のご回答ありがとうございます。

    >> ActiveFmName = IIf(IsNothing(ActiveForm.Name), "", ActiveForm.Name)
    > これについては
    >  ActiveFmName = If(ActiveForm?.Name, "")
    > と書くべきかと。
    > IIf だと As Object になってしまいますので、Option Strict On との相性も悪いですよね。
    ご指摘ありがとうございます。勉強になります。

    > 「PCにもって」という動作が何を指しているのか、
    すみません。タッチミスで正しくは「PCにもどって」となります。

    > 入力位置のキャレットのことを指しているものと推察しました。
    はい、そう言うことです。

    >>自身がアクティブでない場合に自身をアクティブにするロジックを考えたのですが
    > 無線バーコードリーダによる入力が行われていなくても、
    > タイマーで強制的にアクティブ化しようとしていますか?
    > それはシステムの操作的に問題があるような…。
    PCは、バーコード読み取り専用機(サーバ機)として運用するつもりですのでメンテナンス時以外は他の処理は不要となります。
    確かにAPI等でメッセージをフックすれば可能なのでしょうけれども、当方には難しすぎてシンプルにアプリケーションを作成したいと思い今回の仕組みにしています。
    戴きました情報を基にもう少し勉強してみます。

違反を報告
引用返信 削除キー/
■35675 / inTopicNo.5)  Re[4]: AppActiveが正常に機能しない。
□投稿者/ 日研迷琉 一般人(3回)-(2025/04/14(Mon) 10:00:10)
  • アイコンお疲れ様です。

    魔界の仮面弁士様ご指摘の通り、[ウィンドウがアクティブにならない時の対策]を施し、希望通りの動きを実現することができました。
    まっ、ほぼコピペですが...(^^ゞ
    と言う事で、この案件は閉めさせて頂きます。ありがとうございました。
解決み!
違反を報告
引用返信 削除キー/



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

このトピックに書きこむ

Mode/  Pass/


- Child Tree -