我有用本机 C++ 编写的代码,它控制由 CreatePrcess() 和其他 Windows API 创建的其他进程(“客户端进程”)
然后客户端进程(控制台、单线程)等待来自“服务器”进程的消息 MSG_OK 并恢复运行收到消息时。
我使用了 PostThreadMessage() 并且效果很好。
int MSG_OK = RegisterWindowMessage("MSG_OK");
void run(TCHAR* path) {
STARTUPINFO si={0,}; si.cb=sizeof(STARTUPINFO); si.dwFlags=0;
PROCESS_INFORMATION pi;
CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
Sleep(1000); // Just for simplicity. Actual code is message-based
PostThreadMessage(pi.dwThreadId, MSG_OK, 0, 0);
CloseHandle(pi.hProcess); // closing process handle makes usage count 1
CloseHandle(pi.hThread);
}
现在我想用 C# 重写代码,尽可能少地使用 p/invoke。以下是我正在处理的代码:
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostThreadMessage(uint threadId, int msg, IntPtr wParam, IntPtr lParam);
public void run(string path) {
Process proc = new Process();
ProcessStartInfo si = new ProcessStartInfo();
si.FileName = path;
proc.StartInfo = si;
proc.Start();
uint threadId; // <----?
PostThreadMessage(threadId, MSG_OK, 0, 0);
proc.Dispose();
}
我找到了诸如 Process 和 ProcessStartinfo 之类的 C# 类,但找不到任何类似于 dwThreadId 的成员。有没有?
编辑:由于客户端进程是单线程应用程序,
proc.Threads[0].id
似乎是我正在寻找的threadId。难道我做错了什么?