none
スクロールバーが2重に作成されてしまう? RRS feed

  • 質問

  • こんにちは。
    PgDn(ページダウン)のキーを押した効果を
    現在作動中なアプリケーション(ワードやPDFやウェブブラウザ)で出そうと思っています。

    以下のようなプログラムを走らせると、
    右端にある一般的のスクロールバーの外側(?)に
    新しいスクロールバーが2重に作成されてそこで動きが発生してしまい、
    画面内のコンテンツ(PDFとかの文書)自体はスクロールしません。

    私がWin32APIを理解しきれていない所に問題があるのだと思いますが、
    どなたかご助力を頂ければ幸いです。

    また、関連する別件ですが、同様に
    Webサイトでタブのスクロールが出来るようにするにはどうすればよいのでしょうか?
    HWNDは同じなわけなので、もう少し詳細な選択が必要なのかとは思いますが。
    (現在のところ、上と同じく、外側にタブが2重に作成されてしまいます。)

    当方、開発環境はVC++2008、バックグラウンドで走らせたいのでWin32コンソールアプリケーションです。

    ~~~~~~~~~~~~~~~~~

    以下、挙動がおかしいサンプルコードです:

    HWND wnd_curr;//keeps process id of the window
      
    wnd_curr = GetForegroundWindow();//get active id, GetActiveWindow(); didnt work
      if(wnd_curr){
        SCROLLINFO scrlinfo;
       scrlinfo.cbSize = sizeof(SCROLLINFO);
       scrlinfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
       GetScrollInfo(wnd_curr,SB_VERT,&scrlinfo);
       int goal = scrlinfo.nPos += scrlinfo.nPage;
       if(goal <= scrlinfo.nMax)
        scrlinfo.nPos = goal;
       else
        scrlinfo.nPos = scrlinfo.nMax;
       SetScrollInfo(wnd_curr,SB_VERT,&scrlinfo,TRUE);
    }

    2010年1月24日 4:52

回答

  • キーを押した効果が出したいのなら、あんまり遠回りせずに

    keybd_event()

    を使ってはどうでしょう。
    注意点としては、人間のスピード程度にシミュレートするという点です。
    • 回答としてマーク yneedshelp 2010年1月31日 3:14
    2010年1月25日 11:04

すべての返信

  • 外部Applicationから他のApplicationのContentsをScrollさせるのは困難です。

    Scroll Barの表示には、以下Patternがあります。
      1.WS_H(V)SCROLLを使用している
      2.Common Controlを使用している
      3.自前(自作)で表示(描画)させている

    3.の場合、Scrollさせることはほぼ不可能です。
    1.2.の場合でも、うまく動作しない場合もあります。

    また、ApplicationのVersionによって、
    今までScrollできていたものが出来なくなることもあります。

    それらを踏まえて頂いた上で、回答します。

    >右端にある一般的のスクロールバーの外側(?)に
    >新しいスクロールバーが2重に作成されてそこで動きが発生してしまい、
    wnd_currがFrame Windowを指しているからです。
    それらのApplicationは、Frame WindowのClientにChild Windowを作成し、
    そこでContentsを表示しています。

    そのため、そのChild WindowのWindow Handleを取得して、
    SetScrollInfoをCallする必要があります。

    Child Windowは、Spy ++で調べてみてください。
    Scroll Barの形態も判断できます。

    Window Handleを取得するには、
    EnumChildWindows等のAPIで探すことになります。

    また、Scroll Barが2.の形態の場合、SB_VERTではなくSB_CTLで取得してください。

    [Windows Overviews]
      http://msdn.microsoft.com/en-us/library/dd469349(VS.85).aspx
    2010年1月24日 5:33
  • キーを押した効果が出したいのなら、あんまり遠回りせずに

    keybd_event()

    を使ってはどうでしょう。
    注意点としては、人間のスピード程度にシミュレートするという点です。
    • 回答としてマーク yneedshelp 2010年1月31日 3:14
    2010年1月25日 11:04
  • 皆様、ありがとうございました。
    もう一度気を取り直して調査したら、きちんとPgDnは登録されていました。
    http://api.farmanager.com/en/winapi/virtualkeycodes.html
    以下、例によってINPUTクラスとSendInput関数で解決出来ました。


    2010年1月31日 3:17