फोकस चुराने से अनुप्रयोगों को रोकना


191

क्या सक्रिय विंडो से फ़ोकस चुराने वाले अनुप्रयोगों को रोकने के लिए कोई समाधान है?

यह विशेष रूप से कष्टप्रद है जब मैं एक आवेदन शुरू कर रहा हूं, तो कुछ और करने के लिए स्विच करें और नया एप्लिकेशन पाठ का आधा वाक्य प्राप्त करना शुरू कर देता है।


9
@ मेरे विंडोज 7 मेरे मामले में, लेकिन मुझे लगता है कि SuperUser के लिए सभी विंडोज़ संस्करण प्रासंगिक होंगे
svandragt

3
मॉडरेटर ने इस प्रश्न को विलय कर दिया: सुपरयूज़र . com /questions/ 199821/… वर्तमान के साथ। यह गलत है, वर्तमान प्रश्न का उत्तर विंडोज 7 पर लागू नहीं होता है, इसलिए इसे विलय नहीं किया जाना चाहिए। अब तक मुझे विंडोज 7 में इस समस्या का हल नहीं मिला
एलेक्स एंजेलिको

17
यह मेरे द्वारा इस्तेमाल किए गए हर GUI के साथ मेरे नंबर एक पालतू जानवरों में से एक है। आप टाइप कर रहे हैं और ब्लाॅम कर रहे हैं, कुछ ब्लिपिंग डायलॉग बॉक्स फोकस चुरा लेते हैं और आपके आधे कीस्ट्रोक्स कहीं और चले जाते हैं। आपको लगता है कि विंडिंग सिस्टम के कार्यान्वयनकर्ताओं ने एक दशक पहले यह पता लगा लिया होगा। यदि किसी विंडो में गतिविधि है, तो नई विंडो के प्रदर्शन में देरी करें। उदाहरण के लिए, अंतिम बटन पर क्लिक करने या वर्तमान में केंद्रित विंडो में कीस्ट्रोक से तीन या चार सेकंड तक जीयूआई पर कुछ भी पॉप न करें। रवींद्र!
काज

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हुए थे।
Synetech

3
यह वास्तव में कष्टप्रद से अधिक रास्ता है, मैं कहूंगा कि यह एक सुरक्षा जोखिम है। जब आप पासवर्ड टाइप करने और अपने इनपुट को हथियाने के बीच में हों तो पॉप अप को रोकने के लिए कुछ भी नहीं है।
क्रिस पीकॉक

जवाबों:


51

विंडोज इंटर्नल्स के व्यापक हेरफेर के बिना यह संभव नहीं है और आपको इसे खत्म करने की आवश्यकता है।

दैनिक कंप्यूटर उपयोग में कुछ क्षण आते हैं जब यह वास्तव में महत्वपूर्ण होता है कि आप ऑपरेटिंग सिस्टम को एक और करने से पहले एक कार्रवाई करें। ऐसा करने के लिए, इसे कुछ खिड़कियों पर अपना ध्यान केंद्रित करने की आवश्यकता है। विंडोज में, इस व्यवहार पर नियंत्रण काफी हद तक आपके द्वारा उपयोग किए जाने वाले व्यक्तिगत कार्यक्रमों के डेवलपर्स के लिए छोड़ दिया जाता है।

प्रत्येक डेवलपर इस विषय पर आने पर सही निर्णय नहीं लेता है।

मुझे पता है कि यह बहुत निराशाजनक और कष्टप्रद है, लेकिन आप अपना केक नहीं खा सकते हैं और इसे भी खा सकते हैं। आपके दैनिक जीवन में संभवत: ऐसे कई मामले हैं, जहाँ आप ध्यान केंद्रित करने के साथ पूरी तरह से ठीक हैं, एक निश्चित यूआई तत्व या एक आवेदन के लिए स्थानांतरित किया जा रहा है जो यह अनुरोध करता है कि फोकस उस पर लॉक रहे। लेकिन ज्यादातर एप्लिकेशन कुछ हद तक बराबर होते हैं जब यह तय करने की बात आती है कि अभी लीड कौन है और सिस्टम कभी परफेक्ट नहीं हो सकता।

