我正在创建一个自助服务终端应用程序,并且我想确保它始终位于其他 Windows 应用程序和 Windows 任务栏之上。
我已经阻止了 Windows 键盘命令(alt-tab 等),但仍然存在可能导致应用程序启动并窃取屏幕的情况。
是否可以从 .NET 连接到 Windows 并不断测试应用程序是否具有焦点并位于顶部,如果没有,则赋予它焦点并使其位于顶部?
我正在创建一个自助服务终端应用程序,并且我想确保它始终位于其他 Windows 应用程序和 Windows 任务栏之上。
我已经阻止了 Windows 键盘命令(alt-tab 等),但仍然存在可能导致应用程序启动并窃取屏幕的情况。
是否可以从 .NET 连接到 Windows 并不断测试应用程序是否具有焦点并位于顶部,如果没有,则赋予它焦点并使其位于顶部?
我实际上在生产信息亭工作过(不过,它是 Windows 2000)。解决方案是将我们的应用程序作为 shell 运行。您可以通过在 Shell 值中将 Explorer.exe 替换为您的应用程序来部分完成此操作:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
有关更多信息,请参见此处。
现在,我们确实有一个秘密(错误......混淆)方式来关闭我们的应用程序。然后我们会打开任务管理器 ( Ctrl- Shift- Esc) 并选择文件/新任务来运行 Explorer.exe 以立即打开一个 shell。
顺便说一句,当您在这样的系统上工作时,您自然会非常精通键盘以及在 Windows 中使用键盘快捷键的所有含义,因为您可能没有方便的方式或位置来放置鼠标。
您可能只需将外壳替换为您的应用程序即可。
这是一个关于用 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
在这种情况下,您可以全屏运行您的应用程序,并且您的窗口始终位于顶部。我在我的一些 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);
这会将您的应用程序切换到全屏并摆脱任务栏并禁止使用您的应用程序以外的其他操作。
您可以使用 API 调用。问题是您必须不断检查您的应用程序是否失去焦点。完全取决于您为什么要这样做,但是...
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As IntPtr) As Boolean
是 API 声明。然后你只需要窗口句柄:)