C# SetParent(winapi)返回拒绝访问

C# SetParent(winapi)返回拒绝访问,c#,c++,wpf,winapi,C#,C++,Wpf,Winapi,我们在WPF窗口中,使用GUI窗口启动新流程。然后调用SetParent()将新创建的窗口移动到MainWindow中。当以管理员身份运行时,一切正常,但若以用户身份(实际上是系统管理员)启动程序,SetParent()将失败,GetLastError()==5(访问被拒绝) 我尝试提升当前进程的权限(AdjustTokenPrivileges),但没有成功 知道为什么SetParent会失败吗?我该如何修复它 代码: 听起来你好像陷入了用户访问控制问题(UAC)。您可以指定您的程序需要提升的权

我们在WPF窗口中,使用GUI窗口启动新流程。然后调用SetParent()将新创建的窗口移动到MainWindow中。当以管理员身份运行时,一切正常,但若以用户身份(实际上是系统管理员)启动程序,SetParent()将失败,GetLastError()==5(访问被拒绝)

我尝试提升当前进程的权限(AdjustTokenPrivileges),但没有成功

知道为什么SetParent会失败吗?我该如何修复它

代码:


听起来你好像陷入了用户访问控制问题(UAC)。您可以指定您的程序需要提升的权限,也可以使用COM调用提升的进程外服务器(这是一个特殊的COM接口,我不记得细节)。但是,不要将一个进程“窗口”移动到另一个进程“窗口”,只需与新进程通信并显示其信息即可。COM是与另一个进程通信的好方法。Windows mailslots也不错(我记得它是DCOM内部使用的)。是的,但在违反规则之前,您需要了解后果。正如@IInspectable所说,您可以按自己的要求去做,但这是一个非常糟糕的主意。除非这两个应用程序都希望使用合并的输入队列运行,否则您将遇到无休止的问题。
process = new Process();
process.EnableRaisingEvents = true;
process.StartInfo.FileName = "some_gui_process.exe";
process.Start();
process.WaitForInputIdle();
var hChildWindow = process.MainWindowHandle;
var hParentWindow = new WindowInteropHelper(window).Handle;
SetParent(hChildWindow, hParentWindow);