الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Disable Windows Key From Keyboard

بدأه rober في 18 أكتوبر 2008 · 13 رد · 2,710 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

إما أن الموضوع صعب أو أنه غير موجود أو أني لم أبحث جيدا :blush:

بحثت كثيرا عن كيفية إيقاف الزر win الموجود في لوحة المفاتيح و الذي يقوم بفتح قائمة إبدأ

و جدت كثير من الأدوات و المكاتب التي تقوم بعمل hook و hotkey لكن لم أجد ما يوقف هذا الزر

ما أبحث عنه هو إيقاف تام لزر (start) سواء من سطح المكتب أو من لوحة المفاتيح

من سطح المكتب كما تم ذكرها من قبل في المنتدى

ShowWindow(GetWindow(FindWindow('Shell_traywnd', NiL), 5), 0);

لكن ماذا عن لوحة المفاتيح

قمت بعمل بعض التعديلات المضحة على إحدى الأمثلة التي وجدها بخصوص لوحة المفاتيح و قمت بإرفاق المثال

المثال مفتوح كما ذكر في إحدى الملفات النصية المرفقة بالمكتبة المعمولة

قمت بإرفاق الملف الأصلي و الملف الذي عدلته للإطلاع (سأرفق كل الأمثلة التي وجدتها في وقت لاحق لأن الأتصال اليوم ضعيف جدا)

بعد التعديل أصبح الأمر حين يضغط المستخدم على زر أبدأ من لوحة المفاتيح تظهر القائمة و يعود البرنامج و يضغط عليها فتختفي لكن بالضغط مرتين متتاليتين على الزر

لا تختفي القائمة كما حدث في الضغط مرة واحدة

بالمختصر المفيد كيف يمكن إيقاف قائمة أبدأ نهائيا حتى لو كان الفورم minimized عند طلبها من :

1- النقر على زر أبدأ من سطح المكتب (محلول)

2- الضغط على زر win الموجود في لوحة المفاتيح (غير محلول)

3- الضغط بالتتالي على الزرين Ctrl و Esc من لوحة المفاتيح (غير محلول)

أعذروني فقد طال الشرح و ربما لم يكن كاف

و السلام ختام

befor.rar

after.rar

تم تعديل هذه المشاركة بواسطة rober في 18 أكتوبر 2008 في 01:03

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#2

up :blush: :blush:

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#3

أعرف الكثير من المكونات لفصل واشبك الازرار بالكيبورد

سواء مفتاح الويندوز او شريط ابدا الخ ...

اذا كنت تريدها فلن أبخل عليك

I'm giving him an offer he can't refuse ! ;

#4

السلام عليكم

أخي الكريم مشكور على مشاركتك الكريمة

أنا جربت مجموعة من الأدوات و الأمثلة لكن يمكن منها ألغاء الـ hotkey الأساسية

لكن زر الويندوز ( أبدأ ) لوحده لم أجد

على كل أرجو منك وضع الأدوات التي تستخدمها و مشكور سلفا :blush:

و السلام ختام

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#5

لا أعرف أي شئ في الدلفي سوى الـ := الغليظة :D

استخدم SetWindowsHookEx مع WH_KEYBOARD_LL

داخل الـهوك تخلص من WM_KEYUP و WM_SYSKEYUP

استخدم GetKeyState مع VK_LWIN احفظ القيمة في متغير.

استخدم GetKeyState مع VK_RWIN وقم بعمل OR مع المتغير السابق.

لو كانت قيمة الـ LODWORD مساوية 1 قم بإعادة 1 مثلا واخرج من الـ KeyboardCallback دون استدعاء CallNextHookEx

نفس الطريقة لمنع زري Ctrl+Esc

افحص الـ vkCode من داخل الـ KeyboardCallback مع VK_CONTROL (افحص VK_LCONTROL + VK_RCONTROL)

GetAsyncKeyState مع Esc

عملية AND بينهم ومع 8000h حسبما أذكر

لو النتيجة TRUE اعمل بلوك.

عذراً على سوء الشرح.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#6

أستاذ Xacker في دلفي

يا مرحبا

و الله جبتها بصراحة يبدو أني لم أبحث جيدا قبل طرح الموضوع و جدت حل و هو ما أشار أليه الأخ Xacker في مشاركته

الحل على الشكل التالي

unit Unit1;

interface

uses
  Windows, Classes, Forms,StdCtrls, ExtCtrls, Controls;

type
  TForm1 = class(TForm)
	Button1: TButton;
	Button2: TButton;
	procedure Button2Click(Sender: TObject);
	procedure Button1Click(Sender: TObject);
  private
	{ Private declarations }
  public
	{ Public declarations }
  end;

var
  Form1: TForm1;
  HookID: HHOOK;


type 
  pkbll = ^tKBDLLHOOKSTRUCT;
  tKBDLLHOOKSTRUCT = record
  vkCode,scancode,flags,time,dwExtraInfo : integer;
  end;

CONST WH_KEYBOARD_LL=13;

implementation

{$R *.dfm}

function LLKeyHookFunc (hookcode:integer; keycode:wParam; kstrokeinfo:lParam): LResult; stdcall;
var struct: pkbll;
begin
   struct:=Ptr(kstrokeinfo);
   Result:=0;
   if (hookcode >= 0) then
   begin
	  if ((struct.vkCode = VK_ESCAPE) and (GetAsyncKeyState(VK_CONTROL) < -32766)) then
		 Result:=1;
	  if ((struct.vkCode = VK_LWIN) or (struct.vkCode = VK_RWIN)) then
		 Result:=1;
  end;
  if (Result = 0) then
	 Result:=CallNextHookEx (HookID, hookcode, keycode, kstrokeinfo);
end;

procedure LockSystem;
begin 
   HookID:=SetWindowsHookEx (WH_KEYBOARD_LL, @LLKeyHookFunc, hInstance, 0);
end;

procedure UnLockSystem;
begin
   if (not UnHookWindowsHookEx(HookID)) then
	  UnHookWindowsHookEx(HookID);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   LockSystem;
   EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0,'Button',nil),FALSE);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   UnLockSystem;
   EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0,'Button',nil),TRUE);
end;

end.

كما أنه موجود بالمرفق الذي يقوم بإلغاء زر أبدأ نهائيا سواء بإستخدام الـ Mouse أو الـ Keyboard سواء كان البرنامج Active أو Minimzed أو try

أرجو الأستفادة

Disable_WinKey.rar

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#7

Xacker كتب:
لا أعرف أي شئ في الدلفي سوى الـ := الغليظة :D

msgplusimg1655xq3.png

بالنسبه للمكون اللذي اشرت اليه اخي روبر فسيعجبك كثيرا

لأنه جديد وليس قديم كباقي المكونات عام 2003 و 2002

فهو 2008

ثانيا موجود على كل اللغات سي شارب بلس في بي دلفي الخ

ولا يوقف زر ابدا فقط بل حتى شريط المهام ومفاتيح الكيبورد الخ

ثق بي سيعجبك باذن الله

اعطني دقائق لأجلبه لك باذن الله

I'm giving him an offer he can't refuse ! ;

#9
Delphawi كتب:
إيه حكاية الواد ده يا فيصل :) ؟

فيصل ؟؟؟ :huh:

---------------------------

أخي روبر المعذره على غيابي وعدم إيفائي بالوعد اللذي قطعته لك اقصد الخمس دقائق

لقد انفصل علي النت عدة ايام

لا مشكله ها انا اعود بنفس المكون اللذي ذكرته لك

http://www.dwinlock.kassl.de/

هذا هو موقعه أتمنى أن يستفيد منه الأخوان وهو ليس حصرا على دلفي

بل متوافق مع كل لغات البرمجه الأخرى

تقبل تحياتي واعذرني أولا واخيرا

تم تعديل هذه المشاركة بواسطة Michael Corleone في 6 نوفمبر 2008 في 15:57

I'm giving him an offer he can't refuse ! ;

#10

مشكور أخي الكريم

أنا فضلت أنتظر الـ 5 دقائق حتى الأن :angry: :haha:

بصراحة المشكلة حلت و بكل الأحوال أنا أحمل المكون الأن

و كل الشكر لمساعدتك

أجرب المكون و أردك خبر عنه :wink:

و السلام ختام

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#11

أخ Michael Corleone أنا رأيت المكون بالفعل جميل لكن ماذا عن سورس ملف الـ DLL

و المكون غير مجاني :huh:

بكل الأحوال حلت المشكلة بفضل الأخ Xacker مجرد أن قمت بترتيب الأفكار التي تحدث عنها و وتحويلها لدلفي بدون أستخدام أي مكونات

كل الشكر لك و لكل من ساعد في حل الموضوع

و السلام ختام

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#12

مشكورين ... بس أخي Rpber هل اعطيتنا الطريقة و الكود الذي جعلت زر win لا يعمل و هل هناك طريقة لغلق لوحة المفاتيح بالكامل.

منتظر ردكم

#13

أخي وضاح

الرد جاء متأخرا فأرجو أن تعذرني

بكل الأحوال المرفق فيه مثال جيد و كافي لأيقاف زر أبدأ

بعد النقر على زر Lock جرب أن تضغط على الزر أبدأ أو الضغط على الزرين ctrl+esc و ستلاحظ أن قائمة أبدأ لن تفتح

و يمكنك أستخدام الكود التالي لألغاء النقر على زر أبدأ بإستخدام الماوس

EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0,'Button',nil),FALSE) ;

و الكود التالي لإلغاء الكود السابق

EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0,'Button',nil),TRUE) ;

أرجو الإستفادة

Disable Win Key.rar

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#14

مشكور أخي Rober و ما قصرت جاري التنفيذ و التجربة و أطلب طلب آخر هو كيف يمكن أن اقوم بتعطيل لوحة المفاتيح كاملة

وشكراً

مواضيع مشابهة