0

例如,我有一个项目 (c#),它提供 1 到 5 个数字的输出。如果那是一个,我希望程序在记事本中写下“A”。我没有使用 FORM 在 c# 中创建我的项目。它是用 XML 编写的。那么,我可以知道我该怎么做吗?

就像,我试过 - SendKeys.Send("{A}"); 当事件被触发时。但由于我的项目不是表格。我做不到。谁可以帮我这个事。:(

谢谢你。

我的实际项目:我已经完成了情绪识别。我已经完成了第二人生的情绪。我想将(C#)中的情绪检测输入到第二人生。只剩下这个了。如果我已经澄清了我的疑问,我可以做到。谢谢你。

4

1 回答 1

0

为了将“A”放入记事本中,您可以这样做

  1. 找出记事本编辑窗口(假设 notepad.exe 正在执行)
  2. 向找到的窗口发送 WM_CHAR 消息

代码可以是必需的 Native API 声明:

  internal delegate Boolean EnumerationCallback(IntPtr handle, IntPtr parameter);

  [DllImport("User32.dll",
             CallingConvention = CallingConvention.Winapi,
             EntryPoint = "EnumWindows",
             CharSet = CharSet.Unicode,
             SetLastError = true)]
  [return: MarshalAs(UnmanagedType.Bool)]
  internal static extern Boolean EnumWindows(EnumerationCallback lpEnumFunc, 
    IntPtr lParam);

  [DllImport("User32.dll",
             CallingConvention = CallingConvention.Winapi,
             EntryPoint = "EnumChildWindows",
             CharSet = CharSet.Unicode,
             SetLastError = true)]
  [return: MarshalAs(UnmanagedType.Bool)]
  internal static extern Boolean EnumChildWindows(IntPtr hwndParent, 
    EnumerationCallback lpEnumFunc, 
    IntPtr lParam);

 [DllImport("user32.dll",
            CallingConvention = CallingConvention.Winapi,
            EntryPoint = "GetClassNameW",
            CharSet = CharSet.Unicode,
            SetLastError = true)]
  internal extern static int GetClassName(IntPtr hWnd,
   [MarshalAs(UnmanagedType.LPWStr)] 
    StringBuilder name,
    int size);

  [DllImport("User32.dll",
             CallingConvention = CallingConvention.Winapi,
             EntryPoint = "GetWindowThreadProcessId",
             SetLastError = true)]
  internal static extern uint GetWindowThreadProcessId(IntPtr hWnd, 
    out IntPtr ProcessId);

  [DllImport("User32.dll",
             EntryPoint = "SendMessageW",
             CallingConvention = CallingConvention.Winapi,
             SetLastError = true,
             CharSet = CharSet.Unicode)]
  internal extern static IntPtr SendMessage(IntPtr handle,
    int message,
    IntPtr wParam,
    IntPtr lParam);

  const int WM_CHAR = 0x102;

解决方案本身:

public void PrintA() {   
  IntPtr handleNotePad = IntPtr.Zero;   
  IntPtr handleNotePadEdit = IntPtr.Zero;

  // First, find NotePad Main window   
  EnumWindows(
   (IntPtr h, IntPtr p) => {
     int processId;
     GetWindowThreadProcessId(h, out processId);

     if (Process.GetProcessById(processId).ProcessName != "notepad")
       return true;

     handleNotePad = h;

     return false;
    }, 
    IntPtr.Zero);

  // Second find NotePad EDIT window as a child of NotePad Main window
  EnumChildWindows(handleNotePad,
    (IntPtr h, IntPtr p) => {
       StringBuilder s = new StringBuilder();
       s.Length = 500;

       GetClassName(h, s, s.Length);

       if (s.ToString() != "Edit")
         return true;

       handleNotePadEdit = h;
       return false;
    }, 
    IntPtr.Zero);

  // Finally, send the message
  SendMessage(handleNotePadEdit, WM_CHAR, (IntPtr) 'A', IntPtr.Zero);
}
于 2013-06-27T07:13:28.883 回答