2017-11-30 84 views
0

初期の問題:
私はオフィスで外付けキーボードを使用しているので、NumLockをオンにします。しかし、私は自宅にいるときにノートパソコンのキーボードを使うだけなので、文字の代わりに数字が表示され、NumLockをオフにする必要があります。SendKeysがバックグラウンドタスクで動作しない

初期解決策: 以下のスクリプトは、1つまたは2つのキーボードを検出し、NumLockを適切にオンまたはオフにします。

新しい問題:
これはコマンドラインからは完全に機能しますが、ログインして自動的に実行するときにトリガーします。バックグラウンドでタスクスケジューラから実行すると、この行は機能しません。

 Shell.SendKeys "{NUMLOCK}"    

ロックをトグルしますが、トグルしません。エラーは報告されていません。

更新:「ユーザーがログオンしているときのみ」自分のアカウントで実行するようにスケジュールすると、動作しますが、cmdウィンドウが表示されます。自分のアカウントまたはSYSTEMアカウントの下で「ユーザーがログインしているかどうか」を指定して実行すると、ウィンドウがうまく消えてしまいますが動作しません。

Microsoft (R) Windows Script Host Version 5.812 
    Copyright (C) Microsoft Corporation. All rights reserved. 

    Found HID Keyboard Device 
    Found HID Keyboard Device 
    numLock is OFF 
    Toggling Numlock 

ので、スクリプト自体が正しく動作している:それはロックを切り替える必要があるときに、CMDまたはスケジュールされたタスクとして実行から

かどうかは、私はこの出力を取得します。

UPDATE2:バックグラウンドタスクとして実行しているときにウィンドウステーションを持たないと思われるようです。 DetectNumlockConsole.exeが動作していないことがわかります。すなわち、この作品、

numLock = Control.IsKeyLocked(Keys.NumLock);  

再びこの行の結果を返す単純なC#アプリケーションの場合に実行「のみユーザーがログオンしているとき」ではなく「ユーザーがかログインしているかどうか。」
Windowsのセキュリティの仕組みである--------- VBSスクリプト-----------

set OUT = WScript.StdOut   
    Set Shell=CreateObject("Wscript.Shell") 
    Dim KeyCount 
    KeyCount = 0 
    Computer = "." 
    'set NumLock = CheckState 
    Set WMIService = GetObject("winmgmts:\\" & Computer & "\root\cimv2") 
    Set Devices = WMIService.ExecQuery ("Select * From Win32_USBControllerDevice") 

    For Each Device in Devices 
     DeviceName = Device.Dependent 
     Quotes = Chr(34) 
     DeviceName = Replace(DeviceName, Quotes, "") 
     DeviceNames = Split(DeviceName, "=") 
     DeviceName = DeviceNames(1) 
     Set USBDevices = WMIService.ExecQuery ("Select * From Win32_PnPEntity Where DeviceID = '" & DeviceName & "'") 

     For Each USBDevice in USBDevices 
      'OUT.WriteLine USBDevice.Description ' Write description to command line to see what to look for 
      If InStr(LCase(USBDevice.Description), "keyboard") <> 0 Then 
       KeyCount = KeyCount + 1 
       OUT.WriteLine "Found " & USBDevice.Description 
      End If 
     Next 
    Next   

    dim numLock 
    numLock = Shell.Run("DetectNumlockConsole.exe",0,True) 

    If (numLock = 0) Then 
     OUT.WriteLine "numLock is OFF" 
    Else 
     OUT.WriteLine "numLock is ON" 
    End If 

       ' If we have a keyboard, and numlock is OFF 
       ' Or we don't have a keyboard, and numlock is ON 
       ' Then toggle it 
    If (((KeyCount > 1) AND (numLock = 0)) OR ((KeyCount = 1) AND (numLock = 1))) Then 
     Shell.SendKeys "{NUMLOCK}"  ' *** Problem here, doesn't toggle **  
     OUT.WriteLine "Toggling Numlock" 
    End If 
+0

これはどのようにC#関連の質問ですか? –

+0

@SirRufo 1つのC#行を追加したときにシステムがタグを提案しました。 C#コードが動作していなかったので追加しました。しかし、私はそれが属していないことに同意します。 – BWhite

答えて

0

。それはsendkeys自体とは関係ありませんが、異なるセキュリティコンテキストの下でのタスクは他のタスクに影響を与えることはできません。

これは、と同じセキュリティコンテキストで実行されたときに、ユーザがログインしたときにのみ動作することがわかります。

これはプロセス分離と呼ばれ、誰もがの対話ユーザーを混乱させる可能性がなく、セキュリティとUIのプリンシパルはです。

関連する問題