リモートデスクトップ利用時にマウスホイールで常にページごとにスクロールされる

バグ情報

リモートデスクトップによって PowerBuilder アプリケーションを実行している場合、データウィンドウおよびデータウィンドウ上のドロップダウンリストボックス、ドロップダウンデータウィンドウをマウスホイールでスクロールすると、常に 1 ページごとにスクロールされる事象が報告されています。

Bug ID 323
Product PowerBuilder EN/JP
ステータス PowerBuilder 2019 R3 で修正済
発生バージョン EN 12.6以前 2017 (R2) 2017 (R3) 2019
JP 12.6以前 2017 (R2) 2017 (R3) 2019

:発生バージョン    :解決済み、未発生    :未確認

(2017 以外のバージョンについてはリリースされている最新リビジョンでの状況です)

詳細

通常、データウィンドウコントロールやデータウィンドウ上のドロップダウンのリストのマウスホイールによるスクロールについては OS のマウス設定 ([設定 | デバイス | マウス] の「マウスホイールでスクロールする量」および「一度にスクロールする行数」) に依存します。

しかし、リモートデスクトップ経由でアプリケーションを操作すると、OS の設定が反映されず、マウスホイールによるスクロールが常に 1 ページごとになります。

回避策

  • ホイール操作を検出して行ごとにスクロールさせる (ドロップダウンを除く)
    • データウィンドウコントロールの Other イベントでマウスホイールの操作を検出して、Send 関数によりスクロールメッセージを送信します。

[データウィンドウコントロールの Other イベント]

CONSTANT uint WM_MOUSEWHEEL = 522 // マウスホイール操作
CONSTANT long WM_VSCROLL = 277    // スクロール操作
CONSTANT long SB_LINEUP = 0       // 1 行上にスクロール
CONSTANT long SB_LINEDOWN = 1     // 1 行下にスクロール

long ll_scroll // 上下のどちらにスクロールするか
integer li_loop
integer li_line = 3 // スクロールする行数 (3 行ごと)

// ホイール操作時
IF message.number = WM_MOUSEWHEEL THEN
    // Ctrl キーが押されている場合は処理を抜ける
    IF KeyDown(keyControl!) then RETURN 0

    IF Sign(IntHigh(wParam)) > 0 THEN
        // 上スクロール時
        ll_scroll = SB_LINEUP
    ELSE
        // 下スクロール時
        ll_scroll = SB_LINEDOWN
    END IF

    // 指定行数分スクロール
    FOR li_loop = 1 to li_line
        Send(Handle(THIS), WM_VSCROLL, ll_scroll, 0)
    NEXT
    
    // イベントの処理を止める(二重でスクロール処理が発生するを防ぐため)
    message.processed = true
END IF

なお、ドロップダウンリストボックスおよびドロップダウンデータウィンドウのリストのスクロールに対する回避策はありません。スクロールバーによる操作などで対応するか、PowerBuilder 2019 R3 以降にバージョンアップしてください。

バグ情報 一覧を見る
PowerBuilder マイグレーション
PowerBuilder学習、動画で始めちゃう?