如何在紧凑框架中记录操作?

时间:2013-01-31 03:33:00

标签: c# .net windows-mobile compact-framework

我正在使用紧凑的框架处理Windows移动项目。

我要做的一件事是在用户执行操作时记录,这可能意味着从按下按钮到使用条形码扫描仪的任何操作。发生的时间也需要记录下来。

我的计划是覆盖所有控件以包含内置的日志记录功能,但这可能不是正确的方法,这似乎是一件非常繁琐的事情。

有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

我会选择IL Weaving。这是一个我推荐的库:http://www.sharpcrafters.com/aop.net/msil-injection它的作用是用属性标记你的类,你可以拦截所有的函数调用。在这个拦截中,你会输入你的记录逻辑。

答案 1 :(得分:1)

我认为这在很大程度上取决于“行动”的定义。我非常倾向于查看(未记录的)QASetWindowsJournalHook API是否有效。它可能会占用您想要的大部分内容,而不需要很多代码。可以找到本地使用示例on Codeproject here

带有WH_JOURNALRECORD的SetWindowsHook也值得一看。是的,我知道它“不受支持”,但它的工作正常,并且不太可能从你已经部署的设备中移除(加上它已经在操作系统中运行了至少10年)。

一些P / Invoke声明,都是从pwinuser.h派生出来的,它们都是如下:

[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);

答案 2 :(得分: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应用程序也使用它。