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

يا أهل العلم ......كيف يمكن ......... :

مغلق
بدأه فادي لطف في 30 مايو 2002 · 4 رد · 1,114 مشاهدة · في أرشيف منتدى الدلفي
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

1- كيف يمكن أن أوقف عمل الزران Alt+F4 اللذان يقومان بإغلاق البرامج

2- كيف يمكن أن أجعل ال memo تكتب مباشرة بالعربي أي دون الحاجة لأن أحول اللغة من

إنكليزي إلى عربي ( باستخدام الزران Shift+Ctrl )

3- كيف يمكن معرفة الHandle لخانة محددة مثل ( العنوان في ال Explorer ) أي ال Edit بمجرد

تقريب الفأرة إليها

مع جزيل الشكر.

#2

السلام عليكم

أخي العزيز

بالنسبة للسؤال الأول، يمكنك ذلك بالتحكم في إغلاق البرنامج من خلال حدثOnCloseQuery او من خلال الفورم نفسه بفحص ان ضغطت المستخدم على هذه الازار، وهذا مثال:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Shift = [ssAlt]) and (Key = vk_F4) then
  begin
    ShowMessage(' لا يمكنك اغلاق البرنامج');
    Key := 0;
  end
end;

ولا تنسى ان تجعل خاصية KeyPreview الخاصة بالفورم تساوي True

بالنسبة للسؤال الثاني يمكنك ذلك من خلال اجراء API وهو LoadKeyBoardLayout

  LoadKeyBoardLayout('00000401',KLF_Activate);

وان اردت ارجاعه للغة الانجليزية استخدم 409 بدلا من 401

اما للسؤال الاخير فإستخدم برنامج مثل WinSight الذي يأتي مع دلفي، او برنامج ++ Spy الذي يأتي مع فيجوال ستوديو وهو اسهل في الاستخدام لانه يستخدم الماوس اما البرنامج الاول فيعرض لك جميع النوافذ مع الهاند لها ويكون عددها كبير

أرجو ان اكون وفقت لاجابة بعض استفسراتك

مع تحياتي

والسلام

لا تحزن:

إن كنت فقيرا فغيرك محبوس في دين، وإن كنت لا تملك وسيلة نقل فسواك مبتور القدمين، وان كنت تشكوا من آلام فغيرك يرقدون على الاسرة البيضاء و من سنوات، وان فقدت ولدا فغيرك فقد عددا من الأولاد و في حادث واحد.

لا تحزن:

فأنت تشرب الماء الزلال، و تستنشق الهواء الطلق، و تمشي على قدميك معافى، و تنام ليلك آمنا.

#3

السلام عليكم

احببت ان أضيف شئ بسيط بخصوص السؤال الثالث

يمكن مراجعه :

http://arabteam.nicmatic.com/vb/showthread...يه&pagenumber=1

http://arabteam.nicmatic.com/vb/showthread...ighlight=window

(f)

CIONO1

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#4

أولا أود أن أشكركما أخوي العزيزن على سرعة إجابتكم علي وأعتزر عن تأخري بالإجابة

ولكن أخي العزيز tmaaa المثال الذي بعثتة لي جميل جداً وكبير جدا وفيه بعض الكومبونات التي لا أملكها فهل يمكن أن أتخبرني من أين أحصل على هذه الكومبونات وشئ آخر هو أني بحاجة

إلى مثال صغير يوضح لي كيفية معرفة الHandel للعنصر أو النافذة التي أختارها فقط فهل يمكن أن توضّحه لي بمثال صغير لو سمحت

#5

اخي العزيز فادي فادي لطف

توجد هناك طرق احترافية في عمليات الوصول الى الهاندل وهي تحتاج الى احتيالات منك فلا تنتهي بالأمر فقط في الحصول على الأوامر فقط

فمثلاً اذا كنت تريد ان تحصل على جميع الهاندلات التي تعمل في ويندوز فيمكنك ذلك بأستخدام الدالة EnumWindows للوصل الى جميع الهاندلات للبرامج التي تعمل في الويندوز و EnumChildWindows للوصول الى الهاندلات الفرعية للهاندلات الرئيسية واذا كنت تريد ان تميز برنامج معين فهنا تقوم بتحويل الهاندل الذي تحصل عليه من الدوال السابقة الى كلاس نيم وذلك بأستخدام الأمر GetClassName واذا كنت تريد ان تميزه عن طريق نصه فيمكنك استخدام الأمر GetWindowsText ويفضل ان تصل الى البرنامج المطلوب بأستخدام ClassName وكذلك Text التابع للبرنامج لكي تصل الى هدفك بدقة

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

فاليك الطريقة :

اولاً قم بوضع كائنين ListView على الفورم ثم اضف ثلاث قوائم فيها وسمها بهذا الأول Handle والثاني ClassName والثالث Text طبعاً قم بعمل هذا في جميع الكائنين وجعل عرض الكائنين vsReport وبعدها قم بالتصريح عن متغيرين هما ListHandle و ChildHandle قيمتهما TList في ال Var العام للفورم

var
  Form1: TForm1;
  ListHandle,ChildHandle:TList;

ثم قم بكتابة هاذين ال Function

function GetList(Handle:HWND):Bool stdcall;
begin
Result:=True;
ListHandle.Add(Pointer(Handle));
end;

function GetChild(Handle:HWND):Bool stdcall;
begin
Result:=True;
ChildHandle.Add(Pointer(Handle));
end;

بعدها قم بكتابة هذه الأوامر في امر حدث OnCreate للفورم

var
i:integer;
c1,c2:array[0..250] of Char;
begin
ListHandle.Free;
ListHandle:=TList.Create;
EnumWindows(@GetList,0);
ListView1.Clear;
for i:=0 to ListHandle.Count-1 do begin
GetClassName(HWND(ListHandle),c1,50);
GetWindowText(HWND(ListHandle),c2,50);
with ListView1.Items.Add do begin
Caption:=inttostr(HWND(ListHandle));
SubItems.Add(c1);
SubItems.Add(c2);
end;
end;

ثم قم بكتابة هذا الأمر في امر حدث OnClick لل ListView1

var
i:integer;
c1,c2:array[0..250] of Char;
begin
if ListView1.ItemIndex=-1 then
exit;
ChildHandle.Free;
ChildHandle:=TList.Create;
EnumChildWindows(HWND(ListHandle[ListView1.ItemIndex]),@GetChild,HWND(ListHandle[ListView1.ItemIndex]));
ListView2.Clear;
for i:=0 to ChildHandle.Count-1 do begin
GetClassName(HWND(ChildHandle),c1,50);
GetWindowText(HWND(ChildHandle),c2,50);
with ListView2.Items.Add do begin
Caption:=inttostr(HWND(ChildHandle));
SubItems.Add(c1);
SubItems.Add(c2);
end;
end;

ثم قم بتشغيل البرنامج وانظر النتيجة :D

طبعاً اذا مافهمت كلامي السابق او صار عندك اشكال فلاتخف

انا سويت لك مثال على نفس الكلام السابق احتياط ;) وكذلك ايضاً حتى يكون اوضح لك :D

ويمكنك تحميل المثال من هذه الوصلة :

http://www.8op.com/sum/windowshandle.zip

وارجوا ان يكون هو مرادك

وتقبل اطيب تحياتي اخوك SUM

هذا الموضوع مغلق.

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