[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[^]
2 番目の答え
フォームでキーの押下をキャプチャする方法:
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 つのアプローチのいずれかがお役に立てば幸いです…
解決策 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]
コメント