2014-09-08 3 views
-5

Я пытаюсь создать регистратор событий в C#. программа имеет текстовое поле и во время выполнения должна открыть документ блокнота, который покажет активность пользователя в текстовом поле. Пока я знаю, как сохранять файлы в текстовый файл, а также открывать их. Я также знаю, как использовать событие textChanged для 2 текстовых полей, но не с помощью приложения для редактирования текста, такого как блокнот. может кто-то помочь указать мне в правильном направлении и посоветуйте мне, как это сделать. разумеем длинный текст, надеюсь, что я это чувствую :-)Application Activity Logger

+0

Непонятно, что вы пытаетесь сделать с помощью Блокнота здесь. Вы пытаетесь ввести текст в исполняемый экземпляр Notepad? Почему бы вам просто не отобразить текст в окне приложения? – David

+0

Я хочу, чтобы пользовательский ввод отображался в блокноте во время выполнения – YoungDisciple09

+0

Я не уверен, что вы можете это сделать, кроме того, что, возможно, получив дескриптор окна «Блокнот» и отправив ему клавиши, используя некоторые низкоуровневые API Windows. Но это похоже на целую работу только для отображения текста. В приложении есть встроенные элементы управления, которые могут отображать текст. Вы можете просто открыть форму с помощью одного большого TextBox и легко записать в это * много *. – David

ответ

0

Вы можете запустить процесс с использованием Sytem.Diagnostics.Process, а затем использовать SendKey.Send, чтобы отправить текст в окно notpad. Попробуйте это:

Добавьте эти 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); 
} 

Edit: Добавлено FindWindow и SetForgroundWindow. Этот код предполагает, что вы не открыли никаких других окон в блокноте

+0

Я использовал Process.Start ("notepad.exe", "path"); для первых 3 строк вашего кода, которые оба дают мне тот же результат, что и я. он открывает новые несколько файлов блокнота каждый раз, когда я печатаю что-то в текстовом поле. в основном, 'вместо чтения ввода текстового поля, он записывает ввод и игнорирует текстовое поле. – YoungDisciple09

+0

Я не буду следовать за вами. вы говорите, что он открывает блокнот, а затем перезаписывает текст из textbox1.Text обратно в текстовое поле1? – jbriggs

+0

Я отредактировал свой ответ, чтобы попытаться заставить блокнот быть активным окном для работы SendKeys. – jbriggs

Смежные вопросы