将Windows应用程序置于其他窗口之上并保持关注 - 始终如此

时间:2010-03-15 03:00:31

标签: .net wpf windows fullscreen kiosk

我正在创建一个kiosk应用程序,我想确保它总是,无论如何,在其他Windows应用程序和Windows任务栏之上。

我已经阻止了Windows键盘命令(alt-tab等),但仍然存在可能导致应用程序启动并窃取屏幕的情况。

是否有可能从.NET挂钩到Windows并不断测试应用程序是否具有焦点并且是否位于顶部,如果没有,那么请将其重点放在最顶层?

4 个答案:

答案 0 :(得分:2)

我实际上曾在一个生产信息亭工作(但它是Windows 2000)。解决方案是将我们的应用程序作为shell运行。您可以通过将Shell.exe替换为Shell中的应用程序来实现此目的:

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

有关详情,请参阅here

现在,我们确实有一个秘密(错误...混淆)的方式来关闭我们的应用程序。然后我们将调出任务管理器( Ctrl - Shift - Esc )并选择文件/新任务以运行Explorer.exe以显示贝壳然后就在那里。

顺便说一句,当你在这样的系统上工作时,你自然会非常熟练地使用键盘以及在Windows中使用键盘快捷键的所有方法,因为你可能没有方便的地方放置鼠标。

答案 1 :(得分:0)

您可以通过将shell替换为您的应用程序来实现此目的 这是一个关于用IE替换shell的超级用户问题:https://superuser.com/questions/108265/how-do-you-replace-the-logon-shell-with-iexplore

如果您只想为当前用户执行此操作,我认为路径为
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Winlogon

答案 2 :(得分:0)

在这种情况下,您可以全屏运行应用程序,并始终将窗口置于顶部。 我在我的一些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);

这会将您的应用切换到全屏并摆脱任务栏并禁止使用除了使用您的应用之外的其他操作。

答案 3 :(得分:0)

您可以使用API​​调用。问题是你必须继续检查你的应用是否失去了焦点。取决于你想要做的确切原因,但......

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

是API声明。然后你只需要窗口句柄:)