2012-03-22 8 views
1

小さなキーロガーを開発しています(悪意のある目的ではありません)、ログに記録されたキーをすべてテキストボックスに書きたいと思います。現在、WriteOutputへのすべての呼び出しは、開始方法と停止方法を除き、ボックスには何も書き込まれません。私は間違って何をしていますか?ここでテキストがWindowsフォームのテキストボックスに表示されない

私のコードです:

Program.csの

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 
using System.Drawing; 

namespace Logger 
{ 
    /// <summary> 
    /// Class with program entry point. 
    /// </summary> 
    internal sealed class Program 
    { 
     public static bool log = false; 

     private const int WH_KEYBOARD_LL = 13; 
     private const int WM_KEYDOWN = 0x0100; 
     private static LowLevelKeyboardProc _proc = HookCallback; 
     private static IntPtr _hookID = IntPtr.Zero; 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     private static extern bool UnhookWindowsHookEx(IntPtr hhk); 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); 

     [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr GetModuleHandle(string lpModuleName); 

     private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); 

     /// <summary> 
     /// Program entry point. 
     /// </summary> 
     [STAThread] 
     private static void Main(string[] args) 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      _hookID = SetHook(_proc); 
      Application.Run(new MainForm()); 
      UnhookWindowsHookEx(_hookID); 
     } 

     private static IntPtr SetHook(LowLevelKeyboardProc proc) 
     { 
      using (Process curProcess = Process.GetCurrentProcess()) 
      using (ProcessModule curModule = curProcess.MainModule) 
      { 
       return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0); 
      } 
     }  

     private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
     { 
      if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN && log == true) 
      {    
       int vkCode = Marshal.ReadInt32(lParam); 

       MainForm MF = new MainForm(); 
       //THIS IS THE CALL THAT DOESN'T OUTPUT ANYTHING! 
       MF.WriteOutput(vkCode.ToString()); 
      } 
      return CallNextHookEx(_hookID, nCode, wParam, lParam); 
     }  
    } 
} 

Mainform.cs

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Windows.Forms; 
using System.IO; 

namespace Logger 
{ 
    /// <summary> 
    /// Description of MainForm. 
    /// </summary> 
    public partial class MainForm : Form 
    {  
     public MainForm() 
     { 
      InitializeComponent(); 
     } 

     public void WriteOutput(string input) 
     { 
      output.AppendText(string.Format(input)); 
      using (StreamWriter sr = new StreamWriter("log.log", true)) 
      { 
       sr.Write(input.ToString()); 
      } 
     } 

     private void StartClick(object sender, System.EventArgs e) 
     { 
      Program.log = true; 
      output.AppendText(string.Format("Logging started\n")); 
     } 

     private void StopClick(object sender, EventArgs e) 
     { 
      Program.log = false; 
      output.AppendText(string.Format("Logging stopped\n")); 
     } 
    } 
} 

答えて

2

新しいフォームを毎回インスタンス化されています

代わり
MainForm MF = new MainForm(); 
MF.WriteOutput(vkCode.ToString()); 

、同じものを再使用するMainFormインスタンス。 Program.csのでは:

private static MainForm mainForm; 

.... 

[STAThread] 
private static void Main(string[] args) 
{ 
    ... 
    mainForm = new MainForm(); 
    Application.Run(mainForm); 
    ... 
} 

.... 

mainForm.WriteOutput(vkCode.ToString()); 
+0

これを行うと、 'これは静的プロパティ、静的メソッド、または静的フィールド初期化子では無効です' –

+1

@ ryansworld10私の悪い....もちろんmainFormは静的でなければなりません。更新された回答をご覧ください。 – ken2k

1

KeysvkCodeをキャストしてみて、その後、テキストボックスに書き込みます。このよう

:私は、特定の文字をキャプチャするためにswitch文で前にこの同じコードを使用しているし、それはキャストを使用してうまく機能してい

if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN && log == true) 
{     
    int vkCode = Marshal.ReadInt32(lParam); 
    MainForm MF = new MainForm(); 
    MF.WriteOutput((Keys)vkCode); 
} 

希望すると便利です。

+0

これを実行しても、まだテキストボックスに出力されていません。私はファイルに出力を得ています。 –

関連する問題