2010-12-19 17 views

答えて

0

ほとんどのテキストコントロールには、どのキーが押されたかを調べるために使用できるKeyDownイベントとKeyUpイベントがあります。

使用しているテクノロジを指定していないので、私はwinforms TextBoxにリンクしています。

カーソルがフィールド内のどこにあるかは直接的にはわかりませんが、

+0

私はc#.net4で書いています。私はすでにアップ/ダウンのホーム/エンドページ/ページの部分を処理していました。スクロールバーの移動のイベントがあります。 – igal

+0

@igal - winforms、webforms、WPF? – Oded

0

私は、SelectionChangedイベントがキャレット位置のevonを発生させるかどうかはわかりませんが、試してみるべきです。

タイマーを作成して、SelectionStartプロパティの値が変更されていないか確認してください。

更新:SelectionChangedイベントを発生させるのTextBoxクラスを作成するために非常に簡単です:

public class TextBoxEx : TextBox 
{ 

    #region SelectionChanged Event 

    public event EventHandler SelectionChanged; 

    private int lastSelectionStart; 
    private int lastSelectionLength; 
    private string lastSelectedText; 
    private void RaiseSelectionChanged() 
    { 
     if (this.SelectionStart != lastSelectionStart || this.SelectionLength != lastSelectionLength || this.SelectedText != lastSelectedText) 
      OnSelectionChanged(); 

     lastSelectionStart = this.SelectionStart; 
     lastSelectionLength = this.SelectionLength; 
     lastSelectedText = this.SelectedText; 
    } 

    protected virtual void OnSelectionChanged() 
    { 
     var eh = SelectionChanged; 
     if (eh != null) 
     { 
      eh(this, EventArgs.Empty); 
     } 
    } 

    #endregion 

    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     base.OnKeyDown(e); 
     RaiseSelectionChanged(); 
    } 

    protected override void OnKeyUp(KeyEventArgs e) 
    { 
     base.OnKeyUp(e); 
     RaiseSelectionChanged(); 
    } 

    protected override void OnMouseDown(MouseEventArgs e) 
    { 
     base.OnMouseDown(e); 
     RaiseSelectionChanged(); 
    } 

    protected override void OnMouseUp(MouseEventArgs mevent) 
    { 
     base.OnMouseUp(mevent); 
     RaiseSelectionChanged(); 
    } 

} 
+0

SelectionChangedはWindowsフォームでは発生しません – Abel

+0

@Abel、それは事実ですが、私はちょうどSelectionChangedイベントを発生させるTextBoxで投稿を更新しました。 –

2

ネイティブのWindowsコントロールは、このための通知を生成しません。この制限を回避しようとするのは苦痛のためのレシピです。キャレットがどこにあるかはわかりません。 SelectionStartプロパティがではない信頼できるインジケータの場合、ユーザーが選択したテキストの方向に応じて、選択の両端にキャレットが表示されます。 Pinvoking GetCaretPos()は、コントロールにフォーカスがあるときにキャレットの位置を返しますが、TextRenderer.MeasureText()の不正確さのために文字インデックスに戻すマッピングは簡単ではありません。

ここには行かないでください。代わりに、なぜあなたがこれを必要と思うか説明してください。

2

これが役に立ちます。私はマウス移動でこれを行った

private void txtTest_MouseMove(object sender, MouseEventArgs e) 
{ 
    string str = "Character{0} is at Position{1}"; 
    Point pt = txtTest.PointToClient(Control.MousePosition); 
    MessageBox.Show(
     string.Format(str 
     , txtTest.GetCharFromPosition(pt).ToString() 
     , txtTest.GetCharIndexFromPosition(pt).ToString()) 
    ); 
} 
関連する問題