Windows Forms HelpButton Changes Cursor - c#

I have a HelpButton on a Windows Forms application. When clicked, I just want it to show a message box. This is working fine...
private void Form1_HelpButtonClicked(object sender, EventArgs e)
{
MessageBox.Show("This is an awesome program", "Awesome Program");
}
The problem is, when the user closes out of the message box, the form cursor is switched to the "Help" cursor with the question mark on it. This is not good. How do I prevent the cursor from changing? I tried putting this.Cursor = Cursors.Default and this.Cursor = Cursors.Arrow after the message box call, but it was ineffective.

Your event handler declaration is incorrect, the e argument is actually of type CancelEventArgs. Now it is simple:
private void Form1_HelpButtonClicked(object sender, CancelEventArgs e) {
MessageBox.Show("This is a more awesome program", "Awesome Program");
e.Cancel = true;
}

You want to handle the HelpRequested event and set the Handled property of the event args to true, and don't bother handling the HelpButtonClicked event.
private void Form1_HelpRequested(object sender, HelpEventArgs hlpevent)
{
MessageBox.Show("This is an awesome program", "Awesome Program");
hlpevent.Handled = true;
}

Try changing the Cursor.Current static property.

Related

why this.close() close application

I have a window in wpf that i want on the escape button to close the window. So i wrotethis code on PreviewKeyDown event, but it closes the entire application, including the main window and current window. I just want to close current window.
//this code for open second window
private void M_Mahale_Click(object sender, RoutedEventArgs e)
{
Tanzimat.MahaleWin Mahale = new Tanzimat.MahaleWin();
Mahale.ShowDialog();
}
//this code for PreviewKeyDown event on second window and current window
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
this.Close();
}
}
OK, based on this comment //this code for PreviewKeyDown event on second window and current window you have the same code in both windows in the PreviewKeyDown -so in both windows change the code to this:
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
e.Handled = true;
this.Close();
}
}
and that will keep other windows from getting the event when it's been handled already. See, what's happening is when the escape key is pressed both windows are getting the message, and you didn't tell the main window (i.e. the one behind the current one) not to process it.
You window has a name Mahale and or order to close it from the main window, you should call:
Mahale.Close();
If you call this.Close(); in main form it is quite natural for the program to exit
You can use this.Hide() to hide that window, but that window still exists.
I think the best way to achieve your goal is using of Button's IsCancel property.
You can set the IsCancel property on the Cancel button to true,
causing the Cancel button to automatically close the dialog without
handling the Click event.
See here for examples.
do :
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
this.Hide();
}
}
instead.
Close() close every frames. Use hide().

Right click when form is minimized to tray

I overridden the FormClosing event to minimize to system tray when clicked. Here is my code:
private void OnFormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
this.Hide();
notifyIcon.BalloonTipText = "Server minimized.";
notifyIcon.ShowBalloonTip(3000);
}
else
{
this.Close();
}
}
And I also set the notifyIcon's DoubleClick event as well, here is the code:
private void showWindow(object sender, EventArgs e)
{
Show();
WindowState = FormWindowState.Normal;
}
I have two questions regarding this:
1) Now, when the upper-right "X" button is clicked, the application is minimized to the tray, but I can't close it (makes sense...). I wish to click right click on the icon in the system tray, and that it will open a menu with, let's say, these options: Restore, Maximize and Exit.
2) (This is may be related to me exiting the program with shift+f5 since I can't, for now, close my application because of the changes I mentioned).
When the application quits, after I minimzed it to the tray, the icon is left in the tray, until I pass over it with my mouse.
How can I fix it?
Just add a variable that indicates that the close was requested by the context menu. Say:
private bool CloseRequested;
private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
CloseRequested = true;
this.Close();
}
protected override void OnFormClosing(FormClosingEventArgs e) {
base.OnFormClosing(e);
if (e.CloseReason == CloseReason.UserClosing && !CloseRequested) {
e.Cancel = true;
this.Hide();
}
}
Be sure to not call Close() in the FormClosing event handler, that can cause trouble when the Application class iterates the OpenForms collection. The possible reason that you are left with the ghost icon. No need to help.

Showing MessageBox on MouseDown eats up MouseUp event

I am working on a WPF application where i handled a mouse down event which eventually shows up
MessageBox.. But after MessageBox appears on mouseDown, it eats up corresponding MouseUp event of a control.
Scenario can be easily reproduced by simply handling MouseDown and MouseUP event in WPF window
as:-
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
MessageBox.show("Hello, Mouse down");
}
private void Window_MouseUP(object sender, MouseButtonEventArgs e)
{
MessageBox.show("Hello, Mouse Up");
}
MouseUp message is never shown, once messagebox appears on MouseDown event.
What about initializing a new instance of System.Threading.Thread to call the MessageBox so that the main user interface thread would not be interrupted by the prompt?
Example
private void Window_MouseDown(object sender, MouseEventArgs e)
{
Thread mythread = new Thread(() => MessageBox.Show("Hello, Mouse Down")); //Initialize a new Thread to show our MessageBox within
mythread.Start(); //Start the thread
}
private void Window_MouseUP(object sender, MouseEventArgs e)
{
Thread mythread = new Thread(() => MessageBox.Show("Hello, Mouse Up")); //Initialize a new Thread to show our MessageBox within
mythread.Start(); //Start the thread
}
Screenshot
Thanks,
I hope you find this helpful :)
As the commenter on your original post said, it seems that what's happening here is that the user's mouse wanders out of focus to click in the message box, or even just to display it, so the mouse moves "up" anyway - the event is never called.
If you're just wanting to display messageboxes, then simply using:
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
MessageBox.show("Hello, Mouse down");
MessageBox.show("Hello, your mouse must be up because you've shifted focus!");
}
should do the job. If this behaviour repeats for something like changing a window title, or anything that doesn't require user input, then this could be a problem, but I am 100% sure that this is just an issue with regards to the MessageBox. Hope this helped.
#picrofo solution is also good and easy but i did by this way
DialogResult result;
private void button1_MouseDown(object sender, MouseEventArgs e)
{
string message = "would you like to see mouse up event?";
string caption = "event trick";
MessageBoxButtons buttons = MessageBoxButtons.YesNo;
result = MessageBox.Show(message, caption, buttons);
textBox1.Text = result.ToString();
if (result == System.Windows.Forms.DialogResult.Yes)
{
button1_MouseUp(sender, e);
}
}

Troubles with onFormClosing in c#

I'm trying to implement some code that asks if the user wants to exit the application I've made.
It's in c# and is a windows form application.
I've had very little sleep this week and can't seem to get my head around the onFormClosing event. Could some please give me the exact code I should use to have code executed when the user clicks on the close button (the 'x' in the top right).
Please find it in your heart to help a sleep deprived moron.
Double-click the form's FormClosed event in the events tab of the Properties window in the designer.
The FormClosing event allows you to prevent the form from closing by setting e.Cancel = true.
Well, the event is called FormClosing and is cancellable. Subscribe to it, do your stuff and let the user close their form. This event is fired if the "x" button is used or if you close the form yourself.
You can subscribe to it in the designer by highlighting the form and looking in the events tab of the properties window, as SLaks says, then double-click it. You don't need to do anything special to cope with the "x" button.
The easiest way is to activate the form in the designer and find the event FormClosing in the properties windows and then just double click the event.
Then just do the following:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
var result = MessageBox.Show("Are you sure you want to exit?", "Exit", MessageBoxButtons.YesNo);
if (result != System.Windows.Forms.DialogResult.Yes)
{
e.Cancel = true;
}
}
}
If you do not specify that the reason has to be UserClosing, it will stop windows from shutting down if you do not exit the program first which is not a good practice.
public Form1()
{
InitializeComponent();
this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
}
void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("Are you sure that you wan't to close this app", "Question", MessageBoxButtons.OKCancel) == DialogResult.Cancel)
e.Cancel = true;
}
I hope this helps
You can add event handler manually. Example to add event handler in constructor:
public frmMain()
{
InitializeComponent();
FormClosing += frmMain_FormClosing;
}
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
//your code
}
Make derive your form fromf the System.Windows.Forms.Form and put this override:
protected override void OnFormClosing(CancelEventArgs e)
{
if (bWrongClose)
{
bWrongClose = false;
e.Cancel = true; // this blocks the `Form` from closing
}
base.OnFormClosing(e);
}

Visual C#: Exit the Program Check

In Visual C#, how can I detect if the user clicks the X button to close the program? I want to ask the user if they'd like to perform a certain action before exiting. I have an exit button in my program itself, and I know I can code it as follows:
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
DialogResult result;
if (logfiletextbox.Text != "")
{
result = MessageBox.Show("Would you like to save the current logfile?", "Save?", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
if (result == DialogResult.Yes)
{
savelog.PerformClick();
}
}
Environment.Exit(0); //exit program
}
But how can I do this for the X button that is already built into the program?
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("cancel?", "a good question", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
e.Cancel = true;
}
}
It's the "FormClosing" - event of the form. Have fun, friend.
Add an event handler for FormClosing on the form.
The Form designer will do this for you automatically if you select the event, but to do it manually:
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Main_FormClosing);
And then add the handler into your code:
private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
//Code here
}
If you don't want to close the form then you can set:
e.Cancel = true;
There is a FormClosing event you can bind to that gets fired when the form is about to close. The event handler includes a link to the reason the form is closing (user action, OS shutdown, etc), and offers you an option to cancel it.
Check out the MSDN article here: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.formclosing.aspx
use the Application.Exit or Form.Closing event. Exit won't let you cancel, so Closing is probably a better choice
Just use FormClosing event of form
If you're using a form, you can catch the Form.FormClosing event.
It can be cancelled by setting the Cancel property in the args, based on user input.

Categories