VC++での1ページスクロール時にツマミが自動で移動する現象について

このQ&Aのポイント
  • Visual Studio .NET 2003でVC++の開発をしている際に、CViewクラスを基底にした子ウィンドウの1ページスクロール(WM_VSCROLLのSB_PAGEDOWN/SB_PAGEUP)時に、スクロールバーのツマミの上下部分をクリックすると、ツマミがマウスカーソルの位置に自動で移動しながらスクロールし続ける現象が発生しています。
  • 正常動作時にはWM_VSCROLL(SB_PAGEDOWN/SB_PAGEUP)の後に必ずWM_VSCROLL(SB_ENDSCROLL)メッセージが来ますが、異常動作時にはSB_PAGEDOWN/SB_PAGEUP)メッセージが連続して来ます。ツマミがマウスカーソルの位置に来るとWM_VSCROLL(SB_THUMBPOSITION)メッセージに変わり、それに対するWM_VSCROLL(SB_ENDSCROLL)メッセージが来て止まります。
  • この現象の原因、または原因の可能性、回避法等について、情報を探しているのですが、具体的な解決策は見つかっていません。知識のある方がいれば、教えていただけると幸いです。
回答を見る
  • ベストアンサー

1 ページスクロール(WM_VSCROLL )が連続で来る

Visual Studio .NET 2003 で VC++ の開発をしています。 OSはW2KとWinMXです。 CViewクラスを基底にした子ウィンドウの 1 ページスクロール(WM_VSCROLLのSB_PAGEDOWN/SB_PAGEUP)時に、スクロールバーのツマミの上下部分をクリックすると、ボタンを押し続けていなくても、ツマミがマウスカーソルのある位置に移動するまでスクロールし続ける現象が出て困っています。 トレースを出したり、Spy++で確認しましたが、正常動作時はWM_VSCROLL(SB_PAGEDOWN/SB_PAGEUP)の後、必ずWM_VSCROLL(SB_ENDSCROLL)メッセージが来ますが、異常動作時はSB_PAGEDOWN/SB_PAGEUP)メッセージが連続して来ています。 ツマミがマウスカーソルの位置に来るとWM_VSCROLL(SB_THUMBPOSITION)メッセージに変わる為、それに対するWM_VSCROLL(SB_ENDSCROLL)メッセージが来て止まるようです。 MicrosoftのMSDNサイトを探してみたのですが、それらしい記述もありませんでした。 この現象の原因、または原因の可能性、回避法等ご存知の方がいらっしゃいましたら是非ご教示ください。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.2

まあ、ゲームプログラミングみたいな物で能動的に取りに行く手段が有ります。 if (GetAsyncKeyState(VK_LBUTTON) & 0x8000) //APIの戻り値の最上位ビットが立っていればボタンが押されている { //左ボタンが押された場合の処理 } if (GetAsyncKeyState(VK_RBUTTON) & 0x8000) //APIの戻り値の最上位ビットが立っていればボタンが押されている { //右ボタンが押された場合の処理 }

参考URL:
http://www.microsoft.com/japan/msdn/academic/Articles/DirectX/01/
fruipa
質問者

お礼

教えて頂いた方法で、本当のイベントか、間違って来たイベントか区別することが出来ました。 あとは、スクロールバーの状態が戻れば良いのですが、これはなんとか出来ると思います。 貴重なご意見ありがとうございました。

その他の回答 (1)

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

>回避法等 >ツマミがマウスカーソルの位置に来るまで(SB_PAGEDOWN/SB_PAGEUP)メッセージが連続して来ています。 まあ、マウスのクリックを同時に見て、マウスがクリックされて無いなら無視すれば回避出来る気がしますけどね。

fruipa
質問者

補足

ご回答ありがとうございます。 Spy++で試した時、スクロールバー上でクリックした時はWM_VSCROLLのみで、WM_LBUTTONDOWN、WM_LBUTTONUPとも来ていませんでしたが、取得する方法があるのでしょうか?