कुछ समय पहले मैंने इस मुद्दे को एक बार और सभी (और असफल) को हल करने पर गहन शोध किया था। मेरे शोध का परिणाम झुंझलाहट परियोजना पृष्ठ पर पाया जा सकता है ।

प्रोजेक्ट में एक एप्लिकेशन भी शामिल है जो बार-बार कॉल करके ध्यान खींचने की कोशिश करता है:

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;

जैसा कि हम इस स्निपेट से देख सकते हैं, मेरा शोध भी उपयोगकर्ता इंटरफ़ेस व्यवहार के अन्य पहलुओं पर केंद्रित था जो मुझे पसंद नहीं है।

जिस तरह से मैंने इसे हल करने की कोशिश की वह हर नई प्रक्रिया में एक डीएलएल को लोड करने और एपीआई कॉल को हुक करने के लिए है जिससे एक और खिड़कियां सक्रिय हो जाती हैं।
अंतिम भाग एक आसान है, भयानक एपीआई हुकिंग पुस्तकालयों के लिए धन्यवाद। मैं बहुत महान mhook पुस्तकालय का इस्तेमाल किया :

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

मेरे परीक्षणों के बाद से, इसने बहुत अच्छा काम किया। हर नई प्रक्रिया में DLL को लोड करने के हिस्से को छोड़कर। जैसा कि कोई कल्पना कर सकता है, यह बहुत हल्के में लेने के लिए कुछ भी नहीं है। मैंने तब AppInit_DLLs दृष्टिकोण का उपयोग किया (जो कि बस पर्याप्त नहीं है)।

असल में, यह बहुत अच्छा काम करता है। लेकिन मुझे कभी भी ऐसा कुछ लिखने का समय नहीं मिला जो मेरे DLL को नई प्रक्रियाओं में ठीक से इंजेक्ट करता हो। और इसमें निवेश किया गया समय काफी हद तक झुंझलाहट का कारण बनता है, जिस पर ध्यान केंद्रित करने का कारण बनता है।

DLL इंजेक्शन की समस्या के अलावा, एक फोकस-चोरी विधि भी है जिसे मैंने Google कोड पर कार्यान्वयन में शामिल नहीं किया था। एक सहकर्मी ने वास्तव में कुछ अतिरिक्त शोध किया और उस पद्धति को कवर किया। समस्या पर SO पर चर्चा की गई: https://stackoverflow.com/questions/7430864/windows-7-prevent-application-from-losing-focus


क्या आपको लगता है कि आपका यह समाधान जावा में पोर्ट किया जा सकता है? मैं खोज रहा हूं और सवाल पूछ रहा हूं लेकिन कुछ नहीं मिला। शायद मैं java का उपयोग करके स्वयं हुक लाइब्रेरी आयात कर सकता हूं jne?
टॉमेज़ ज़ाटो

@ TomášZato: कोई विचार नहीं। मैं स्वयं इस कोड का सक्रिय रूप से उपयोग नहीं कर रहा हूं।
डेर होकस्टाप्लर 15

मैं इसे कम से कम C ++ के रूप में संकलित करने की कोशिश कर रहा हूं (और फिर जावा से संकलित DLL को इंजेक्ट / हटा सकता हूं)। लेकिन वह बहुत अच्छी तरह से नहीं जाता है। मैं यहाँ टिप्पणियों में इसकी चर्चा नहीं करना चाहता, लेकिन अगर आप वास्तव में इसे काम में लाने में मेरी मदद कर सकते हैं, तो मैं बहुत अनुग्रहित होऊंगा! मैंने एक चैट रूम बनाया, अगर मुझे वह काम मिलता है तो मैं टिप्पणी करूँगा कि मैं यहाँ कैसे करूँ: chat.stackexchange.com/rooms/21637/…
Tomáš Zato

