DOBON.NET DOBON.NETプログラミング掲示板過去ログ

vb.netでキーとマウスクリックを同時に処理させたいのですが。

環境/言語:[VB.NET2008]
分類:[.NET]


 いつも参考にさせていただいています。

 現在、以下のような処理をしようとしているのですが、どうしてもボタンをクリックした処理が飛ばされてしまいます。

 1.CTLキーを押すとリストビュー1に項目を追加する。

 2.ボタンをクリックするとリストビュー2に項目を追加する。

 1のキー押下とボタンクリックが同時になる時があり、その場合、
 ボタンクリックの処理がスルーされてしまいます。

 リストビュー1に項目は追加されるが、リストビュー2に項目が追加
 されない。

 何とか同時に押しても処理できる方法はないでしょうか?

 ※別スレッドで実行する方法を試したのですが、変わりませんでした。

 何卒、よろしくお願いいたします。
■No27779に返信(困り果てている人さんの記事)

記述したコードの抜粋がないとコメント大変だと思います。

 ありがとうございます。

 コードは以下のようになっています。

  'CTRLキーを押した時の処理
Private Sub From1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown

Select Case e.KeyData
Case 131089 'Ctrl
GoTo JIKKO
Case Else
Exit Sub
End Select
JIKKO:
Dim WSTR As String

Dim Wlist As New ListViewItem
Wlist.Text = "キーを押しました"
Me.ListView_Time.Items.Add(Wlist)
Me.ListView_Time.EnsureVisible(Me.ListView_Time.Items.Count - 1)

End Sub

  'ボタンをクリックしたときの処理
Private Sub BT_1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_1.MouseClick

Dim Wlist As New ListViewItem
Wlist.Text = "ボタンをクリックしました"
Me.ListView7.Items.Add(Wlist)
Me.ListView7.EnsureVisible(Me.ListView7.Items.Count - 1)

End Sub

  パソコンの操作でCTRLキーを押すのと、マウスでボタンをクリックするのを
  同時にすると、ボタンの処理が実行されない時がたまにあります。
■No27781に返信(困り果てている人さんの記事)

> Me.ListView_Time.Items.Add(Wlist)
> Me.ListView_Time.EnsureVisible(Me.ListView_Time.Items.Count - 1)
この辺でブロックされているんじゃないかな?データをバッファリングだけして
処理が空いているときに追加するようにしてみてはどうでしょう。

 アドバイスありがとうございます。
 また、連絡が遅くなって申し訳ありません。

 Me.ListView_Time.Items.Add(Wlist)
Me.ListView_Time.EnsureVisible(Me.ListView_Time.Items.Count - 1)

 の部分をコメントにして実行したのですが、やはり状況は変わりませんでした。

 もしかすると、処理うんぬんではなく、OSの基本的なところなのかもしれません。
 ボタンが押されなかったことが分かるような工夫をして対応したいと思います。

 お忙しい中、ありがとうございました。
  • 題名: Re[5]: ありがとうございます
  • 著者: shu
  • 日時: 2010/12/09 22:36:23
  • ID: 27803
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No27796に返信(困り果てている人さんの記事)
>
>  アドバイスありがとうございます。
>  また、連絡が遅くなって申し訳ありません。
>
>  Me.ListView_Time.Items.Add(Wlist)
> Me.ListView_Time.EnsureVisible(Me.ListView_Time.Items.Count - 1)
>
>  の部分をコメントにして実行したのですが、やはり状況は変わりませんでした。
>
>  もしかすると、処理うんぬんではなく、OSの基本的なところなのかもしれません。

そうするとウィンドウメッセージレベルで処理しないと無理なのかな。
■No27781に返信(困り果てている人さんの記事)
> パソコンの操作でCTRLキーを押すのと、マウスでボタンをクリックするのを
> 同時にすると、ボタンの処理が実行されない時がたまにあります。

「ボタンの処理が実行されないこと」をどうやって検証しましたか?
ブレークポイントですか?ログ出力か何かですか?
回答ではありません。
100%再現するので方法を記載しておきます。確認はコンソール出力(Console.WriteLineなど)で行いましたのでイベント消失しないと思うのですが。
------
1)ボタン上でマウスを押下。
2)CTRLキーを押下。
3)CTRLキーを離す。
4)マウスを離す。

--- 確認コード
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Console.WriteLine("ボタンをクリックしました")
End Sub

Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
Console.WriteLine("キーを押しました")
End Sub
------
動作を見ていると3)を行うとマウスの押下状態が解除されてしまうみたい。ボタンの背景が押下されていない状態になる。
VB6で作成したプログラムではそんなことは起きなかったので推測として.NET Frameworkの仕様かも。
いい加減でも良いのならClickイベントではなく、マウスのDownでフラグを設けてUpで処理するようにするとか。
  • 題名: ありがとうございます!
  • 著者: 困り果てている人
  • 日時: 2010/12/10 18:03:15
  • ID: 27811
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示

 みなさん、色々とアドバイスをありがとうございます。

 MouseClickをMouseDownに変更したところ、現象がみられなくなりました。
 100回程度確認し、一度も発生しませんでした。

 これで望んでいた処理を実現できそうです。

 本当にありがとうございました!!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板