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

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

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

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

Q&A

3回答

3423閲覧

フォームがクリックされたら

matukazekun

総合スコア47

C#

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

0グッド

0クリップ

投稿2019/03/11 12:50

編集2022/01/12 10:55

フォームがクリックされたらというイベントはこれでいいんですか?

型の宣言と、メソッドの作成 [DllImport("System.Windows.Forms.dll")] public static extern System.Windows.Forms.Form FindForm(); [DllImport("System.Windows.Forms.dll")] public static extern System.Windows.Forms.Control Click(object sender, System.EventArgs e); [DllImport("System.Windows.Forms.dll")] public static extern System.Windows.Forms.Form Activate(); public static void GE() { Form s = FindForm(); // findformでコントロールがあるフォームを取る s =          //クリックされたら if(イベントが起きれば){ s = Activate(); //フォームをアクティブにするというか 次のメソッドを実行する。} }

クリックされた、というイベントの指定方法がわかりません。

コントロールがあるフォームが複数あるなら Form s も配列?にしなければなりません。 (コレクションというやつでしょうか・・・?)

イベントのIFのような使い方も知りませんのでこのような書き方になっています。

とりあえず完成できません。お願いします。

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

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

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

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

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

guest

回答3

0

Windowがクリックされたら自身のタイトルを変更するコード。
以下のコードをForm1.csに張り付ければ動くはず。

参照:
Detect active window changed using C# without polling

C#

1using System; 2using System.Text; 3using System.Windows.Forms; 4using System.Runtime.InteropServices; 5 6 7namespace WindowsFormsApp1 8{ 9 public partial class Form1 : Form 10 { 11 public Form1() 12 { 13 InitializeComponent(); 14 this.TopMost = true; 15 dele = new WinEventDelegate(WinEventProc); 16 IntPtr m_hhook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, dele, 0, 0, WINEVENT_OUTOFCONTEXT); 17 } 18 19 WinEventDelegate dele = null; 20 21 delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime); 22 23 [DllImport("user32.dll")] 24 static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess, uint idThread, uint dwFlags); 25 26 private const uint WINEVENT_OUTOFCONTEXT = 0; 27 private const uint EVENT_SYSTEM_FOREGROUND = 3; 28 29 [DllImport("user32.dll")] 30 static extern IntPtr GetForegroundWindow(); 31 32 [DllImport("user32.dll")] 33 static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); 34 35 private string GetActiveWindowTitle() 36 { 37 const int nChars = 256; 38 IntPtr handle = IntPtr.Zero; 39 StringBuilder Buff = new StringBuilder(nChars); 40 handle = GetForegroundWindow(); 41 42 if (GetWindowText(handle, Buff, nChars) > 0) 43 { 44 return Buff.ToString(); 45 } 46 return null; 47 } 48 49 public void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) 50 { 51 var windowTitle = GetActiveWindowTitle(); 52 53 if (windowTitle != this.Text && windowTitle != null) 54 { 55 this.Text = windowTitle; 56 } 57 } 58 } 59} 60

投稿2019/03/12 15:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

C#で、フォームのクリックは、イベントハンドラを使います。

MSのドキュメント Form Class から、Clickイベントに方法が書かれていますので、参照される事をお勧めします。 (検索すると解説は他にもいっぱいあると思いますが)

Formクラスの中で、自分自身は、thisで参照できるので、
this.Click += form_Click とし、

C#

