.net 阻止我的应用占据焦点
我们的程序监听来自WndProc中第三方应用程序的WM_COPYDATA消息。在每次接收到WM_COPYDATA时都会收到另一个版本的应用程序之后,我们的程序从用户正在处理的任何应用程序中获取焦点。 当WM_COPYDATA出现时,我试图忽略WM_ACTIVATE,什么也不做,但我的应用程序仍然得到了关注。我肯定他们的申请激活了我们的,但他们拒绝了。有没有办法阻止我的应用程序占据焦点.net 阻止我的应用占据焦点,.net,winforms,winapi,.net,Winforms,Winapi,我们的程序监听来自WndProc中第三方应用程序的WM_COPYDATA消息。在每次接收到WM_COPYDATA时都会收到另一个版本的应用程序之后,我们的程序从用户正在处理的任何应用程序中获取焦点。 当WM_COPYDATA出现时,我试图忽略WM_ACTIVATE,什么也不做,但我的应用程序仍然得到了关注。我肯定他们的申请激活了我们的,但他们拒绝了。有没有办法阻止我的应用程序占据焦点 protected override void WndProc(ref Message m)
protected override void WndProc(ref Message m)
{
if(m.Msg == WM_ACTIVATE)
return;
if(m.Msg == WM_COPYDATA)
{
// ProcessCopyData(m);
}
base.WndProc(ref m);
}
更新
在激活之前,我编写了Focused属性和消息值
sw.WriteLine( this.Focused+" " + m.ToString());
False msg=0x1c(WM_ACTIVATEAPP)hwnd=0x2606d4 wparam=0x1 lparam=0x0结果=0x0
False msg=0x86(WM_NCACTIVATE)hwnd=0x2606d4 wparam=0x0 lparam=0x0结果=0x0
False msg=0x6(WM_激活)hwnd=0x2606d4 wparam=0x1 lparam=0x0结果=0x0
True msg=0x281(WM\U IME\U SETCONTEXT)hwnd=0x2606d4 wparam=0x1 lparam=0xFFFFFFC000000F结果=0x0
这也没用
if(m.Msg == WM_NCACTIVATE || m.Msg == WM_ACTIVATE || m.Msg == WM_ACTIVATEAPP)
{
m.WParam = (IntPtr)0;
}
可以忽略这些消息吗?为什么不在无法集中的专用后台服务上执行侦听?我们的应用程序有用户界面,还可以做其他事情。是的,我理解这一点,我的意思是创建一个专用服务来执行侦听和控制GUI应用程序。这样,中间的服务,你可以过滤掉不需要的消息……为什么WMLCopyDATA会把你的应用程序窗口带到前台,除了你对它进行编码之外,或者把它发送给另一个完全有帮助的应用程序,没有任何理由。对于后一种解释,你显然无法找到原因。简单地隐藏窗口是一种解决方法。“电话也是一样。”我试着把它藏起来,但它仍然能引起注意。我添加了在wm_copydata之后收到的消息