How to trigger Windows hotkeys using my C# application - c#

I want to trigger Windows hotkeys using my c# application. For example, if I selected copy button in my Application, i want to trigger the Ctrl - C hotkey. If I selected the run button in my application, I want to trigger the Win - R hotkey.
How can I do that?
Thank you.

You can use SendKeys.Send method
For example in your button click event, to trigger CTRL + C combination you can use this
SendKeys.Send("^c") // CTRL + C
Note: By the way I wouldn't suggest you to do it in button click event.Probably you are trying to copy some text from your textbox.But when you click your button textbox is losing it's focus and selected text is disappear.So key is sending correctly but you can't copy anything.

"If I selected the run button in my application, I want to trigger the Win - R hotkey."
Run Dialog
In JScript, it's a lot simpler do display the Run dialog box. It is still possible in C#, though. You need a reference to Shell32:
Then add using Shell32; in your code-behind.
In your button's click event, you can do this:
private void runBtn_Click(object sender, EventArgs e)
{
Shell shell = new Shell();
IShellDispatch sd = (IShellDispatch)shell;
sd.FileRun();
}
And you should see somethin' like this:
Simulating Ctrl-C
"...if I selected copy button in my Application, i want to trigger the Ctrl - C hotkey."
Selman22 mentioned the textbox will lose focus if you click another button. Here's the way around it:
private void copyBtn_Click(object sender, EventArgs e)
{
textBox1.Focus(); // <---- here
SendKeys.Send("^c");
}

Related

MaskedTextBox.SelectAll on GotFocus doesn't work with mouse

I want to select all the contents of a MaskedTextBox when the clicks (or tabs onto) the control, so they can easily replace the old content. I tried calling SelectAll() in the Enter event, but that didn't work at all.
I switched to using the GotFocus event, which works great when tabbing through controls, but doesn't work when I click on it with the mouse. I would only want to select all the contents when first entering/focusing on the control (subsequent clicks might be used to position the cursor to edit the existing text).
I added a button and tried calling SelectAll() in the button click event, but that didn't do anything either. What's going on? Is this a bug?
How can I get around this?
Steps to reproduce
Create a new Windows Form Application in .NET 4.0 in Visual
Studio 2010.
Add a TextBox, MaskedTextBox, and Button to the default form
Change the Mask property on the MaskedTextBox to "_____".
Add some event handlers:
private void maskedTextBox1_GotFocus(object sender, EventArgs e)
{
Debug.WriteLine("GotFocus");
maskedTextBox1.SelectAll();
}
private void button1_Click(object sender, EventArgs e)
{
Debug.WriteLine("Click");
maskedTextBox1.SelectAll();
}
Run the program, entered some data into the MaskedTextBox, tab through controls back to it. It selects the contents of the MaskedTextBox.
Select the other TextBox. Try clicking on MaskedTextBox. Output shows that GotFocus event was called, but text doesn't get selected.
Try clicking on button in form. Text doesn't get selected.
Tested in Visual Studio 2010 with .NET 4.0 in a Windows Forms Application project
Why this isn't a duplicate of TextBox.SelectAll() does not work with TAB
If you notice, the title says "SelectAll doesn't work with TAB". In my case, it does work with Tab, it doesn't work with the mouse - completely opposite scenario. The answer for that question is to use the GotFocus event. I'm already using the GotFocus event, but it doesn't work. That answer does not answer this question. It is clearly not a duplicate. If I'm wrong, please explain in the comments.
Your SelectAll() is being overwritten by the default functionality of the masked textbox select. I would use the Enter event, it allows for tabbed entry or mouse click entry to the masked text box. You will most likely need to use the BeginInvoke method. Try the code below. It worked for me when I tried...
private void maskedTextBox1_Enter(object sender, EventArgs e)
{
BeginInvoke((Action) delegate { SetMaskedTextBoxSelectAll((MaskedTextBox) sender); });
}
private void SetMaskedTextBoxSelectAll(MaskedTextBox txtbox)
{
txtbox.SelectAll();
}
Executing Focus before Select All worked for me:
private void Masked_Enter(object sender, EventArgs e) {
((MaskedTextBox)sender).Focus();
((MaskedTextBox)sender).SelectAll();
}

Insert existing Buttons into Context Toolstrip - Winforms

I have a GUI and some buttons in WinForms. Now I want to create a Toolstrip Menu and move the buttons into the menu. Is it possible without copying the whole code into the new Toolstrip entries? I just want to link the buttons somehow.
Thanks
Yes and no. It is not possible to move the existing buttons into the ToolStrip but you can create new ones and rewire them:
first: look for the name of the current event handler by selecting the old button, press F4 and switch to the action menu (the lightning bolt in the properties window):
second: select the new button and pick the same event handler as for the old button:
finally you can remove the old button.
Buttons click events code can be linked directly to toolstrip buttons.
All availables events can be showed in Action->Click in design time.
EDIT:
I assume that you have a form in your project with some buttons, eg.: button1, button2.
For each Button you wrote a click action, in your code something like:
private void button1_Click(object sender, EventArgs e)
{
// YOUR CODE FOR BUTTON1
}
private void button1_Click(object sender, EventArgs e)
{
// YOUR CODE FOR BUTTON2
}
Then you can use those methods/action for toolbar's buttons.
The easiest way to do is to add buttons to tollbar and use Events (with property panel, the little bolt icon) to choose the correct method to assign to each tolbar's button Click event/action.

