C#在没有焦点的情况下加载的应用程序仍然会在第一次注入鼠标事件时窃取它 我有两个应用程序,第一个是用C++编写的完整DirectX应用程序,第二个应用程序是用C语言编写的,并使用ActiveX COM对象呈现Flash视频、AVI、PDF等。然后,第一个应用程序捕获这个c#应用程序的内容,并将其作为纹理渲染到3d环境中。这一切都按预期工作,我在directX应用程序中有代码,允许我通过SendMessage和PostMessage向c#应用程序发送按键和鼠标事件

C#在没有焦点的情况下加载的应用程序仍然会在第一次注入鼠标事件时窃取它 我有两个应用程序,第一个是用C++编写的完整DirectX应用程序,第二个应用程序是用C语言编写的,并使用ActiveX COM对象呈现Flash视频、AVI、PDF等。然后,第一个应用程序捕获这个c#应用程序的内容,并将其作为纹理渲染到3d环境中。这一切都按预期工作,我在directX应用程序中有代码,允许我通过SendMessage和PostMessage向c#应用程序发送按键和鼠标事件,c#,visual-studio-2008,C#,Visual Studio 2008,我的问题在于初始启动。我将c#应用程序设置为在不激活的情况下启动,使用: protected override bool ShowWithoutActivation { get { return true; } } 这相当于CreateProcess调用中的SW_shownoactive。应用程序启动良好,并在C++应用程序的纹理上呈现良好的效果。然而,第一次鼠标点击就迫使c#应用程序窃取焦点,从而丢弃我的directx上下文。有人知道为什么会这样吗,或者有没有办法 如果启动C++应用

我的问题在于初始启动。我将c#应用程序设置为在不激活的情况下启动,使用:

protected override bool ShowWithoutActivation
{
    get { return true; }
}
这相当于CreateProcess调用中的SW_shownoactive。应用程序启动良好,并在C++应用程序的纹理上呈现良好的效果。然而,第一次鼠标点击就迫使c#应用程序窃取焦点,从而丢弃我的directx上下文。有人知道为什么会这样吗,或者有没有办法

如果启动C++应用程序,并且不点击它,启动时的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
}
为任何帮助提前欢呼,
Wayne

您还可以尝试通过将主c#表单的属性设置为WindowState=Minimized来隐藏它 ShowInTaskbar=false

然后,在某一时刻,如果您愿意,您可以更改上述属性以将申请表带到前台


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

发送按键听起来不是两个程序之间进行通信的正确方式。你能在这两个程序之间设置某种COM接口吗?这里有一个微软的页面,上面还有一些其他的技术

好的,我已经做了进一步的调查,从我所知道的情况来看,实际上是c#表单上的ActiveX组件窃取了焦点。我最初使用的那只老鼠直到注射了一只老鼠才引起这种情况。但是,我的pdf查看器是在加载时执行的。有什么方法可以阻止这种情况吗?请尝试隐藏C#窗口,直到所有ActiveX/组件完全加载。一旦发生这种情况,显示它。我已经通过使用MFC函数的几个dll导入来解决这个问题。使用SetWindowLong中的WS_EX_NOACTIVATE标志和SetWindowPos中的HWND_BOTTOM标志设置WindowLong和SetWindowPos。表单现在总是在其他窗口后面,并且从不激活。实际上,在最小化窗口内容时,不可能(或者至少据我所知)捕获窗口内容。绘图上下文包含大小为0的位图。如果将控件/窗体句柄传输到图形对象,则它可以将控件内容绘制为位图。我已经为我的生活游戏应用程序做了动画,我将在第二天向你展示捕捉控制内容作为位图的代码,因为我现在还没有。嗯,我已经看了IPC,似乎更适合发送实际数据,而不是我当前正在注入的用户输入:当我说Im注入鼠标和按键事件时,我指的是如果我直接与应用程序交互,应用程序将接收到的事件。也就是说,用户在表单文本字段中的键盘上键入一个单词,或者用鼠标单击一个按钮,等等。