C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: フォームの外のマウスイベントを拾いたい


(過去ログ 31 を表示中)

[トピック内 23 記事 (1 - 20 表示)]  << 0 | 1 >>

■14980 / inTopicNo.1)  フォームの外のマウスイベントを拾いたい
  
□投稿者/ ken (6回)-(2008/02/29(Fri) 17:54:06)

分類:[VB.NET/VB2005] 

VB2005+WINXP SP2

マウスで画面上のドラッグ&ドロップした範囲をキャプチャするプログラムを作成しています。

MouseClick時の座標と、Mouseup時の座標をとりたいのですが、
フォームの外でのマウスのイベントを取得する方法がわかりません。
どのようにすればよいのでしょうか。

引用返信 編集キー/
■14984 / inTopicNo.2)  Re[1]: フォームの外のマウスイベントを拾いたい
□投稿者/ やじゅ (197回)-(2008/02/29(Fri) 18:42:33)
No14980 (ken さん) に返信
> フォームの外でのマウスのイベントを取得する方法がわかりません。
>

参考リンクだけ

GetAsyncKeyState() vbKeyLButton vbKeyRButton
http://www.itmedia.co.jp/enterprise/articles/0412/07/news034_4.html

VB.NETでGetCursorPosを使いたい
http://bbs.wankuma.com/index.cgi?mode=al2&namber=12407&KLOG=27
引用返信 編集キー/
■14986 / inTopicNo.3)  Re[1]: フォームの外のマウスイベントを拾いたい
□投稿者/ 渋木宏明(ひどり) (657回)-(2008/02/29(Fri) 19:28:58)
渋木宏明(ひどり) さんの Web サイト
いきなり API すか。

Control.Capture じゃダメなの?
引用返信 編集キー/
■14994 / inTopicNo.4)  Re[2]: フォームの外のマウスイベントを拾いたい
□投稿者/ ken (7回)-(2008/02/29(Fri) 23:02:26)
やじゅ さん、渋木宏明(ひどり) さん ありがとうございます。

やじゅ さんから教えていただいたサイトですが、

GetAsyncKeyState(vbKeyLButton)と使うのでしょうか?
vbKeyLButtonは宣言されていませんとでてしまい、使えません。
すみません、もう少しヒントをください。

渋木宏明(ひどり) さん

button.clickで、
  Me.Capture=Trueとし、

Me.MouseDownで、
  Me.TextBox1.Text &= "Mouse Down"

Me.MouseUpで、
  Me.TextBox1.Text &= "Mouse Up" & vbCrlf
  Me.Capture=False

として、デスクトップ上でドラッグ&ドラックをしたのですが、
最初にマウスを押した瞬間に、MouseDownとMouseUpが動作してしまうようで、
ドラッグ時点のマウスポイントとドロップ時点のマウスポイントが
うまく取得できません。

引き続きよろしくおねがします。

引用返信 編集キー/
■14997 / inTopicNo.5)  Re[1]: フォームの外のマウスイベントを拾いたい
□投稿者/ myugaru (25回)-(2008/03/01(Sat) 03:41:40)
myugaru さんの Web サイト
2008/03/01(Sat) 03:53:13 編集(投稿者)
2008/03/01(Sat) 03:44:01 編集(投稿者)

No14980 (ken さん) に返信

No14994 (ken さん) に返信
やろうとしてることはわかります。
まず、やじゅさんの回答はおそらくkenさんの力量では無理だと思われます
(APIの実装がわかってない返答からの推測)。

渋木宏明(ひどり)さんの言っている方法はkenさんのやりたいこととは若干はずしていると見受けます。
(最初のkenさんの質問があまりよくないです。なのでこれは渋木宏明(ひどり)さんのせいではないですよ。)

以下でおそらくkenさんのやりたい事になると思われます。

1.まずデスクトップ画面を完全に覆う大きなFormを表示します。
2.そのフォームへデスクトップ画面全体のスクリーンキャプチャを貼ります。
3.あとは2のフォーム上でFormのマウスイベントで処理します。

