クラスを使用System.Diagnostic.Process
して、.Net WCF Web サービスを使用してサーバー pc でプロセスを開始します。それらはスムーズに起動し、タスクマネージャーから実行されているのを見ることができますが、ウィンドウは表示されません。どうすればこの問題を克服できると思いますか?
1639 次
3 に答える
3
GUI を表示し、ユーザーがそれを操作できるようにする場合は、対話型プロセスを開始する必要があります。現在、Web サービスにはおそらく当てはまりません。
Windows サービスを開始して cmd を起動するを参照してください
于 2012-07-06T12:13:09.453 に答える
1
あなたはこれをするべきではありませんが...
現在のセッションでユーザーとしてプログラムを起動できます
IntPtr UserTokenHandle = IntPtr.Zero;
WTSQueryUserToken ( WTSGetActiveConsoleSessionId(), ref UserTokenHandle);
PROCESS_INFORMATION ProcInfo = new PROCESS_INFORMATION();
STARTUPINFOW StartInfo = new STARTUPINFOW();
StartInfo.cb = Convert.ToUInt32(System.Runtime.InteropServices.Marshal.SizeOf(StartInfo));
CreateProcessAsUser ( UserTokenHandle, @"C:\dir\MyApp.exe",
IntPtr.Zero,
IntPtr.Zero,
IntPtr.Zero,
false,
0,
IntPtr.Zero,
null,
ref StartInfo,
ref ProcInfo);
if (!(UserTokenHandle == IntPtr.Zero))
{
CloseHandle ( UserTokenHandle);
}
必要なインポートと構造体:
[DllImport("kernel32.dll", EntryPoint = "WTSGetActiveConsoleSessionId", SetLastError = true)]
public static extern uint WTSGetActiveConsoleSessionId ();
[DllImport("Wtsapi32.dll", EntryPoint = "WTSQueryUserToken", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool WTSQueryUserToken ( uint SessionId, ref IntPtr phToken );
[DllImport("kernel32.dll", EntryPoint = "CloseHandle", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CloseHandle ( [InAttribute()]
IntPtr hObject );
[DllImport("advapi32.dll", EntryPoint = "CreateProcessAsUserW", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CreateProcessAsUser (
[InAttribute()]
IntPtr hToken,
[InAttribute(), MarshalAs(UnmanagedType.LPWStr)]
string lpApplicationName, System.IntPtr lpCommandLine,
[InAttribute()]
IntPtr lpProcessAttributes,
[InAttribute()]
IntPtr lpThreadAttributes,
[MarshalAs(UnmanagedType.Bool)]
bool bInheritHandles, uint dwCreationFlags,
[InAttribute()]
IntPtr lpEnvironment,
[InAttribute(), MarshalAsAttribute(UnmanagedType.LPWStr)]
string lpCurrentDirectory,
ref STARTUPINFOW lpStartupInfo,
ref PROCESS_INFORMATION lpProcessInformation );
[StructLayout(LayoutKind.Sequential)]
public struct SECURITY_ATTRIBUTES
{
public uint nLength;
public IntPtr lpSecurityDescriptor;
[MarshalAs(UnmanagedType.Bool)]
public bool bInheritHandle;
}
[StructLayout(LayoutKind.Sequential)]
public struct STARTUPINFOW
{
public uint cb;
[MarshalAs(UnmanagedType.LPWStr)]
public string lpReserved;
[MarshalAs(UnmanagedType.LPWStr)]
public string lpDesktop;
[MarshalAs(UnmanagedType.LPWStr)]
public string lpTitle;
public uint dwX;
public uint dwY;
public uint dwXSize;
public uint dwYSize;
public uint dwXCountChars;
public uint dwYCountChars;
public uint dwFillAttribute;
public uint dwFlags;
public ushort wShowWindow;
public ushort cbReserved2;
public IntPtr lpReserved2;
public IntPtr hStdInput;
public IntPtr hStdOutput;
public IntPtr hStdError;
}
[StructLayout(LayoutKind.Sequential)]
public struct PROCESS_INFORMATION
{
public IntPtr hProcess;
public IntPtr hThread;
public uint dwProcessId;
public uint dwThreadId;
}
于 2012-07-06T12:21:10.937 に答える
0
あなたはWebサービスについて話しているので、おそらくWindowsサービスとしても実行されていますか? その場合、プロセスを開始できますが、フォームはまったく表示されません。
Windows サービスは、ユーザーがログインしていないときでもコンピューター上で実行されるように設計されています。
「デスクトップとの対話を許可する」(または同様のもの) という設定をいじることができますが、サービスはそのように使用することを意図していません。
于 2012-07-06T12:07:54.503 に答える