戻る  □一般操作のサロン  □ 使用方法  □ 新着記事  □ 新規に質問する!  □ トピック一覧  □ 検索  □ 過去ログ
[ 最新記事及び返信フォームをトピックトップへ ]
このトピック参照回数 :
マウスの右クリックが認識できない。

    [192050] マウスの右クリックが認識できない。-

    ■親トピック/記事引用/メール受信=OFF■

    □投稿者/ 吉田 -(2020/05/20(14:36))
    □U R L/
      少し前の質問(191920)で(2uさんに)教えていただいた中にリンクを貼っていただいており、
      今、ソコを勉強していますが、以下の質問が出ました。
      
      
      リンクの内容は、マウスクリックの左右を判断するというモノで、
      やってみたら確かにそのとおり動きました。
      
      そこで、私なりに以下のようなコードを作りやってみたところ、
      「マウスの右クリック」が認識出来ませんでした。
      
      リンクと違う結果が出て不思議ですが、
      理由、その他を教えていただきたく質問しました。
      宜しくお願いします。
      
      
      
      @貼っていただいたリンク
      'マウスクリックを検出する
      'h ttps://excel-excel.com/tips/vba_151.html
      
      
      A検証したコード
      最上段がリンクから抜粋したコードで、
      その下の3件が私が書いた検証用のコードです。
      
      Private Sub MyMouseClick0()
          Do Until GetAsyncKeyState(27) <> 0
            If GetAsyncKeyState(vbKeyLButton) <> 0 Then
                lnum = lnum - 1
              ElseIf GetAsyncKeyState(vbKeyRButton) <> 0 Then
                  lnum = lnum + 1
            End If
            Cells(1, 1) = lnum
            DoEvents
          Loop
       End Sub
       
      Private Sub MyMouseClick1()
          Do Until GetAsyncKeyState(27) <> 0
          DoEvents
          If GetAsyncKeyState(vbKeyLButton) = 1 Then
              MsgBox "hidari"
              Exit Sub
             Else
               MsgBox "migi"
               Exit Sub
          End If
          Loop
      End Sub
      
      Private Sub MyMouseClick2()
          Do Until GetAsyncKeyState(27) <> 0
          DoEvents
          If GetAsyncKeyState(vbKeyRButton) = 1 Then
              MsgBox "migi"
              Exit Sub
             Else
               MsgBox "hidari"
               Exit Sub
          End If
          Loop
      End Sub
      
      Private Sub MyMouseClick3()
          MsgBox GetAsyncKeyState(vbKeyRButton)
          MsgBox GetAsyncKeyState(vbKeyLButton)
      End Sub
      
      
      
      B検証結果
      マウスのクリックでは、
       左で、GetAsyncKeyState(vbKeyLButton)には「1」が返りますが、
       右で、GetAsyncKeyState(vbKeyRButton)には「0」しか返りません。
         →右の認識が出来ません。
         
       また、リンクにあったコードでも上記の条件から問題無いように見えてしまいます。
         
      以上


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他



      ++++++++++++++++++++
      OS      ⇒OTHER
      Version⇒Excel 2003
      ++++++++++++++++++++




    [192051] Re[1]: マウスの右クリックが認識できない。-

    記事引用/メール受信=OFF■

    □投稿者/ とことこ -(2020/05/20(21:43))
    □U R L/
      まず初めに、GetAsyncKeyStateの判定は
      「1」かどうかで判断するのではなく
      「0以外」かどうかで判断してください。
      
      で本題ですが、
      MyMouseClick0
      は無限ループで、目にも見えない速さで
      GetAsyncKeyStateを
      連続して呼び出してます。
      (1秒間に何千回・何万回という速さ)
      Escキー(27)を押すまで。
      
      しかし、
      MyMouseClick1
      MyMouseClick2
      MyMouseClick3
      は無限ループを回していません。
      
      MyMouseClick1
      MyMouseClick2
      は無限ループを書いていますが、
      実際には、無限ループを回ることはありません。
      
      
      あと、こういう確認するときはMsgBoxは使用しないでください。
      MsgBoxを閉じるために、左クリックしたりエンターキーを押したりすると
      思いますが、その「左クリックした」とか「エンターキー押した」という
      情報も検出されてしまいます。


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [192052] Re[2]: マウスの右クリックが認識できない。-

    記事引用/メール受信=OFF■

    □投稿者/ 吉田 -(2020/05/21(07:22))
    □U R L/

      とことこ様、有り難うございます。
      色々と見ていただきお手間を取らせました。
      ご指摘でだんだん進む気がしてきました。
      さらなる質問をお願いします。

      >0以外」かどうかで判断してください。
       まさにこれが質問した引き金なのですが、
       理由を教えて下さい。
       「yes」だと「1」が返るのではないのでしょうか。

      >連続して呼び出してます。
       まさにこれも不思議だったのですが、理由を教えて下さい。
       確かに私が書いたコードは実際にはループしません。
       元をそっくり使い、単に確認したい部分だけを使ったモノで。
       判定にはループが必要なのでしょうか。

      msgboxが不適という件は良く分かりました。

      兎に角、「マウスの右クリックは判定可能なのか」が主旨です。
      そして可能なら、MyMouseClick0がその方法なのでしょうか、

      引き続き宜しくお願いします。




    [192053] Re[3]: マウスの右クリックが認識できない。-

    記事引用/メール受信=OFF■

    □投稿者/ 2u -(2020/05/21(20:07))
    □U R L/
      こういう場合、GetAsyncKeyStateで検索してみてはいかがでしょうか。
      
      GetAsyncKeyState - API 関数解説
      h ttps://www.tokovalue.jp/function/GetAsyncKeyState.htm
      
      こちらには戻り値の解説があります。
      戻り値
          関数が成功すると、前回の GetAsyncKeyState 関数呼び出し以降にキーが押されたかどうか、およびキーが現在押されているかどうかを示す値が返る。
        最上位ビットがセットされたときは現在そのキーが押されていることを示し、最下位ビットがセットされたときは前回の GetAsyncKeyState 関数呼び出し以降にそのキーが押されたことを示す。
      
      VBAで押されたキーボードを取得する方法
      h ttps://liclog.net/getasynckeystate-function-vba-macro-catia-v5/
      
      こちらでは使用例などがあります。
      
      こちらも確認していませんでしたが、GetAsyncKeyState 関数の戻り値の型は
      Long ではなくて Integer ですね・・・。すみません。
      
      以下、サンプルです。
      
      Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
      
      Sub MyMouseClick()
      
          Const KeyPress As Integer = &H8000
          Const KeyDown As Integer = 1
          
          Dim KeyState As Integer
          
          Cells(1, "A").Value = "マウス左"
          Cells(1, "B").Value = "マウス右"
          
          Do Until GetAsyncKeyState(vbKeyEscape) <> 0
          
              KeyState = GetAsyncKeyState(vbKeyLButton)
              Cells(2, "A").Value = Hex(KeyState)
              If KeyState And KeyDown = KeyDown Then
                  Cells(3, "A").Value = "KeyDown"
                  Cells(3, "B").Value = ""
              End If
              
              KeyState = GetAsyncKeyState(vbKeyRButton)
              Cells(2, "B").Value = Hex(KeyState)
              If KeyState And KeyDown = KeyDown Then
                  Cells(3, "A").Value = ""
                  Cells(3, "B").Value = "KeyDown"
              End If
              DoEvents
          Loop
      End Sub
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [192054] Re[4]: マウスの右クリックが認識できない。-

    記事引用/メール受信=OFF■

    □投稿者/ 吉田 -(2020/05/21(20:37))
    □U R L/

      2u様、何時もありがとうございます。
      そして今回も色々調べていただき、お手間をかけます。

      誠に申し訳ありませんが、今会社で休み時間に出てきました。
      明日の朝帰ってからやってみます。

      取り敢えずお礼までです。
      今度ははっきりしそうです。
      楽しみにしています。




    [192055] Re[5]: マウスの右クリックが認識できない。-

    記事引用/メール受信=OFF■

    □投稿者/ 吉田 -(2020/05/22(06:50))
    □U R L/
      2u様、お世話になります。
      
      今帰ってきて取り敢えずサンプルコードをコピーし、やってみました。
      チャンと右クリックも返ってきますが、予想とは違う場合があります。
      (右では変化がなく、次ぎに左を押したときに右にkeydownが出るなど)
      もう少し試してから、かつ貼っていただいたリンクを読んでから報告させてください。
      
      なお、私も検索はしていたのですが、
      GetAsyncKeyState(vbKeyLButton)の様なキーにしていました。
      これでは出てこないですよね。
      検索の仕方も分かっていないからでしょう、頓珍漢でした。
      
      あと、(未だ内容が読めていないので分かりませんが)、
      If KeyState And KeyDown = KeyDown Then
       は if keystate then と同じではないでしょうか。
       本件とは関係無いレベルの質問ですが、?です。
      
      以上、宜しくお願いします。


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [192056] Re[6]: マウスの右クリックが認識できない。-

    記事引用/メール受信=OFF■

    □投稿者/ とおりすがり -(2020/05/22(07:26))
    □U R L/
      とりあえず、この部分だけ。
      
      >>If KeyState And KeyDown = KeyDown Then
      > は if keystate then と同じではないでしょうか。
      
      If KeyState And KeyDown = KeyDown ThenIf (KeyState) And (KeyDown = KeyDown) Then
      のように評価されるならば、
      (KeyDown = KeyDown)は常にTrueなので、あなたの言うようになります。
      
      しかし実際には
      If (KeyState And KeyDown) = (KeyDown) Then
      のように評価されます。
      
      そして、この時の And は
      論理演算子ではなくビット演算子になります。
      
      KeyDown は &H8000 なので2進数表記で 10000000 00000000 です。
      
      KeyState (GetAsyncKeyStateの戻り値)は2進数表記で
      00000000 00000000 ( = 0 )
      00000000 00000001 ( = 1 )
      10000000 00000000 ( = &H8000 = -32768 )
      10000000 00000001 ( = &H8001 = -32767 )
      のいずれかがセットされます。
      
      KeyState      KeyState And KeyDown    KeyState And KeyDown = KeyDown
      -----------------  -----------------  ---------------------------------------
      00000000 00000000  00000000 00000000  False
      00000000 00000001  00000000 00000000  False
      10000000 00000000  10000000 00000000  True
      10000000 00000001  10000000 00000000  True
      
      以上は、細かい話になりますが、
      >>If KeyState And KeyDown = KeyDown Then
      でやりたいことは結局のところ
      KeyDownと同じビット(最上位ビット・一番左の1ビット)が
      KeyState の中で1かどうか
      を判定しているだけです。
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [192057] Re[7]: マウスの右クリックが認識できない。-

    記事引用/メール受信=OFF■

    □投稿者/ 吉田 -(2020/05/22(09:30))
    □U R L/

      とおりすがり様、有り難うございます。

      私の疑問を完璧に解釈いただき、
      サラに実際の動きをこと細かに説明いただき、
      完璧に納得、理解できました。
      (こんなところで間違うはずはない、とも思っていましたが私の知識では着いていけなかったので)

      ただ、このようなコードでは「そのように解釈される」、
      というのが当たり前なのでしょうか、
      それとも「データの中身による」ということなのでしょうか。

      兎に角、疑問が解け、眼の前が開けました。
      頂いた説明を踏まえもう少し先を勉強します。
      お世話になりました。




    [192058] Re[8]: マウスの右クリックが認識できない。-

    解決!!ありがとうございました! / 記事引用/メール受信=OFF■

    □投稿者/ 吉田 -(2020/05/22(10:18))
    □U R L/
      皆様のお教えの下、全て納得し、解決しました。
      チャンとマウスの右クリックが捉えられることを確認出来ました。
      これまで教えていただいたコードを使い、以下のコードで確認しました。
      
      Option Explicit
      Private Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Integer
      Sub MyMouseClick()
        Dim h8 As Long
        Dim m8 As Long
        Dim s8 As Long
        Dim wait8 As Variant
        Dim KeyState As Integer
      
          Const KeyPress As Integer = &H8000
          Const KeyDown As Integer = 1    
          
          Cells(1, "A").Value = "マウス左"
          Cells(1, "B").Value = "マウス右"
          
          Do Until GetAsyncKeyState(vbKeyEscape) <> 0
            KeyState = GetAsyncKeyState(vbKeyLButton)
            Cells(2, "A").Value = Hex(KeyState)
            If KeyState And KeyDown = KeyDown Then
                Cells(3, "A").Value = "KeyDown"
                Cells(3, "B").Value = ""
            End If
              
            KeyState = GetAsyncKeyState(vbKeyRButton)
            Cells(2, "B").Value = Hex(KeyState)
            If KeyState And KeyDown = KeyDown Then
                Cells(3, "A").Value = ""
                Cells(3, "B").Value = "KeyDown"
            End If
            
            DoEvents
                    
            h8 = Hour(Now())
            m8 = Minute(Now())
            s8 = Second(Now()) + 1
            wait8 = TimeSerial(h8, m8, s8)
            Application.Wait wait8
            Cells(3, "A") = ""
            Cells(3, "B") = ""
          Loop
      End Sub
      
      Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
          Cancel = True
      End Sub
      
      2uさん、とおりすがりさん、大変お世話になりました。
      深謝です。


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他



このトピック内容の全ページ数 / [0]

このトピックに書きこむ
Name/
E-Mail/

└>このツリーのレス記事をメールで受信しますか? YES/ NO/
Title/
URL/
Comment/ 通常モード->  図表モード-> (←の場合適当に改行を入れて下さい)
タグが使用できます。例 ⇒ <font color="blue">文字</font>
解決!!ありがとうございました! 解決       保留中です・・・ 保留        迷宮入りorほかあたって見ます・・ 迷宮入       すいませ〜ん。誰か〜! Help! ←※回答者専用
解決したらチェック       保留(コードテスト中など・・)         解決不可orレスが全く付かなくてほかのサイトに行くときなど・・
削除キー/
(半角8文字以内) 


- Child Forum -
Edit:ゆう-G