23

विंडोज 7 में, ForegroundLockTimeoutरजिस्ट्री प्रविष्टि की जांच नहीं की जाती है, आप इसे प्रोसेस मॉनिटर के साथ सत्यापित कर सकते हैं। वास्तव में, विंडोज 7 में वे आपको अग्रभूमि की खिड़की को बदलने से रोकते हैं। जाओ और इसके विवरण के बारे में पढ़ें , यह विंडोज 2000 के बाद से यहां तक ​​है।

हालाँकि, दस्तावेज़ीकरण बेकार है और वे एक दूसरे का पीछा करते हैं और उसके चारों ओर तरीके ढूंढते हैं

तो, वहाँ कुछ छोटी गाड़ी है SetForegroundWindow, या इसी तरह के एपीआई कार्यों के साथ ...

वास्तव में इसे ठीक से करने का एकमात्र तरीका एक छोटा अनुप्रयोग है जो समय-समय पर कॉल करता है LockSetForegroundWindow, वस्तुतः हमारे छोटी गाड़ी एपीआई फ़ंक्शन को किसी भी कॉल को अक्षम करता है।

यदि यह पर्याप्त नहीं है (एक और छोटी गाड़ी एपीआई कॉल?) आप आगे भी जा सकते हैं और कुछ एपीआई निगरानी कर सकते हैं कि क्या चल रहा है, और फिर आप बस हर प्रक्रिया पर एपीआई कॉल को हुक करते हैं जिसके बाद आप किसी भी कॉल से छुटकारा पा सकते हैं जो गड़बड़ करते हैं अग्रभूमि। हालाँकि, विडंबना यह है कि यह Microsoft द्वारा हतोत्साहित किया गया है ...


3
क्या किसी के पास विंडोज 7 में इसका एक प्रतिलिपि प्रस्तुत करने योग्य उपयोग मामला है? यह देखते हुए कि लोग इसके विपरीत अनुभव करते हैं (उदाहरण के लिए, मैं अक्सर विंडोज को अपनी वर्तमान विंडो के पीछे छिपाए जाने की मांग करता हूं) और यह कि मुझे विंडोज 7 में ऐसा होना अभी बाकी है, एक आवेदन लिखना बहुत कष्टप्रद होगा, लेकिन इसमें असमर्थ होना झसे आज़माओ। इसके अलावा, जैसा कि Microsoft बताता है कि यह विंडोज 7 के साथ नहीं होना चाहिए। सबसे अच्छे लोगों ने पाया कि यह केवल कीबोर्ड के फोकस को गलती से स्विच कर सकता है, यह एपीआई कॉल को ठीक कर देगा, लेकिन मुझे नहीं पता कि यह परीक्षण करना है कि क्या यह वास्तव में काम करता है .. ।
तमारा विज्समैन

1
इंस्टॉलर (InnoSetup पर आधारित) अन्य प्रक्रियाओं और संभव अन्य (छिपे हुए) सेटअप लॉन्च करता है, लेकिन मुझे नहीं पता कि वे किस सेटअप निर्माता पर आधारित हैं।
डैनियल बेक

6
@TomWijsman: ओपन रीजीडिट, कुछ यादृच्छिक पाठ की खोज करें जो नहीं मिलेंगे। दूसरे ऐप में जाएं और टाइप करना शुरू करें। जब खोज समाप्त हो जाती है, तो regedit फोकस चुरा लेगा।
एंडोलिथ

1
@endolith: नहीं बल्कि प्रतिलिपि प्रस्तुत करने योग्य है, हालांकि यहां विंडोज 8 रेप्लस पूर्वावलोकन का उपयोग किया गया है। आप कौन सा ओएस उपयोग कर रहे हैं? मेरे मामले में यह केवल नीचे दिए गए एप्लिकेशन को हाइलाइट करता है, लेकिन मेरे ब्राउज़िंग को बिल्कुल भी बाधित नहीं करता है ...
तमारा विज्समैन

