|
■No97969 (プログラマー さん) に返信 >> (1) Form1 の上でマウスボタンを押す >> (2) Form1 を隠して Form2 を表示 >> (3) マウスボタンが離されたイベントを取得 >> ということでしょうか? > はい、そのような操作を想定しています。
No97964 時点では「押下されている状態」を取得とありましたが、 No97969 時手では「離されたイベント」を取得ということで、 質問内容が変化していますね。(^^;
マウスボタンが離されたタイミングを取得するのが目的なら、 WM_INPUT メッセージを処理する手法もあります。 https://j.mp/3jSFlNu
しかしこの場合、自前で API 宣言を連ねるよりも、 SharpDX.RawInput を NuGet 参照するのが手っ取り早いでしょう。
Imports SharpDX.RawInput Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Device.RegisterDevice(SharpDX.Multimedia.UsagePage.Generic, SharpDX.Multimedia.UsageId.GenericMouse, DeviceFlags.None)
SetDesktopBounds(0, 0, 640, 480) Form2.Show() Form2.Opacity = 0 Form2.ShowInTaskbar = False Form2.SetDesktopBounds(640, 0, 640, 480) End Sub
Private Sub RawInput_MouseInput(sender As Object, e As MouseInputEventArgs) If e.ButtonFlags.HasFlag(MouseButtonFlags.LeftButtonUp) Then RemoveHandler Device.MouseInput, AddressOf RawInput_MouseInput
Stop End If End Sub
Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown If e.Button.HasFlag(MouseButtons.Left) Then Opacity = 0 ShowInTaskbar = False Form2.Opacity = 100 Form2.ShowInTaskbar = True AddHandler Device.MouseInput, AddressOf RawInput_MouseInput End If End Sub End Class
> Hideで非表示にした場合ですとイベントが発生しましたが、以下のように記述するとCaptureをTrueにしてもイベントが発生しません。
MouesDown 時と MouseUp 時とで、キャプチャしたウィンドウのハンドルが異なるため、 Capture プロパティが期待動作しなくなっています。
ShowInTaskBar はフォーム生成前に呼び出し、そのあとは変更すべきではありません。 これはフォーム起動時に呼び出される CreateParams プロパティの ExStyle で利用される設定値だからです。
Windows API 側の制限により、この値はハンドル生成時にしか指定できないため、 フォーム生成後に切り替えた場合は、現在のウィンドウ ハンドルが作り直されることになります。
Debug.WriteLine(Me.Handle) Me.ShowInTaskbar = False ' Me.RecreateHandle() 'ShowInTaskbar の変更により、内部的に RecreateHandle が呼ばれる Debug.WriteLine(Me.Handle) 'それにより、ウィンドウハンドルが別の値になる
|