私はキオスクアプリケーションを作成していますが、それが常に他のWindowsアプリケーションやWindowsタスクバーの上にあることを確認したいと思います。
すでにWindowsキーボードコマンド(alt-tabなど)をブロックしていますが、アプリケーションが起動して画面を盗む可能性のある状況がまだあります。
.NETからWindowsに接続して、アプリケーションにフォーカスがあり、最上位にあるかどうかを継続的にテストし、そうでない場合は、フォーカスを与えて最上位にすることは可能ですか?
私はキオスクアプリケーションを作成していますが、それが常に他のWindowsアプリケーションやWindowsタスクバーの上にあることを確認したいと思います。
すでにWindowsキーボードコマンド(alt-tabなど)をブロックしていますが、アプリケーションが起動して画面を盗む可能性のある状況がまだあります。
.NETからWindowsに接続して、アプリケーションにフォーカスがあり、最上位にあるかどうかを継続的にテストし、そうでない場合は、フォーカスを与えて最上位にすることは可能ですか?
私は実際にプロダクション キオスクで作業したことがあります (ただし、それは Windows 2000 でした)。解決策は、アプリケーションをシェルとして実行することでした。これを実現するには、次の場所にある Shell 値で Explorer.exe をアプリケーションに置き換えます。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
詳細については、こちらを参照してください。
さて、アプリをシャットダウンするための秘密の (エラー...難読化された) 方法がありました。次に、タスク マネージャー ( Ctrl- Shift- Esc) を起動し、[ファイル]/[新しいタスク] を選択して Explorer.exe を実行し、その場でシェルを起動します。
余談ですが、このようなシステムで作業していると、マウスを置く便利な方法や場所がない可能性が高いため、自然にキーボードと、Windows でキーボード ショートカットを使用することを意味するすべてのことに非常に習熟するようになります。
シェルをアプリケーションに置き換えるだけで、これを実行できる場合があります。
シェルをIEに置き換えることに関するスーパーユーザーの質問は次のとおりです。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宣言です。次に、ウィンドウハンドルが必要です:)