tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル クリックで素早く押して離すと反応しません。
記事No16314
投稿日: 2017/06/09(Fri) 09:23
投稿者susu
度々、お世話になります。

環境
OS:Windows 7/8/10  IE 11   VB 6.0
VB歴は長いのですが詳しくはありません。

クリックで素早く押して離すと反応しませんの件につきまして、ご質問致します。

右クリックが押された場合に処理するようにしています。

定義  Private Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As Long

   If (GetAsyncKeyState(vbKeyRButton) < 0) then

        処理

   end if

概要
(押す⇒離す)押している時間が瞬時ですと処理されない事があります。
マウスのプロパティ⇒ダブルクリックの速度を変えても改善されませんでした。、
推測になりますが、GetAsyncKeyState関数が感知する最小必要時間に達していないものと考えています?。
そこで、他に関数を探しましたらマウスボタンが押されているが調べるmousePressed()がありました。
しかし、使い方が分かりません。  


質問
mousePressed()はvb6でも使用できますでしょうか。
mousePressed()を使用する際の定義は必要ないのでしょうか。

ご教示願えますと幸いであります。

[ツリー表示へ]
タイトルRe: クリックで素早く押して離すと反応しません。
記事No16315
投稿日: 2017/06/09(Fri) 13:49
投稿者魔界の仮面弁士
> 右クリックが押された場合に処理するようにしています。

自フォーム上なら MouseDown イベントで処理できそうですが、
フォーム外も拾いたいなら、DirectX を使う方法があります。
http://www.geocities.jp/konbiki/tips/mouse/


> (押す⇒離す)押している時間が瞬時ですと処理されない事があります。

マウス側の性能限界というわけでは無いのですね?


> 他に関数を探しましたらマウスボタンが押されているが調べるmousePressed()がありました。

Java Applet の mousePressed のことでは無いですよね?

mousePressed という API や COM メソッドに聞き覚えが無かったので、
どこで見つけたか教えてもらえないでしょうか。

[ツリー表示へ]
タイトルRe^2: クリックで素早く押して離すと反応しません。
記事No16316
投稿日: 2017/06/09(Fri) 14:53
投稿者susu
魔界の仮面弁士 さん

返答をして頂きまして、ありがとうございます。

>自フォーム上なら MouseDown イベントで処理できそうですが、
>フォーム外も拾いたいなら、DirectX を使う方法があります。
>http://www.geocities.jp/konbiki/tips/mouse/
ありがとうございます。自フォーム上ではなくWebブラウザーをクリックします。

>マウス側の性能限界というわけでは無いのですね?
説明不足で申し訳ありませんでした。
他のマウスで試しても瞬時ですと処理されない同じ現象になりました。
また、テストでは、クリックを早くするとtext1が加算されないことがありますが、
押す時間を心持ち長くしますと問題なく加算されます。
それにより関数の問題かと疑いました。

If (GetAsyncKeyState(vbKeyRButton) < 0) then

 text1=text1+1'テスト

          処理
     end if

>Java Applet の mousePressed のことでは無いですよね?
済みません。その点につきましては、分からないで投稿していました。

>mousePressed という API や COM メソッドに聞き覚えが無かったので、
>どこで見つけたか教えてもらえないでしょうか。

http://mslabo.sakura.ne.jp/WordPress/make/processing%E3%80%80%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/%E3%83%9E%E3%82%A6%E3%82%B9%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%8C%E6%8A%BC%E3%81%95%E3%82%8C%E3%81%9F%E4%BA%8B%E3%82%92%E5%88%A4%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF/

「マウスボタンが押された事を判定するには - 自己啓発。人生について考える」

[ツリー表示へ]
タイトルRe^3: クリックで素早く押して離すと反応しません。
記事No16317
投稿日: 2017/06/09(Fri) 15:51
投稿者魔界の仮面弁士
> ありがとうございます。自フォーム上ではなくWebブラウザーをクリックします。

WebBrowser コントロールの右クリック動作なら、こういう方法があります。
http://www.gizcollabo.jp/vbtomo/log/archive/choshoqa_18083_0.html

Option Explicit
Private WithEvents doc As MSHTML.HTMLBody

Private Sub Form_Load()
    WebBrowser1.Navigate2 "http://hanatyan.sakura.ne.jp/index.html"
End Sub

Private Sub doc_onmousedown()
    Debug.Print "onmousedown"
    DumpMouse
End Sub