短く言えば「デスクトップのマウスイベント」じゃなく「Formのマウスイベント」に変換をしちゃうわけです。
一般にスクリーンセーバーも画面を完全に覆うフォームで出来ています。普通にデスクトップを全部消去して上に絵を描いて見たいな手法で思いつくとたどり着けません。

というところで。
3は、このプログラムに挑戦しようというのだからおそらくわかっているように思われますが1と2の手順がもし不明であれば再度質問ください。

引用返信 編集キー/
■14998 / inTopicNo.6)  Re[3]: フォームの外のマウスイベントを拾いたい
□投稿者/ 渋木宏明(ひどり) (658回)-(2008/03/01(Sat) 07:00:11)
渋木宏明(ひどり) さんの Web サイト
> 最初にマウスを押した瞬間に、MouseDownとMouseUpが動作してしまうようで、
> ドラッグ時点のマウスポイントとドロップ時点のマウスポイントが
> うまく取得できません。

「ドラッグ中である/ない」を表す bool 型のメンバ変数を一個追加すればいいんじゃないでしょうか。
引用返信 編集キー/
■14999 / inTopicNo.7)  Re[4]: フォームの外のマウスイベントを拾いたい
□投稿者/ myugaru (26回)-(2008/03/01(Sat) 07:05:38)
myugaru さんの Web サイト
2008/03/01(Sat) 07:09:54 編集(投稿者)

No14998 (渋木宏明(ひどり) さん) に返信
>>最初にマウスを押した瞬間に、MouseDownとMouseUpが動作してしまうようで、
>>ドラッグ時点のマウスポイントとドロップ時点のマウスポイントが
>>うまく取得できません。
>
> 「ドラッグ中である/ない」を表す bool 型のメンバ変数を一個追加すればいいんじゃないでしょうか。

おそらくデスクトップ画面のキャプチャをしたそうです。
なので最初のマウスダウンはフォームには来ないです。
なので突き詰めると私の先の提示になるかと思います。

適当に作ってみたので確認ください。
http://myugaru.wankuma.com/ScreenCapture.zip

引用返信 編集キー/
■15000 / inTopicNo.8)  Re[5]: フォームの外のマウスイベントを拾いたい
□投稿者/ 渋木宏明(ひどり) (659回)-(2008/03/01(Sat) 07:52:03)
渋木宏明(ひどり) さんの Web サイト
> おそらくデスクトップ画面のキャプチャをしたそうです。
> なので最初のマウスダウンはフォームには来ないです。

キャプチャ開始のトリガはアプリ起点なはずなので、そこんとこはどうにもなるような。

でも、キャプチャだとイベントのキャンセルが出来ないから、どっちみち都合が悪いですね ;-p

>適当に作ってみたので確認ください。

えーと、うちマルチモニタなのでw
引用返信 編集キー/
■15001 / inTopicNo.9)  Re[6]: フォームの外のマウスイベントを拾いたい
□投稿者/ myugaru (27回)-(2008/03/01(Sat) 08:14:48)
myugaru さんの Web サイト
No15000 (渋木宏明(ひどり) さん) に返信
> えーと、うちマルチモニタなのでw