21
हां, विन 7 प्रो 64-बिट। और ध्यान केंद्रित करना ऊंचे स्तर की प्रक्रियाओं के लिए और भी बदतर है, क्योंकि वे आपके दबाने पर कब्जा करते हैं <Enter> जब वे नहीं करना चाहिए, और आप इसे गलती से अपने सिस्टम को नली करने के लिए कहते हैं। कुछ भी कभी भी ध्यान चोरी करने में सक्षम नहीं होना चाहिए ।
एंडोलिथ

18

TweakUI में एक विकल्प है जो ऐसा करता है। यह अधिकांश सामान्य ट्रिक्स को रोकता है संदिग्ध सॉफ़्टवेयर डेवलपर अपने ऐप पर ध्यान केंद्रित करने के लिए काम करते हैं।

हालांकि यह एक हथियार चलाने का युद्ध है, इसलिए मुझे नहीं पता कि यह सब कुछ काम करता है या नहीं।

अद्यतन : लुप्तप्राय माँ के अनुसार , TweakUI विंडोज 7 पर काम नहीं करता है।


2
विंडोज 7 के साथ tweakui संगत है?
फ्रैंकस्टर

@frankster। कोई विचार नहीं, क्षमा करें, मुझे संदेह है कि यह शायद नहीं है। इसे डाउनलोड करें और इसे आज़माएं। रिपोर्ट करें यदि आप ऐसा करते हैं तो हर कोई जानता है।
सिमोन पी स्टीवंस

5
यहां तक ​​कि रजिस्ट्री सेटिंग का उपयोग करना जो TweakUI सेट Win7 पर काम नहीं करता है।
लुप्तप्राय

@EndangeredMassa कौन सी रजिस्ट्री कुंजी है?
n611x007 21

2
रजिस्ट्री कुंजी HKEY_CURRENT_USER \ Control पैनल \ Desktop \ ForegroundLockTimeout (मिलीसेकंड में) है। और हाँ, यह अब विंडोज 7 में काम नहीं करता है।
फू

14

मेरा मानना ​​है कि कुछ भ्रम हो सकता है, क्योंकि "ध्यान चुराने" के दो तरीके हैं: (1) अग्रभूमि में आने वाली एक खिड़की, और (2) कीस्ट्रोक्स प्राप्त करने वाली खिड़की।

यहां बताई गई समस्या शायद दूसरी है, जहां उपयोगकर्ता के अनुरोध या अनुमति के बिना - एक विंडोज़ खुद को अग्रभूमि में लाकर फ़ोकस का दावा करती है।

एक्सपी और 7 के बीच चर्चा को यहां विभाजित करना होगा।

विंडोज एक्स पी

XP में एक रजिस्ट्री हैक है जो अनुप्रयोगों को ध्यान केंद्रित करने से रोकने में XP को विंडोज 7 के समान काम करता है:

  1. पर जाने के लिए regedit का उपयोग करें: HKEY_CURRENT_USER\Control Panel\Desktop
  2. डबल-क्लिक करें ForegroundLockTimeoutऔर इसके मान को हेक्साडेसिमल में सेट करें 30d40
  3. OK दबाएं और regedit से बाहर निकलें।
  4. परिवर्तनों को प्रभावी करने के लिए अपने पीसी को रिबूट करें।

विंडोज 7

(नीचे दी गई चर्चा ज्यादातर XP पर भी लागू होती है।)

कृपया समझें कि ऐसा कोई तरीका नहीं है जिसमें विंडोज अनुप्रयोगों को फ़ोकस चुराने से पूरी तरह से रोक सकता है और कार्यशील रह सकता है। उदाहरण के लिए, यदि किसी फ़ाइल-कॉपी के दौरान आपके एंटी-वायरस ने संभावित खतरे का पता लगा लिया है और आप किसी विंडो को पॉप-अप करना चाहते हैं, तो वह आपसे कार्रवाई करने के लिए कहेगी, यदि यह विंडो ब्लॉक हो जाती है, तो आप यह कभी नहीं समझ पाएंगे कि कॉपी कभी समाप्त क्यों नहीं होती।

विंडोज 7 में केवल विंडोज के व्यवहार के लिए केवल एक संशोधन संभव है, जो कि एमएस-विंडोज फोकस-फॉलो-माउस रजिस्ट्री हैक का उपयोग करना है , जहां फोकस और / या सक्रियण हमेशा कर्सर के नीचे खिड़कियों पर जाता है। सभी डेस्कटॉप पर पॉप अप करने वाले एप्लिकेशन से बचने के लिए देरी को जोड़ा जा सकता है।
इस लेख को देखें: विंडोज 7 - माउस होवर विंडो को सक्रिय बनाता है - सक्षम करें

अन्यथा, किसी को दोषी कार्यक्रम का पता लगाना और उसे बेअसर करना होगा: यदि यह हमेशा वही एप्लिकेशन है जो फोकस प्राप्त कर रहा है, तो इस एप्लिकेशन को फोकस लेने के लिए प्रोग्राम किया जाता है और इसे रोकने के लिए या तो इसे कंप्यूटर से शुरू करने से अक्षम किया जा सकता है, या इस व्यवहार से बचने के लिए उस एप्लिकेशन द्वारा आपूर्ति की गई कुछ सेटिंग का उपयोग करें।

आप VB कोड में शामिल VBS स्क्रिप्ट का उपयोग कर सकते हैं जो पहचानता है कि कौन चोरी करने वाले फ़ोकस को पहचानता है , जिसे लेखक ने एक प्रिंटर सॉफ़्टवेयर के लिए अपराधी को "कॉल होम" अपडेटर के रूप में पहचाना था।

जब बाकी सब विफल हो जाता है, तो एक हताश उपाय, और यदि आपने इस बुरी तरह से प्रोग्राम किए गए एप्लिकेशन की पहचान की है, तो इसे कम से कम करें और आशा करें कि तब खुद को सामने नहीं लाया जाएगा। न्यूनीकरण के एक मजबूत रूप में सूचीबद्ध मुक्त उत्पादों में से एक का उपयोग करके ट्रे करने के लिए है सबसे अच्छा नि: शुल्क आवेदन Minimizer

हताशा के क्रम में अंतिम विचार डेस्कटॉप या डेक्सपॉट जैसे उत्पाद का उपयोग करके अपने डेस्कटॉप को लगभग फ्रैक्चर करना है, और डिफ़ॉल्ट की तुलना में किसी अन्य डेस्कटॉप में अपना काम करना है।

[संपादित करें]

जैसा कि Microsoft ने आर्काइव गैलरी से संन्यास ले लिया है, यहाँ उपरोक्त VB कोड पुन: प्रस्तुत किया गया है:

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
@ सिंथेटेक: कभी-कभी गैर-सामने वाले संवाद का एकमात्र समाधान कार्य को मारना है। विंडोज में फोकस एल्गोरिदम वास्तव में घटिया हैं।
हरमिन्क

2
@harrymc, मुझे कभी भी एक ऐप को मारने का सहारा नहीं लेना चाहिए। मैं बस अपना विंडो-मैनिपुलेटिंग प्रोग्राम चलाता हूं ( WinSpy ++ चाल को बहुत अच्छा करता है) और खिड़की को सामने छिपाता है, फिर मैं अटके हुए संवाद को खारिज कर सकता हूं, फिर छिपी हुई खिड़की को फिर से दिखा सकता हूं। यह सुविधाजनक नहीं है, लेकिन यह या तो प्रक्रियाओं को मारने से बेहतर है।
सिंटेक

