[ad_1]
我正在尝试使用快捷键在 Windows 窗体应用程序中显示隐藏窗口。我能够隐藏但无法显示。
建议我该怎么做。
谢谢
普拉富拉
解决方案2
我不知道我是否理解正确,但这里有一些链接:
http://stackoverflow.com/questions/8210095/c-sharp-show-hidden-window[^]
http://www.techotopia.com/index.php/Hiding_and_Showing_Forms_in_C_Sharp[^]
第二个答案
如何捕获表单中的按键操作:
http://stackoverflow.com/questions/3001237/how-to-catch-key-press-on-a-form-c-sharp-net[^]
http://www.dreamincode.net/forums/topic/61509-capture-key-pressed/[^]
http://www.daniweb.com/software-development/csharp/threads/29646/capturing-keypresses[^]
希望这三种方法中的任何一种都能对您有所帮助…
解决方案3
亲爱的
浏览这些链接,您将获得代码
http://www.techotopia.com/index.php/Hiding_and_Showing_Forms_in_C_Sharp[^]
解决方案4
private void OnKeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { if (e.Shift && e.KeyCode == Keys.H) { WindowState = FormWindowState.Minimized; } }
解决方案5
您需要挂钩 win32 api。 一旦隐藏 .net 表单,事件和事件订阅者就会停止工作,因为它们仅存在于表单的容器中。 你需要这样的东西。
using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Windows.Input; public class GlobalHotKey : IDisposable { public static bool RegisterHotKey(string aKeyGestureString, Action aAction) { var c = new KeyGestureConverter(); KeyGesture aKeyGesture = (KeyGesture)c.ConvertFrom(aKeyGestureString); return RegisterHotKey(aKeyGesture.Modifiers, aKeyGesture.Key, aAction); } public static bool RegisterHotKey(ModifierKeys aModifier, Key aKey, Action aAction) { if (aModifier == ModifierKeys.None) { throw new ArgumentException("Modifier must not be ModifierKeys.None"); } if (aAction is null) { throw new ArgumentNullException(nameof(aAction)); } System.Windows.Forms.Keys aVirtualKeyCode = (System.Windows.Forms.Keys)KeyInterop.VirtualKeyFromKey(aKey); currentID = currentID + 1; bool aRegistered = RegisterHotKey(window.Handle, currentID, (uint)aModifier | MOD_NOREPEAT, (uint)aVirtualKeyCode); if (aRegistered) { registeredHotKeys.Add(new HotKeyWithAction(aModifier, aKey, aAction)); } return aRegistered; } public void Dispose() { // unregister all the registered hot keys. for (int i = currentID; i > 0; i--) { UnregisterHotKey(window.Handle, i); } // dispose the inner native window. window.Dispose(); } static GlobalHotKey() { window.KeyPressed += (s, e) => { registeredHotKeys.ForEach(x => { if (e.Modifier == x.Modifier && e.Key == x.Key) { x.Action(); } }); }; } private static readonly InvisibleWindowForMessages window = new InvisibleWindowForMessages(); private static int currentID; private static uint MOD_NOREPEAT = 0x4000; private static List<HotKeyWithAction> registeredHotKeys = new List<HotKeyWithAction>(); private class HotKeyWithAction { public HotKeyWithAction(ModifierKeys modifier, Key key, Action action) { Modifier = modifier; Key = key; Action = action; } public ModifierKeys Modifier { get; } public Key Key { get; } public Action Action { get; } } // Registers a hot key with Windows. [DllImport("user32.dll")] private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk); // Unregisters the hot key with Windows. [DllImport("user32.dll")] private static extern bool UnregisterHotKey(IntPtr hWnd, int id); private class InvisibleWindowForMessages : System.Windows.Forms.NativeWindow, IDisposable { public InvisibleWindowForMessages() { CreateHandle(new System.Windows.Forms.CreateParams()); } private static int WM_HOTKEY = 0x0312; protected override void WndProc(ref System.Windows.Forms.Message m) { base.WndProc(ref m); if (m.Msg == WM_HOTKEY) { var aWPFKey = KeyInterop.KeyFromVirtualKey(((int)m.LParam >> 16) & 0xFFFF); ModifierKeys modifier = (ModifierKeys)((int)m.LParam & 0xFFFF); if (KeyPressed != null) { KeyPressed(this, new HotKeyPressedEventArgs(modifier, aWPFKey)); } } } public class HotKeyPressedEventArgs : EventArgs { private ModifierKeys _modifier; private Key _key; internal HotKeyPressedEventArgs(ModifierKeys modifier, Key key) { _modifier = modifier; _key = key; } public ModifierKeys Modifier { get { return _modifier; } } public Key Key { get { return _key; } } } public event EventHandler<HotKeyPressedEventArgs> KeyPressed; #region IDisposable Members public void Dispose() { this.DestroyHandle(); } #endregion } }
现在通过调用并传入类型的回调来使用 Alt + Shift 注册 S 和 H Action
。
RegisterHoitKey
。
为您的回调连接一个操作,该操作将显示或隐藏您的表单。
解决方案6
要使用快捷键在 Windows 窗体应用程序中显示和隐藏窗口,您可以处理 KeyDown 事件来检测何时按下快捷键。 然后,您可以相应地切换表单的可见性。 以下是如何实现此目标的基本示例:
using System; using System.Windows.Forms; namespace YourNamespace { public partial class MainForm : Form { private bool isVisible = true; // Flag to track the visibility of the form public MainForm() { InitializeComponent(); this.KeyPreview = true; // Enable key events to be captured by the form this.KeyDown += MainForm_KeyDown; // Subscribe to the KeyDown event } private void MainForm_KeyDown(object sender, KeyEventArgs e) { // Check if the shortcut key (e.g., Ctrl + H) is pressed if (e.Control && e.KeyCode == Keys.H) { // Toggle the visibility of the form isVisible = !isVisible; if (isVisible) { // Show the form this.Show(); } else { // Hide the form this.Hide(); } } } } }
在这个例子中:
我们在构造函数中订阅了表单的 KeyDown 事件。
当按下快捷键(在本例中为 Ctrl + H)时,将调用 MainForm_KeyDown 事件处理程序。
在事件处理程序中,我们使用 isVisible 标志以及 Show() 和 Hide() 方法切换表单的可见性。
确保将 YourNamespace 替换为应用程序的实际命名空间。 您还可以通过修改 KeyDown 事件处理程序中的条件来自定义快捷键组合(本例中为 Ctrl + H)。
[ad_2]
コメント