উইন্ডোজ ইন্টার্নালগুলির বিস্তৃত হেরফের ছাড়া এটি সম্ভব নয় এবং আপনার এটি সরিয়ে নেওয়া দরকার।
প্রতিদিনের কম্পিউটার ব্যবহারের কিছু মুহুর্ত থাকে যখন অপারেটিং সিস্টেম আপনাকে অন্যটি করার অনুমতি দেওয়ার আগে আপনি একটি ক্রিয়া করা সত্যিই গুরুত্বপূর্ণ। এটি করতে, নির্দিষ্ট উইন্ডোতে আপনার ফোকাসটি লক করা দরকার। উইন্ডোজে, আপনি ব্যবহার করেন এমন পৃথক প্রোগ্রামগুলির বিকাশকারীদের পক্ষে এই আচরণের উপর নিয়ন্ত্রণ বেশিরভাগ ক্ষেত্রেই ছেড়ে দেওয়া হয়।
প্রতিটি বিষয় বিকাশকারী যখন এই বিষয় আসে তখন সঠিক সিদ্ধান্ত নেয় না।
আমি জানি যে এটি খুব হতাশাব্যঞ্জক এবং বিরক্তিকর, তবে আপনি নিজের পিষ্টক রাখতে এবং এটি খেতেও পারবেন না। আপনার প্রতিদিনের জীবন জুড়ে সম্ভবত এমন অনেকগুলি ঘটনা রয়েছে যেখানে নির্দিষ্ট 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