Jor*_*dan 9 c# wpf mfc ipc process
我有一种情况,我在我的代码中启动一个进程,以便建立一个IPC通道.我正在开始的过程是一个没有CLR支持的MFC应用程序.我开始这个过程的应用程序是WPF应用程序中的C#模块(我认为这不是我的问题的结果).这适用于支持CLR的应用程序版本,它适用于除部署目标之外的每台计算机,Windows 7的触摸屏计算机.但出于某种原因,当我尝试使用此确切方案时,Process对象永远不会解析主窗口句柄(Process.MainWindowHandle).这样做有另一种(甚至是pinvoke)方法吗?这是安全的事吗?我是那个盯着这个过程的人.进程的主窗口句柄确实存在.我看不出有什么不对.
如果它有帮助,这是我的代码.
_applicationProcess = new Process();
_applicationProcess.StartInfo.FileName = _strProcessPath;
_applicationProcess.StartInfo.Arguments = _strProcessArguments;
_applicationProcess.Start();
long nTicks = Environment.TickCount;
if (_applicationProcess.WaitForInputIdle(1 /*minute(s)*/ * 60000))
{
try
{
do
{
// Don't let total processing take more than 1 minute(s).
if (Environment.TickCount > nTicks + 1 /*minute(s)*/ * 60000)
throw new ApplicationException("MFCApplication.Startup failed! The main window handle is zero!");
_applicationProcess.Refresh();
}
while (_applicationProcess.MainWindowHandle.ToInt32() == 0);
_applicationHandle = new IntPtr(_applicationProcess.MainWindowHandle.ToInt32());
}
catch (Exception ex)
{
//Do some stuff...
throw;
}
}
else
{
// Do exception handling.
}
Run Code Online (Sandbox Code Playgroud)
在ApplicationException尝试获得除零之外的主窗口句柄一分钟后被击中.
不幸的是,你从Process.MainWindowHandle获得的值是一个猜测.程序没有可用的API函数让它告诉Windows"这是我的主窗口".它使用的规则是记录的,它是进程启动时创建的第一个窗口.如果第一个窗口是登录窗口或启动画面,则会导致问题.
你无能为力,你必须更多地了解程序如何找到真正的主窗口.只要在与主窗口相同的线程上创建第一个窗口,使用EnumThreadWindows()枚举窗口就可以帮助您找到它.如果不是这样的话,将需要更精细的EnumWindows().
| 归档时间: |
|
| 查看次数: |
14348 次 |
| 最近记录: |