我的工作环境:C#,. NET 4和VS2012
我的应用有问题。它通过在系统托盘中显示NotifyIcon来运行。当用户只需单击该图标时,它会弹出一个新窗口并显示重要信息。
在正常情况下,用户只需点击图标即可显示新窗口。但是,我们正在寻求实现一个没有系统托盘区域的替代Windows shell,因此应用程序将没有可以单击的NotifyIcon!
我在运行备用shell时已经测试过了。如果我使用WinSpy,即使没有系统托盘,我也可以看到正在运行的进程(在其下面列有两个列出的Windows)。
我需要创建一个应用来解决这个问题。有没有办法连接到流程并模拟用户点击应用程序的系统托盘NotifyIcon,这应该会导致新窗口弹出...即使在替代shell(甚至没有系统托盘!)内部! ?)
或者有人有替代解决方案吗?
答案 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);
}
}