نمایش نتایج 1 تا 4 از 4

نام تاپیک: سوال در مورد اجرای یک کد نوشته شده در همه جای ویندوز !! نه فقط در برنامه خودمان

  1. #1

    سوال در مورد اجرای یک کد نوشته شده در همه جای ویندوز !! نه فقط در برنامه خودمان

    سلام و سپاس-
    یک ویندوز فرم داریم، میتونیم داخل تکست باکس اون تعیین کنیم مثلا اگه کاربر کلید Enter را زد الارم بده یا هرچی....

    میخوام این برنامه روی کل ویندوز فعال باشه نه فقط موقع فعال بودن پنجره فرم !! یعنی مثلا بره کنار system Tray ویندوز و من همین جا که دارم تایپ میکنم اگه Enter را زدم هم الارم بده-


    ممنون میشم راهنمایی کنید-

  2. #2

    نقل قول: سوال در مورد اجرای یک کد نوشته شده در همه جای ویندوز !! نه فقط در برنامه خودمان

    سلام دوست عزیز در خصوص keylogger کمی تحقیق کنید.موفق باشید

  3. #3
    کاربر دائمی آواتار ShayanFiroozi
    تاریخ عضویت
    شهریور 1397
    محل زندگی
    بندرعباس ، خلیج همیشه فارس
    سن
    38
    پست
    222

    نقل قول: سوال در مورد اجرای یک کد نوشته شده در همه جای ویندوز !! نه فقط در برنامه خودمان

    سلام ، باید از طریق API ویندوز یه سری Keyboard Hook رو Register کنین.

    اگر با سی شارپ انجام میدین حتما گزینه unsafe code رو در Properties پروژه فعال کنین.

    ضمنا کار با API مقداری دقت و تخصص میخواد چون براحتی نرم افزارتون و یا کل ویندوز رو میتونین unstable کنین.

  4. #4

    نقل قول: سوال در مورد اجرای یک کد نوشته شده در همه جای ویندوز !! نه فقط در برنامه خودمان

    نقل قول نوشته شده توسط ehsan_kabiri_33 مشاهده تاپیک
    سلام و سپاس-
    یک ویندوز فرم داریم، میتونیم داخل تکست باکس اون تعیین کنیم مثلا اگه کاربر کلید Enter را زد الارم بده یا هرچی....

    میخوام این برنامه روی کل ویندوز فعال باشه نه فقط موقع فعال بودن پنجره فرم !! یعنی مثلا بره کنار system Tray ویندوز و من همین جا که دارم تایپ میکنم اگه Enter را زدم هم الارم بده-


    ممنون میشم راهنمایی کنید-
    دو تا تابع در API ویندوز داریم به نام های RegisterHotKey و UnregisterHotKey که کارشون اولی ثبت کردن یک Hot Key و دومی باطل کردن اونه.
    فرضا شما Ctrl + T رو برای پنجره اصلی برنامه تون به عنوان HotKey ثبت می کنید تا مستقل از اینکه در کجای ویندوز کدوم پنجره فعال باشه، فشار این ترکیب کلیدی Ctrl + T با یک پیام به پنجره برنامه شما اطلاع داده بشه و کار خاصی رو در برنامه تون انجام بده.
    در ابتدای کلاس فرم اصلی برنامه ابتدا این دو تابع و به همراه مقادیر ثابت مرتبط شون ثبت می کنیم :

    private const int WM_HOTKEY = 0x0312;
    private const int MOD_ALT = 0x1;
    private const int MOD_CONTROL = 0x2;
    private const int MOD_SHIFT = 0x4;
    private const int MOD_WIN = 0x8;

    [System.Runtime.InteropServices.DllImport ("user32.dll")]
    private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, Keys vk);

    [System.Runtime.InteropServices.DllImport ("user32.dll")]
    private static extern bool UnregisterHotKey(IntPtr hWnd, int id);


    WM_HOTKEY پیامی است که موقع فشار دادن HotKey ها به پنجره مرتبط ارسال میشه، هر پیامی یک کد منحصر بفرد داره و WM_HOTKEY مخصوص HotKey ها است.
    MOD_ALT یعنی کلید Alt و اگر بخواهید در ترکیب کلیدی تون از Alt استفاده کنید این مقدار مورد استفاده قرار میگیره.
    MOD_CONTROL و MOD_SHIFT و MOD_WIN هم که کلید های Ctrl و Shift و Win (کلید با لوگوی ویندوز) هستند و اگر بخواهید می توانید در ترکیب کلیدی تون ازشون استفاده کنید.

    ابتدا ترکیب کلیدی مورد نظر رو باید Register کنید، یعنی به ثبت برسونید. مثلا ترکیب کلیدی Ctrl + T رو برای برنامه ثبت می کنیم :


    private void Form1_Load(object sender, EventArgs e)
    {
    RegisterHotKey(Handle, 1, MOD_CONTROL, Keys.T);
    }

    Handle کد پنجره فرم ای است که داریم کد رو داخل کلاسش می نویسیم، هر پنجره ای یک Handle یا کد منحصر بفرد خودش رو داره.
    1 شماره دلخواهی است که خودتون برای HotKey ثبت می کنید، می توانید چندین HotKey رو با شماره های متفاوتی ثبت کنید، لازم نیست حتما از 1 شروع بشه.
    ثبت این شماره صرفا برای اینه که در پیامی که به پنجره ارسال میشه راحت تشخیص بدهید که کدوم HotKey فشار داده شده. مثلا اگر 1 بود می دونیم همون Ctrl + T فشار داده شده.

    در مثال دیگری من Ctrl + Shift + R رو با شماره 2 ثبت می کنم.
    دقت کنید که بین اون MOD_CONTROL و MOD_SHIFT از عملگر | (عملگر OR) استفاده میشه، با + با هم جمع شون نمی کنیم.
    ممکنه اگر از نظر ریاضی با عملگری دیگری مثل + جواب مشابهی بگیرید اما استفاده از عملگر جمع در اینجور موارد اصولی نیست، از عملگر | باید استفاده بشه :

    private void Form1_Load(object sender, EventArgs e)
    {
    RegisterHotKey(Handle, 1, MOD_CONTROL, Keys.T);
    RegisterHotKey(Handle, 2, MOD_CONTROL | MOD_SHIFT, Keys.R);
    }


    هر کلیدی که به عنوان HotKey به ثبت میرسونید رو حداقل باید موقع بستن فرم باطل کنید تا برای استفاده سایر برنامه ها آزاد بشوند :

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
    UnregisterHotKey(Handle, 1);
    UnregisterHotKey(Handle, 2);
    }


    و اصل کاری اینه که هر وقت پیامی به پنجره فرم داده شد در متد WndProc بررسی کنیم که آیا پیام WM_HOTKEY هست یا نه.
    اگر پیام WM_HOTKEY بود، شماره HotKey در m.WParam مشخص میشه. کاری که مربوط به اون HotKey هست رو در داخل if می نویسید.
    من در یک مثال صرفا داخل یک ListBox شماره اون HotKey رو درج می کنم :

    protected override void WndProc(ref Message m)
    {
    if (m.Msg == WM_HOTKEY)
    {
    listBox1.Items.Add(m.WParam);
    }
    base.WndProc(ref m);
    }

    دقت کنید که ممکنه در یک ثانیه صد ها پیام به پنجره ارسال بشه، اون پیام ها در WndProc دریافت می شوند. اما ما فقط با پیام WM_HOTKEY کار داریم، نه سایر پیام ها.
    پس به سطر base.WndProc(ref m) که مسئولیت رسیدگی به سایر پیام ها رو داره و برای اونها مهمه دست نمی زنیم و حذفش نمی کنیم.

    اگر احیانا یک زمانی خواستید کدی بنویسید که سر و کارش با اشاره گر به سبک زبان های C و ++C بود، که ممکنه هیچوقت هم لازمتون نشه، کد unsafe code می نویسید که بحث مجزایی داره، وگرنه فراخوانی توابع از طریق DllImport جزو موارد کد نویسی unsafe به حساب نمیاد و برای اینجور جاها نیازی به تغییری در تنظیمات پروژه نداریم.

    public partial class Form1 : Form
    {
    private const int WM_HOTKEY = 0x0312;
    private const int MOD_ALT = 0x1;
    private const int MOD_CONTROL = 0x2;
    private const int MOD_SHIFT = 0x4;
    private const int MOD_WIN = 0x8;

    [System.Runtime.InteropServices.DllImport ("user32.dll")]
    private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, Keys vk);

    [System.Runtime.InteropServices.DllImport ("user32.dll")]
    private static extern bool UnregisterHotKey(IntPtr hWnd, int id);

    public Form1()
    {
    InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
    RegisterHotKey(Handle, 1, MOD_CONTROL, Keys.T);
    RegisterHotKey(Handle, 2, MOD_CONTROL | MOD_SHIFT, Keys.R);
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
    UnregisterHotKey(Handle, 1);
    UnregisterHotKey(Handle, 2);
    }

    protected override void WndProc(ref Message m)
    {
    if (m.Msg == WM_HOTKEY)
    {
    listBox1.Items.Add(m.WParam);
    }
    base.WndProc(ref m);
    }
    }

تاپیک های مشابه

  1. سوال: سوال درباره بروز رسانی ویندوز کرک شده
    نوشته شده توسط پروگرامنویس در بخش امنیت در شبکه
    پاسخ: 1
    آخرین پست: یک شنبه 31 اردیبهشت 1391, 09:51 صبح
  2. سوال: نصب ویندوز که سورس ویندوز روی سرور است؟
    نوشته شده توسط farhadfery در بخش شبکه و Networking‌
    پاسخ: 6
    آخرین پست: سه شنبه 07 خرداد 1387, 08:26 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •