Как заставить консольное приложение C # всегда быть впереди? - PullRequest
0 голосов
/ 28 октября 2018

Как я могу убедиться, что мое консольное приложение C # всегда впереди?Например, если человек отходит от консоли, как я могу определить, что консоль потеряла фокус, и вернуть ее вперед?У меня есть это консольное приложение C #, которое ждет, когда пользователи будут сканировать штрих-коды, если по какой-то причине кто-то уходит из окна консоли, тогда данные штрих-кода будут «потеряны».Я взглянул на этот код, размещенный в другом потоке, однако я не могу заставить его работать: вывести окно консоли на передний план в 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 голосов
/ 28 октября 2018

SetForegroundWindow был ограничен с тех пор (см. Замечания в https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setforegroundwindow). Это больше не позволит вам произвольно размещать окна на переднем плане, в точности, чтобы вы не делали то, что вы пытаетесь сделать.

Если вам нужны другие приложения, работающие в системе, вам не повезло. Вам просто нужно сказать своим пользователям, что им нужно сфокусировать окно при сканировании штрих-кода.

0 голосов
/ 28 октября 2018

Следующее выполнит работу, если приложение подключено к консоли.

Полный ответ о том, как получить дескриптор, если ваше приложение не является приложением, подключенным к консоли.см https://stackoverflow.com/a/28616832/2370138.

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...