質問: 常駐アプリを作成し、Windowsの画面ロック中にSendInputでNumキーの押下を シミュレートしてもキーボードのNumLockのLEDが変わりません。 (Windowsが認識していないようです。) 画面ロック中はSendInputによるキー処理は出来ないのでしょうか? 環境はVisual C++です。
回答: おそらく無理です。 Windowsではウィンドウなどを束ねて他と分離するDesktopというものがあります。Desktopは複数存在することができ、ログオン画面やスクリーンセーバーも普段のUIとは別のDesktopを使っています。 で、今回ログオン画面のセキュリティがとかUIPIがとかを疑って色々試してみましたが、ログオン画面に限らず、プロセスが属するDesktopがアクティブでない間はSendInputがうまく動かないようです。 Desktopについてはこの辺を参考に: CreateDesktopによる仮想デスクトップ - kkAyatakaのメモ帳。 また、英語版SOでは以下の回答を見かけました。 > > However, since the desktop is now inactive, it cannot receive input. GetForegroundWindow will return NULL (IIRC), and you can't use SendInput any longer, since input now belongs to [a thread on] a different desktop; no controls on that inactive desktop can receive focus. > > > What happens 'behind' the windows lock screen? のBrendanMcK氏の回答より引用 > > > 普段SendInputで送ったキーストロークがどのように処理され、Desktopが違うと何故無理なのかという詳細な機序はいまだつかめていませんが、セキュリティ上の観点からGUIオブジェクトを分離するための機能.aspx)のようなのでまあ納得はできるかなというところです。