如何在进程上使用WinAPI SendMessage(或等效)

时间:2013-06-27 02:42:12

标签: c# winapi sendmessage

我的工作环境:C#,. NET 4和VS2012

我的应用有问题。它通过在系统托盘中显示NotifyIcon来运行。当用户只需单击该图标时,它会弹出一个新窗口并显示重要信息。

在正常情况下,用户只需点击图标即可显示新窗口。但是,我们正在寻求实现一个没有系统托盘区域的替代Windows shell,因此应用程序将没有可以单击的NotifyIcon!

我在运行备用shell时已经测试过了。如果我使用WinSpy,即使没有系统托盘,我也可以看到正在运行的进程(在其下面列有两个列出的Windows)。

我需要创建一个应用来解决这个问题。有没有办法连接到流程并模拟用户点击应用程序的系统托盘NotifyIcon,这应该会导致新窗口弹出...即使在替代shell(甚至没有系统托盘!)内部! ?)

或者有人有替代解决方案吗?

1 个答案:

答案 0 :(得分:2)

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