関連するQ&A

  • WM_VSCROLL内の実行回数について

    Visual Studio 2010 Express WIN32 ユニコードビルド C言語 でクライアント領域に縦スクロールバーを貼り付け次のようなプログラムを作りました。 スクロールバーの勉強中に適当に作ったプログラムです。 LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { PAINTSTRUCT ps; TCHAR moji[256]; static int countout=0; static int countin=0;       switch(message){       case WM_PAINT: BeginPaint(hwnd,&ps); wsprintf(moji,TEXT("switch文の外=%d回 switch文の中=%d"),countout,countin); TextOut(ps.hdc,0,0,moji,lstrlen(moji)); EndPaint(hwnd,&ps); break; case WM_VSCROLL: countout=countout+1; switch(LOWORD(wParam)){ case SB_LINEDOWN: countin=countin+1; break; } InvalidateRect(hwnd,NULL,TRUE); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,message,wParam,lParam); } return 0; } 私はこのプログラムの実行結果は スクロールバーのどこをクリックしてもcountoutは+1され下の矢印をクリックしたときはcountinが+1 されるという動作になると思ったのですが実行してみると スクロールバーの矢印をクリック countout が+2 スクロールバーのつまみをクリック countout が+3 スクロールバーの下矢印をクリック countout が+2,countinが+1 されるという結果になりました。 この結果から推測するとVSCROLLバーをクリックしたときはWM_VSCROLL:メッセージが複数回送られているということになると思うのですがどうしてこうなるのでしょうか? プログラミングの本などではWM_VSCROLL:の中のswitch文の外に初期化やInvalidateRectがあるのでWM_VSCROLLメッセージが送られるのは1回だけだと思ったのですが・・・・。

  • ページスクロールさせたいのに一番上まで戻ってしまう

    検索でFirefoxを利用しています。pagedownで中腹までスクロールしたあと、スクロールし過ぎたため上下左右矢印のいずれかやpageupを押すと、スクロールではなく、一番上までもどってしまいます。非常に不便で、以前まではそんなことはなかったです。どうすれば解決できるか調べても出てこなかったのですが、ご存知の方いらっしゃればご教示いただきたいです。クロムではそのような現象が起きないことから、Firefoxが原因だとは思っているのですが...。 キーボードはノートPCに付属のもので、 ボタンはキャプチャのようなものを使用しています。

  • Ctrl+マウススクロールでPageUp/Down

    現在、タイトルのように Ctrlキーを押したままマウススクロールすると PageUpやPageDownするようになるソフトを探しています。 VCなどでは、このように動作すると思うのですが、 他のエディタ(メモ帳など)でも、このように動作させることが できるようになるソフトはありますでしょうか? よろしくお願い致します。 環境:WindowsXP SP2

  • スクロールバーの左右

    こんばんは。 大変お恥ずかしいのですが、教えてください。 いままでスクロールバーはマウスで動かしていました。 それが、PageUpやPagedownキーをつかうと少しずつ スクロールされることを知りました(恥ずかしい。。。) また、HomeやEndキーを使うと一気に最初、最後に いくことも知りました。。。 では左右のスクロールってどのキーでやればよいですか? (スクロールという言葉であっていますでしょうか。。。) またこのようなことをまとめて書いてあるサイトなど がありましたら教えてください。。。 大変初歩的な質問で申し訳ありません。。

  • MS-Wordで、マウスホイールのスクロールの刻みを1ページにする方法

    MS-Wordで、マウスホイールのスクロールの刻みを1ページにする方法 お世話になります。 MS-Wordを使用中にマウスホイールを回すと、文書が上下に数行分ずつスクロールしますよね。 このときのマウスホイールの1つの刻みあたりのスクロール量を、数行分ずつではなく1ページに設定する方法はありませんでしょうか。 つまり、マウスホイールを1刻み回したときの動作を、キーボードの「PageUp」や「PageDown」を押したのと同じにしたいのです。 質問の背景としましては、ディスプレイが比較的大きいので、常に1ページがすっぽり収まる状態でページごとのレイアウトを確認しながら作業したいのですが、マウスホイールで数行スクロールすると、2ページにまたがった状態になってしまうためです。 よろしくお願い致します。

  • スクロールスピードを遅くしたい

    現在、WindowsMeを使っています。 それで、画面をスクロールする時のスピードをかえたいのですが、なにかいい方法とかありますか。 矢印キーでスクロールさせると目がつかれてしまいます。 早くする方法はわかったのですが(キーボードのプロパティで文字の表示速度を変える)遅くするいい方法が見つかりませんでした。    なにか、これについて、いい方法やソフトウエアなどありましたら、おしえてください。お願いします。 (PageUp/PageDownキーでもスクロールして目がつかれますので。)

  • ExcelVBAで他のアプリをスクロールさせたい

    エクセルVBAから 他のアプリのスクロールバーを操作して、指定範囲で画面スクロールしたいと思っています。 キー入力では操作出来ない(マウス操作でのみスクロールされる)アプリなので、 Sendkeysは使えないのではないかと思い、 APIでハンドルを取得して、 SendMessageすればできるかなと思いましたが、APIについてよく分からないので、 とりあえず、メモ帳で以下を作成してみました。しかし、スクロールされません。 どこがいけないのか教えていただけないでしょうか? よろしくお願いします。 *************** Public Declare Function FindWindowA Lib "User32" (ByVal cnm As String, ByVal cap As String) As Long Public Declare Function SendMessage Lib "User32" Alias "SendMessageA" _ (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Const WM_VSCROLL = &H115 Public Const WM_HSCROLL = &H114 Public Const SB_TOP = &H6& Public Const SB_BOTTOM = &H7& Sub handle_get()  Dim Handle As Long  Dim Ap1 As String  Ap1 = "a.txt - メモ帳"  AppActivate Ap1  Handle = FindWindowA(vbNullString, Ap1)  SendMessage Handle, WM_VSCROLL, SB_BOTTOM, ByVal CLng(0)  SendMessage Handle, WM_HSCROLL, SB_TOP, ByVal CLng(0) End Sub ***************

  • カーソルが次のレコードに移動する

    ACCESS2010を使用しています。 単票形式のメインフォームに、帳票形式のサブフォームが2つあるフォームを作成しています。 メインフォームには項目が20個程、サブフォームは共に4つ程の入力項目があります。 サブフォームとメインフォームのカーソルの移動にマウスを使用するのが面倒なので、PageUp/Donwキーを使用するようにしているのですが、PageDownキーを使用した時に何故なのか分からない現象が起きます。 入力済みのレコードを画面上に呼び出しPageUpキーを押すと、2つ目のサブフォームの入力済みレコード1件目の1個目の項目にカーソルが移動し、更にPageUpキーを押すと1つ目のサブフォームの入力済みレコード1件目の1個目の項目にカーソルが移動します。 ですが、PageDownキーをした時、1つ目のサブフォームへの移動はPageUpキーと同じ結果ですが、更にPageDownキーを押し2つ目のサブフォームに移動した時、入力済みのレコードではなく新しいレコードの1個目の項目にカーソルが移動してしまいます。 フォーム自身にもVBAにもそのような制御やコードは書いていないのですが、何故動きが異なるのかが分かりません。 ヒントになるような事でも結構です。

  • C#:ListViewでのスクロールイベントの取得について

    .Net2003 C# にてアプリを作成しています。 .Netを始めて初心者です。(プログラミング経験も浅いです) ListView1とListView2を作成して、 ListView2がスクロールしたら、ListView1も同じくスクロールさせる と言ったListViewのスクロールの同期化処理を行いたいのですが、 ソースコードが思いつきません。 ListViewのイベント、プロパティにはスクロール情報を取得するモノが みつかりませんでした。 現在は下記サイトを参考にさせて頂き、スクロールイベントの発生をキャッチする所までは なんとかたどり着いたのですが、ここからどうやって ListView1にスクロール同期化をさせるコードを書いていいのかが 思いつきません。 何か参考になるHPや、コードがありましたら教えてください。 http://dobon.net/vb/dotnet/control/firescrollevent.html から以下コードを参考にしました。 protected override void WndProc(ref Message m) { const int WM_HSCROLL = 0x114; const int WM_VSCROLL = 0x115; switch (m.Msg) { case WM_HSCROLL: Console.WriteLine( "水平スクロールバーがスクロールされました。"); break; case WM_VSCROLL: Console.WriteLine( "垂直スクロールバーがスクロールされました。"); break; } base.WndProc(ref m); }

  • EXCEL2010でカーソル移動時に

    EXCEL2010でカーソル移動時にキーボードのカーソルキーを押すと、以前までカーソルキーのみで、 セル間を移動できたのに画面がキーの方向に移動するようになりました。(Pageup、Pagedownと同じ動作) これを直す方法が分かる方、教えてください。