1void form_Click(object sender, System.EventArgs e) 2{ 3 // .... 4}

でしょうか?

あ、この時、間違えて、 同名の Clickメソッドを作らないようにしましょう。引数とか違えば、作成できますが、混乱の元なので。

投稿2019/03/12 14:21

編集2019/03/12 14:48
pepperleaf

総合スコア6383

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

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

matukazekun

2019/03/12 14:30

すいません親切に、これフックぽいのを作ってみようと思ったんです。 ウィンドウをクリックしたらそのクリックを検知してウィンドウをアクティブにし、 何かのメソッド(例えばキーストロークを送る) を実行するみたいな? 見当違いかもしれないかなとか思いながら書いてます。まだ1年未満なので・・・。
matukazekun

2019/03/12 14:34

ですのでthisじゃない!これ自身ではないのですだ。ほかのウィンドウをフックするのですのだ。 EventArgs e ってやっぱ意味わからねぇよなあ・・orz
pepperleaf

2019/03/12 14:47

> EventArgs e 調べましょう。マウスクリックイベントならば、この中に、右ボタンとかの情報が入っていますが、単なるクリックイベントとして使うなら、中身なんて見なくてもOK(大抵はそう) 他のウィンドウ、、という話ならば、そのFormオブジェクトのクリックイベントに追加 (あ、代入(=)じゃなくて、追加(+=)だった) 画面上にある別プログラムの Formって話だと、話は別。ちと面倒。(やった事無い)
matukazekun

2019/03/13 11:11

そうそれ別のプログラムのフォーム。調べて漕ぎついて見せます
pepperleaf

2019/03/13 11:19

グローバルフックで、全画面のイベントをフックして、画面上の座標と、表示されている Formの座標から、該当するFormを探す、、だったか。 申し訳ないですが、あまり興味ある方向では無いので、ここまでとします。
matukazekun

2019/03/13 11:47

やはりグローバルフックなんですね・・・
guest

0

全然違います。Visual Studio を使ってください。
Code ではなく。

追記

はい、これ。

C#

1using System.Windows.Forms; 2 3namespace WindowsFormsApp1 4{ 5 public partial class Form1 : Form 6 { 7 public Form1() 8 { 9 InitializeComponent(); 10 Click += (s, e) => 11 { 12 MessageBox.Show("Clicked!"); 13 }; 14 } 15 } 16} 17

投稿2019/03/11 12:52

編集2019/03/11 12:57
Zuishin

総合スコア28656

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

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

matukazekun

2019/03/11 12:55

visualスタジオ使ってるよ?
Zuishin

2019/03/11 12:56

使ってそれ?
matukazekun

2019/03/11 13:01

だって1年未満だもん
y_waiwai

2019/03/11 13:03

春休みだなあ。。
Zuishin

2019/03/11 13:04

ふつうは多分最初の一日でできるようになります。 コード書いてあげたからコピペして使ってください。
matukazekun

2019/03/11 13:17

これって自分で生成したフォームですよね? 他のフォーム(アプリのフォーム)をクリックしたらといったコードです。 僕のだとメソッドのclickが 値を返さないコードパスうんぬんかんぬんとかでるなあこれって どういう意味なんだろ
matukazekun

2019/03/11 13:41

フォーム(アプリのウィンドウ)がクリックされたらなんやかんやという イベントコードはこれでいいのか・・・?
Zuishin

2019/03/11 13:47

私が書いたところは合っています。間違っているのはあなたの書いた部分です。
matukazekun

2019/03/11 13:59

Zuishinさんのコードではアプリのフォーム(ウィンドウ)なども捉えることができるんですか?
matukazekun

2019/03/11 14:01

フォームという言い方は間違ってますか? ウィンドウといったほうが正しいのですか?
Zuishin

2019/03/11 14:04

言葉の通じない人と言葉でやりとりするのは不可能なのでまず正確な言葉をおぼえてきてください。
matukazekun

2019/03/11 14:07

分かりました。いろいろと調べてきます
matukazekun

2019/03/11 14:07

今日は書くことはないです
fiveHundred

2019/03/12 04:42

横やりで失礼しますが、話の流れから察するに、matukazekunさんはUnity上でフォームを動かそうとしているという、非常に面倒くさいことをやろうとしているように感じられます。
Zuishin

2019/03/12 04:54

過去の質問を見ると、そこだけでなく他にも色々と問題あるようですね。解決にはあと 1000 年くらいかかるでしょう。
Zuishin

2019/03/12 05:00

私の思うに、Unity も関係なくて、ただ別のプロセスのメインウィンドウをフォームと思いこんでるだけの気がします。 要するにクリックのメッセージをフックすれば片付く問題だと思いますが、ここでの質問はそのようになってないのと、説明しても理解できそうにないので、質問に沿った回答を続けています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問