質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

15269閲覧

C# Windows Formsにて、ボタンのタッチイベント取得できない。

nobysanz

総合スコア42

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/05/31 08:06

編集2017/05/31 08:08

お世話になります。
以下の環境で、Windowsタッチの調査をしております。
フォームを押したときのタッチイベントは取得できたのですが、
フォームに張り付けた、コントロールのタッチイベントが取得できません。
そもそも、取得できないのでしょうか?

OS:Windows10(タブレット)
言語:C#
フレームワーク:.NET Framework4

以下、サンプルコードです。
タッチした場合に、WM_TOUCHイベントを受信したカウンタを表示するようにしています。

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Windows.Forms; 9using System.Runtime.InteropServices; 10 11 12namespace WindowsTouch01 13{ 14 15 16 public partial class Form1 : Form 17 { 18 19 20 [DllImport("user32.dll")] 21 [return: MarshalAs(UnmanagedType.Bool)] 22 public static extern bool RegisterTouchWindow(IntPtr hWnd, uint ulFlags); 23 [DllImport("user32.dll")] 24 [return: MarshalAs(UnmanagedType.Bool)] 25 private static extern bool GetTouchInputInfo(IntPtr hTouchInput, int cInputs, [In, Out] TOUCHINPUT[] pInputs, int cbSize); 26 27 private int _count = 0; 28 private int _count2 = 0; 29 30 private struct TOUCHINPUT 31 { 32 public int x; 33 public int y; 34 public System.IntPtr hSource; 35 public int dwID; 36 public int dwFlags; 37 public int dwMask; 38 public int dwTime; 39 public System.IntPtr dwExtraInfo; 40 public int cxContact; 41 public int cyContact; 42 } 43 private const int WM_TOUCH = 0x0240; 44 public Form1() 45 { 46 InitializeComponent(); 47 } 48 49 private void Form1_Load(object sender, EventArgs e) 50 { 51 bool result = RegisterTouchWindow(this.Handle, 0); 52 Console.WriteLine(result); 53 result = RegisterTouchWindow(button1.Handle, 0); 54 Console.WriteLine(result); 55 result = RegisterTouchWindow(panel1.Handle, 0); 56 Console.WriteLine(result); 57 58 _count = 0; 59 _count2 = 0; 60 label1.Text = String.Format("(1) WM_TOUCH {0}", _count); 61 label2.Text = String.Format("(1) ON CLICKED {0}", _count2); 62 63 64 } 65 66 protected override void WndProc(ref Message m) 67 { 68 switch (m.Msg) 69 { 70 case WM_TOUCH: 71 int inputCount = (int)(m.WParam.ToInt32() & 0xFFFF); 72 TOUCHINPUT[] inputs = new TOUCHINPUT[inputCount]; 73 bool result = GetTouchInputInfo(m.LParam, inputCount, inputs, Marshal.SizeOf(inputs[0])); 74 75 76 label1.Text = String.Format("(1) WM_TOUCH {0}", _count); 77 _count++; 78 break; 79 default: 80 break; 81 } 82 base.WndProc(ref m); 83 } 84 85 private void button1_Click(object sender, EventArgs e) 86 { 87 label2.Text = String.Format("(1) ON CLICKED {0}", _count2); 88 _count2++; 89 } 90 } 91} 92

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

WM_POINTERDOWNだと思います。

投稿2017/05/31 08:47

hmmm

総合スコア818

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobysanz

2017/05/31 09:06

コメントありがとうございます。 早速、WM_POINTERDOWNをwndprocのcase に追加しました。 イベント発生しませんでした。
hmmm

2017/05/31 09:09

@nobysanz RegisterTouchWindowをやめてみてください。
nobysanz

2017/05/31 09:49

コメントありがとうございます。 RegisterTouchWindowをたら、WM_POINTERDOWNを 取得できました。本イベントは、タッチした時のみ発生するんですね。
guest

0

ベストアンサー

コントロールのほうはコントロール側のWndProcで処理されフォームのWndProcには
入ってこないのでないかと思います。

投稿2017/05/31 08:33

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobysanz

2017/05/31 09:07

コメントありがとうございます。 コントロール側のWndProc ということは、ボタンコントロールを継承した UserControl を作成してUserControl 側でフックしたほうが良いとの事でしょうか?
nobysanz

2017/05/31 09:28

自己レスです。 コントロール側のWndProc をフックしたら、WM_TOUCHを取得することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問