1
@harrymc, वास्तव में नहीं; ऐप को मारना और सामान खोना बस अधिक भाप बनाता है, और अगर यह एक मोडल डायलॉग है (जो पैरेंट विंडो को लॉक करता है और टास्कबार बटन नहीं है), तो यह Alt+Tabसूची में नहीं दिखाई देगा , और, मेरे अनुभव में, एक विंडो एक मोडल डायलॉग हमेशा नहीं होता (कभी नहीं?) के साथ मोडल डायलॉग दिखाते हैं Alt+Tab, खासकर अगर डायलॉग में फोकस पाने के लिए बदलाव नहीं होता। :-|
सिंटेक

2

घक्स का एक संभावित समाधान है:

ऐसा दिन में कई बार होता है कि कुछ एप्लिकेशन पॉप अप करके सक्रिय विंडो का फोकस चुरा लेते हैं। यह कई कारणों से हो सकता है, जब मैं फ़ाइलों को निकालता हूं या उदाहरण के लिए एक स्थानांतरण खत्म करता हूं। यह तब होता है जब यह होता है लेकिन यह कभी-कभी मैं एक लेख लिख रहा होता हूं और इसका मतलब यह नहीं है कि मुझे कुछ शब्द फिर से लिखना होगा, लेकिन यह भी कि मैंने एकाग्रता खो दी और ध्यान केंद्रित करने के लिए क्लिक करना होगा।

प्रो समीक्षक वेबसाइट कैसे ऐसा होने से रोकने के लिए पर एक टिप है। फोकस चुराने से रोकने का सबसे आसान तरीका Tweak UI का उपयोग करना है जिसकी एक सेटिंग है जिसे "फोकस चुराने से एप्लिकेशन को रोकना" कहा जाता है। इस विकल्प की जाँच करने से यह पता चलता है कि अन्य एप्लिकेशन अचानक से पॉप हो जाते हैं और उस विंडो का ध्यान चुरा लेते हैं जो आप वर्तमान में काम कर रहे हैं।

यह केवल तभी काम करता है जब पहले आवेदन को छोटा किया गया हो। फ़ोकस चुराने के बजाय यह कई बार फ्लैश करेगा जिसे Tweak UI में एक ही मेनू में परिभाषित किया जा सकता है । यदि आप Tweak UI का उपयोग नहीं करना चाहते हैं तो आप Windows रजिस्ट्री में सेटिंग बदल सकते हैं।

रजिस्ट्री कुंजी HKEY_CURRENT_USER> नियंत्रण कक्ष> डेस्कटॉप पर नेविगेट करें और फ़ोरग्राउंडलॉकटाइम मान को 30d40 (हेक्साडेसिमल) या 200000 (दशमलव) में बदलें। मुख्य फॉरग्राउंडफ्लाशकाउंट एक विंडो के फ्लैश की मात्रा को उपयोगकर्ता को सचेत करने के लिए परिभाषित करता है जहां 0 का मतलब असीमित है।


20
यह XP के बाद किसी भी OS पर काम नहीं करता है। वह रजिस्ट्री मान पहले से ही सेट है (डिफ़ॉल्ट रूप से, मेरा मानना ​​है) और वैसे भी काम नहीं करता है।
लुप्तप्राय

