1

私の作業環境: C#、.NET 4、および VS2012

アプリに問題があります。システム トレイに NotifyIcon を表示して実行します。ユーザーがアイコンをクリックするだけで、新しいウィンドウがポップアップ表示され、重要な情報が表示されます。

通常の状況では、ユーザーはアイコンをクリックするだけで、新しいウィンドウが表示されます。ただし、システム トレイ領域を持たない代替 Windows シェルの実装を検討しているため、アプリにはクリックする NotifyIcon がありません。

代替シェルを実行するときにすでにテストしました。WinSpy を使用すると、システム トレイがなくても、プロセスが実行されていることがわかります (その下に同じ 2 つの Windows が表示されます)。

この問題に対処するアプリを作成する必要があります。プロセスに接続し、ユーザーがアプリのシステム トレイ NotifyIcon をクリックすることをシミュレートする方法はありますか?これにより、新しいウィンドウがポップアップするはずです...代替シェル内でも (システム トレイすらありません! ?)

または、誰かが代替ソリューションを持っていますか?

4

1 に答える 1

2

(システム全体で一意であることが保証されている新しいウィンドウ メッセージを定義しRegisterWindowMessageます。メッセージの値は、メッセージを送信または投稿するときに使用できます。)

RegisterWindowMessage 関数は、通常、2 つの連携アプリケーション間で通信するためのメッセージを登録するために使用されます。

2 つの異なるアプリケーションが同じメッセージ文字列を登録すると、アプリケーションは同じメッセージ値を返します。メッセージは、セッションが終了するまで登録されたままになります。

static public class WinApi
{
    [DllImport("user32")]
    public static extern int RegisterWindowMessage(string message);

    public static int RegisterWindowMessage(string format, params object[] args)
    {
        string message = String.Format(format, args);
        return RegisterWindowMessage(message);
    }
}

アプリケーションを起動する前にメッセージを登録する

public class Program
{
    public static readonly int WM_SHOWFIRSTINSTANCE =
        WinApi.RegisterWindowMessage("WM_SHOWFIRSTINSTANCE|{0}", "ANY_UNIQUE_STING");
    public static void Main()
    {

    }
}

アプリケーションのメインフォームで

protected override void WndProc(ref Message message)
{
    if (message.Msg == PROGRAM.WM_SHOWFIRSTINSTANCE) {
        //show the window
    }
    base.WndProc(ref message);
}   

他のアプリケーションからウィンドウを復元するには

public class OtherProgram
{

    [DllImport("user32")]
    public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);            

    [DllImport("user32")]
    public static extern int RegisterWindowMessage(string message); 

    public static readonly int WM_SHOWFIRSTINSTANCE =
        WinApi.RegisterWindowMessage("WM_SHOWFIRSTINSTANCE|{0}", "ANY_UNIQUE_STING");


    public static void Main()
    {
        //public const int HWND_BROADCAST = 0xffff;
        PostMessage(
        (IntPtr)WinApi.HWND_BROADCAST, 
        WM_SHOWFIRSTINSTANCE,
        IntPtr.Zero,
        IntPtr.Zero);
    }
}   
于 2013-06-27T03:02:23.043 に答える