我的工作环境:C#,.NET 4和VS2012
我有一个应用程序的问题。 它运行由表示在系统托盘将NotifyIcon。 当用户只需点击该图标,它会弹出一个新窗口,并显示重要信息。
一般情况下用户只需点击该图标,它带来了新的窗口。 然而,我们正在实施,不会有系统托盘区,因此该应用程序将在其上单击否NotifyIcon的一个替代Windows外壳!
运行替代壳的时候我已经测试。 如果我使用WinSpy我可以看到运行的进程(与它下面的两个相同列出的Windows),即使没有系统托盘。
我需要创建一个应用程序来解决这个问题。 有没有连接到过程,并模拟上的应用程序的系统托盘NotifyIcon的用户点击,那么这应该引起新的窗口弹出...的方式即使在替代外壳(这甚至没有一个系统盘里面! ?)
或者有没有人有一个替代的解决方案?
看一看在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);
}
}