চুরি ফোকাস থেকে অ্যাপ্লিকেশন প্রতিরোধ


191

সক্রিয় উইন্ডো থেকে অ্যাপ্লিকেশন চুরি ফোকাস প্রতিরোধের জন্য কি কোনও সমাধান আছে?

এটি বিশেষত বিরক্তিকর হয় যখন আমি কোনও অ্যাপ্লিকেশন শুরু করি, অন্য কিছু করতে স্যুইচ করি এবং নতুন অ্যাপ্লিকেশনটি পাঠ্যের অর্ধেক বাক্য পেতে শুরু করে।


9
@ আইভো উইন্ডোজ my আমার ক্ষেত্রে তবে আমি মনে করি সুপার ইউজারের জন্য সমস্ত উইন্ডোজ সংস্করণ প্রাসঙ্গিক হবে
and

3
মডারেটর এই প্রশ্নের সাথে একত্রীকরণ করেছে: সুপারইউস.আর.কশনস / ১৯৯৮২২ / the বর্তমান প্রশ্নের সাথে। এটি ভুল, বর্তমান প্রশ্নের উত্তর উইন্ডোজ 7-এ প্রযোজ্য নয়, সুতরাং এটি একীভূত হওয়া উচিত নয়। এখনও পর্যন্ত আমি উইন্ডোজ 7
অ্যালেক্স অ্যাঞ্জেলিকো

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

24
This is especially annoying when I'm starting an application, switch to do something else and the new application starts receiving half a sentence of text.কোনও ডায়ালগ পপ আপ হয়ে গেলে এটি আরও বিরক্তিকর হয় এবং আপনি অনিচ্ছাকৃতভাবে বার্তাটি না দেখেও খারিজ করে দেন কারণ আপনি চাপ দেওয়ার সময় Spaceবা Enterবাক্যটি টাইপ করার সময় ঘটেছিল ।
সিনেটেক

3
এটি আসলে বিরক্তির চেয়েও বেশি উপায়, আমি বলব এটি একটি সুরক্ষা ঝুঁকিপূর্ণ। আপনি যখন কোনও পাসওয়ার্ড টাইপ করার সময় এবং আপনার ইনপুটটি ধরার মাঝখানে থাকবেন তখন কোনও অ্যাপ্লিকেশন পপআপ বন্ধ করার কিছুই নেই।
ক্রিস ময়ূর

উত্তর:


51

উইন্ডোজ ইন্টার্নালগুলির বিস্তৃত হেরফের ছাড়া এটি সম্ভব নয় এবং আপনার এটি সরিয়ে নেওয়া দরকার।

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

প্রতিটি বিষয় বিকাশকারী যখন এই বিষয় আসে তখন সঠিক সিদ্ধান্ত নেয় না।

আমি জানি যে এটি খুব হতাশাব্যঞ্জক এবং বিরক্তিকর, তবে আপনি নিজের পিষ্টক রাখতে এবং এটি খেতেও পারবেন না। আপনার প্রতিদিনের জীবন জুড়ে সম্ভবত এমন অনেকগুলি ঘটনা রয়েছে যেখানে নির্দিষ্ট UI উপাদান বা ফোকাসটি এতে লক থাকে বলে আবেদন করার জন্য আপনি পুরোপুরি ঠিক আছেন। এখনই নেতৃত্ব কে এবং সিস্টেম কখনই নিখুঁত হতে পারে না তা সিদ্ধান্ত নেওয়ার ক্ষেত্রে বেশিরভাগ অ্যাপ্লিকেশন কিছুটা সমান।

কিছুক্ষণ আগে আমি একবার এবং সকলের জন্য এই সমস্যাটি সমাধান করার বিষয়ে ব্যাপক গবেষণা করেছি (এবং ব্যর্থ হয়েছিল)। আমার গবেষণার ফলাফলটি বিরক্তি প্রকল্পের পৃষ্ঠায় পাওয়া যাবে ।

প্রকল্পটিতে এমন একটি অ্যাপ্লিকেশন অন্তর্ভুক্ত রয়েছে যা বারবার ফোন করে ফোকাস দখল করার চেষ্টা করে:

