2013-06-27 2 views
0

Моя рабочая среда: C#, .NET 4 и VS2012Как использовать WinAPI SendMessage (или эквивалент) на процессе

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

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

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

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

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

+0

Если пользователь не может видеть значок, то как он узнает, куда нажать? – Longball27

ответ

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); 
    } 
}