我遇到了麻烦。我想用C#启动进程(目标是在后台启动一个特殊文档的几个应用程序)。现在这是由我完成的,我将程序作为一个不可见的进程启动,但我想通过我的代码指导应用程序。所以,我希望有一个对象(具有特殊Process-ID的对象),它位于Running Object Table上。我无法解决这个问题,因为我总是得到第一个应用程序。
public static Application GetRunningCOMObjectByProcessId(int id)
{
// ROT-Schnittstelle
IRunningObjectTable runningObjectTable = null;
// Moniker-Auflistung
IEnumMoniker monikerList = null;
try
{
// Running Object Table abfragen und nichts zurückgeben, wenn keine COM-Objekte laufen
if (GetRunningObjectTable(0, out runningObjectTable) != 0 || runningObjectTable == null) return null;
// Moniker abfragen
runningObjectTable.EnumRunning(out monikerList);
// An den Anfang der Auflistung springen
monikerList.Reset();
// Array für Moniker-Abfrage erzeugen
IMoniker[] monikerContainer = new IMoniker[1];
// Zeiger auf die Anzahl der tatsächlich abgefragten Moniker erzeugen
IntPtr pointerFetchedMonikers = IntPtr.Zero;
// Alle Moniker durchlaufen
while (monikerList.Next(1, monikerContainer, pointerFetchedMonikers) == 0)
{
// Objekt für Bindungsinformationen
IBindCtx bindInfo;
// Variable für den Anzeigenamen des aktuellen COM-Objekts
string displayName;
// Bindungsobjekt erzeugen
CreateBindCtx(0, out bindInfo);
// Anzeigename des COM-Objekts über den Moniker abfragen
monikerContainer[0].GetDisplayName(bindInfo, null, out displayName);
// Bindungsobjekt entsorgen
Marshal.ReleaseComObject(bindInfo);
/*
// Wenn der Anzeigename mit dem gesuchten übereinstimmt ...
if (displayName.IndexOf(objectDisplayName) != -1)
{
// Variable für COM-Objekt
object comInstance;
// COM-Objekt über den Anzeigenamen abrfragen
runningObjectTable.GetObject(monikerContainer[0], out comInstance);
// COM-Objekt zurückgeben
return comInstance;
}
*/
// Variable für COM-Objekt
object comInstance;
Application qvApp;
// COM-Objekt über den Anzeigenamen abrfragen
runningObjectTable.GetObject(monikerContainer[0], out comInstance);
if (comInstance is Application)
{
qvApp = (Application)comInstance;
int pid = qvApp.GetProcessId();
if (pid == id)
{
return qvApp;
}
}
}
}
catch
{
// Nichts zurückgeben
return null;
}
finally
{
// Ggf. COM-Verweise entsorgen
if (runningObjectTable != null) Marshal.ReleaseComObject(runningObjectTable);
if (monikerList != null) Marshal.ReleaseComObject(monikerList);
}
// Nichts zurückgeben
return null;
}
那么,我怎么能用一个特殊的进程id ???
来获取某个对象我对黄色的感兴趣。