switch( message ) {
  case WM_TIMER:
    if( hWnd != NULL ) {
      // Start off easy
      // SetForegroundWindow will not move the window to the foreground,
      // but it will invoke FlashWindow internally and, thus, show the
      // taskbar.
      SetForegroundWindow( hWnd );

      // Our application is awesome! It must have your focus!
      SetActiveWindow( hWnd );

      // Flash that button!
      FlashWindow( hWnd, TRUE );
    }
    break;

যেহেতু আমরা এই স্নিপেট থেকে দেখতে পাচ্ছি, আমার গবেষণাটি আমার পছন্দ না হওয়া ব্যবহারকারীর ইন্টারফেস আচরণের অন্যান্য দিকগুলিতেও নিবদ্ধ ছিল।

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

#include "stdafx.h"
#include "mhook-2.2/mhook-lib/mhook.h"

typedef NTSTATUS( WINAPI* PNT_QUERY_SYSTEM_INFORMATION ) ( 
  __in       SYSTEM_INFORMATION_CLASS SystemInformationClass,     
  __inout    PVOID SystemInformation, 
  __in       ULONG SystemInformationLength, 
  __out_opt  PULONG ReturnLength    
);

// Originals
PNT_QUERY_SYSTEM_INFORMATION OriginalFlashWindow   = 
  (PNT_QUERY_SYSTEM_INFORMATION)::GetProcAddress( 
  ::GetModuleHandle( L"user32" ), "FlashWindow" );

PNT_QUERY_SYSTEM_INFORMATION OriginalFlashWindowEx = 
  (PNT_QUERY_SYSTEM_INFORMATION)::GetProcAddress( 
  ::GetModuleHandle( L"user32" ), "FlashWindowEx" );

PNT_QUERY_SYSTEM_INFORMATION OriginalSetForegroundWindow = 
  (PNT_QUERY_SYSTEM_INFORMATION)::GetProcAddress( 
  ::GetModuleHandle( L"user32" ), "SetForegroundWindow" );

// Hooks
BOOL WINAPI
HookedFlashWindow(
  __in  HWND hWnd,
  __in  BOOL bInvert
  ) {
  return 0;
}

BOOL WINAPI 
HookedFlashWindowEx(
  __in  PFLASHWINFO pfwi
  ) {
  return 0;
}

BOOL WINAPI 
HookedSetForegroundWindow(
  __in  HWND hWnd
  ) {
  // Pretend window was brought to foreground
  return 1;
}


BOOL APIENTRY 
DllMain( 
  HMODULE hModule,
  DWORD   ul_reason_for_call,
  LPVOID  lpReserved
  ) {
  switch( ul_reason_for_call ) {
    case DLL_PROCESS_ATTACH:
      Mhook_SetHook( (PVOID*)&OriginalFlashWindow,         HookedFlashWindow );
      Mhook_SetHook( (PVOID*)&OriginalFlashWindowEx,       HookedFlashWindowEx );
      Mhook_SetHook( (PVOID*)&OriginalSetForegroundWindow, HookedSetForegroundWindow );
      break;

    case DLL_PROCESS_DETACH:
      Mhook_Unhook( (PVOID*)&OriginalFlashWindow );
      Mhook_Unhook( (PVOID*)&OriginalFlashWindowEx );
      Mhook_Unhook( (PVOID*)&OriginalSetForegroundWindow );
      break;
  }
  return TRUE;
}

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

মূলত, এটি দুর্দান্ত কাজ করে। তবে আমি কখনই এমন কিছু লেখার সময় পাইনি যা আমার ডিএলএলকে নতুন প্রক্রিয়াগুলিতে সঠিকভাবে সংক্রামিত করে। এবং এতে ব্যয় করা সময়টি মূলত বিরক্তিকে ছাপিয়ে যায় ফোকাস চুরিটি আমার জন্য কারণ।

ডিএলএল ইনজেকশন সমস্যা ছাড়াও, এখানে একটি ফোকাস-চুরির পদ্ধতি রয়েছে যা আমি গুগল কোডে প্রয়োগের ক্ষেত্রে কভার করি নি। একজন সহকর্মী আসলে কিছু অতিরিক্ত গবেষণা করেছিলেন এবং সেই পদ্ধতিটি methodেকে রেখেছিলেন। সমস্যাটি নিয়ে আলোচনা করা হয়েছিল এসও: https://stackoverflow.com/questions/7430864/windows-7-prevent-application-from-losing-foc


আপনি কি মনে করেন যে আপনার এই সমাধানটি জাভাতে পোর্ট করা যেতে পারে? আমি অনুসন্ধান করে জিজ্ঞাসা করেছি কিন্তু কিছুই পাইনি। আমি জাভা ব্যবহার করে হুক লাইব্রেরি নিজেই আমদানি করতে পারি jne?
টমো জাটো

@ টমজাটো: ধারণা নেই। আমি নিজে এই কোডটি সক্রিয়ভাবে ব্যবহার করছি না।
ডের হচস্টাপলার

আমি এটিকে কমপক্ষে সি ++ হিসাবে সংকলনের চেষ্টা করছি (এবং তারপরে জাভা থেকে সংকলিত ডিএলএল ইনজেকশন / মুছে ফেলুন)। কিন্তু এটি খুব ভাল যায় না। আমি এখানে মন্তব্যগুলিতে এটি নিয়ে আলোচনা করতে চাই না, তবে আপনি যদি এটির কাজটি করতে আসলে আমাকে সহায়তা করতে পারতেন তবে আমি খুব কৃপণ হয়ে উঠতাম! আমি একটি চ্যাট রুম তৈরি করা যদি আমি যে কাজ আমি মন্তব্য পোষ্ট কিভাবে তাই এখানে করতে হবে তা পেতে: chat.stackexchange.com/rooms/21637/...
Tomáš Zato

23

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

যাইহোক, ডকুমেন্টেশনগুলি সফল হয় এবং তারা একে অপরকে তাড়া করে এবং এর আশেপাশের উপায়গুলি সন্ধান করে

সুতরাং, এখানে কিছু বগী SetForegroundWindowবা একই জাতীয় এপিআই ফাংশন চলছে ...

এটি সঠিকভাবে করার একমাত্র উপায় হ'ল একটি ছোট অ্যাপ্লিকেশন করা যা পর্যায়ক্রমে কল করে LockSetForegroundWindow, আমাদের বগি এপিআই ফাংশনে কার্যত কোনও কল অক্ষম করে।

যদি এটি পর্যাপ্ত না হয় (অন্য বগি এপিআই কল?) আপনি আরও এগিয়ে যেতে পারেন এবং যা চলছে তা দেখতে কিছু API মনিটরিং করতে পারেন, এবং তারপরে আপনি কেবল প্রতিটি প্রক্রিয়াতে API কলগুলি হুক করতে পারেন যার পরে যে কোনও কল থেকে আপনি মুক্তি পেতে পারেন অগ্রভাগ। যাইহোক, মজার বিষয় হল, এটি মাইক্রোসফ্ট দ্বারা নিরুৎসাহিত করেছে ...


3
উইন্ডোজ in এ কারও কি পুনরুত্পাদনযোগ্য ব্যবহারের কেস রয়েছে? লোকেরা বরং বিপরীত অভিজ্ঞতা দেয় (উদাহরণস্বরূপ, আমি প্রায়শই উইন্ডোজকে আমার বর্তমান উইন্ডোটির আড়ালে লুকিয়ে রাখার দাবি করি) এবং উইন্ডোজ in এ আমি এখনও এটি দেখতে পাইনি, একটি অ্যাপ্লিকেশন লিখতে পেরে খুব বিরক্তিকর হবে তবে তা অক্ষম হয়ে পড়েছে এটা পরীক্ষা করো. অধিকন্তু, মাইক্রোসফ্ট যেমন বলেছে যে এটি উইন্ডোজ with এর সাথে আর ঘটবে না best সর্বোপরি লোকেরা আবিষ্কার করেছিল যে এটি কেবল দুর্ঘটনার দ্বারা কীবোর্ডের ফোকাসটি স্যুইচ করতে পারে, এই এপিআই কলটি ঠিক করবে তবে এটি কীভাবে এটি পরীক্ষা করে তা পরীক্ষা করতে জানি না .. ।
তামারা উইজসম্যান

1
ইনস্টলারটি (ইনোসেটআপের ভিত্তিতে) অন্যান্য প্রক্রিয়া এবং সম্ভাব্য অন্যান্য (লুকানো) সেটআপ চালু করে, তবে তারা কী সেটআপ স্রষ্টাকে ভিত্তি করে করছে তা আমি জানি না।
ড্যানিয়েল বেক

6
@ টমউইজসম্যান: রিজেডিট খুলুন, এমন কিছু এলোমেলো পাঠ্যের সন্ধান করুন যা পাওয়া যাবে না। অন্য অ্যাপে যান এবং টাইপ করা শুরু করুন start অনুসন্ধান শেষ হয়ে গেলে, রিজেডিট ফোকাসটি চুরি করবে।
এন্ডোলিথ

1
@ এন্ডোলিথ: পুনরুত্পাদনযোগ্য নয়, যদিও উইন্ডোজ 8 রিপ্লেজ পূর্বরূপ এখানে ব্যবহার করুন। আপনি কোন ওএস ব্যবহার করছেন? আমার ক্ষেত্রে এটি কেবল নীচের অংশে অ্যাপ্লিকেশনটি হাইলাইট করে তবে আমার ব্রাউজিংয়ে মোটেই বাধা দেয় না ...
তমারা উইজসম্যান

21
হ্যাঁ, Win7 প্রো 64-বিট। এবং ফোকাস চুরি উন্নত প্রক্রিয়াগুলির জন্য আরও খারাপ, যেহেতু তারা আপনার চাপ টি <কন্ট্রোল> ক্যাপচার করার সময় ক্যাপচার করে এবং আপনি এটিকে ঘটনাক্রমে আপনার সিস্টেমে হোস্ট করতে বলছেন। কিছুই কখনও ফোকাস চুরি করতে সক্ষম হওয়া উচিত ।
এন্ডোলিথ

18

টুইটসইউআইতে একটি বিকল্প রয়েছে যা এটি করে। এটি সন্দেহজনক সফটওয়্যার বিকাশকারীদের তাদের অ্যাপ্লিকেশনে ফোকাস জোর করার জন্য নিয়োগ করা সাধারণ কৌশলগুলি থেকে বেশিরভাগটিকে প্রতিরোধ করে।

যদিও এটি একটি চলমান অস্ত্র যুদ্ধ, সুতরাং আমি জানি না যে এটি সব কিছুর জন্য কাজ করে।

আপডেট : মতে EndangeredMassa , TweakUI উইন্ডোজ 7 এ কাজ করে না।


2
উইন্ডোজ with এর সাথে কি সামঞ্জস্যপূর্ণ টুইটকুই?
ফ্র্যাঙ্কস্টার

@frankster। কোন ধারণা নেই, দুঃখিত, আমি সম্ভবত এটি সম্ভবত না। এটি ডাউনলোড করুন এবং চেষ্টা করুন। আপনি যদি এমনটি করেন তবে প্রত্যুত্তরে রিপোর্ট করুন everyone
সাইমন পি স্টিভেনস

5
এমনকি টুইটসইউআই সেটগুলি রেজিস্ট্রি সেটিংটি উইন 7 এ কাজ করে না।
বিপন্নমাসা

@ এন্ডেজার্ডমাসা কোন রেজিস্ট্রি কী তা?
n611x007

2
রেজিস্ট্রি কী হ'ল HKEY_CURRENT_USER \ কন্ট্রোল প্যানেল \ ডেস্কটপ \ ফোরগ্রাউন্ডলকটাইমআউট (মিলিসেকেন্ডে)। এবং হ্যাঁ, এটি উইন্ডোজ 7 এ আর কাজ করে না।
foo

14

আমি বিশ্বাস করি যে "স্টিলিং ফোকাস" এর দুটি উপায় রয়েছে বলে কিছু বিভ্রান্তি থাকতে পারে: (1) অগ্রভাগে একটি উইন্ডো এবং (2) উইন্ডো কীস্ট্রোক গ্রহণ করে।

এখানে উল্লিখিত সমস্যাটি সম্ভবত দ্বিতীয়টি, যেখানে একটি উইন্ডোজ ব্যবহারকারীর অনুরোধ বা অনুমতি ব্যতিরেকে - নিজেকে সম্মুখের দিকে নিয়ে এসে ফোকাস দাবি করে।

এক্সপি এবং 7 এর মধ্যে এখানে আলোচনাটি বিভক্ত করতে হবে।

উইন্ডোজ এক্সপি

এক্সপিতে একটি রেজিস্ট্রি হ্যাক রয়েছে যা অ্যাপ্লিকেশনগুলি চুরির ফোকাস থেকে আটকাতে এক্সপি উইন্ডোজ 7 এর মতোই কাজ করে:

  1. যেতে regedit ব্যবহার করুন: HKEY_CURRENT_USER\Control Panel\Desktop
  2. ডাবল ক্লিক করুন ForegroundLockTimeoutএবং তার মান হেক্সাডেসিমালে সেট করুন 30d40
  3. ওকে চাপুন এবং রিজেডিট থেকে প্রস্থান করুন।
  4. পরিবর্তনগুলি কার্যকর হওয়ার জন্য আপনার পিসিটি পুনরায় বুট করুন।

উইন্ডোজ 7

(নীচের আলোচনাটি বেশিরভাগ এক্সপি-তেও প্রযোজ্য))

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

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

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

