Cách hiển thị cửa sổ ẩn trong Ứng dụng Windows Form

lập trình


Tôi đang cố gắng hiển thị cửa sổ ẩn trong ứng dụng biểu mẫu windows bằng phím tắt. Tôi có thể ẩn nhưng không thể hiển thị.
gợi ý cho tôi cách tôi sẽ làm.

Cảm ơn
Prafulla

Giải pháp 2

CÂU TRẢ LỜI ĐẦU TIÊN

Tôi không biết liệu tôi có hiểu đúng ý bạn không, nhưng đây là một số liên kết:

http://stackoverflow.com/questions/8210095/c-sharp-show-hidden-window[^]
http://www.techotopia.com/index.php/Hiding_and_Showing_Forms_in_C_Sharp[^]

[^]

CÂU TRẢ LỜI THỨ HAI

Cách ghi lại các lần nhấn phím trong biểu mẫu của bạn:
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-press/[^]
http://www.daniweb.com/software-development/csharp/threads/29646/capturing-keypresses[^]

[^]

Hy vọng bất kỳ cách nào trong ba cách tiếp cận đó sẽ giúp bạn …

Giải pháp 3

Kính thưa
duyệt các liên kết này, bạn sẽ nhận được mã

Ẩn cửa sổ bằng C#[^]

http://www.techotopia.com/index.php/Hiding_and_Showing_Forms_in_C_Sharp[^]

Giải pháp 4

Thử cái này xem sao:
Sử dụng OnKeydown[^] sự kiện:

C#
private void OnKeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
     if (e.Shift && e.KeyCode == Keys.H) 
     {
         WindowState = FormWindowState.Minimized;
     }        
}

Tìm thấy nó đây[^]

Giải pháp 5

Bạn cần có được sự kết nối với api win32. Ngay khi bạn ẩn biểu mẫu .net của mình, các sự kiện và người đăng ký sự kiện sẽ ngừng hoạt động vì chúng chỉ tồn tại trong vùng chứa biểu mẫu. Bạn cần một cái gì đó như thế này.

C#
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
    }
}

Bây giờ đăng ký S và H với Alt + Shift bằng cách gọi và chuyển một cuộc gọi lại loại Action.

RegisterHoitKey.

Thiết lập một Hành động cho cuộc gọi lại của bạn để hiển thị hoặc ẩn biểu mẫu của bạn.

Giải pháp 6

Để hiển thị và ẩn cửa sổ trong ứng dụng Windows Forms bằng phím tắt, bạn có thể xử lý sự kiện KeyDown để phát hiện khi phím tắt được nhấn. Sau đó, bạn có thể chuyển đổi chế độ hiển thị của biểu mẫu cho phù hợp. Đây là một ví dụ cơ bản về cách bạn có thể đạt được điều này:

C#
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();
                }
            }
        }
    }
}

Trong ví dụ này:

Chúng tôi đã đăng ký sự kiện KeyDown của biểu mẫu trong hàm tạo.
Khi nhấn phím tắt (trong trường hợp này là Ctrl + H), trình xử lý sự kiện MainForm_KeyDown sẽ được gọi.
Bên trong trình xử lý sự kiện, chúng ta chuyển đổi chế độ hiển thị của biểu mẫu bằng cách sử dụng cờ isVisible và các phương thức Show() và Hide().
Đảm bảo thay thế YourNamespace bằng không gian tên thực tế của ứng dụng của bạn. Bạn cũng có thể tùy chỉnh tổ hợp phím tắt (Ctrl + H trong ví dụ này) bằng cách sửa đổi điều kiện trong trình xử lý sự kiện KeyDown.

コメント

タイトルとURLをコピーしました