سؤال

بقدر ما كنت قادرا على معرفة ذلك ، يقوم نظام ويندوز لا تقدم وظيفة API تقول ما تطبيق سجلت العالمية هوتكي (عبر RegisterHotkey).لا يمكن أن تجد فقط هذا هوتكي مسجلة إذا RegisterHotkey بإرجاع خطأ ، ولكن ليس من "يملك" هوتكي.

في غياب مباشر API, يمكن أن يكون هناك دوار الطريقة ؟ ويندوز يحافظ على التعامل مع المرتبطة مع بعضها registred هوتكي - انها قليلا مجن أنه ينبغي أن يكون هناك أي وسيلة للحصول على هذه المعلومات.

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

إنه شيء بالغ الأهمية ، ولكن رأيت كثرة الطلبات على هذه الوظائف ، و نفسي ضحية التطبيقات التي سجل مفاتيح الاختصار حتى من دون الكشف عن ذلك في أي مكان في واجهة المستخدم أو مستندات.

(العمل في دلفي ، وليس أكثر من متدرب في WinAPI ، يرجى أن يكون نوع.)

هل كانت مفيدة؟

المحلول

وسؤالك منزعج اهتمامي، حتى لقد فعلت شيئا من حفر وحين، للأسف ليس لدي إجابة مناسبة بالنسبة لك، اعتقدت أن حصة ما لدي.

ولقد وجدت هذا سبيل المثال إنشاء ربط لوحة المفاتيح (في دلفي) مكتوبة في عام 1998، ولكن تحويل البرمجي في دلفي 2007 مع اثنين من القرص.

وانها DLL مع دعوة SetWindowsHookEx الذي يمر من خلال وظيفة الاستدعاء، والتي يمكن بعد اعتراض ضربات لوحة المفاتيح: في هذه الحالة، انها ترقيع معهم من أجل المتعة، وتغيير المؤشر الأيسر إلى اليمين، وما إلى ذلك التطبيق بسيطة ثم باستدعاء DLL والتقارير الوراء نتائجها بناء على الحدث TTimer. إذا كنت ترغب يمكنني الرد على رمز القائمة على دلفي 2007.

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

وقد حاول

والتطبيقات الأخرى في تحديد مفاتيح الاختصار التي يمر اختصارات بها لأنها يمكن أن تحتوي على مفتاح اختصار، الذي هو مجرد تعبير آخر عن هوتكي. لكن معظم التطبيقات لا تميل إلى تعيين هذه الخاصية حتى أنه قد لا يعود من ذلك بكثير. إذا كنت مهتما في هذا الطريق، دلفي لديه حق الوصول إلى IShellLink اجهة COM التي يمكن استخدامها لتحميل اختصار مقابل والحصول على مفتاح الاختصار لها:

uses ShlObj, ComObj, ShellAPI, ActiveX, CommCtrl;

procedure GetShellLinkHotKey;
var
  LinkFile : WideString;
  SL: IShellLink;
  PF: IPersistFile;

  HotKey : Word;
  HotKeyMod: Byte;
  HotKeyText : string;
begin
  LinkFile := 'C:\Temp\Temp.lnk';

  OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, SL));

  // The IShellLink implementer must also support the IPersistFile
  // interface. Get an interface pointer to it.
  PF := SL as IPersistFile;

  // Load file into IPersistFile object
  OleCheck(PF.Load(PWideChar(LinkFile), STGM_READ));

  // Resolve the link by calling the Resolve interface function.
  OleCheck(SL.Resolve(0, SLR_ANY_MATCH or SLR_NO_UI));

  // Get hotkey info
  OleCheck(SL.GetHotKey(HotKey));

  // Extract the HotKey and Modifier properties.
  HotKeyText := '';
  HotKeyMod := Hi(HotKey);

  if (HotKeyMod and HOTKEYF_ALT) = HOTKEYF_ALT then
    HotKeyText := 'ALT+';
  if (HotKeyMod and HOTKEYF_CONTROL) = HOTKEYF_CONTROL then
    HotKeyText := HotKeyText + 'CTRL+';
  if (HotKeyMod and HOTKEYF_SHIFT) = HOTKEYF_SHIFT then
    HotKeyText := HotKeyText + 'SHIFT+';
  if (HotKeyMod and HOTKEYF_EXT) = HOTKEYF_EXT then
    HotKeyText := HotKeyText + 'Extended+';

  HotKeyText := HotKeyText + Char(Lo(HotKey));

  if (HotKeyText = '') or (HotKeyText = #0) then
    HotKeyText := 'None';

  ShowMessage('Shortcut Key - ' + HotKeyText);
end;

إذا كنت قد حصلت على الوصول إلى سفاري كتب عبر إنترنت ، هناك <لأ href = "HTTP: //my.safaribooksonline.com/0672321157/ch16lev1sec3 "يختلط =" noreferrer "> قسم بالرضا عن العمل مع اختصارات / الروابط قذيفة في دليل المطور بورلاند دلفي 6 عن طريق ستيف تيكسيرا وكزافييه باتشيكو. بلدي على سبيل المثال أعلاه هو نسخة ذبح من هناك و هذا الموقع .

وعلى أمل أن يساعد!

نصائح أخرى

واحد ممكن طريقة هي استخدام Visual Studio أداة تجسس++.

تعطي هذه المحاولة:

  1. تشغيل الأداة (بالنسبة لي, انها في C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\spyxx_amd64.exe)
  2. في شريط القوائم ، اختر تجسس -> سجل الرسائل... (أو ضرب Ctrl + م)
  3. تحقق كل النوافذ في نظام في إضافية ويندوز frame
  4. التبديل إلى رسائل علامة التبويب
  5. انقر على مسح جميع زر
  6. حدد WM_HOTKEY في مربع القائمة أو التحقق من لوحة المفاتيح في رسالة المجموعات (إذا كنت موافق مع المزيد من المحتمل الضوضاء)
  7. انقر على طيب زر
  8. اضغط على مفتاح التشغيل في السؤال (الفوز + R, على سبيل المثال)
  9. حدد WM_HOTKEY خط في رسائل (جميع النوافذ) إطار, انقر بزر الماوس الأيمن ثم اختر خصائص... في قائمة السياق
  10. في خصائص الرسالة الحوار, انقر على مقبض الإطار رابط (وهذا سوف يكون مقبض النافذة التي تلقت رسالة)
  11. انقر على مزامنة زر على نافذة الخصائص الحوار.هذا وسوف تظهر النافذة الرئيسية Spy++ نافذة treeview.
  12. على نافذة الخصائص الحوار حدد عملية علامة التبويب
  13. انقر على معرف العملية الارتباط.هذا وسوف تظهر لك عملية (في بلدي الفوز + R الحالة: EXPLORER)

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

واعتمادا على كيفية تنفيذ وثيقة رياكت "هو تنفيذ MS، قد تكون قادرا على كزة حولها في الذاكرة للعثور على هيكل، ولكن هذا فوق رأسي ...

BOOL FASTCALL
GetHotKey (UINT fsModifiers,
           UINT vk,
           struct _ETHREAD **Thread,
           HWND *hWnd,
           int *id)
{
   PHOT_KEY_ITEM HotKeyItem;

   LIST_FOR_EACH(HotKeyItem, &gHotkeyList, HOT_KEY_ITEM, ListEntry)
   {
      if (HotKeyItem->fsModifiers == fsModifiers &&
            HotKeyItem->vk == vk)
      {
         if (Thread != NULL)
            *Thread = HotKeyItem->Thread;

         if (hWnd != NULL)
            *hWnd = HotKeyItem->hWnd;

         if (id != NULL)
            *id = HotKeyItem->id;

         return TRUE;
      }
   }

   return FALSE;
}

هذا الموضوع على sysinternals على سئل من قبل شخص ذي صلة لهذا السؤال، ولكنني اعتقدت أن تصل إلى ذلك على أي حال للحفاظ على اثنين معا. الخيط تبدو مثيرة للاهتمام للغاية، ولكن أظن أن بعض استكشاف الكهوف الغوص العميق يحتاج أن يحدث لهذا الرقم دون الوصول إلى الأجزاء الداخلية MS.

ومن على قمة رأسي، قد حاولت تعداد جميع النوافذ مع EnumWindows، ثم في الاستدعاء، وإرسال WM_GETHOTKEY إلى كل نافذة.

وتحرير: Apparrently كنت مخطئا في ذلك. MSDN ديه مزيد من المعلومات:

<اقتباس فقرة>   

وWM_HOTKEY لا علاقة لWM_GETHOTKEY وWM_SETHOTKEY المفاتيح الساخنة. يتم إرسال رسالة WM_HOTKEY المفاتيح الساخنة العامة في حين تتعلق الرسائل WM_SETHOTKEY وWM_GETHOTKEY لتفعيل نافذة المفاتيح الساخنة.

ملحوظة: هنا هو برنامج ترمي الى وظيفة أنت تبحث عن. قد تتمكن من محاولة إلغاء ترجمته ذلك.

ويبدو أن هذا اقول لكم الكثير: http://hkcmdr.anymania.com/help.html

وموضوع آخر يذكر على NT ربط لوحة المفاتيح المستوى العالمي:

إعادة تعيين / تجاوز هوتكي (وين + L) لقفل النوافذ

وربما يمكنك الحصول على مقبض العملية التي تسمى ربط بهذه الطريقة، والتي يمكنك ثم العزم على اسم العملية

و(تنويه: كان لي في المواقع المفضلة، لم أحاول حقا / اختبار)

وأنا أعلم أنك يمكن اعتراض تيار من الرسائل في أي إطار ضمن العملية الخاصة بك - ما كنا نسميه شاء subclasses ترث في VB6. (على الرغم من أنني لا أتذكر وظيفة، وربما SetWindowLong؟) وأنا غير متأكد ما اذا كان يمكنك القيام بذلك للنوافذ خارج العملية الخاصة بك. ولكن من أجل هذا المنصب لنفترض أن تجد وسيلة للقيام بذلك. بعد ذلك يمكنك ببساطة اعتراض الرسائل لجميع النوافذ أعلى مستوى، ومراقبة للرسالة WM_HOTKEY. أنت لن تكون قادرة على معرفة كل مفاتيح الحق قبالة الخفافيش، ولكن كما كانوا ضغط يمكن بسهولة معرفة ما تم تطبيق استخدامها. إذا كنت لا تزال قائمة النتائج الخاصة بك إلى القرص وإعادة تحميل كل مرة تم تشغيل تطبيق الشاشة هل يمكن زيادة أداء التطبيق الخاص بك مع مرور الوقت.

وهذا لا يجيب بالضبط جزء من السؤال الذي يدور حول API ويندوز، لكنه يجيب على جزء من السؤال الذي حول قائمة من مفاتيح الاختصار العالمية والتطبيقات التي "تملك" لهم.

وهوتكي مستكشف مجانا في http://hkcmdr.anymania.com/ يظهر قائمة بجميع العالمية مفاتيح الاختصار والتطبيقات التي تمتلكها. هذا وقد ساعد لي فقط معرفة سبب توقف مفتاح الاختصار الخاصة بالتطبيق العمل وكيفية اصلاحها (عن طريق إعادة تشكيل هوتكي العالمي المسجل في التطبيق الذي كان له مسجل)، في غضون ثوان قليلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top