C#
ユーザ入出力
メッセージの表示
// MessageBox に、メッセージと、[ OK ] ボタンを表示する
MessageBox.Show("メッセージ文字", "タイトルバー文字") ;
// Note: メッセージボックスを表示すると、閉じない限り、親の Form へフォーカスを
// 移動できない。
メッセージで確認
// MessageBox に、[はい] [いいえ] ボタンを表示し、確認を行う
if (MessageBox.Show(
"××しますか?",
"タイトルバー文字",
MessageBoxButtons.YesNo, // ボタンの一覧は MessageBoxButtons 参照
MessageBoxIcon.Question // アイコンの一覧は MessageBoxIcon 参照
)
== DialogResult.Yes)
{
/* [はい] ボタンの処理 */
}
デバッグ用メッセージの表示
// デバッグの時、メッセージをIDE(統合開発環境)の出力ウィンドウに表示する
System.Diagnostics.Debug.WriteLine("This is a message from Debug.") ;
テキストの入力と表示
// TextBox を使って、テキストの入力と表示を行う
配置 TextBox, TextBox ;
string A = textBox1.Text ; // 入力
textBox1.Text = "000" ; // 表示
textBox2.Text = "111\r\n" + "222\r\n" + "333\r\n" + "444\r\n" + // 複数行
"555\r\n" + "666\r\n" + "777\r\n" + "888\r\n" ; // の表示
textBox2.Text += "abc\r\n" ; // 1行追加(スクロールしない)
textBox2.AppendText("abc\r\n") ; // 1行追加(追加行が見えるようにスクロールする)
textBox2.SelectAll() ; // すべてを選択して、
textBox2.Copy() ; // クリップボードへコピーする
// Note: TextBox の場合、改行は "\r\n" で行う! "\n" ではダメ!
// Note: textBox2 を、複数行対応、縦スクロールバー表示 にするためには、
// プロパティ Multiline を True、ScrollBars を Vertical に設定要。
テキストの選択
// ComboBox を使って、テキストの選択(入力)を行う
配置 ComboBox ;
string A = comboBox1.Text ; // 選択(入力)
comboBox1.Text = "zzz" ; // 表示
comboBox1.Items.Clear() ; // 項目のクリア
comboBox1.Items.Add("aaa") ; // 項目の追加
comboBox1.Items.Add("bbb") ; // 項目の追加
comboBox1.Items.Add("ccc") ; // 項目の追加
comboBox1.Items.Insert(3, "bbb") ; // 項目の挿入(インデックス位置 3 に)
comboBox1.Items.RemoveAt(3) ; // 項目の削除(インデックス位置 3 の)
comboBox1.SelectedIndex = 0 ; // インデックスを設定
int B = comboBox1.SelectedIndex ; // インデックスを取得(非選択時 -1)
int C = comboBox1.Items.Count ; // 項目の数を取得
string D = comboBox1.Items.Item ; // 項目を取得(インデックス位置の)
string E = comboBox1.Items[3] ; // 項目を取得(インデックス位置 3 の)
private void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
/* 選択項目が変化した時の処理 */
}
// Note: インデックスの指定が不適切(項目の範囲外)だと、例外が発生する!
テキストのカーソル位置取得
// TextBox のカーソル位置(行, 桁)を表示する ; 桁は文字数でなくバイト数の形式
using System.Text ; // for Encoding
using System.Text.RegularExpressions ; // for Regex
using System.Threading ; // for Thread
private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
(new Thread(new ThreadStart(display_position))).Start() ;
// 注) Thread で display_position() を呼ばないと、うまく動作しない。
// KeyDown した直後は、まだ、カーソルの移動が 完了してないから。
}
private void textBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
display_position() ;
}
private void display_position()
{
string A = "" ;
try { A = textBox1.Text.Substring(0, textBox1.SelectionStart) ; }
catch { A = textBox1.Text ; } // 下記 Note を参照せよ
// 行 位置 の取得
int N1 = Regex.Matches(A, "\n").Count + 1 ; // 改行コードの数から算出
// 桁 位置 の取得
string B = A.Substring(A.LastIndexOf("\n") + 1) ;
int N2 = Encoding.GetEncoding("Shift_JIS").GetByteCount(B) + 1 ;
label1.Text = "行" + N1 + " : 桁" + N2 ;
}
// Note: 上記、catch 文は 必要。try 文で、System.ArgumentOutOfRangeException が、
// 稀に(特にキーを連続的に速く打った場合)発生することがあるから。
// Note: textBox1_KeyDown ではなく textBox1_KeyPress イベントでは、 Shiftキー、
// Controlキー、Altキー、矢印キー 等を検出できない。
テキストのカーソル位置設定
// TextBox の最初の文字に カーソル(カレット)を移動する
textBox1.SelectionStart = 0 ;
// TextBox の最後の文字の後に カーソル(カレット)を移動する
textBox1.SelectionStart = textBox1.Text.Length ;
// TextBox のカーソル(カレット)が見える位置まで テキストをスクロールする
textBox1.ScrollToCaret() ;
// textBox1 のカーソル(カレット)を textBox2 で指定された行の先頭に移動する
private void button1_Click(object sender, System.EventArgs e)
{
int line_end = int.Parse(textBox2.Text) ;
int line_count = 1 ;
int char_pos = 0 ;
while (line_count < line_end)
{
try { if (textBox1.Text[char_pos++] == '\n') line_count ++ ; }
catch { break ; } // 指定行が存在しない場合の対策
}
textBox1.Focus() ;
textBox1.SelectionStart = char_pos ; // カーソル位置を設定
textBox1.ScrollToCaret() ; // カーソルが見える位置までスクロール
}
// Note: SelectionStart プロパティが、テキストの長さを超えた位置に設定された場合、
// 開始点は、最後の文字の後ろになる。
パスワードの入力
// テキストボックスに入力されるパスワードの文字をマスク設定する
textBox1.PasswordChar = '*' ; // マスク文字の設定
// Note: マスク文字は、全角文字(たとえば'★')での設定も可能。
// その場合も、入力1文字(半角)が、1マスク文字(全角)で表示される。
押されたキーの判定
// どのキーが押されたか判定する
private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter) { /* Enter キーの処理 */ }
else if (e.KeyCode == Keys.Space) { /* Space キーの処理 */ }
else if (e.KeyCode == Keys.F1) { /* F1 キーの処理 */ }
}
すべてのキーイベントを取得
// Form も、すべてのキーイベントを受け取るように設定する
this.KeyPreview = true ; // 既定値は false
上記のように設定し、フォーカスが textBox1 の中でキーを押した場合、次のような順番で
イベントが発生する。
1) Form1_KeyDown
2) textBox1_KeyDown
3) Form1_KeyPress
4) textBox1_KeyPress
5) Form1_KeyUp
6) textBox1_KeyUp
// Note: ただし、特殊なコントロール(AxWebBrowser など)では、この設定は 無効!
// Note: 非文字キー(Shiftキー、Controlキー、Altキー、矢印キーなど)では、KeyPress
// イベントは発生しないので、注意すること。
ホットキーを登録する
// "ALT + SHIFT + A" をホットキーとして使う
using System.Runtime.InteropServices ; // for DllImport
const int MOD_ALT = 0x0001 ;
const int MOD_CONTROL = 0x0002 ;
const int MOD_SHIFT = 0x0004 ;
const int WM_HOTKEY = 0x0312 ;
const int HOTKEY_ID = 0x0001 ; // 0x0000〜0xbfff 内の適当な値でよい
// 0xc000〜0xffff は DLL 用なので 使用不可!
[DllImport("user32.dll")]
extern static int RegisterHotKey(IntPtr HWnd, int ID, int MOD_KEY, int KEY) ;
// 返り値: 成功 = 0以外, 失敗 = 0(既に他が登録済み)
[DllImport("user32.dll")]
extern static int UnregisterHotKey(IntPtr HWnd, int ID) ;
// 返り値: 成功 = 0以外, 失敗 = 0
private void Form1_Load(object sender, System.EventArgs e)
{
// ホットキーの登録 "ALT + SHIFT + A"
RegisterHotKey(this.Handle, HOTKEY_ID, MOD_ALT | MOD_SHIFT, (int)Keys.A) ;
}
private void Form1_Closed(object sender, System.EventArgs e)
{
// ホットキーの登録抹消
UnregisterHotKey(this.Handle, HOTKEY_ID) ;
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m) ;
if (m.Msg == WM_HOTKEY)
{
if ((int)m.WParam == HOTKEY_ID)
{
/* ホットキーの処理 */
}
}
}
// Note: 他のアプリで、既に同じホットキーが登録済みの場合は、登録が失敗する。
キーの自動入力
// キー入力をアプリケーションに送信する
private void button1_Click(object sender, System.EventArgs e)
{
// form2 へ textBox1.Text に記述された文字列(キーコード)を送信する
form2.Activate() ;
SendKeys.SendWait(textBox1.Text) ; // 送信し、メッセージが処理されるまで待機
}
// Note: キーコード仕様 (詳細は MSDN の SendKeys クラス を参照)
// A ⇒ "A"
// A B C ⇒ "ABC"
// Shift A ⇒ "+A"
// Ctrl A ⇒ "^A"
// Alt A ⇒ "%A"
// A を 10回 ⇒ "{A 10}"
// F1 ⇒ "{F1}"
// BackSpace ⇒ "{BS}"
// Del ⇒ "{DEL}"
// ↓ ⇒ "{DOWN}"
// ↑ ⇒ "{UP}"
// → ⇒ "{RIGHT}"
// ← ⇒ "{LEFT}"
// End ⇒ "{END}"
// Enter ⇒ "{ENTER}"
// Esc ⇒ "{ESC}"
// Help ⇒ "{HELP}"
// Home ⇒ "{HOME}"
// Insert ⇒ "{INS}"
// PageDown ⇒ "{PGDN}"
// PageUp ⇒ "{PGUP}"
// PrintScreen⇒ "{PRTSC}" ⇒ 注) 下記 Note 参照。
// Tab ⇒ "{TAB}"
// 特別な記号として扱われる + ^ % ~ ( ) { } [ ] も、{ と } で囲む。
// Note: Windows ショートカットキー の機能も併用すれば、たいへん便利である。
// たとえば、SendKeys.SendWait("%{PRTSC}") だけで、「アクティブなウィンドウ
// のスナップショットをクリップボードに保存」することができる。
// Note: キーコード "{PRTSC}" は、"%{PRTSC}" に解釈されてしまうようだ!
// よって、「画面全体のスナップショットをクリップボードに保存」したい場合、
// デスクトップをアクティブにしてから、SendKeys.SendWait("%{PRTSC}") せよ。
// 具体例は、画面全体をキャプチャする(toクリップボード) を参照。
// Note:「メッセージが処理されるまで待機」が不要な場合は、SendKeys.Send() 。
// Note: この SendKeys.SendWait() メソッドは、アクティブなアプリケーションに対して
// しか、送信できない。
// C# には、他のアプリを 強制的にアクティブにする マネージ メソッド は存在し
// ないので、その場合は、アンマネージ メソッド を利用する必要がある。具体的
// には、他のアプリをアクティブにする を参照せよ。
ボタンの自動クリック
// button1 をプログラムで自動クリックする(クリックイベントを生成する)
button1.PerformClick() ;
押されたマウスボタンの判定
// どのマウスボタンが押されたか判定する
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left) { /* 左 ボタンの処理 */ }
else if (e.Button == MouseButtons.Right) { /* 右 ボタンの処理 */ }
else if (e.Button == MouseButtons.Middle) { /* 中央ボタンの処理 */ }
}
ダブルクリック時間の取得
// ダブルクリックの設定時間を ms 単位で取得する (150, 300,・・・1650ms の11段階)
// ListView (および TreeView) では、Item のない領域をダブルクリックしても、
// DoubleClick() イベントが発生しないが、下記のようにして検出が可能となる
using System.Runtime.InteropServices ; // for DllImport
[DllImport("user32.dll")]
extern static int GetDoubleClickTime() ;
DateTime prev_time = DateTime.Now ;
private void listView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
DateTime now = DateTime.Now ;
TimeSpan ts = now - prev_time ;
prev_time = now ;
if (ts.TotalMilliseconds <= GetDoubleClickTime())
{
/* ダブルクリック処理 */
}
}
// Note: ダブルクリックした時のマウスイベントの順序は、下記のとおり。
// MouseDown → MouseClick → MouseUp →
// MouseDown → MouseDoubleClick → MouseUp .
// 参考: MSDN『 Windows フォームのイベントの順序 』 / ms-help
マウスの位置の取得と設定
// マウスカーソルの位置の取得と設定
int X = Cursor.Position.X ; // X 座標 の取得
int Y = Cursor.Position.Y ; // Y 座標 の取得
Point pos = new Point(100, 250) ;
Cursor.Position = pos ; // 座標(100, 250)に設定
// Note: 座標は、Form からの相対座標ではなく、スクリーンの絶対座標である。
マウスの自動操作
// マウスカーソルを、指定した位置へ移動したり、クリックしたりする
// "user32.dll" の SendInput() を使い、マウスイベントを生成するので、
// 他のアプリケーションのウィンドウ・オブジェクトをクリックすることも可能
using System.Runtime.InteropServices ; // for DllImport, Marshal
[DllImport("user32.dll")]
extern static uint SendInput(
uint nInputs, // INPUT 構造体の数(イベント数)
INPUT[] pInputs, // INPUT 構造体
int cbSize // INPUT 構造体のサイズ
) ;
[StructLayout(LayoutKind.Sequential)] // アンマネージ DLL 対応用 struct 記述宣言
struct INPUT
{
public int type ; // 0 = INPUT_MOUSE(デフォルト), 1 = INPUT_KEYBOARD
public MOUSEINPUT mi ;
// Note: struct の場合、デフォルト(パラメータなしの)コンストラクタは、
// 言語側で定義済みで、フィールドを 0 に初期化する。
}
[StructLayout(LayoutKind.Sequential)] // アンマネージ DLL 対応用 struct 記述宣言
struct MOUSEINPUT
{
public int dx ;
public int dy ;
public int mouseData ; // amount of wheel movement
public int dwFlags ;
public int time ; // time stamp for the event
public IntPtr dwExtraInfo ;
// Note: struct の場合、デフォルト(パラメータなしの)コンストラクタは、
// 言語側で定義済みで、フィールドを 0 に初期化する。
}
// dwFlags
const int MOUSEEVENTF_MOVED = 0x0001 ;
const int MOUSEEVENTF_LEFTDOWN = 0x0002 ; // 左ボタン Down
const int MOUSEEVENTF_LEFTUP = 0x0004 ; // 左ボタン Up
const int MOUSEEVENTF_RIGHTDOWN = 0x0008 ; // 右ボタン Down
const int MOUSEEVENTF_RIGHTUP = 0x0010 ; // 右ボタン Up
const int MOUSEEVENTF_MIDDLEDOWN = 0x0020 ; // 中ボタン Down
const int MOUSEEVENTF_MIDDLEUP = 0x0040 ; // 中ボタン Up
const int MOUSEEVENTF_WHEEL = 0x0080 ;
const int MOUSEEVENTF_XDOWN = 0x0100 ;
const int MOUSEEVENTF_XUP = 0x0200 ;
const int MOUSEEVENTF_ABSOLUTE = 0x8000 ;
const int screen_length = 0x10000 ; // for MOUSEEVENTF_ABSOLUTE (この値は固定)
private void button1_Click(object sender, System.EventArgs e)
{
/*** マウスカーソルの移動と、ドラッグ操作の例 ***/
// マウスカーソルの移動 (絶対座標 200, 300 へ移動)
Cursor.Position = new Point(200, 300) ;
// ドラッグ操作の準備 (struct 配列の宣言)
INPUT[] input = new INPUT[3] ; // 計3イベントを格納
// ドラッグ操作の準備 (第1イベントの定義 = 左ボタン Down)
input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN ;
// ドラッグ操作の準備 (第2イベントの定義 = 絶対座標へ移動)
input[1].mi.dx = screen_length / 2 ; // X 座標 = 画面 1/2 (中央)
input[1].mi.dy = screen_length / 2 ; // Y 座標 = 画面 1/2 (中央)
input[1].mi.dwFlags = MOUSEEVENTF_MOVED | MOUSEEVENTF_ABSOLUTE ;
// ドラッグ操作の準備 (第3イベントの定義 = 左ボタン Up)
input[2].mi.dwFlags = MOUSEEVENTF_LEFTUP ;
// ドラッグ操作の実行 (計3イベントの一括生成)
SendInput(3, input, Marshal.SizeOf(input[0])) ;
}
// Note: マウスカーソルの移動方法は、Cursor.Position と SendInput() の2通りあるが、
// ドラッグ操作中の「マウスカーソルの移動」は、途中で割り込みが入らないよう
// SendInput() で行う方が安全である。
// Note: MOUSEEVENTF_ABSOLUTE での座標指定は、特殊な座標単位系なので注意せよ。
// 画面左上のコーナーが (0, 0)、画面右下のコーナーが (65535, 65535)である。
// Note: No MOUSEEVENTF_ABSOLUTE での座標指定は、相対座標系になるが、単位が必ず
// しも 1px ではないので注意せよ。
// 各 PC で設定された mouse speed と acceleration level に依存する。
// Note: SendInput()パラメータの詳細は、MSDN『 MOUSEINPUT Structure 』を参照せよ。
日付の入力
// DateTimePicker を使って日付を入力し、TextBox に表示する
配置 DateTimePicker, TextBox ;
private void dateTimePicker1_ValueChanged(object sender, System.EventArgs e)
{
textBox1.Text = dateTimePicker1.Value.ToString("d") ;
}
期間の入力
// MonthCalendar を使って期間を入力し、TextBox に表示する
配置 MonthCalendar, TextBox ;
private void monthCalendar1_DateSelected(object sender,
System.Windows.Forms.DateRangeEventArgs e)
{
textBox1.Text =
"開始 " + monthCalendar1.SelectionStart.ToString("D") + "\r\n" +
"終了 " + monthCalendar1.SelectionEnd.ToString("D") ;
}
フォントの設定ダイアログ
// FontDialog を表示する
// 選択したフォントで TextBox の文字を表示する
配置 FontDialog, Button, TextBox ;
private void button1_Click(object sender, System.EventArgs e)
{
fontDialog1.ShowColor = true ; // 色の選択肢も表示する設定
if (fontDialog1.ShowDialog() == DialogResult.OK) // ダイアログを表示
{
textBox1.Font = fontDialog1.Font ; // 選択したフォントの取得
textBox1.ForeColor = fontDialog1.Color ; // 選択した色の取得
}
}
色の設定ダイアログ
// ColorDialog を表示する
// 選択した色を TextBox の背景色にして、色の情報を TextBox へ表示する
配置 ColorDialog, Button, TextBox ;
private void button1_Click(object sender, System.EventArgs e)
{
colorDialog1.Color = Color.Blue ; // 初期の選択色 (既定値は Color.Black)
colorDialog1.FullOpen = true ; //「色の作成」画面を表示 (既定値は false)
if (colorDialog1.ShowDialog() == DialogResult.OK)
{
textBox1.BackColor = colorDialog1.Color ; // 選択色の取得
textBox1.Text = colorDialog1.Color.ToString() ; // 選択色の取得
}
}
TrackBar を使う
// TrackBar のスライダの位置を TextBox で表示または設定する
配置 TrackBar, TextBox ;
private void trackBar1_Scroll(object sender, System.EventArgs e)
{
// TrackBar のスライダの位置を表示する
textBox1.Text = trackBar1.Value.ToString() ; // 位置を取得
}
private void textBox1_TextChanged(object sender, System.EventArgs e)
{
// TrackBar のスライダの位置を設定する
try { trackBar1.Value = int.Parse(textBox1.Text) ; } // 位置を設定
catch { /* 無効な位置を設定した場合の処理 */ }
}
// Note: trackBar1_Scroll イベントは、マウス操作またはキー操作でスライダが
// 移動した時に発生するが、trackBar1.Value の設定時は 発生しない!
ScrollBar を使う
// HScrollBar のスライダの位置を TextBox で表示または設定する
配置 HScrollbar, TextBox ;
using System.Threading ; // for Thread
private void hScrollBar1_Scroll(object sender,
System.Windows.Forms.ScrollEventArgs e)
{
// ScrollBar のスライダの位置を表示する(スレッドで処理する)
(new Thread(new ThreadStart(hScrollBar1_thread))).Start() ;
// この時点では、スライダの位置は 移動を開始した時のポイントを示している。
// よって、移動を終了した時の位置を取得するためには、少し 待つ必要がある!
}
private int hScrollBar1_busy = 0 ;
private void hScrollBar1_thread()
{
// ScrollBar のスライダの位置を表示する(スレッド本体)
if (hScrollBar1_busy == 1) return ;
hScrollBar1_busy = 1 ;
Thread.Sleep(100) ; // 100ms 待ち
textBox1.Text = hScrollBar1.Value.ToString() ; // 位置を取得
hScrollBar1_busy = 0 ;
}
private void textBox1_TextChanged(object sender, System.EventArgs e)
{
// ScrollBar のスライダの位置を設定する
try { hScrollBar1.Value = int.Parse(textBox1.Text) ; } // 位置を設定
catch { /* 無効な位置を設定した場合の処理 */ }
}
// Note: ScrollBar のプロパティ Maximum は、109 に変更すること!
// そうしないと、スライダを最大値のところに移動しても、プロパティ Value
// は、100 にならず、91 にしかならない。(仕様?)
// Note: ScrollBar は、スライダの移動を終了した時(マウスボタンを UP した時)、
// スライダボタンのグリッド表示位置調整(?)が行われるので、場合によっ
// ては、微妙に(1〜2ピクセル)スライダボタンが勝手に移動する。(仕様?)
// Note: hScrollBar1_Scroll イベントは、マウス操作またはキー操作で スライダが
// 移動した時に発生するが、hScrollBar1.Value の設定時は 発生しない!
ProgressBar の表示
// ProgressBar を表示する
配置 ProgressBar, Button ;
using System.Threading ; // for Thread
private void button1_Click(object sender, System.EventArgs e)
{
int N_max = 1234 ;
progressBar1.Maximum = N_max ; // 最大値の設定
for (int N = 0 ; N <= N_max ; N ++)
{
progressBar1.Value = N ; // 現在位置の設定
Thread.Sleep(10) ;
}
}
クリップボードへ設定
// テキスト(文字列)を、クリップボードへコピーする
string text = "aaaaaaa" ;
Clipboard.SetDataObject(text, false) ;
// Note: false = アプリ終了後は データを残さない
// true = アプリ終了後も データを残す ← 時々、例外が発生! どうして?
クリップボードの取得
// クリップボードのデータを(文字列なら)取得する
IDataObject data = Clipboard.GetDataObject() ;
if (data.GetDataPresent(DataFormats.Text))
{
string text = (string)data.GetData(DataFormats.Text) ;
}
ドラッグ&ドロップ機能
// ドラッグ&ドロップ機能を textBox1 に実装する
// textBox1 へドロップされたファイル名(複数可)を textBox1 に表示する
private void textBox1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
e.Effect =
(e.Data.GetData(DataFormats.FileDrop) != null) ? // ファイル形式か確認
DragDropEffects.Copy :
DragDropEffects.None ;
}
private void textBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
textBox1.Text = "" ;
foreach (string file_name in (string[])e.Data.GetData(DataFormats.FileDrop))
{
textBox1.AppendText("\"" + file_name + "\"\r\n") ;
}
}
// または、ドロップするものが「ひとつ」の場合、
private void textBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
textBox1.Text = ((string[])e.Data.GetData(DataFormats.FileDrop))[0] ;
}
// Note: デザイナ等で、textBox1 のプロパティ AllowDrop を True に設定すること。
// textBox1 からドラッグを開始した場合、textBox1 のテキストをコピーする
private void textBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
textBox1.DoDragDrop(textBox1.Text, DragDropEffects.Copy) ;
}