当前位置: 首页 > 编程语言 > C#

如何将焦点放在外窗?分享

时间:2023-04-10 10:46:24 C#

外窗如何对焦?我有一个应用程序,一次只打开一个自身实例。为了强制执行此操作,我使用以下代码:System.Diagnostics.Process[]myProcesses=System.Diagnostics.Process.GetProcesses();System.Diagnostics.Processme=System.Diagnostics.Process.GetCurrentProcess();foreach(System.Diagnostics.ProcesspinmyProcesses){if(p.ProcessName==me.ProcessName)if(p.Id!=me.Id){//如果已经运行,则中止此副本。返回;}}//启动应用程序。//...它工作正常。我还希望它集中已经运行的副本的形式。也就是说,我想在返回之前将此应用程序的另一个实例带到前台。我该怎么做回复:SetForeGroundWindow:SetForeGroundWindow在一定程度上起作用:[System.Runtime.InteropServices.DllImport("user32.dll")]publicstaticexternboolSetForegroundWindow(IntPtrhWnd);//...if(p.Id!=me.Id){//如果已经在运行,聚焦它,然后中止这个副本。SetForegroundWindow(p.MainWindowHandle);返回;}//...如果窗口未最小化,这会将窗口置于前台。惊人的。但是,如果窗口被最小化,它将保持最小化。它需要被最小化。通过SwitchToThisWindow的解决方案(可行!):[System.Runtime.InteropServices.DllImport("user32.dll")]publicstaticexternvoidSwitchToThisWindow(IntPtrhWnd,boolfAltTab);[STAThread]staticvoidMain(){System.Diagnostics.Processme=System.Diagnostics.Process.GetCurrentProcess();System.Diagnostics.Process[]myProcesses=System.Diagnostics.Process.GetProcessesByName(me.ProcessName);foreach(System.Diagnostics.ProcesspinmyProcesses){if(p.Id!=me.Id){SwitchToThisWindow(p.MainWindowHandle,true);返回;}}//现在开始我们的应用程序;-)我遇到了同样的问题,SwitchToThisWindow()对我来说效果最好。唯一的限制是您必须安装XPsp1。我玩过SetForegroundWindow、ShowWindow,它们都无法将窗口拉入视图。与OP相同,我发现当窗口最小化时,仅SetForegroundWindow是不够的。因为我不想使用SwitchToThisWindow,所以我选择ShowWindow,然后选择SetForegroundWindow。为我工作!privateconstSW_SHOWNORMAL=1_PrivateFunctionShowWindow(ByValhwndAsIntPtr,ByValnCmdShowAsinteger)作为布尔结束函数ForEachpasProcessinprocessesShowWindow(p.MainWindowHandle,SW_SHOWNORMAL)SetForegroundWindow(p.MainWindowHandle)NextEndSub我确定你会想要使用SetForegroundWindowMSDNexamplecompletesidenote...你可以使用Process.GetProcessesByName(me.ProcessName)而不是遍历系统上运行的所有进程...更新此类事件的PInvoke规则...C#相当于TomJuergens的回答。对我来说就像一个魅力。私人常量intSW_SHOWNORMAL=1;[DllImport("user32.dll",SetLastError=true,CharSet=CharSet.Auto)]privatestaticexternboolShowWindow(IntPtrhwnd,intnCmdShow);[DllImport("user32.dll",SetLastError=true)]privatestaticexternboolSetForegroundWindow(IntPtrhwnd);publicvoidSetForeground(){Process[]processes=Process.GetProcessesByName("进程名称");foreach(进程中的进程p){ShowWindow(p.MainWindowHandle,SW_SHOWNORMAL);SetForegroundWindow(p.MainWindowHandle);您可以获得Process对象的MainWindowHandle属性并向其发送WM_USER消息,您可以将其解释为“其他一些实例想要将我带到前面”。以上就是C#学习教程:如何聚焦外层窗口?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: