استخدام GetKeyboardLayoutName مع البرامج الاخرى
#1
السلام عليكم و رحمة الله تعالى و بركاته
إخواني الكرام
الإجراء GetKeyboardLayoutName لا يستطيع إستخراج لغة لوحة المفاتيح في حالة الـ Forme غير نشطة بمعنى آخر عندما يكون البرنامج شغال و ننتقل إلى برنامج آخر مثل Notepad و نحاول أن نكتب نصا فإن برنامجنا لا يستطيع إستخراج اللغة التي نكتب بها في الـ Notepad أو أي برنامج آخر خارجي
هل من حل لهذه المشكلة بحيث يصبح برنامجنا يستخرج لغة لوحة المفاتيح حتى في حالة الكتابة مع برنامج آخر
للتأكد من المشكلة ضع أمر إستخراج اللغة في Timer لكي يكرر التنفيذ و نفذ البرنامج و أنتقل الى برنامج آخر و سترى أخي العزيز النتيجة
هل يوجد حل لهذه المشكلة و باك الله فيكم
الرد
#2
و عليكم السلام و رحمة الله و بركاته

أخي الكريم , المسألة في ThreadId :

مثال توضيحي :

PHP كود :
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Label1
.Caption:= Format('%X',[  //  القيمة بالهيكس
                  
GetKeyboardLayout( //ThreadId لجلب لغة النظام حسب الـ apiدالة
                  
GetWindowThreadProcessId(//لجلب ThreadId من البروسس الذي نحدده
                  
GetForegroundWindow ,nil) //البروسس هوالواجهة المفعلة
                  
) And $FFFF]);//للحفاظ على أول 32 بيت
end; 
بالتوفيق ,,
I'M Fly Like A G6

الرد
#3
السلام عليكم
بصراحة لا أعرف حتى كيف أشكرك أ
الرد
#4
إقتباس :ضع أمر إستخراج اللغة في Timer
يمكن اقتناص الحدث WM_INPUTLANGCHANGE المخصص لذلك كما يلي:
PHP كود :
procedure WMInputLangChange(var wMsg: TMessage); message WM_INPUTLANGCHANGE; 
ثم:
PHP كود :
procedure TForm1.WMInputLangChange(var wMsg: TMessage);
begin
  ShowMessage
(Format('Keyboard Layout: %8.8x', [LoWord(GetKeyboardLayout(GetCurrentThreadId))]));
  
inherited;
end; 
هذا لن يعمل إذا وجدت مكونات التحكم (TControls) على النموذج لأنها تمتص الأحداث أيضا
لذلك يفضل إرسال الحدث إلى التطيبق (TApplication). واقتناص WM_INPUTLANGCHANGEREQUEST أفضل كما يلي:
PHP كود :
private
    
procedure WndProc(var wMsg: TMsg; var Handled: Boolean);
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application
.OnMessage := WndProc;
end;

procedure TForm1.WndProc(var wMsg: TMsg; var Handled: Boolean);
begin
  
if wMsg.message = WM_INPUTLANGCHANGEREQUEST then
    ShowMessage
(Format('Keyboard Layout: %8.8x', [LoWord(GetKeyboardLayout(GetCurrentThreadId))]));
end; 
...
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم