Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
Jimi's answer works well to stop flickering, but I don't have a good feeling about capturing mouse on mouse move. For example one issue that I see in that solution, is if you set the capture on mouse move, then keyboard shortcuts like
Alt
+
F4
or
Alt
+
Space
will stop working.
I'd prefer to handle
WndProc
and set the cursor when received
WM_SETCURSOR
:
using System.Windows.Forms;
public class ExRichTextBox : RichTextBox
const int WM_SETCURSOR = 0x0020;
protected override void WndProc(ref Message m)
if (m.Msg == WM_SETCURSOR)
Cursor.Current = this.Cursor;
base.WndProc(ref m);
It stops flickering. Not a perfect solution, but at least those important shortcuts will continue working.
–
–
–
I'm assuming this is the WinForms' RichTextBox, because the WPF one doesn't have this problem.
The RichTextBox handles WM_SETCURSOR
messages, to change the Cursor to Cursors.Hand
if the Mouse Pointer ends up on a Link. A note from the developers:
RichTextBox uses the WM_SETCURSOR
message over links to allow us to
change the cursor to a hand. It does this through a synchronous
notification message. So we have to pass the message to the DefWndProc
first, and then, if we receive a notification message in the meantime
(indicated by changing "LinkCursor", we set it to a hand. Otherwise,
we call the WM_SETCURSOR
implementation on Control to set it to the
user's selection for the RichTextBox's cursor.
You could set the Capture when the Mouse enters the Control's bounds and then release it when the Mouse Pointer leaves the area. The capture needs to be released otherwise, when you first click on another control, the cursor will be set to RichTextBox instead:
private void richTextBox1_MouseMove(object sender, MouseEventArgs e)
if (!richTextBox1.ClientRectangle.Contains(e.Location)) {
richTextBox1.Capture = false;
else if (!richTextBox1.Capture) {
richTextBox1.Capture = true;
–
–
–
–
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.