Private Function doc_oncontextmenu() As Boolean
    Debug.Print "oncontextmenu"
    
    DumpMouse

    'True : コンテキストメニューを表示する
    'False: コンテキストメニューを表示させない
    doc_oncontextmenu = False
End Function

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    Set doc = pDisp.Document.body
End Sub

Private Sub DumpMouse()
    On Error Resume Next
    Dim eventObject As MSHTML.IHTMLEventObj
    Set eventObject = WebBrowser1.Document.parentWindow.event
    Debug.Print "  XY=("; eventObject.x; ", "; eventObject.y;
    Debug.Print ") / Client ["; eventObject.clientX; ", "; eventObject.clientY; "]"
    Debug.Print "  button="; eventObject.button;
    If eventObject.altKey Then Debug.Print " Alt";
    If eventObject.ctrlKey Then Debug.Print " Ctrl";
    If eventObject.shiftKey Then Debug.Print " Shift";
    Debug.Print
End Sub


> 他のマウスで試しても瞬時ですと処理されない同じ現象になりました。

GetAsyncKeyState で認識されないだけで、クリック時の処理は動作しているということですか?
(クリック自体が認識されていないのかと思っていました)


>> mousePressed という API や COM メソッドに聞き覚えが無かったので、
>> どこで見つけたか教えてもらえないでしょうか。
冒頭に「PROCESSING 逆引きリファレンス」と書かれていますし、
それは Processing 言語ではありませんか? VB とは無関係だと思いますよ。
https://ja.wikipedia.org/wiki/Processing

[ツリー表示へ]
タイトルRe^4: クリックで素早く押して離すと反応しません。
記事No16318
投稿日: 2017/06/09(Fri) 17:01
投稿者susu
魔界の仮面弁士 さん

>GetAsyncKeyState で認識されないだけで、クリック時の処理は動作しているということですか?
>(クリック自体が認識されていないのかと思っていました)
認識されない時は、処理の動作はされません。

>冒頭に「PROCESSING 逆引きリファレンス」と書かれていますし、
>それは Processing 言語ではありませんか? VB とは無関係だと思いますよ。
>hhttps://ja.wikipedia.org/wiki/Processing
はい、分かりました。詳しくはありませんので、ご理解ください。

参考プログラムを記載して頂きましてありがとうございました。

大変申し訳ありませ。まだ、説明不足がありました。今回の投稿により気がつきました。

Private Sub Timer1_Timer() 'タイマー

    If (GetAsyncKeyState(vbKeyRButton) < 0) then

        処理

   end if

end if


今回の投稿によりTimer1のintervalが直接影響しているのではないか?。
長い間疑問でいましたがマウス、関数ではなくプログラムのタイマーの設定時間に
問題があるのではないか気が付きました。Timer1.intervalの時間を変えてテストしてみます。

実際に確認して結果を再度、ご報告させてもらいます。

いつも、ご教示、ご指摘してしてもらいまして心より感謝申し上げます。

[ツリー表示へ]
タイトルRe^5: クリックで素早く押して離すと反応しません。
記事No16319
投稿日: 2017/06/09(Fri) 19:20
投稿者susu
魔界の仮面弁士 さん

Timer1.intervalは、100msに設定していました。

極端に1000ms〜1msでテストしましたら反応の違いがありました。
こちらでの環境で行った限り極端に素早くクリックを10回しますと
1000ms 0回 100ms 3回 10ms 8回 1ms 10回 感知されました。

1msで素早く押して離すテストでは100%ではありませんでしたが特に問題ない範囲でした。
実際の処理時間は、1〜6数msでしたのでTimer1.intervaを10msに設定し直しました。
試しにTimer1.intervaを1msにしても他に影響ないかテストしてみたいと思います。

Private Sub Timer1_Timer() 'タイマー

    If (GetAsyncKeyState(vbKeyRButton) < 0) then

        処理(1〜6数ms)

   end if

end if

魔界の仮面弁士 さん、今回のご指摘等により、タイマーに気が付くことができ長い間の疑問が解決できました。
いつも、本当にありがとうございます。感謝申し上げます。

[ツリー表示へ]
タイトルRe^6: クリックで素早く押して離すと反応しません。
記事No16320
投稿日: 2017/06/10(Sat) 07:57
投稿者susu
魔界の仮面弁士 さん

追加分です。

>WebBrowser コントロールの右クリック動作なら、こういう方法があります。
実際に起動てみました。今後の参考にさせてもらいたいと思います。