আপনি ভিবি কোডে অন্তর্ভুক্ত থাকা ভিবিএস স্ক্রিপ্টটি ব্যবহার করতে পারেন যা চুরির ফোকাসটি চিহ্নিত করে, যা লেখক একজন প্রিন্টার সফ্টওয়্যারটির জন্য "কল হোম" আপডেটকারী হিসাবে অপরাধীকে সনাক্ত করতে ব্যবহার করেছিলেন।

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

হতাশা ক্রমানুসারে গত ধারণা যেমন একটি পণ্য ব্যবহার করে কার্যত আপনার ডেস্কটপে ফাটল হয় ডেস্কটপ বা Dexpot এবং ডিফল্ট চেয়ে অন্য ডেস্কটপে আপনার কাজ।

[Edit]

মাইক্রোসফ্ট আর্কাইভ গ্যালারী থেকে অবসর গ্রহণ করায়, উপরের ভিবি কোডটি পুনরায় উত্পাদিত হয়েছে:

Declare Auto Function GetForegroundWindow Lib "user32.dll" () As Integer
Declare Auto Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Integer, ByRef procid As Integer) As UInteger

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.RichTextBox1.AppendText("Starting up at " & Now & vbCrLf)
    End Sub

    Private Sub GoingAway(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Deactivate, Me.LostFocus

        Dim hwnd As Integer = GetForegroundWindow()
        ' Note that process_id will be used as a ByRef argument
        ' and will be changed by GetWindowThreadProcessId
        Dim process_id As Integer = 1
        GetWindowThreadProcessId(hwnd, process_id)

        If (process_id <> 1) Then
            Dim appExePath As String = Process.GetProcessById(process_id).MainModule.FileName() 
            Me.RichTextBox1.AppendText("Lost focus at " & Now & " due to " & appExePath & vbCrLf)
        Else
            Me.RichTextBox1.AppendText("Lost focus due to unknown cause.")
        End If

    End Sub

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

1
"যদি এই উইন্ডোটি অবরুদ্ধ থাকে তবে আপনি কখনই বুঝতে পারবেন না কেন অনুলিপিটি কখনই বন্ধ হয় না" এটি সত্য নয়। সঠিক আচরণটি হ'ল ব্ল্যাকিং টাস্ক বার আইকনটি দিয়ে ব্যবহারকারীকে অবহিত করা ... এমন সময় এসেছে যখন আমি চলমান প্রোগ্রামে একটি বোতাম বা কিছু ক্লিক করেছি যা একটি নতুন মডেল ডায়ালগ তৈরি করার কারণ তৈরি করে (যেমন, ফাইলটি ওপেন করুন ) তবে তারপরে ডায়ালগটি তৈরি হওয়ার আগে আমি অন্য প্রোগ্রামে স্যুইচ করি। ফলস্বরূপ, ডায়লগটি গোপন থাকে এবং অন্য প্রোগ্রামটি স্যুইচ করা যায় না এবং ডায়ালগটি খারিজ করা যায় না। এর টাস্কবার বাটন বা Alt-Tabকাজ করে না; ডায়ালগটি কেবল সামনে চাপিয়ে দেওয়া হচ্ছে।
সিনিটেক

1
@ সাইনটেক: কখনও কখনও নন-ফ্রন্ট ডায়ালগের একমাত্র সমাধান হ'ল টাস্কটি মেরে ফেলা। উইন্ডোজের ফোকাস অ্যালগরিদমগুলি সত্যই লম্পট।
harrymc

2
@harrymc, আমাকে কোনও অ্যাপ্লিকেশন হত্যার উপায় অবলম্বন করতে হবে না। আমি কেবল আমার উইন্ডো-ম্যানিপুলেটিং প্রোগ্রামটি চালাচ্ছি ( উইনএসপি ++ কৌশলটি দুর্দান্তভাবে সম্পাদন করে) এবং সামনে উইন্ডোটি আড়াল করে রাখি, তারপরে আমি আটকে থাকা ডায়ালগটি খারিজ করতে পারি, তারপরে লুকানো উইন্ডোটি আবার দেখাতে পারি। এটি সুবিধাজনক নয়, তবে উভয় প্রক্রিয়া হত্যার চেয়ে এটি ভাল।
সিনিটেক

1
@harrymc, সত্যিই নয়; একটি অ্যাপ্লিকেশন হত্যা এবং জিনিস হারাতে কেবল আরও বাষ্প তৈরি হয়, এবং যদি এটি একটি মডেল ডায়ালগ হয় (যা প্যারেন্ট উইন্ডোটি লক করে এবং কোনও টাস্কবারের বোতাম না থাকে), তবে এটি Alt+Tabতালিকায় উপস্থিত হবে না এবং, আমার অভিজ্ঞতাতে, একটি উইন্ডো যা একটি মোডাল ডায়লগ খোলা থাকে (সর্বদা না?) সর্বদা মডেল ডায়ালগটি প্রদর্শন করে না Alt+Tab, বিশেষত যদি ডায়ালগটির ফোকাস পেতে কোনও পরিবর্তন হয় না। :-|
সিনিটেক

2

গ্যাকগুলির একটি সম্ভাব্য সমাধান রয়েছে:

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

প্রো পর্যালোচক ওয়েবসাইট কিভাবে এরকম হওয়া থেকে প্রতিরোধ করতে একটি টিপ হয়েছে। ফোকাস চুরি রোধ করার সহজতম উপায় হ'ল টিউক ইউআই ব্যবহার করা যা একটি সেটিং রয়েছে যা "চুরির ফোকাস থেকে অ্যাপ্লিকেশনগুলি প্রতিরোধ করুন" নামে পরিচিত। এই বিকল্পটি যাচাই করা বাধা দেয় যে অন্যান্য অ্যাপ্লিকেশনগুলি হঠাৎ পপআপ হয়ে যায় এবং আপনি যে উইন্ডোটিতে কাজ করছেন তার ফোকাসটি চুরি করে।

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

রেজিস্ট্রি কীতে নেভিগেট করুন HKEY_CURRENT_USER> কন্ট্রোল প্যানেল> ডেস্কটপ এবং ফোরগ্রাউন্ডলকটাইমআউট মান 30d40 (হেক্সাডেসিমাল) বা 200000 (দশমিক) এ পরিবর্তন করুন। ফোরগ্রাউন্ডফ্ল্যাশকাউন্ট কীটি ব্যবহারকারীকে সতর্ক করতে উইন্ডোটির ফ্ল্যাশগুলির পরিমাণ নির্ধারণ করে যেখানে 0 এর অর্থ সীমাহীন।


20
এটি এক্সপি-র পরে কোনও ওএসে কাজ করে না। এই রেজিস্ট্রি মান ইতিমধ্যে সেট করা হয়েছে (ডিফল্ট হিসাবে, আমি বিশ্বাস করি) এবং যাইহোক কাজ করে না।
বিপন্নমাসা

1
দ্বিতীয় যে আমি উইন্ডোজ on (64৪-বিট) এ আছি, ফোকাস-চুরির অভিজ্ঞতা অর্জন করছি (শেষ অবধি সক্রিয় যখন ভিএস 2012), এবং উপরের রেজিস্ট্রি-পরামর্শটি ইতিমধ্যে স্থানে রয়েছে। এই উত্তরে প্রযুক্তিগত নিশ্চয়তা: superuser.com/a/403554/972
মাইকেল পাউলুকোনিস

2

ডের হচস্টাপলারের জবাব থেকে অনুপ্রাণিত হয়ে আমি একটি ডিএলএল ইনজেক্টর লেখার সিদ্ধান্ত নিয়েছি, যা 64৪ এবং 32-বিট উভয় প্রসেসের সাথে কাজ করে এবং উইন্ডোজ 7 বা আরও নতুনতে ফোকাস চুরি রোধ করে: https://blade.sk/stay-focused/

এটি যেভাবে কাজ করে তা হ'ল এটি সদ্য নির্মিত উইন্ডোগুলির জন্য (ব্যবহার করা SetWinEventHook) নজর রাখে এবং ডিআরএলটিকে ডায়ার হচস্টাপলার এর অনুরূপ উইন্ডোটির প্রসেসের সাথে ইতিমধ্যে উপস্থিত না থাকলে ইনজেক্ট করে । এটি ডিএলএলগুলি আনলোড করে এবং প্রস্থান করার সময় মূল কার্যকারিতা পুনরুদ্ধার করে।

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

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


0

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

"সিস্টেমটি সীমাবদ্ধ করে যে কোন প্রক্রিয়াগুলি অগ্রভাগ উইন্ডোটি সেট করতে পারে A একটি প্রক্রিয়া কেবলমাত্র পূর্ববর্তী উইন্ডোটি সেট করতে পারে যদি নিম্নলিখিত শর্তগুলির মধ্যে একটি সত্য হয়:

  • প্রক্রিয়াটি অগ্রভাগ প্রক্রিয়া।
  • অগ্রভাগ প্রক্রিয়া দ্বারা প্রক্রিয়া শুরু হয়েছিল।
  • প্রক্রিয়াটি সর্বশেষ ইনপুট ইভেন্ট পেয়েছিল।
  • কোনও অগ্রভাগ প্রক্রিয়া নেই।
  • অগ্রভাগ প্রক্রিয়া ডিবাগ করা হচ্ছে।
  • অগ্রভাগ লক করা হয়নি (লকসেটফোরগ্রাউন্ড উইন্ডো দেখুন)।
  • অগ্রভাগ লক টাইম আউট এর মেয়াদ শেষ হয়ে গেছে (সিস্টেমপ্যারামিটারআইআইএনফো-তে SPI_GETFOREGROUNDLOCKTIMEOUT দেখুন)।
  • কোনও মেনু সক্রিয় নেই।

https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-allowsetforegroundwindow

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

স্পষ্টতই, এটি দুটি প্রক্রিয়ার মধ্যে কিছু সমন্বয় প্রয়োজন, তবে এটি কার্যকর হয় এবং আপনি যদি এমন একক-ইনস্টল অ্যাপ্লিকেশন প্রয়োগ করতে যা এটি সমস্ত অ্যাপ্লিকেশন -ক্লিক লঞ্চগুলিকে বিদ্যমান অ্যাপ্লিকেশনটিতে পুনঃনির্দেশ করে, তবে আপনি ইতিমধ্যে যাইহোক জিনিস সমন্বয় করতে একটি (যেমন) নামের পাইপ রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.