Click on form does not click underlying control

I have a windows forms application. When I click on a window this activates the form and then I need to click again to call the particular control click event. For example if I click on a button this activates the form and then I need to click the button again.
Is there a way to perform the control click and window activation in one click? Preferably I would want this to work with whatever the clickable control is (menu,button, label etc)
So far I have managed to activate the win form on mouse over and then the control click works. I would like to have the win form activated on click and also run the click command on an underlying control if this has a click event.
Well, here's a way to accomplish what You want (just attach a similar method to Your from's MouseClick event):
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
var c = this.GetChildAtPoint(e.Location);
this.InvokeOnClick(c, e);
}
This method has it's drawbacks though - for example the control will be clicked even though it's disabled etc., so You have to make sure the control under the cursor is "clickable" by yourself...

Using widgets in MonoDevelop and GTKSharp

I switched from using VirtualStudio Express 2010 and I am trying to work with MonoDevelop and GTKSharp. Now. I am trying to switch to new editor software but it seems much different than VisualStudio.
What I am trying to do is basically to use widgets in this editor. For example when I am creating a button in VisualStudio and then double click the item then I am automatically getting the piece of code representing the item in the form. And here is the problem, how do I create events for buttons and comboboxes in MonoDevelop? I was looking through Internet examples for two days now and I can not figure out how to do it. The examples are not clear enough.
What I am trying to create? First I am trying to figure out how to use ComboBox and button which will allow me to choose one of 3 options in ComboBox and then under button event I want to fire 1 of 3 separate windows depending on which item has been picked.
Please provide me some easy examples how to work with MonoDevelop or else I will need to switch back to Windows OS :(
Please help!
// edit //
Lets say I got time on my hands and I am really interested in it. So if GTK# allow me so far:
public MainWindow () : base(Gtk.WindowType.Toplevel)
{
Build ();
button1.Clicked += button1_Click;
combobox1.SelectionGet += comboBox1_Selection; << is this correct?
}
private void button1_Click(object s, EventArgs e)
{
}
private void comboBox1_Selection (object s, EventArgs e)
{
switch (combobox1.SelectedIndex)
{
case 0:
window1.Show();
break;
case 1:
window2.Show();
break;
case 2:
window3.Show();
break;
}
}
But I feel like I am more lost than I was earlier.
Create a new C# GTK project.
Open up the "MainWindow.cs" and at the bottom right of the window click the "Designer" button to go into designer mode.
Next open up the hidden toolBox window at the right of the MonoDev window. Drag out a "Fixed" Container on the main windows canvas. This is required to put Buttons and stuff on your window.
Now drag a button on the Fixed container. To move the button around click on the little white box above the button when selected.
Now go to your SourceCode again. In the constructor write::
button1.Clicked += button1_Click;
Then make the new Click method.
private void button1_Click(object s, EventArgs e)
{
}
You don't need to add the handlers manually...
In Gtk the concept names changes a little, when a widget which is the same as a control in windows forms, just different name, does something it emits a "signal" then what you have to do is to "handle" that signal which would be the equivalent to catch the event in windows forms.
You can just select your widget in monodevelop and then go to the properties pane of that widget, there you will see a tab called "signals", this has the list of the signals that the widget specifically emits, thus allowing you to code actions when the widget does something like being clicked. Once there just double click in the signal you want to handle, for example, for a button, double click on the "Released" signal which is the signal emitted by the button when you click on it and release it.
I'm attaching a screenshot so you can get the picture. Hope it helps!!

How to you kill a windows form program other than using x

How do I kill a windows form application other than clicking the x button. More specifically, I need to close the program from a menu option. I am coding this in c# 2010.
You mean Application.Exit()? It can be called from any block of code, such as a menu option or a button click.
Use the Close method on your main form.
Use the following code for proper exit.
Environment.Exit(0).
This will terminate the application and inform the Operating system as process completed successfully.
You can call it from menu, text click event, button event etc..
More info
You need to assign a custom handler to your menu item's OnClick event handler:
(Pseudocode)
MenuItem_CloseWindow.OnClick += new OnClickHandler(YourMethodHere)
....
YourMethod(object sender, EventArgs e)
{
this.Close();
}
That should do the trick.
All Windows Forms come with the built-in ability to close them using the System Menu. Just press ALT + SPACE and it will show the Close option unless you have set the ControlBox property to False.
You can use for a basic Windows Form
System.Windows.Forms.Application.Exit();
If you are using Xaml/WPF you can use:
System.Windows.Application.Current.Shutdown();
Note: I only added this because some people think WPF and c# are the same.

Categories