我的应用程序有一个托盘图标,双击时会隐藏或显示应用程序窗口.我的问题是,如果隐藏窗口处于最小化状态,我似乎无法将窗口置于前台.
例如,假设用户最小化应用程序,然后双击托盘图标.然后隐藏应用程序窗口并从任务栏中消失.当用户再次双击托盘图标时,应该出现应用程序窗口,即应该从最小化状态恢复并将其带到前台.
下面的代码应该这样做,但由于某种原因,它不会:
private void TrayIcon_DoubleClick(object sender, EventArgs e)
{
if (this.Visibility == Visibility.Hidden)
{
this.Visibility = Visibility.Visible;
this.WindowState = WindowState.Normal;
this.Activate();
}
...
}
Run Code Online (Sandbox Code Playgroud)
应用程序保持最小化,不会被带到前台.Activate()返回true,后续调用TrayIcon_DoubleClick()表示状态确实设置为Normal.
我一直在努力将输入注入到WPF应用程序中.使这个项目变得困难的原因是我需要能够将输入注入到应用程序中,即使它在后台运行(即另一个应用程序具有输入焦点).因此,使用SendInput()函数是不可能的.
到目前为止,我已经有键盘输入工作,但是在注入鼠标输入时遇到了麻烦.
我使用Spy ++观察物理单击鼠标按钮时发送到WPF窗口的窗口消息.然后,我手动简单地制作这些相同的鼠标消息(例如WM_LBUTTONDOWN和WM_LBUTTONUP),并将它们显式发送到WPF窗口以模拟鼠标输入.
不幸的是,这不能按预期工作(即使我出于测试目的,已将WPF窗口设置为前景窗口).
我在我的测试WPF窗口中添加了一个按钮,单击该窗口时会显示一个消息框.当我手动将光标放在按钮上时,注入适当的鼠标消息不会导致单击按钮(即,WPF框架不会触发单击的事件).
如果我在实际对话框(客户区)上添加鼠标单击处理程序,那么如果我将光标放在对话框本身上并像以前一样注入相同的窗口消息,则会调用该处理程序:
this.MouseLeftButtonDown += WndMouseDown;
public void WndMouseDown(object sender, EventArgs e)
{
...
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我将按钮的推模式更改为Press(即,它被认为是单击鼠标按下而不是默认鼠标向上),则当我像以前一样注入相同的消息时,按钮单击事件现在被触发.(值得一提的是,上面示例中的处理程序正确地触发了鼠标向下和向上,因此看起来WPF框架确实成功处理了这两个消息.)
似乎还有一些其他标准需要满足才能使WPF框架触发鼠标单击事件.有没有人知道如何在WPF内部处理鼠标输入,或者为什么它不是单击按钮来解释我的鼠标上下消息?
(值得一提的是,这种方法[发送窗口消息]在普通的Win32窗口上工作正常,例如Start-> Run对话框.这里的区别是WPF只有一个物理Win32窗口,其余的是WPF特定的,这意味着所有窗口消息转到顶级窗口而不是实际按钮.)
我一直在寻找这个答案的高低,并会欣赏任何想法或想法.
我需要为Chrome编写一个插件,如果在Windows上运行并且浏览器的URL与特定内容匹配,则可以打开命名管道到操作系统上运行的某个进程.
什么是Chrome的最佳插件选择?我应该使用Native Client还是可以使用更少侵入性的东西(虽然我意识到命名管道的定义非常具有侵入性)?