PDA

View Full Version : درخواست : کلاسی برای غیر فعال کردن کیبورد



ya30ien2
سه شنبه 10 آبان 1390, 08:38 صبح
سلام
کسی کلاسی داره که بشه کیبورد رو در زمان اجرای برنامه از کار بندازه
البته کلیدهای اصلی ctrl+alt+...مخصوصا کلید استارت

ya30ien2
پنج شنبه 12 آبان 1390, 10:06 صبح
کسی نبود کمک کنه ؟

Directx
پنج شنبه 12 آبان 1390, 10:21 صبح
دوست عزیز غیر فعال کردن منابع سخت افزاری به راحتی تو دات نت امکان پذیر نیست و باید از api های ویندوز استفاده کنید فک کنم این پروژه (http://www.codeproject.com/KB/system/CSLLKeyboard.aspx) بتونه کمک کنه

ya30ien2
پنج شنبه 12 آبان 1390, 12:37 عصر
نه که کامل از کار بندازیم
مثلا کلیدهایی مثل alt,ctrl,shift,menu start,...
اگه کلاسی باشه که این کلیدها رو غیر فعال کنه بقیش رو حل میکنم

Directx
پنج شنبه 12 آبان 1390, 19:36 عصر
غیر فعال کردن کلیدها کار ساده ایه کافیه که چک کنید کدام کلید هنگام اجرای برنامه ی شما فشرده می شه و شما هیچ پاسخی بهش ندید ولی بعضی از کلید ها رو نمی شه کاری کرد مثلا کلید ویندوز کیبورد حالا یه مثلا می ذارم که این کلید رو غیر فعال کنید.
رفرنس های زیر رو به فرمتون اضافه کنید

1: using System.Diagnostics;
2: using System.Runtime.InteropServices;
حالا قبل از سازنده ی فرمتون این کد رو اضافه کنید.

1: // Structure contain information about low-level keyboard input event
2: [StructLayout(LayoutKind.Sequential)]
3: private struct KBDLLHOOKSTRUCT
4: {
5: public Keys key;
6: public int scanCode;
7: public int flags;
8: public int time;
9: public IntPtr extra;
10: }
11:
12: //System level functions to be used for hook and unhook keyboard input
13: private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
14: [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
15: private static extern IntPtr SetWindowsHookEx(int id, LowLevelKeyboardProc callback, IntPtr hMod, uint dwThreadId);
16: [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
17: private static extern bool UnhookWindowsHookEx(IntPtr hook);
18: [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
19: private static extern IntPtr CallNextHookEx(IntPtr hook, int nCode, IntPtr wp, IntPtr lp);
20: [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
21: private static extern IntPtr GetModuleHandle(string name);
22: [DllImport("user32.dll", CharSet = CharSet.Auto)]
23: private static extern short GetAsyncKeyState(Keys key);
24:
25:
26: //Declaring Global objects
27: private IntPtr ptrHook;
28: private LowLevelKeyboardProc objKeyboardProcess;

حالا کد زیر رو به سازنده فرم اضافه کنید.

1: public Form1()
2: {
3: ProcessModule objCurrentModule = Process.GetCurrentProcess().MainModule; //Get Current Module
4: objKeyboardProcess = new LowLevelKeyboardProc(captureKey); //Assign callback function each time keyboard process
5: ptrHook = SetWindowsHookEx(13, objKeyboardProcess, GetModuleHandle(objCurrentModule.ModuleName), 0); //Setting Hook of Keyboard Process for current module
6:
7:
8: InitializeComponent();
9: }


حالا تابع زیر رو اضافه کنید.

1: private IntPtr captureKey(int nCode, IntPtr wp, IntPtr lp)
2: {
3: if (nCode >= 0)
4: {
5: KBDLLHOOKSTRUCT objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lp, typeof(KBDLLHOOKSTRUCT));
6:
7: if (objKeyInfo.key == Keys.RWin || objKeyInfo.key == Keys.LWin) // Disabling Windows keys
8: {
9: return (IntPtr)1;
10: }
11: }
12: return CallNextHookEx(ptrHook, nCode, wp, lp);
13: }



حالا به متد Dispose مربوط به فرم برید تو (designer فرم) و این تغییرات را ایجاد کنید.


1: /// <summary>
2: /// Clean up any resources being used.
3: /// </summary>
4: /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
5: protected override void Dispose(bool disposing)
6: {
7: if (disposing && (components != null))
8: {
9:
10: components.Dispose();
11: }
12: if (ptrHook != IntPtr.Zero)
13: {
14: UnhookWindowsHookEx(ptrHook);
15: ptrHook = IntPtr.Zero;
16: }
17: base.Dispose(disposing);
18: }

حالا وقتی که برنامه در حال اجراست کلید ویندوز کار نمی کنه

ya30ien2
جمعه 13 آبان 1390, 22:33 عصر
دوست عزیز فقط به این قسمت گیر میده
ptrHook = SetWindowsHookEx(13, objKeyboardProcess, GetModuleHandle(objCurrentModule.ModuleName), 0);
سازنده فرم

Directx
جمعه 13 آبان 1390, 22:54 عصر
میشه بگید چه خطایی میده؟

ya30ien2
جمعه 13 آبان 1390, 23:33 عصر
به هیچ عنوان این پارامتر رو نمیشناسه که بخواد خطا بده

ya30ien2
جمعه 13 آبان 1390, 23:34 عصر
منظورم اینه که این SetWindowsHookEx رو جزو سمبلهای برنامه نمیشناسه

Directx
جمعه 13 آبان 1390, 23:38 عصر
این دو تا تعریف رو تو فرمتون انجام دادید؟

private IntPtr ptrHook;
private LowLevelKeyboardProc objKeyboardProcess;

ya30ien2
جمعه 13 آبان 1390, 23:50 عصر
آره دیگه دوست عزیز
طبق دستورات شما کلیه دستورها رو نوشتم

Directx
جمعه 13 آبان 1390, 23:57 عصر
آخه چطور ممکنه تابع رو نشناسه وقتی ما اینجا یه این صورت اون رو تو فرممون تعریف می کنیم.

private static extern IntPtr SetWindowsHookEx(int id, LowLevelKeyboardProc callback, IntPtr hMod, uint dwThreadId);



برا من که همین الان داره کار می کنه در ضمن من خودم این کدو از یه جا گرفتم دقیقا یادم نمیاد کجا پس اگه یه جای دیگه دیدید نگید که دزدی کردید

ya30ien2
شنبه 14 آبان 1390, 00:08 صبح
آقا دمت گرم
کدا رو دوباره نوشتم مشکل حل شد

Directx
شنبه 14 آبان 1390, 00:09 صبح
خواهش می کنم:قلب:

ya30ien2
شنبه 14 آبان 1390, 19:56 عصر
دوست عزیز اگه ممکنه راهی هم برای غیر فعال کردن کلید alt,tab ذکر کنید
بازم ممنون

ardeshir1365
یک شنبه 15 آبان 1390, 14:38 عصر
با سلام
خوب دوست عزیز شما چرا پروسس explorer رو نمیبندی که کارت راحت بشه؟؟؟اون وقت دیگه دکمه ویندوز کار نمیکنه و میتونی با یه برنامه هم تسک منجیر رو غیر فعال کنی به همین راحتی (اگه خواستی برام پیام بذار):لبخندساده:
من این کد رو دارم اگه بدردت میخوره بگو تا بذارمش