タイマーの割り込み内で使うのは適当で無いと今回気ずきました。
クリックは、IeWebからurlとタイトルを取得しています。
タイマー無い方法で進めているところです。

説明が不十分でしたので、お手数をお掛けしました。

大変、お世話になり感謝申し上げます。

[ツリー表示へ]
タイトルRe^7: クリックで素早く押して離すと反応しません。
記事No16321
投稿日: 2017/06/11(Sun) 00:57
投稿者魔界の仮面弁士
> クリックは、IeWebからurlとタイトルを取得しています。

IeWeb というのが何を指しているのかわからなかったのですが、
字面からして、InternetExplorer や WebBrowser のことでしょうか?
その場合、HTMLDocument オブジェクトから url や タイトルを取得できますね。

処理対象のウィンドウを指定させるためのクリック操作を監視しようというのが
今回の目的ということだとすれば、マウス操作をリアルタイムに捉える必要があるわけで、
その場合、タイマーの利用はお薦めできません。仕組み上、取りこぼしが発生します。

No16315 で紹介した方法でマウス操作を統括的に捕らえる方が良いと思います。もしくは
No16317 のような方法などで、各ウィンドウ単位の操作を拾うかですかね。


> タイマーの割り込み内で使うのは適当で無いと今回気ずきました。
×気ずく
○気づく(気付く)

[ツリー表示へ]
タイトルRe^8: クリックで素早く押して離すと反応しません。
記事No16322
投稿日: 2017/06/11(Sun) 10:52
投稿者susu
魔界の仮面弁士 さん

度重なる返答を頂きまして、ありがとうございました。

> >クリックは、IeWebからurlとタイトルを取得しています。

>IeWeb というのが何を指しているのかわからなかったのですが、
>字面からして、InternetExplorer や WebBrowser のことでしょうか?
また、不備がありまして申し訳ありませんでした。
InternetExplorerです。IE11で行っています。
今後は、できる限り具体的に記載するようにしたいと思います。
(参考:WebBrowserは別なところで使用していますが問題なくできています)

>処理対象のウィンドウを指定させるためのクリック操作を監視しようというのが
>今回の目的ということだとすれば、マウス操作をリアルタイムに捉える必要があるわけで、
>その場合、タイマーの利用はお薦めできません。仕組み上、取りこぼしが発生します。
大変、参考になりました。

>> タイマーの割り込み内で使うのは適当で無いと今回気ずきました。
>×気ずく
>○気づく(気付く)
迷った場合は検索で確認するように心がけていますが。
ご指摘して頂きまして、ありがとうございました。

[ツリー表示へ]
タイトルRe^9: クリックで素早く押して離すと反応しません。
記事No16323
投稿日: 2017/06/12(Mon) 05:05
投稿者susu
魔界の仮面弁士 さん

ご教示により解決することができました。

>処理対象のウィンドウを指定させるためのクリック操作を監視しようというのが
>今回の目的ということだとすれば、マウス操作をリアルタイムに捉える必要があるわけで、
>その場合、タイマーの利用はお薦めできません。仕組み上、取りこぼしが発生します。
取りこぼしが発生していましたので、下記のように変更、追加をしまいた。
>タイマーの利用はお薦めできません。
処理でのタイマーの利用は中止しました。
>リアルタイムに捉える必要があるわけで
新たにタイマーを追加しその中にGetAsyncKeyState関数と
処理用のタイマーを開始するようにしました。

動作確認
クリックで素早く押して離しても反応するようになりました。
極端に処理用タイマー(Timer1)の時間を5秒に定め、マウスを
素早く押して離しても5秒後には反応するようになりました。
また、取りこぼしが発生しないようになりました。
(もう少し問題ないかテストを続けます) Timer1_Timer > Timer2_Timer

ご指摘をして頂きましたことから大変、参考になり解決に繋がりました。

Private Sub Timer1_Timer()
        
   'If (GetAsyncKeyState(vbKeyRButton) < 0) then  '中止

       Form1.Timer1.Enabled = 0 'イベント停止を追加しました。
       
                   処理

    'end if  '中止

End Sub


新たにタイマーを追加しました。

Private Sub Timer2_Timer()

   If (GetAsyncKeyState(vbKeyRButton) < 0) then  Form1.Timer1.Enabled = 1 'イベント開始

End Sub   


大変、お世話になりました。心より感謝申し上げます。

[ツリー表示へ]