5

私は、コンパクトなフレームワークを使用して Windows モバイル プロジェクトに取り組んでいます。

私がしなければならないことの 1 つは、ユーザーがアクションを実行したときにログを記録することです。これは、ボタンを押すことからバーコード スキャナーを使用することまで、あらゆるアクションを意味します。発生時刻も記録する必要があります。

私の計画は、すべてのコントロールをオーバーライドして、組み込みのログ機能を含めることですが、これは正しい方法ではない可能性があり、非常に面倒なことのように思えます..

より良い方法はありますか?

4

3 に答える 3

2

私はIL Weavingに行きます。私がお勧めするライブラリは次のとおりです: http://www.sharpcrafters.com/aop.net/msil-injectionそれが行うことは、クラスを属性でマークし、すべての関数呼び出しをインターセプトできることです。このインターセプトでは、ロギング ロジックを挿入します。

于 2013-01-31T03:47:25.127 に答える
1

それは「行動」の定義に大きく依存すると思います。QASetWindowsJournalHook(文書化されていない) APIが機能するかどうかを確認したいと思います。多くのコードを必要とせずに、おそらく必要なもののほとんどを取得できます。ネイティブの使用例は、Codeproject のこちらにあります

SetWindowsHook withWH_JOURNALRECORDも一見の価値があるかもしれません。ええ、私はそれが「サポートされていない」ことを知っていますが、それはうまく機能し、フィールドにあるデバイスから削除される可能性は低いです (さらに、少なくとも 10 年間 OS に含まれています)。

すべて pwinuser.h から派生したいくつかの P/Invoke 宣言は、次のとおりです。

[StructLayout(LayoutKind.Sequential)]
public struct JournalHookStruct
{

  public int message { get; set; }
  public int paramL { get; set; }
  public int paramH { get; set; }
  public int time { get; set; }
  public IntPtr hwnd { get; set; }
}

internal enum HookType
{
  JournalRecord = 0,
  JournalPlayback = 1,
  KeyboardLowLevel = 20
}

internal enum HookCode
{
  Action = 0,
  GetNext = 1,
  Skip = 2,
  NoRemove = 3,
  SystemModalOn = 4,
  SystemModalOff = 5
}

public const int HC_ACTION = 0;
public const int LLKHF_EXTENDED = 0x1;
public const int LLKHF_INJECTED = 0x10;
public const int LLKHF_ALTDOWN = 0x20;
public const int LLKHF_UP = 0x80;
public const int VK_TAB = 0x9;
public const int VK_CONTROL = 0x11;
public const int VK_ESCAPE = 0x1B;
public const int VK_DELETE = 0x2E;


[DllImport("coredll.dll", SetLastError = true)]
public static extern IntPtr SetWindowsHookEx(HookType idHook, HookProc lpfn, IntPtr hMod, int 

[DllImport("coredll.dll", SetLastError = true)]
public static extern bool UnhookWindowsHookEx(IntPtr hhk);

[DllImport("coredll.dll", SetLastError = true)]
public static extern int CallNextHookEx(IntPtr hhk, HookCode nCode, IntPtr wParam, IntPtr 

[DllImport("coredll.dll", SetLastError = true)]
public static extern IntPtr QASetWindowsJournalHook(HookType nFilterType, HookProc pfnFilterProc, ref JournalHookStruct pfnEventMsg);
于 2013-01-31T05:26:00.017 に答える
1

これらのメッセージをログ ファイルに書き込んでも問題は解決しませんか?

#if PocketPC
private static string _appPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
#else
private static string _appPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), Application.CompanyName);
#endif
public const int KILOBYTE = 1024;
public static string ErrorFile { get { return _appPath + @"\error.log"; } }

public static void Log(string message)
{
  if (String.IsNullOrEmpty(message)) return;
  using (FileStream stream = File.Open(ErrorFile, FileMode.Append, FileAccess.Write))
  {
    using (StreamWriter sw = new StreamWriter(stream, Encoding.UTF8, KILOBYTE))
    {
      sw.WriteLine(string.Format("{0:MM/dd/yyyy HH:mm:ss} - {1}", DateTime.Now, message));
    }
  }
}

ただし、スレッド化が進行中で、複数のルーチンが同時に書き込もうとすると、問題が発生する可能性があります。その場合、使用中のルーチンをロックするロジックを追加できます。

とにかく、それは私がそれを行う方法です。

#if地域別に見ると、これは私の Windows PC アプリケーションでも使用されていることがわかります。

于 2013-02-01T14:52:58.367 に答える