2014-04-01 33 views
3

我有一个用黑色的Windows控制台打开的C#控制台应用程序(A)。有时候在启动时,它会将重点从另一个程序(B)那里偷走,需要的重点。如何从C#中的控制台窗口重新获得焦点?

问题:我该如何将焦点从A.exe改回B.exe

A -> Focus -> B 


详情:

  • 方案B是不是我的,我不能做任何事情。它有一个GUI,多个窗口,其中1个需要关注(它可能是一个模态对话窗口)。
  • 计划A不需要任何的焦点,它不以任何方式与程序B.
  • 程序A通过启动快捷方式启动并在后台运行,基本交互(它被释放,但仍处于开发阶段,虽然,这就是为什么控制台窗口)
  • 我有一些时刻/最多几分钟来检查并重点关注。
+0

无法不被关注正常运行的程序是...坏。我知道,不是你的错。最简单的解决方案:在另一个完成之前不要运行你的应用程序,或者根本不给你应用程序任何接口。 –

+0

您的控制台程序如何知道您何时需要关注它?如果你有什么需要检查的话,你不需要你的控制台应用程序来关注它。 – Tarec

+0

@Tarec我记得可以通过.NET Framework,WinApi或两者都以各种方式操作控制台窗口。 – Bitterblue

回答

4
// this should do the trick.... 

[DllImport("user32.dll")] 
public static extern bool ShowWindowAsync(HandleRef hWnd, int nCmdShow); 
[DllImport("user32.dll")] 
public static extern bool SetForegroundWindow(IntPtr WindowHandle); 

public const int SW_RESTORE = 9; 

private void FocusProcess(string procName) 
{ 
    Process[] objProcesses = System.Diagnostics.Process.GetProcessesByName(procName); 
    if (objProcesses.Length > 0) 
    { 
     IntPtr hWnd = IntPtr.Zero; 
     hWnd = objProcesses[0].MainWindowHandle; 
     ShowWindowAsync(new HandleRef(null,hWnd), SW_RESTORE); 
     SetForegroundWindow(objProcesses[0].MainWindowHandle); 
    } 
} 
+0

好,这个工程!我需要等待下一次启动时检查它是否解决了** my **问题。但它回答了这个问题。谢谢! – Bitterblue

+0

这可能会回答这个问题,但它忽略了真正的问题。如果你不想要重点,那就不要在第一时间偷窃。很容易做到。 –

+0

没问题,我遇到过需要控制窗口焦点的时间,这在很多场合已被证明对我非常有用。乐意效劳! – phcoding

相关问题