1

C# を使用して Win7 でサービスを作成しました。そのサービス内で、Win7 では管理者が必要なように見える BlockInput 関数を使用したいと考えています。

コード内で serviceprocessorinstaller のアカウント、ユーザー名、およびパスワードを管理者アカウントに設定すると、BlockInput が機能しません。注: サービスのプロパティ/ログオン タブで、適切に設定されています。

次に、サービスのマニフェストを追加し、requestedExecutionLevel を「requireAdministrator」に設定しました。それでも、BlockInput はまだ機能したくありません。

BlockInput をクライアント レベルに移動してからクライアント ラッパーに移動しようとしましたが、それでも機能しません。

アイデアが不足しています...何か提案はありますか?

ここから編集を開始:

これが私のマニフェストです(またはその一部です。申し訳ありませんが、フォーマットはひどいです) <assemblyIdentity version="1.0.0.0" name="BlockInputService.app"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo>



    namespace BlockInputService
    {
       [ServiceContract(Namespace = "http://BlockInputService")]
       public interface IBlockInputTest
       {
          [OperationContract]
          void BlockInputMethod();
       }

       public class BlockInputTest : IBlockInputTest
       {
          private const string SOURCE = "BlockInputService";
          private const string LOGNAME = "Application";

          [return: MarshalAs(UnmanagedType.Bool)]
          [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
          public static extern bool BlockInput([In, MarshalAs(UnmanagedType.Bool)] bool fBlockIt);

          public void BlockInputMethod()
          {
             if (!EventLog.SourceExists(SOURCE))
             {
                EventLog.CreateEventSource(SOURCE, LOGNAME);
             }

             try
             {
                bool flag = BlockInput(true);
                EventLog.WriteEntry(SOURCE, "BlockInput(true) returned: " + flag);

                EventLog.WriteEntry(SOURCE, "Sleep for 5 sec");
                Thread.Sleep(5000);
             }
             catch (Exception ex)
             {
                EventLog.WriteEntry(SOURCE, ex.Message);
             }
             finally
             {
                bool flag = BlockInput(false);
                EventLog.WriteEntry(SOURCE, "BlockInput(false) returned: " + flag);
             }
          }
       }
    }


4

1 に答える 1

0

次に、SetWindowsHookEx を使用して WH_KEYBOARD_LL および WH_MOUSE_LL イベントをキャプチャしました。

BlockInput を機能させるために考えられることはすべて試しました。サービスを間違って設定しただけだと今でも思いますが、もう心配する時間はありません。

ありがとう。

于 2012-09-22T14:08:29.797 に答える