我有两个应用程序,第一个是用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
}
提前为任何帮助干杯, 韦恩
答案 0 :(得分:0)
你也试图通过将其属性设置为WindowState = Minimized来隐藏主c#表单 和ShowInTaskbar = false。
然后在某个时刻,如果需要,您可以更改上述属性以将申请表格放在前面。
在这种情况下,应用程序将运行其所有作业,但它将不可见。然后,您可以捕获其活动区域,而不会在屏幕上显示它。
答案 1 :(得分:0)
发送按键听起来不像是在两个程序之间进行通信的正确方法。你能在两个程序之间设置某种COM接口吗?这是Interprocess Communication上的Microsoft页面以及其他一些技术。