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) ; }

(C)緑のバイク