始终让一个Windows应用程序保持在其他窗口的最上层并保持焦点

3
我正在创建一款亭子应用程序,我希望它无论如何都能始终在其他 Windows 应用程序和 Windows 任务栏之上。
我已经屏蔽了 Windows 键盘命令(alt-tab 等),但仍有可能发生一些情况,导致某个应用程序启动并夺取屏幕。
是否可以从 .NET 连接到 Windows,并不断地测试应用程序是否具有焦点并处于顶部,如果不是,则将其设置为焦点并置于顶部?

那么,直接关闭资源管理器并禁用可能打开窗口的任何服务或后台进程怎么样?如果这是一个信息亭应用程序,那么很可能在程序运行时没有人想要使用计算机进行其他操作。 - Joey
仅出于讨论的目的。假设您找到了一种方法来实现这一点,但软件出现了问题。您打算如何在该计算机上进行故障排除和修复? - JohnFx
自助式应用程序有一个隐藏按钮(然后提示输入密码),可以退出应用程序。 - James Newton-King
4个回答

2

我曾经在一个生产亭上工作过(虽然使用的是Windows 2000)。解决方案是将我们的应用程序作为shell运行。为此,您需要在Shell值中用您的应用程序替换Explorer.exe。

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

点击这里获取更多信息。

我们曾经有一个秘密(嗯...混淆的)方法来关闭我们的应用程序。然后,我们会打开任务管理器(Ctrl-Shift-Esc),选择文件/新建任务运行Explorer.exe,立即在那里打开一个shell。

顺便说一下,当你在这样的系统上工作时,你自然会变得非常熟练,掌握在Windows中使用键盘快捷方式的所有技巧,因为你可能没有方便的方法或地方放置鼠标。


混淆的方式?可能需要涉及用户名和密码 :-) - Vincent McNabb
我并不想假装我们的方法是完全安全的。但同时我也认识到,我们关闭应用程序并启动资源管理器来操作信息亭的解决方案已超出了问题的范围。但我特别指出这一点,以强调您应该仔细思考,并比我们做得更好。 - Chris Gomez

0

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);

这将把您的应用程序切换到全屏模式并消除任务栏,禁止用户做其他事情而不是使用您的应用程序。


0

你可以使用API调用。问题在于你必须不断检查你的应用程序是否失去了焦点。这取决于你想要做什么,但是...

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接