ナイス返し!Σ(ノ∀`*)パチッ
引用返信 編集キー/
■15037 / inTopicNo.10)  Re[2]: フォームの外のマウスイベントを拾いたい
□投稿者/ y4yama (57回)-(2008/03/03(Mon) 08:50:41)
> ■No14980 (ken さん) に返信

あのぉ〜
WH_MOUSE_LL = 14 で検索してみたら、
.netだけで、ローレベル(WH_MOUSE_LLとWH_KEYBOARD_LL)フックはDLLを使わずに出来る
などが見つかります。
たしかに、他のウィンドウがアクティブでも、マウスのイベントを取得できますようです(C#では確認済み)
hHook = SetWindowsHookEx(WH_MOUSE_LL,・・・・
例が探せますので、APIに詳しくなくても何とかなるかも知れませんヨ
引用返信 編集キー/
■15038 / inTopicNo.11)  Re[3]: フォームの外のマウスイベントを拾いたい
□投稿者/ やじゅ (207回)-(2008/03/03(Mon) 09:06:27)
No15037 (y4yama さん) に返信

> WH_MOUSE_LL = 14 で検索してみたら、
> .netだけで、ローレベル(WH_MOUSE_LLとWH_KEYBOARD_LL)フックはDLLを使わずに出来る
> などが見つかります。

「WH_MOUSE_LL」で検索してみました。
こんなのがあったんですね、勉強不足でした。

VB2005でWindowsフックを設定する方法
http://www.hollytown.net/Start/tabid/54/EntryID/15/Default.aspx
引用返信 編集キー/
■15044 / inTopicNo.12)  Re[3]: フォームの外のマウスイベントを拾いたい
□投稿者/ 渋木宏明(ひどり) (662回)-(2008/03/03(Mon) 11:32:49)
渋木宏明(ひどり) さんの Web サイト
> たしかに、他のウィンドウがアクティブでも、マウスのイベントを取得できますようです(C#では確認済み)

でもキャンセルできないよ?

他のウィドウの上でクリックしたらそのウィンドウがアクティブになるのを防ぐすべがないわけで、それだと「デスクトップのキャプチャ」には不向きなんじゃない?

> 例が探せますので、APIに詳しくなくても何とかなるかも知れませんヨ

マウスの低レベルフックでいいなら、コンポーネントにしてあります。

http://hidori.spaces.live.com/Blog/cns!F11BB9FD8E1BC5F9!393.entry

# コメントが文字化けしちゃってますが。
引用返信 編集キー/
■15055 / inTopicNo.13)  Re[3]: フォームの外のマウスイベントを拾いたい
□投稿者/ y4yama (58回)-(2008/03/03(Mon) 16:13:26)
No14994 (ken さん) に返信
> 渋木宏明(ひどり) さん
> button.clickで、
>   Me.Capture=Trueとし、
> 
> Me.MouseDownで、
>   Me.TextBox1.Text &= "Mouse Down"
> として、デスクトップ上でドラッグ&ドラックをしたのですが、
> 最初にマウスを押した瞬間に、MouseDownとMouseUpが動作してしまうようで、

だから、MouseDownの位置は(Form1の外でも)検出できますネ
その後で、
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim loc1 As Point = Form1.MousePosition 'Windows.Forms.Cursor.Position
        Dim butn1 As Windows.Forms.MouseButtons = Form1.MouseButtons
        Label1.Text = "mov x=" & loc1.X.ToString & " y=" & loc1.Y.ToString _
            & " btns=" & butn1.ToString
    End Sub
とTimer1を使ってみたら、Form1外でも位置とボタンは検出できてますVB2005EE
もっと賢い方法があるのかも・・・
午前に示したイベント(フック)よりは、はるかにコードが簡単そうです。
>でもキャンセルできないよ?
キャンセルは、右ボタン・・・とか。

引用返信 編集キー/
■15063 / inTopicNo.14)  Re[3]: フォームの外のマウスイベントを拾いたい
□投稿者/ myugaru (28回)-(2008/03/03(Mon) 19:18:26)
myugaru さんの Web サイト
No15037 (y4yama さん) に返信
> 例が探せますので、APIに詳しくなくても何とかなるかも知れませんヨ

まあここへたどり着く人は少なくは無いですww
http://d.hatena.ne.jp/myugaru/20071203/1196693758
http://d.hatena.ne.jp/myugaru/20071204/1196779914


引用返信 編集キー/
■15088 / inTopicNo.15)  Re[4]: フォームの外のマウスイベントを拾いたい
□投稿者/ 渋木宏明(ひどり) (664回)-(2008/03/04(Tue) 11:11:29)
渋木宏明(ひどり) さんの Web サイト
> >でもキャンセルできないよ?
> キャンセルは、右ボタン・・・とか。

そうでなくて、「マウスイベントそのもののキャンセル」のことです。
引用返信 編集キー/
■15089 / inTopicNo.16)  Re[4]: フォームの外のマウスイベントを拾いたい
□投稿者/ れい (434回)-(2008/03/04(Tue) 11:26:42)
> マウスで画面上のドラッグ&ドロップした範囲をキャプチャするプログラムを作成しています。

「ドラッグドロップした範囲」っていうのがよくわからないです。
何をドラッグドロップするのでしょうか?

ボタンダウンからボタンアップまでの矩形の範囲を撮りたいなら
私なら普通にひどりさんの言うCaptureを使います。
そういった用途のためのものですから。

> 最初にマウスを押した瞬間に、MouseDownとMouseUpが動作してしまうようで、
> ドラッグ時点のマウスポイントとドロップ時点のマウスポイントが
> うまく取得できません。

Buutton.ClickでCaptureしてるからではないですか?
ClickのあとにMouseUpが走りますから。
引用返信 編集キー/
■15104 / inTopicNo.17)  Re[5]: フォームの外のマウスイベントを拾いたい
□投稿者/ y4yama (59回)-(2008/03/04(Tue) 16:43:42)
No15088 (渋木宏明(ひどり) さん) に返信
>>>でもキャンセルできないよ?
>>キャンセルは、右ボタン・・・とか。
>
> そうでなくて、「マウスイベントそのもののキャンセル」のことです。

当方の理解がズレておりまして、済みませんでした。色々探してみると、なかなか難しいものですねぇ〜
勉強をさせていただきました。ありがとうございました
引用返信 編集キー/
■15128 / inTopicNo.18)  Re[5]: フォームの外のマウスイベントを拾いたい
□投稿者/ ken (8回)-(2008/03/05(Wed) 09:02:11)
No15089 (れい さん) に返信
> 「ドラッグドロップした範囲」っていうのがよくわからないです。
> 何をドラッグドロップするのでしょうか?
>
> ボタンダウンからボタンアップまでの矩形の範囲を撮りたいなら
> 私なら普通にひどりさんの言うCaptureを使います。
> そういった用途のためのものですから。

れいさんのおっしゃる通り、
ボタンダウンからボタンアップまでの矩形の範囲ということを
伝えたかったのですが、わかりにくくてすみません。
デスクトップや、他アプリの一部分をキャプチャしたかったのです。

> Buutton.ClickでCaptureしてるからではないですか?
> ClickのあとにMouseUpが走りますから。

ボタンを押してから、デスクトップ(または他アプリ)のキャプチャを開始したいのですが、
では、MouseDownでCaptureすればよいのでしょうか?


引用返信 編集キー/
■15137 / inTopicNo.19)  Re[6]: フォームの外のマウスイベントを拾いたい
□投稿者/ myugaru (30回)-(2008/03/05(Wed) 11:09:12)
myugaru さんの Web サイト
No15128 (ken さん) に返信

えっと私の回答もちゃんとご覧くださいねw
一応アプリも作ってますよ。
引用返信 編集キー/
■15138 / inTopicNo.20)  Re[6]: フォームの外のマウスイベントを拾いたい
 
□投稿者/ れい (437回)-(2008/03/05(Wed) 11:14:10)
No15128 (ken さん) に返信
> ボタンを押してから、デスクトップ(または他アプリ)のキャプチャを開始したいのですが、
> では、MouseDownでCaptureすればよいのでしょうか?

MouseDownではだめでしょうね。
いろいろやってみたらどうですか?
マウスイベントの生じる順序は

MouseDown
Click
MouseClick
MouseUp

です。4通りありますね。
また、MouseUpの後、

Application.Idle

でキャプチャを開始するという手があります。
私なら絶対安全なIdleでやりますね。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -