トップ回答者
スクロールバーが2重に作成されてしまう?

質問
-
こんにちは。
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);
}
回答
-
キーを押した効果が出したいのなら、あんまり遠回りせずに
keybd_event()
を使ってはどうでしょう。
注意点としては、人間のスピード程度にシミュレートするという点です。- 回答としてマーク yneedshelp 2010年1月31日 3:14
すべての返信
-
外部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 -
キーを押した効果が出したいのなら、あんまり遠回りせずに
keybd_event()
を使ってはどうでしょう。
注意点としては、人間のスピード程度にシミュレートするという点です。- 回答としてマーク yneedshelp 2010年1月31日 3:14
-
皆様、ありがとうございました。
もう一度気を取り直して調査したら、きちんとPgDnは登録されていました。
http://api.farmanager.com/en/winapi/virtualkeycodes.html
以下、例によってINPUTクラスとSendInput関数で解決出来ました。