Как использовать WinAPI SendMessage (или эквивалент) в процессе

Моя рабочая среда: C#, .NET 4 и VS2012.

У меня проблема с приложением. Он запускается, показывая NotifyIcon на панели задач. Когда пользователи просто нажимают на значок, появляется новое окно, в котором отображается важная информация.

В обычных условиях пользователи просто щелкают по значку, и открывается новое окно. Тем не менее, мы стремимся реализовать альтернативную оболочку Windows, в которой не будет области панели задач, и, следовательно, у приложения не будет значка NotifyIcon, по которому можно было бы щелкнуть!

Я уже тестировал при запуске альтернативной оболочки. Если я использую WinSpy, я вижу запущенный процесс (с теми же двумя перечисленными Windows под ним), даже если нет системного трея.

Мне нужно создать приложение для решения этой проблемы. Есть ли способ подключиться к процессу и имитировать пользователя, щелкающего по NotifyIcon на панели задач приложения, что должно вызвать появление нового окна... даже в альтернативной оболочке (у которой даже нет панели задач! ?)

Или у кого есть альтернативное решение?


person Joey    schedule 27.06.2013    source источник
comment
Если пользователь не видит значок, как он узнает, куда щелкнуть?   -  person Longball27    schedule 27.06.2013


Ответы (1)


Взгляните на RegisterWindowMessage (Определяет новое оконное сообщение, которое гарантированно будет уникальным во всей системе. Значение сообщения можно использовать при отправке или публикации сообщений.)

Функция RegisterWindowMessage обычно используется для регистрации сообщений для связи между двумя взаимодействующими приложениями.

Если два разных приложения регистрируют одну и ту же строку сообщения, приложения возвращают одно и то же значение сообщения. Сообщение остается зарегистрированным до окончания сеанса.

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);
    }
}   
person Parimal Raj    schedule 27.06.2013