在没有焦点的情况下加载的C#应用​​程序仍在第一次注入的鼠标事件中被盗

时间:2010-08-19 16:57:48

标签: c# visual-studio-2008

我有两个应用程序,第一个是用c ++编写的完整directX应用程序,第二个应用程序是用c#编写的,使用ActiveX COM对象呈现flash视频,avi,pdf等。然后,第一个应用程序捕获此c#app的内容,并将其作为纹理呈现到3d环境中。这一切都按预期工作,我在directX应用程序中有代码,允许我通过SendMessage和PostMessage将密钥和鼠标事件发送到c#app。

我的问题在于初次启动。我将c#app设置为启动而不激活,使用:

protected override bool ShowWithoutActivation
{
    get { return true; }
}

这相当于CreateProcess调用中的SW_SHOWNOACTIVATE。应用程序启动很好,并在c ++应用程序的纹理上呈现正常。但是,第一次单击鼠标会强制c#应用程序窃取焦点,从而丢弃我的directx上下文。有人知道为什么会发生这种情况,或者是否有任何解决方法?

如果我启动c#app并且没有点击它,启动时的c ++应用程序仍按预期运行,只有在通过代码启动它时才会运行:

STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
ZeroMemory(&pi, sizeof(pi));

si.cb   = sizeof(si);
si.dwFlags  = STARTF_USESHOWWINDOW | STARTF_USESIZE;
si.wShowWindow = SW_SHOWNORMAL;
si.dwXSize  = 400;
si.dwYSize  = 400;
if(!::CreateProcess(program, arguments, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
    return false;
}
else
{
    // use EnumWindows to conforim the app is open and get its HANDLE
}

提前为任何帮助干杯, 韦恩

2 个答案:

答案 0 :(得分:0)

你也试图通过将其属性设置为WindowState = Minimized来隐藏主c#表单 和ShowInTaskbar = false。

然后在某个时刻,如果需要,您可以更改上述属性以将申请表格放在前面。

在这种情况下,应用程序将运行其所有作业,但它将不可见。然后,您可以捕获其活动区域,而不会在屏幕上显示它。

答案 1 :(得分:0)

发送按键听起来不像是在两个程序之间进行通信的正确方法。你能在两个程序之间设置某种COM接口吗?这是Interprocess Communication上的Microsoft页面以及其他一些技术。