1
दूसरे नंबर पर है कि मैं विंडोज 7 (64-बिट) पर हूं, फोकस-चोरी (वीएस 2012 जब अंततः सक्रिय, एफ'आर उदाहरण) का अनुभव कर रहा हूं, और उपरोक्त रजिस्ट्री-सुझाव पहले से ही जगह में है। इस उत्तर में तकनीकी पुष्टि: superuser.com/a/403554/972
माइकल पॉलुकोनिस

2

Der Hochstapler के उत्तर से प्रेरित होकर , मैंने एक DLL इंजेक्टर लिखने का फैसला किया, जो 64 और 32-बिट दोनों प्रक्रियाओं के साथ काम करता है और विंडोज 7 या नए पर ध्यान केंद्रित करने से रोकता है: https://blade.sk/stay-focused/

जिस तरह से यह काम करता है वह नए बनाए गए विंडोज़ के लिए देखता है (उपयोग करते हुए SetWinEventHook) और डीएलएल को डेर होच्स्टापलर के समान है जो खिड़की की प्रक्रिया में पहले से मौजूद नहीं है। यह DLL को अनलोड करता है और बाहर निकलने पर मूल कार्यक्षमता को पुनर्स्थापित करता है।

मेरे परीक्षण से, यह अब तक बहुत अच्छा काम करता है। हालाँकि, यह समस्या सिर्फ ऐप कॉलिंग की तुलना में अधिक गहराई तक जाती है SetForegroundWindow। उदाहरण के लिए, जब एक नई विंडो बनाई जाती है, तो यह स्वचालित रूप से अग्रभूमि में लाया जाता है, जो किसी अन्य विंडो में टाइप करने वाले उपयोगकर्ता के साथ हस्तक्षेप भी करता है।

चोरी करने के अन्य तरीकों से निपटने के लिए, अधिक परीक्षण की आवश्यकता है और मैं परिदृश्यों पर किसी भी प्रतिक्रिया की सराहना करूंगा जहां यह हो रहा है।


0

मुझे पता चला कि टास्कबार को प्रोग्राम सक्रिय रूप से सक्रिय करने, अधिकतम करने और किसी अन्य प्रक्रिया से उस प्रक्रिया की मुख्य विंडो को फ़ोकस करने के बाद एक नई सक्रिय लक्ष्य विंडो को चमकाने से कैसे रोकें। सबसे पहले, इस पर बहुत सारे प्रतिबंध हैं कि क्या इस ऑपरेशन की अनुमति होगी।

"सिस्टम प्रतिबंधित करता है कि कौन सी प्रक्रियाएं अग्रभूमि विंडो सेट कर सकती हैं। एक प्रक्रिया अग्रभूमि विंडो को केवल तभी सेट कर सकती है जब निम्न में से कोई एक स्थिति सत्य हो:

  • प्रक्रिया अग्रभूमि प्रक्रिया है।
  • अग्रभूमि प्रक्रिया द्वारा प्रक्रिया शुरू की गई थी।
  • प्रक्रिया को अंतिम इनपुट ईवेंट प्राप्त हुआ।
  • कोई अग्रभूमि प्रक्रिया नहीं है।
  • अग्रभूमि प्रक्रिया डीबग की जा रही है।
  • अग्रभूमि लॉक नहीं है (LockSetForegroundWindow देखें)।
  • अग्रभूमि लॉक टाइम-आउट की समय सीमा समाप्त हो गई है (देखें SPI_GETFOREGROUNDLOCKTIMEOUT SystemParametersInfo में)।
  • कोई मेनू सक्रिय नहीं हैं।

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

इसलिए यदि नियंत्रण प्रक्रिया अग्रभूमि में है, तो यह अस्थायी रूप से लक्ष्य प्रक्रिया की प्रक्रिया आईडी के साथ AllowSetForegroundWindow को कॉल करके अग्रभूमि को पूरी तरह से चोरी करने में सक्षम कर सकती है। फिर उसके बाद, लक्ष्य प्रक्रिया स्वयं SetForegroundWindow को अपने स्वयं के विंडो हैंडल का उपयोग करके कॉल कर सकती है , और यह काम करेगा।

जाहिर है, इसके लिए दो प्रक्रियाओं के बीच कुछ समन्वय की आवश्यकता होती है, लेकिन यह काम करता है, और यदि आप एकल-इंस्टेंस ऐप को लागू करने के लिए ऐसा कर रहे हैं, जो सभी एक्सप्लोरर-क्लिक को मौजूदा ऐप इंस्टेंस में लॉन्च करता है, तो आप पहले से ही हैं। वैसे भी चीजों को समन्वित करने के लिए एक (जैसे) नाम का पाइप है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.