アプリ版:「スタンプのみでお礼する」機能のリリースについて

VB6で開発しています。

ラベルとListViewのみのフォーム上で、
PageUpやPageDownキー押下で、イベントを発生させたいのですが、
PageDownを押下すると、ListView内のリストのカーソルが下に移動してしまい、
(フォーカスが当たるコントロールがListViewしかないためと思われますが)
イベントが発生せずに困っています。

自分で実現しようとしてできなかった方法を紹介します
・リストビューにフォーカスが当たらないようにする。
  Enabled = Falseだとスクロールバーが使えないので困る。
  
・ListViewはEnabled=Falseにし、スクロールバーコントロールを使って、スクロールさせる。
  スクロールさせる方法が見つかりませんでした。

何か、よいアイデアや方法があれば、ご教授宜しくお願いしますm(_ _)m

A 回答 (3件)

VB6の標準コントロールの場合は FormのKeyPreviewをTrueにすることでコントロールより先にForm側でKeyPress/KeyDown/KeyUpで処理可能なようです


しかしListViewやTreeViewの場合同様の設定を施しても ListView側がキーイベントを処理してしまうようです

方法としては ListViewコントロールをサブクラス化してサブクラス化したListViewのWndProcのなかで WM_KEYDOWNなどのメッセージを親に通知する仕組みを構築する必要がありそうです

この回答への補足

上記の方法ですと、大変難しそうで自分には無理です(^^;)

上記の方法を見て思いついて、結局、
ListViewのKeyDownイベントで、フォームのKeyDownイベントを呼び出すことにしました。
いろいろありがとうございました。

補足日時:2008/07/31 10:30
    • good
    • 0

Accessのフォーム上にテキストボックスを配置したケースでテストしました。



Private Sub テキスト0_KeyDown(KeyCode As Integer, Shift As Integer)

If KeyCode = vbKeyPageUp Then MsgBox ("PageUp")
If KeyCode = vbKeyPageDown Then MsgBox ("PageDown")

End Sub

これまた参考までに。
    • good
    • 0
この回答へのお礼

ありがとうございます。参考にいたします。

お礼日時:2008/07/31 10:29

PageUp/PageDownはKeyPressイベントでは使用不可のようです。


KeyDown/KeyUpイベントの場合は使用可能のようです。

この2点はVB6(持っていいないのでAccessVBAリファレンスを参照しました)もVB.netも同じのようですが、.netの方には自動処理(本来の動作)を無効にするために(?)IsInputKey メソッドをオーバーライドしろと記述がありますが、VBAの方には特に記述がなかったので、詳細不明です。

以下その解説を転載します。

キーボード イベントをフォームでだけ処理し、そのイベントを他のコントロールでは受け取らないようにする場合は、フォームの KeyPress イベント処理メソッドの KeyPressEventArgs.Handled プロパティを true に設定します。Tab キー、Enter キー、Esc キー、方向キーなどは、コントロールによって自動処理されます。これらのキーで KeyDown イベントを発生させるには、フォーム上の各コントロールで IsInputKey メソッドをオーバーライドする必要があります。IsInputKey のオーバーライドのコードは、特殊なキーのいずれかが押され、そのキーが true の値を返したかどうかを判断する必要があります。

文中の「これらのキー」にPageUp/PageDownはふくまれます。

以上参考までに。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています