গ্লোবাল হটকি নিবন্ধিত কোন প্রক্রিয়াটি সন্ধান করুন? (উইন্ডোজ এপিআই)


114

আমি যতদূর জানতে পেরেছি, উইন্ডোজ কোন অ্যাপ্লিকেশনটি বিশ্বব্যাপী হটকি নিবন্ধিত করেছে তা জানাতে একটি API ফাংশন সরবরাহ করে না (রেজিস্টারহোটির মাধ্যমে)। আমি কেবল এটিই জানতে পারি যে যদি রেজিস্টারহটকি মিথ্যা প্রত্যাবর্তন করে তবে হটকি নিবন্ধিত হয়েছে তবে হটকি কে "মালিক" নয়।

প্রত্যক্ষ এপিআইয়ের অভাবে, কোনও রাউন্ড আউট উপায় হতে পারে? উইন্ডোজ প্রতিটি নিবন্ধিত হটকির সাথে সম্পর্কিত হ্যান্ডেলটি বজায় রাখে - এটি একটু উন্মাদজনক যে এই তথ্যটি পাওয়ার কোনও উপায় নেই should

সম্ভবত কিছু কাজ করবে না এর উদাহরণ: একটি নিবন্ধিত হটকি প্রেরণ করুন (সিমুলেট করুন), তারপরে হটকি বার্তাটি উইন্ডোজ প্রেরণ করবে যা এটি নিবন্ধীকৃত প্রক্রিয়াতে প্রেরণ করবে। প্রথমত, আমি মনে করি না যে বার্তাটি থামানো গন্তব্য উইন্ডো হ্যান্ডেলটি প্রকাশ করবে। দ্বিতীয়ত, এটি সম্ভব হলেও এটি করা একটি খারাপ কাজ হবে, যেহেতু হটকি পাঠানো বিভিন্ন প্রোগ্রাম থেকে সমস্ত ধরণের সম্ভাব্য অযাচিত ক্রিয়াকলাপকে সূচিত করে।

এটি সমালোচনামূলক কিছু নয়, তবে আমি এই জাতীয় কার্যকারিতার জন্য ঘন ঘন অনুরোধগুলি দেখেছি এবং আমি নিজেই এমন অ্যাপ্লিকেশনগুলির শিকার হয়েছি যা হটকিগুলি নিখরচায়ভাবে ইউআই বা ডক্সের বাইরেও প্রকাশ না করে রেজিস্টার করে।

(ডেলফিতে কাজ করা, এবং উইনএপিআইতে শিক্ষানবিশ ছাড়া আর কিছু নয়, দয়া করে দয়া করুন।)

উত্তর:


20

আপনার প্রশ্নটি আমার আগ্রহ প্রকাশ করেছে, তাই আমি কিছুটা খনন করেছি এবং দুর্ভাগ্যক্রমে আমার কাছে আপনার কাছে সঠিক উত্তর নেই, আমি ভেবেছিলাম আমার যা আছে তা ভাগ করে দেই।

আমি 1998 সালে লিখিত কীবোর্ড হুক (ডেলফিতে) তৈরি করার এই উদাহরণটি পেয়েছি , তবে বেশ কয়েকটি টুইটের মাধ্যমে ডেলফি 2007-এ সংকলনযোগ্য।

এটি একটি কলের সাথে একটি কল রয়েছে SetWindowsHookExযা কলব্যাক ফাংশনটির মধ্য দিয়ে যায়, যা মূল স্ট্রোকগুলিকে আটকাতে পারে: এই ক্ষেত্রে, এটি মজা করার জন্য তাদের সাথে ঝাঁকুনি দিচ্ছে, বাম কার্সারটি ডানে বামে পরিবর্তন করা ইত্যাদি etc. এটির ফলাফল কোনও টিটাইমার ইভেন্টের ভিত্তিতে। আপনি যদি আগ্রহী হন তবে আমি ডেলফি 2007 ভিত্তিক কোডটি পোস্ট করতে পারি।

এটি ভাল নথিভুক্ত এবং মন্তব্য করা হয়েছে এবং আপনি সম্ভবত কোনও কী প্রেস চলছে সেখানে কাজ করার ভিত্তি হিসাবে এটি ব্যবহার করতে পারেন। কী স্ট্রোক প্রেরণকারী অ্যাপ্লিকেশনটির হ্যান্ডেলটি যদি আপনি পেয়ে থাকেন তবে আপনি সেভাবে এটি ট্র্যাক করতে পারেন। এই হ্যান্ডেলটি দিয়ে আপনি আপনার প্রয়োজনীয় তথ্য খুব সহজেই পেতে সক্ষম হবেন।

অন্যান্য অ্যাপ্লিকেশনগুলি তাদের শর্টকাটগুলি ধরে হটকিগুলি নির্ধারণের চেষ্টা করেছে যেহেতু সেগুলিতে একটি শর্টকাট কী থাকতে পারে যা হটকারির জন্য অন্য একটি শব্দ। তবে বেশিরভাগ অ্যাপ্লিকেশনগুলিতে এই সম্পত্তি সেট করার ঝোঁক থাকে না যাতে এটি বেশি পরিমাণে ফিরে না আসে। আপনি যদি সেই রুটে আগ্রহী হন, ডেলফির IShellLinkসিওএম ইন্টারফেসে অ্যাক্সেস রয়েছে যা আপনি শর্টকাটটি লোড করতে এবং এর হটকি পেতে ব্যবহার করতে পারেন:

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;

আপনি যদি সাফারি বুকস অনলাইনে অ্যাক্সেস পেয়ে থাকেন তবে স্টিভ টিক্সেইরা এবং জাভিয়ের পাচেকোর বোরল্যান্ড ডেল্ফি 6 বিকাশকারীদের গাইডে শর্টকাট / শেল লিঙ্কগুলির সাথে কাজ করার বিষয়ে একটি ভাল বিভাগ রয়েছে । আমার উপরের উদাহরণটি সেখান থেকে এবং এই সাইটটির একটি কসাই সংস্করণ ।

আশা করি এইটি কাজ করবে!


59

একটি সম্ভাব্য উপায় ভিজ্যুয়াল স্টুডিও সরঞ্জাম স্পাই ++ ব্যবহার করা

একবার চেষ্টা করে দেখুন:

  1. সরঞ্জামটি চালান (আমার জন্য এটি এখানে C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\spyxx_amd64.exe)
  2. মেনু বারে, স্পাই নির্বাচন করুন -> বার্তাগুলি লগ করুন ... (বা হিট Ctrl+ M)
  3. পরীক্ষা করে দেখুন সিস্টেমের সকল উইন্ডোজ মধ্যে অতিরিক্ত উইন্ডোজ ফ্রেম
  4. বার্তা ট্যাবে স্যুইচ করুন
  5. ক্লিক করুন সমস্ত সাফ বোতাম
  6. নির্বাচন WM_HOTKEYতালিকা বাক্সে, অথবা পরীক্ষা কীবোর্ড মধ্যে বার্তা গোষ্ঠীসমূহ (যদি আপনি আরো সম্ভাব্য গোলমাল সাথে এসেছেন ঠিক আছে)
  7. ক্লিক করুন ঠিক আছে বোতাম
  8. প্রেস প্রশ্নে হট-( Win+ + R, উদাহরণস্বরূপ)
  9. বার্তা (সমস্ত উইন্ডোজ) উইন্ডোতে WM_HOTKEYলাইনটি নির্বাচন করুন , ডান ক্লিক করুন এবং প্রসঙ্গ মেনুতে বৈশিষ্ট্যগুলি নির্বাচন করুন ...
  10. ইন পাঠান প্রোপার্টি ডায়ালগ, ক্লিক করুন উইন্ডো হাতল লিঙ্ক (এই উইন্ডোটি যে বার্তা পেয়েছি জন্য হাতল হবে)
  11. ক্লিক করুন সিংক্রোনাইজ বোতাম উইন্ডো প্রোপার্টি ডায়ালগ। এটি মূল স্পাই ++ উইন্ডো ট্রিভিউতে উইন্ডোটি প্রদর্শন করবে।
  12. উপর উইন্ডো প্রোপার্টি ডায়ালগ নির্বাচন প্রক্রিয়া ট্যাব
  13. প্রক্রিয়া আইডি লিঙ্কটি ক্লিক করুন। এটি আপনাকে প্রক্রিয়াটি প্রদর্শন করবে (আমার Win+ Rক্ষেত্রে EXPLORER:)

6
দুর্দান্ত উত্তর! কেবল একটি নোট যে স্পাই ++ এর 64৪-বিট সংস্করণটি কেবলমাত্র -৪-বিট অ্যাপ্লিকেশনগুলির জন্য বার্তাগুলি ক্যাচ করে , তাই হটকি টিপানোর পরে WM_HOTKEYআপনি বার্তা লগটিতে বার্তাটি না দেখলে আপনার স্পাই ++ এর 32-বিট সংস্করণটি চালানোর প্রয়োজন হতে পারে ।
ডেভিড ফেরেঞ্জি রোগোয়ান

তোমাকে অনেক ধন্যবাদ!!! আমি এটি না পাওয়া পর্যন্ত মূলত কিছু শর্টকাট ব্যবহার করা ছেড়ে দিয়েছি।
thewindev

3
অষ্টম ধাপে এটি হটকি জিজ্ঞাসা করে না, বার্তা উইন্ডো কোনও হটকি টিপে খালি রাখবে। Github.com / ওয়েস্টনক্যাম্পেল / এসপিপ্লাসপ্লাস (উইন্ডোজ 10 এ) থেকে 32 এবং 64-বিট সংস্করণ ব্যবহৃত হয়েছে ।
কুলমাইন্ড

9

কিছু গবেষণা করার পরে, দেখা যাচ্ছে যে আপনাকে হটকিগুলি সংরক্ষণের জন্য এমএস ব্যবহার করে এমন অভ্যন্তরীণ কাঠামোটিতে অ্যাক্সেস পাওয়া দরকার। রিএকটিএসের একটি পরিষ্কার কক্ষ বাস্তবায়ন রয়েছে যা GetHotKeyএকটি অভ্যন্তরীণ তালিকার পুনরাবৃত্তি করে এবং কলটির সাথে পরামিতিগুলির সাথে মেলে এমন হটকি বের করে কলটি প্রয়োগ করে ।

এমএস বাস্তবায়নের সাথে রিঅ্যাক্টস বাস্তবায়ন কতটা কাছাকাছি, তার উপর নির্ভর করে আপনি কাঠামোটি সন্ধান করতে মেমরির চারপাশে ঝাঁকুনি দিতে সক্ষম হতে পারেন তবে এটি আমার মাথার উপরে ...

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;
}

আমি অনুমান করি যে সিস্টেন্ডারলে এই থ্রেডটি এই প্রশ্নের সাথে সম্পর্কিত কেউ জিজ্ঞাসা করেছেন, তবে আমি ভেবেছিলাম যে দু'জনকে একসাথে রাখতে আমি এটির সাথে লিঙ্ক করব। থ্রেডটি খুব আকর্ষণীয় দেখায়, তবে আমার সন্দেহ হয় যে এমএস ইন্টার্নালগুলিতে অ্যাক্সেস না করেই কিছু গভীর ডাইভ স্পেলিংকিংয়ের এটি হওয়া দরকার।


3

আমার মাথার শীর্ষে, আপনি EnumWindows সহ সমস্ত উইন্ডো গণনার চেষ্টা করতে পারেন, তারপরে কলব্যাকে প্রতিটি উইন্ডোতে WM_GETHOTKEY প্রেরণ করুন।

সম্পাদনা করুন: পরিষ্কারভাবে আমি সে সম্পর্কে ভুল ছিলাম। এমএসডিএন আরও তথ্য রয়েছে:

WM_HOTKEY WM_GETHOTKEY এবং WM_SETHOTKEY হট কীগুলির সাথে সম্পর্কিত নয়। ডাব্লুএমহটকি বার্তাটি জেনেরিক হট কীগুলির জন্য প্রেরণ করা হয় যখন ডাব্লুএম_এসএইচটকি এবং ডাব্লুএম_জিথটকি বার্তা উইন্ডো অ্যাক্টিভেশন হট কীগুলির সাথে সম্পর্কিত।

দ্রষ্টব্য: আপনি যে কার্যকারিতাটি সন্ধান করছেন তা পেতে এখানে একটি প্রোগ্রাম পুরোপুরিড করা হচ্ছে। আপনি এটি পচানোর চেষ্টা করতে পারেন।


3
প্রোগ্রামটির লিঙ্কটি এখন সম্পূর্ণ ভেঙে গেছে। কি প্রোগ্রাম ছিল? আমি অনেকবার জানতে চেয়েছি কোন প্রোগ্রামটি আমার হটকিগুলি নিবন্ধিত করেছে কারণ হঠাৎ তারা আর কাজ করে না বা বিরক্তিকর নতুন জিনিস করে না do
জেমস ওলটম্যানস

(প্রায়শই, ওয়েবেব্যাক মেশিন ওয়েবপৃষ্ঠা নিখোঁজ হওয়ার ক্ষেত্রে সহায়তা করতে পারে তবে এখানে এটি কেবল পাওয়া যায় না এমন 404 মিরর করা হয়েছে: http://web.archive.org/web/*/tds.diimarcs.com.au/dse/ সনাক্তকরণ / হটকিজ.এফপি )
অ্যারন থোমা

2

এটি আপনাকে অনেক কিছু বলে মনে হচ্ছে: http://hkcmdr.anymania.com/help.html


1
এটা কি পারে? একজন ডিএলএল ড্রাইভারের ছদ্মবেশে? ডিএলএল ফাংশনটি দুটি হুক সেট করার জন্য hooব্যবহার হিসাবে রফতানি করা হয় SetWindowHookEx, একটি WH_KEYBOARD_LLএবং একটি WH_GETMESSAGE... বাকিটি এমএসডিএন-তে বেশিরভাগ নথিভুক্ত হওয়া উচিত।
0xC0000022L

উইন্ডোজ 8 বা 10 এ এই অ্যাপ্লিকেশনটি ব্যবহার করবেন না
জেফ ল্যাঞ্জ

1

অন্য থ্রেডে একটি বিশ্বব্যাপী এনটি স্তরের কীবোর্ড হুকের উল্লেখ রয়েছে:

উইন্ডোজ লক করতে হটকি (উইন + এল) পুনরায় বরাদ্দ করুন / ওভাররাইড করুন

সম্ভবত আপনি সেই প্রক্রিয়াটির হ্যান্ডেল পেতে পারেন যা হুককে সেভাবে ডেকেছিল, যা আপনি প্রক্রিয়াটির নামটি সমাধান করতে পারেন

(অস্বীকৃতি: আমার বুকমার্কগুলিতে এটি ছিলাম, সত্যিই চেষ্টা / পরীক্ষিত হয়নি)


0

আমি জানি আপনি নিজের প্রসেসের মধ্যে যে কোনও উইন্ডোতে বার্তাগুলির প্রবাহকে বাধা দিতে পারেন - যা আমরা ভিবি 6-তে সাবক্লাসিং বলতাম। (যদিও আমি ফাংশনটি মনে রাখছি না, সম্ভবত সেটউইন্ডোলং?) আপনি নিজের প্রক্রিয়ার বাইরে উইন্ডোজের জন্য এটি করতে পারবেন কিনা তা সম্পর্কে আমি নিশ্চিত নই। তবে এই পোস্টের খাতিরে ধরে নিই যে আপনি এটি করার জন্য কোনও উপায় খুঁজে পাবেন। তারপরে আপনি কেবলমাত্র সমস্ত শীর্ষ স্তরের উইন্ডোজের বার্তাগুলি আটকাতে পারেন, ডাব্লুএমহটকি ম্যাসেজের জন্য মনিটর রাখতে পারেন। আপনি ব্যাটের সাথে সাথে সমস্ত কীগুলি জানতে সক্ষম হবেন না, তবে তারা চাপলে আপনি সহজেই বুঝতে পারবেন যে কোন অ্যাপ্লিকেশন সেগুলি ব্যবহার করছে। আপনি যদি নিজের ফলাফলগুলি ডিস্কে চালিয়ে যান এবং প্রতিবার আপনার মনিটরের অ্যাপ্লিকেশনটি চালিত হয় আপনি সময়ের সাথে সাথে আপনার অ্যাপ্লিকেশনটির কার্যকারিতা বাড়িয়ে তুলতে পারেন।


-1

এটি উইন্ডোজ এপিআই সম্পর্কিত প্রশ্নের অংশটির সঠিক উত্তর দেয় না, তবে এটি বিশ্বব্যাপী হটকি এবং তাদের "নিজস্ব" অ্যাপ্লিকেশনগুলির একটি তালিকা সম্পর্কিত প্রশ্নের অংশটির উত্তর দেয়।

Http://hkcmdr.anymania.com/ এ ফ্রি হটকি এক্সপ্লোরার সমস্ত বিশ্বব্যাপী হটকি এবং তাদের অ্যাপ্লিকেশনগুলির একটি তালিকা দেখায়। এটি কেবলমাত্র একটি অ্যাপ্লিকেশন-শর্টকাট কী কী কাজ বন্ধ করে দিয়েছে এবং কীভাবে এটি ঠিক করতে হয় তা নির্ধারণ করতে আমাকে সহায়তা করেছে (অ্যাপটিতে এটি নিবন্ধিত বিশ্বব্যাপী হটকি পুনরায় কনফিগার করে) এটি কয়েক সেকেন্ডের মধ্যে।


4
এটি ইনস্টল করা হয়েছে এবং এটি কমপক্ষে মল-অভিপ্রায় সহ একটি প্রোগ্রাম হিসাবে একটি খারাপ রসিকতার মতো একটি ভাইরাস হিসাবে কাজ করেছে। জানালার সব ধরনের খোলা, ভয়েস narator, ইত্যাদি সক্রিয়
Flion

3
@Flion: চালু আলোচনা দেখুন superuser.com/a/191090/3617 । মূলত, কিছু হটকি ইউটিলিটি প্রতিটি সম্ভাব্য কী সংমিশ্রণটি অনুসন্ধান করে কাজ করে। উইন্ডোজ 8+ এ (এবং উইন্ডোজ on-তে কিছুটা কম পরিমাণে), এই পরীক্ষামূলক কৌশলটি কেবল জিজ্ঞাসা না করে প্রতিটি মূল সংমিশ্রণকে ট্রিগার করে।
ব্রায়ান

@ ফ্লিয়ন এফডাব্লুআইডাব্লু, আমি এটি সাফল্যের সাথে উইন 7 এ ব্যবহার করেছি। তবে আমি যদি ব্রায়ানকে সঠিকভাবে বুঝতে পারি তবে এটি পরবর্তী সংস্করণগুলির সাথে ঠিক তেমন কাজ করতে পারে না এবং এটি কতটা ভাল কাজ করে তা সংজ্ঞায়িত কাস্টম হটকিগুলির উপরও নির্ভর করে।
জেরহার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.