テキストボックスにフォーカスがあるたびに、読み取り専用RichRextBox
のカーソル(IBeam)が点滅しないようにする方法はありますか?読み取り専用リッチテキストボックスからの点滅カーソル(IBeam)の防止
WndProc
からWM_SETFOCUS
メッセージをブロックしようとしましたが、フォームがハングする原因になりました。
if(m.Msg == 0x0007) return;
テキストボックスにフォーカスがあるたびに、読み取り専用RichRextBox
のカーソル(IBeam)が点滅しないようにする方法はありますか?読み取り専用リッチテキストボックスからの点滅カーソル(IBeam)の防止
WndProc
からWM_SETFOCUS
メッセージをブロックしようとしましたが、フォームがハングする原因になりました。
if(m.Msg == 0x0007) return;
Win32 APIを使用する必要があります。ここでは、あなたがVBで何ができるかです:あなたはそれを非表示にする今までにとき
'API declares
Private Declare Function HideCaret Lib "user32" _
(ByVal hwnd As IntPtr) As Integer
Private Declare Function ShowCaret Lib "user32" _
(ByVal hwnd As IntPtr) As Integer
'hide the caret in myTextBox
Call HideCaret(myTextBox.Handle)
'show the caret back..
Call ShowCaret(myTextBox.Handle)
とC#で
[DllImport("user32.dll", EntryPoint = "ShowCaret")]
public static extern long ShowCaret(IntPtr hwnd);
[DllImport("user32.dll", EntryPoint = "HideCaret")]
public static extern long HideCaret(IntPtr hwnd);
その後、
HideCaret(richtextbox.Handle)
に電話をかけます。
ちょうどAnirudh Goelの答えは(少なくともC#では)うまくいかないと言っています。/
私はで解決策が見つかりました::まだ点滅カラットあなたはキャレットを非表示にするかどうかを選択できるようhttp://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_21896403.html
彼のクラスは常にキャレットを非表示には、ここでの改善です。
あなたは真の Pedro77から私ソリューションは、あまりにも動作しませんでしについては
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace Lm
{
public class RichTextBoxEx : RichTextBox
{
private readonly object mustHideCaretLocker = new object();
private bool mustHideCaret;
[DefaultValue(false)]
public bool MustHideCaret
{
get
{
lock (this.mustHideCaretLocker)
return this.mustHideCaret;
}
set
{
TabStop = false;
if (value)
SetHideCaret();
else
SetShowCaret();
}
}
[DllImport("user32.dll")]
private static extern int HideCaret(IntPtr hwnd);
[DllImport("user32.dll", EntryPoint = "ShowCaret")]
public static extern long ShowCaret(IntPtr hwnd);
public RichTextBoxEx()
{
}
private void SetHideCaret()
{
MouseDown += new MouseEventHandler(ReadOnlyRichTextBox_Mouse);
MouseUp += new MouseEventHandler(ReadOnlyRichTextBox_Mouse);
Resize += new EventHandler(ReadOnlyRichTextBox_Resize);
HideCaret(Handle);
lock (this.mustHideCaretLocker)
this.mustHideCaret = true;
}
private void SetShowCaret()
{
try
{
MouseDown -= new MouseEventHandler(ReadOnlyRichTextBox_Mouse);
MouseUp -= new MouseEventHandler(ReadOnlyRichTextBox_Mouse);
Resize -= new EventHandler(ReadOnlyRichTextBox_Resize);
}
catch
{
}
ShowCaret(Handle);
lock (this.mustHideCaretLocker)
this.mustHideCaret = false;
}
protected override void OnGotFocus(EventArgs e)
{
if (MustHideCaret)
HideCaret(Handle);
}
protected override void OnEnter(EventArgs e)
{
if (MustHideCaret)
HideCaret(Handle);
}
private void ReadOnlyRichTextBox_Mouse(object sender, System.Windows.Forms.MouseEventArgs e)
{
HideCaret(Handle);
}
private void ReadOnlyRichTextBox_Resize(object sender, System.EventArgs e)
{
HideCaret(Handle);
}
}
}
にMustHideCaretを設定することを忘れないでください非表示にしたい場合は... 私はそのクラスを変更した:
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace Lm
{
public class RichTextBoxEx : RichTextBox
{
private readonly object mustHideCaretLocker = new object();
private bool mustHideCaret;
[DefaultValue(false)]
public bool MustHideCaret
{
get
{
lock (this.mustHideCaretLocker)
return this.mustHideCaret;
}
set
{
TabStop = false;
if (value)
SetHideCaret();
else
SetShowCaret();
}
}
[DllImport("user32.dll")]
private static extern int HideCaret(IntPtr hwnd);
[DllImport("user32.dll", EntryPoint = "ShowCaret")]
public static extern long ShowCaret(IntPtr hwnd);
public RichTextBoxEx()
{
}
private void SetHideCaret()
{
MouseDown += new MouseEventHandler(ReadOnlyRichTextBox_Mouse);
MouseUp += new MouseEventHandler(ReadOnlyRichTextBox_Mouse);
Resize += new EventHandler(ReadOnlyRichTextBox_Resize);
HideCaret(Handle);
lock (this.mustHideCaretLocker)
this.mustHideCaret = true;
}
private void SetShowCaret()
{
try
{
MouseDown -= new MouseEventHandler(ReadOnlyRichTextBox_Mouse);
MouseUp -= new MouseEventHandler(ReadOnlyRichTextBox_Mouse);
Resize -= new EventHandler(ReadOnlyRichTextBox_Resize);
}
catch
{
}
ShowCaret(Handle);
lock (this.mustHideCaretLocker)
this.mustHideCaret = false;
}
protected override void OnGotFocus(EventArgs e)
{
if (MustHideCaret)
{
HideCaret(Handle);
this.Parent.Focus();//here we select parent control in my case it is panel
}
}
protected override void OnEnter(EventArgs e)
{
if (MustHideCaret)
HideCaret(Handle);
}
private void ReadOnlyRichTextBox_Mouse(object sender, System.Windows.Forms.MouseEventArgs e)
{
HideCaret(Handle);
}
private void ReadOnlyRichTextBox_Resize(object sender, System.EventArgs e)
{
HideCaret(Handle);
}
}
}
は、マウスをクリックしたときに、キャレットの点滅になっ固定(内部の)パネル制御... ...に私のRichTextBoxExを入れ
簡単方法は:リッチテキストボックスのEnterイベントにこのイベントを添付:
private void Control_Enter(object sender, EventArgs e) {
ActiveControl = null;
}
の内側にそれを呼び出すときに、私は成功を見つけました。代わりに、私はActiveControl =
@ TheC4Fox私はそれを使用しています、リッチテキストボックスのEnterイベントにのみイベントを添付します。これにより、マウスクリックやキーボードのTABによるコントロールの集中を防ぐことができます。 TABキーを使用すると、次のコントロールをターゲットにすることができます。私はそれをもっと明確にするために答えを少し修正しました。 –
を付録として、これは私のフォームのすべてのコントロールを殺したイベント 'textbox.GotFocus' – maxp