【问题标题】:Application Activity Logger应用程序活动记录器
【发布时间】:2014-09-08 23:26:57
【问题描述】:

我正在尝试在 C# 中创建一个事件记录器。该程序有一个文本框,在运行时应该打开一个记事本文档,该文档将在文本框中显示用户的活动。到目前为止,我确实知道如何将文件保存到文本文件以及打开它们。我也知道如何将 textChanged 事件用于 2 个文本框,但不知道如何使用记事本等文本编辑应用程序。有人可以帮我指出正确的方向,并建议我如何去做。请注意冗长的文字,希望我说得通:-)

【问题讨论】:

  • 这里不清楚你想用记事本做什么。您是否尝试将文本输入到正在运行的记事本实例中?为什么不直接在应用程序窗口中显示文本?
  • 我希望用户输入在运行时显示在记事本上
  • 我不确定您是否可以这样做,除了获取记事本窗口的句柄并使用一些低级 Windows API 向其发送击键。但这似乎只是为了显示文本需要做很多工作。应用程序中有可以显示文本的本机控件。您可以打开一个带有一个大文本框的表单,然后更轻松地很多
  • 例如 textBox2.Text += textBox1.Text + Envionment.NewLine;将在第二个文本框中显示用户在文本框 1 中输入的任何内容。现在我想这样做,而是在记事本文本文件中显示输入
  • 我想您可以查看一些 Windows API 以尝试将击键和其他命令发送到应用程序实例,并调用记事本实例作为该应用程序。但是,这比它需要的要复杂得多。正如您已经展示的,将文本附加到 TextBox 是一行代码。我认为没有理由为此需要使用记事本。您可以简单地在表单中显示文本并将其写入文本文件。您需要使用记事本写入文本文件,您可以在代码中写入。

标签: c#


【解决方案1】:

您可以使用 Sytem.Diagnostics.Process 启动一个进程,然后使用 SendKey.Send 将文本发送到记事本窗口。试试这个:

将这些 api 调用添加到您的类中:

[DllImport("user32.dll",EntryPoint="FindWindow")]
private static extern IntPtr FindWindow(string sClass, string sWindow);

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);

将此添加到您的事件处理程序(textbox.TextChanged/button.Clicked):

IntPtr notepadHwnd = FindWindow("Notepad",(string)null);
if (notepadHwnd == null)
{
  System.Diagnostics.Process notepad = new Process();
  notepad.StartInfo.FileName = "notepad.exe";
  notepad.Start();
  System.Threading.Thread.Sleep(500);
  notepadHwnd = FindWindow("Notepad",(string)null);
}
// get the text from the users input
string msg = textBox1.Text;
if (notepadHwnd != null)
{    
   SetForgroundWindow(notepadHwnd);

   // Send the string to the application that has focus 
   // note: If you need to erase existing text (ie. on TextChanged) 
   // you could use SendKeys.Send("^a{BACKSPACE}"); to select all and delete
   SendKeys.Send(msg);
}

编辑:添加了 FindWindow 和 SetForgroundWindow。此代码假定您没有打开任何其他记事本窗口

【讨论】:

  • 我使用过 Process.Start("notepad.exe" , "path");对于您的代码的前 3 行,它们都给了我相同的输出。每次我在文本框中输入内容时,它都会打开新的多个记事本文件。基本上,'而不是读取文本框输入,而是写入输入并忽略文本框
  • 我没有关注你。你是说它打开记事本然后将文本从 textbox1.Text 重写回 textbox1?
  • 我编辑了我的答案,试图强制记事本成为活动窗口,以便 SendKeys 工作。
猜你喜欢
  • 2014-02-28
  • 2011-12-25
  • 2011-09-01
  • 1970-01-01
  • 2010-12-21
  • 2013-09-23
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
相关资源
最近更新 更多