如何使C#控制台应用程序始终位于最前面?

时间:2018-10-27 21:40:58

标签: c# console

如何确保C#控制台应用程序始终位于最前面? e.i.如果有人从控制台上单击一下,我如何检测到控制台失去了焦点并将其放回到前面? 我有一个正在等待用户扫描条形码的C#控制台应用程序,如果由于某种原因有人单击了控制台窗口,则条形码数据将“丢失”。 我看了一下在另一个线程上发布的代码;但是,我似乎无法使它对我有用: bring a console window to front in c# 借助@ILan,此代码可将控制台保持在所有窗口的顶部,但不会设置“焦点”来继续捕获传入的数据。

   class Program
{
    [DllImport("user32.dll")]
    static extern bool SetWindowPos(IntPtr hWnd, 
                                    IntPtr hWndInsertAfter, 
                                    int X, 
                                    int Y, 
                                    int cx, 
                                    int cy, 
                                    uint uFlags);
    static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
    const uint SWP_NOSIZE = 0x0001, SWP_NOMOVE = 0x0002, SWP_SHOWWINDOW = 0x0040;

    [DllImport("kernel32.dll")]
    static extern IntPtr GetConsoleWindow();

    static void Main()
    {
        IntPtr handle = GetConsoleWindow();
        SetWindowPos(handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
        Console.WriteLine($"Hello handle: {handle}");
        Console.ReadLine();
    }
}

2 个答案:

答案 0 :(得分:0)

如果应用程序是控制台附带的应用程序,则以下将完成工作。

有关在您的应用程序不是与控制台连接的应用程序的情况下如何获取句柄的完整答案,请参见dialog Add-In

var birthYear;
birthYear = Number(document.getElementById("input988744").value);
or
birthYear = parseInt(document.getElementById("input988744").value);

答案 1 :(得分:0)

从那时起,

SetForegroundWindow受限制(请参阅https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setforegroundwindow中的备注)。它将不允许您再将窗口随意放在前台,这完全是为了防止您执行自己想做的事情。

如果您需要系统上运行的其他应用程序,那么您不走运。您只需要告诉您的用户,他们在扫描条形码时需要使窗口聚焦。