5

私は自分のアプリをシステムトレイに保持するようにバックグラウンドで実行されるアプリケーションを持っています。それがシステムトレイに残っている場合、私のアプリはそれを実行します。ユーザーがF10またはF9を押すたびに、いくつかの作業が行われます。私はこれを試しました:

public partial class Form1 : Form
{
    public int a = 1;

    [DllImport("user32.dll")]
    public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc);
    [DllImport("user32.dll")]
    public static extern bool UnregisterHotKey(IntPtr hWnd, int id);


    [DllImport("User32.dll")]
    private static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey);
    [DllImport("User32.dll")]
    private static extern short GetAsyncKeyState(System.Int32 vKey);

    const int MYACTION_HOTKEY_ID = 1;

    public Form1()
    {
        InitializeComponent();
        RegisterHotKey(this.Handle, MYACTION_HOTKEY_ID, 0, (int) Keys.F9);
        RegisterHotKey(this.Handle, MYACTION_HOTKEY_ID, 0, (int)Keys.F10);

        this.ShowInTaskbar = false;
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x0312 && m.WParam.ToInt32() == MYACTION_HOTKEY_ID && (GetAsyncKeyState(Keys.F9) == -32767))
        {
            if ((a % 2) != 0)
            {
                a++;
                MessageBox.Show(a.ToString()+"not equal F9");
                label1.Text = "not equal F9";
            }

            if ((a % 2) == 0)
            {
                a++;
                MessageBox.Show(a.ToString()+"equal F9");
                label1.Text = " equal F9";
            }

        }

        else if (m.Msg == 0x0312 && m.WParam.ToInt32() == MYACTION_HOTKEY_ID && (GetAsyncKeyState(Keys.F10) == -32767))
        {
            if ((a % 2) != 0)
            {
                a++;
                MessageBox.Show(a.ToString() + "not equal F10");
                label1.Text = "not equal F10";
            }

            if ((a % 2) == 0)
            {
                a++;
                MessageBox.Show(a.ToString() + "equal F10");
                label1.Text = " equal F10";
            }

        }
        base.WndProc(ref m);
    }

}

set "this.ShowInTaskbar = false"を使用すると、この行は機能しません。ただし、これを設定しないと、正常に機能します。私のアプリでは、この行を使用する必要があります。これを解決するにはどうすればよいですか????

4

2 に答える 2

8

オペレーティングシステムがの​​ようなネイティブ関数呼び出しを使用して送信する特定のメッセージをサブスクライブする必要がありますRegisterHotKey()。この関数を呼び出すときウィンドウのを指定することにより、メッセージを送信するウィンドウをオペレーティングシステムに指示しHandleます。これは、アドレスと見なすことができます。ハンドルを設定ShowInTaskbar = falseすると、オペレーティングシステムがどこに到達するかわからないように変更されます。

最初のarugmentを参照してください:

RegisterHotKey(this.Handle, MYACTION_HOTKEY_ID, 0, (int) Keys.F9);

問題を解決するために、「ウィンドウハンドルとウィンドウプロシージャの低レベルのカプセル化を提供するNativeWindow」から派生したクラスを作成し、そのクラス内から(または、実装によっては少なくともそのクラスのハンドルを使用して)、登録することができます。決して変更されないハンドルを使用するホットキー。

public sealed class HotkeyManager : NativeWindow, IDisposable
{
    public HotkeyManager()
    {
        CreateHandle(new CreateParams());
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == Constants.WM_HOTKEY)
        {
             //handle hotkey message
        }
        base.WndProc(ref m);
    }

    public void Dispose()
    {
        DestroyHandle();
    }
}
于 2013-03-15T14:15:57.140 に答える
1

私の知る限り、「ShowInTaskbar」の状態を変更するたびに、ホットキーを再登録する必要があります。

他の誰かが同様の問題を抱えていました。このスレッドを参照してください。

于 2013-03-15T14:13:10.783 に答える