Держать приложение Windows поверх других окон и в фокусе - всегда - PullRequest
3 голосов
/ 15 марта 2010

Я создаю приложение для киоска и хочу убедиться, что оно всегда, несмотря ни на что, поверх других приложений Windows и панели задач Windows.

Я уже блокирую команды клавиатуры Windows (alt-tab и т. Д.), Но все еще существуют ситуации, которые могут привести к запуску приложения и краже экрана.

Можно ли подключиться к Windows из .NET и постоянно проверять, находится ли приложение в фокусе и находится ли оно сверху, а если нет, то дать ему фокус и сделать его сверху?

Ответы [ 4 ]

2 голосов
/ 29 июля 2010

Я на самом деле работал в производственном киоске (однако это была Windows 2000). Решением было запустить наше приложение в качестве оболочки. Частично это можно сделать, заменив Explorer.exe приложением со значением Shell по адресу:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

См. здесь для получения дополнительной информации.

Теперь у нас был секретный (ошибочно ... запутанный) способ закрыть наше приложение. Затем мы запустили бы диспетчер задач ( Ctrl - Shift - Esc ) и выберите Файл / Новая задача, чтобы запустить Explorer.exe, чтобы сразу вызвать оболочку. и там.

Кроме того, когда вы работаете в такой системе, вы, естественно, очень хорошо разбираетесь в клавиатуре и во всем, что означает использование сочетаний клавиш в Windows, поскольку у вас, вероятно, не будет удобного способа или места для установки мышь.

0 голосов
/ 20 июля 2010

В этом сценарии вы можете запустить приложение в полноэкранном режиме с всегда верхним окном. Я использую следующий фрагмент в некоторых моих приложениях opengl (от http://nehe.gamedev.net/). Это в win32, но я думаю, что вы можете использовать pinvoke или System.Management.ManagementClass ("Win32_VideoController")

    DEVMODE dmScreenSettings;                               // Device Mode
    memset(&dmScreenSettings,0,sizeof(dmScreenSettings));   // Makes Sure Memory's Cleared
    dmScreenSettings.dmSize=sizeof(dmScreenSettings);       // Size Of The Devmode Structure
    dmScreenSettings.dmPelsWidth    = width;                // Selected Screen Width
    dmScreenSettings.dmPelsHeight   = height;               // Selected Screen Height
    dmScreenSettings.dmBitsPerPel   = bits;                 // Selected Bits Per Pixel
    dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
// Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
if(ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL);

Это переключит ваше приложение в полноэкранный режим, избавит от панели задач и запретит использовать какие-либо действия, кроме использования вашего приложения.

0 голосов
/ 22 июля 2010

Вы можете использовать вызовы API. Загвоздка в том, что вы должны продолжать проверять, не потеряло ли ваше приложение фокус. Зависит от того, почему вы хотите это сделать, но ...

    Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As IntPtr) As Boolean

является декларацией API. Тогда вам просто нужен дескриптор окна:)

0 голосов
/ 22 апреля 2010

Вы можете сделать это, просто заменив оболочку своим приложением.
Вот вопрос суперпользователя о замене оболочки на IE: https://superuser.com/questions/108265/how-do-you-replace-the-logon-shell-with-iexplore

Если вы хотите сделать это только для текущего пользователя, я думаю, что путь
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Winlogon

...