වින්ඩෝස් අභ්යන්තරය පුළුල් ලෙස හැසිරවීමකින් තොරව මෙය කළ නොහැකි අතර ඔබ එය ඉක්මවා යා යුතුය.
මෙහෙයුම් පද්ධතිය ඔබට තවත් දෙයක් කිරීමට පෙර ඔබ එක් ක්රියාවක් කිරීම සැබවින්ම වැදගත් වන විට දෛනික පරිගණක භාවිතයේ අවස්ථා තිබේ. එය සිදු කිරීම සඳහා, එය සමහර කවුළු වෙත ඔබේ අවධානය අගුළු දැමිය යුතුය. වින්ඩෝස් හි, මෙම හැසිරීම පාලනය කිරීම බොහෝ දුරට ඔබ භාවිතා කරන තනි වැඩසටහන් වල සංවර්ධකයින්ට ඉතිරි වේ.
මෙම මාතෘකාව සම්බන්ධයෙන් සෑම සංවර්ධකයෙකුම නිවැරදි තීරණ ගන්නේ නැත.
මෙය ඉතා කලකිරවන සහ කරදරකාරී බව මම දනිමි, නමුත් ඔබට ඔබේ කේක් තබා එය අනුභව කළ නොහැක. ඔබගේ දෛනික ජීවිත කාලය පුරාවටම යම් යම් UI අංගයක් වෙත අවධානය යොමු කිරීම හෝ යෙදුම කෙරෙහි අවධානය යොමු වී ඇති ලෙස ඉල්ලා සිටීම සමඟ ඔබ හොඳින් සිටින අවස්ථා බොහෝමයක් ඇත. නමුත් බොහෝ යෙදුම් මේ වන විට පෙරමුණ ගෙන සිටින්නේ කවුරුන්ද යන්න තීරණය කිරීමේදී තරමක් සමාන වන අතර පද්ධතිය කිසි විටෙකත් පරිපූර්ණ විය නොහැක.
ටික කලකට පෙර මම මෙම ගැටළුව විසඳීම පිළිබඳව පුළුල් පර්යේෂණ සිදු කළෙමි (සහ අසාර්ථක විය). මගේ පර්යේෂණයේ ප්රති result ලය කරදරකාරී ව්යාපෘති පිටුවෙන් සොයාගත හැකිය .
ඇමතීමෙන් අවධානය නැවත නැවත ලබා ගැනීමට උත්සාහ කරන යෙදුමක් ද ව්යාපෘතියට ඇතුළත් වේ:
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;
මෙම ස්නිපටයෙන් අපට දැකිය හැකි පරිදි, මගේ පර්යේෂණය මා අකමැති පරිශීලක අතුරුමුහුණත් හැසිරීමේ වෙනත් අංශ කෙරෙහි ද අවධානය යොමු කරන ලදී.
මෙය විසඳීමට මා උත්සාහ කළ ආකාරය නම් සෑම නව ක්රියාවලියකටම ඩීඑල්එල් පටවා වෙනත් කවුළු සක්රිය වීමට හේතු වන ඒපීඅයි ඇමතුම් සම්බන්ධ කිරීමයි.
අන්තිම කොටස පහසුම එකයි, එහි ඇති අපූරු API කොකු පුස්තකාල වලට ස්තූතියි. මම ඉතා විශාල 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;
}
එදා මගේ පරීක්ෂණ වලින්, මෙය විශිෂ්ටයි. සෑම නව ක්රියාවලියකටම ඩීඑල්එල් පැටවීමේ කොටස හැර. කෙනෙකුට සිතිය හැකි පරිදි, එය එතරම් සැහැල්ලුවට ගත යුතු දෙයක් නොවේ. මම එවකට AppInit_DLLs ප්රවේශය භාවිතා කළෙමි (එය ප්රමාණවත් නොවේ).
මූලික වශයෙන්, මෙය විශිෂ්ට ලෙස ක්රියා කරයි. නමුත් මගේ ඩීඑල්එල් නිසි ලෙස නව ක්රියාවලි වලට ඇතුල් කරන යමක් ලිවීමට මට කාලය සොයා ගැනීමට නොහැකි විය . මේ සඳහා ආයෝජනය කර ඇති කාලය බොහෝ සෙයින් අවධානය යොමු කරන්නේ සොරකම් කිරීම නිසා ඇති වන කරදරයයි.
ඩීඑල්එල් එන්නත් කිරීමේ ගැටලුවට අමතරව, ගූගල් කේතය ක්රියාත්මක කිරීමේදී මා ආවරණය නොකළ නාභිගත කිරීමේ ක්රමයක් ද තිබේ. සම සේවකයෙකු ඇත්ත වශයෙන්ම අමතර පර්යේෂණ කිහිපයක් කළ අතර එම ක්රමය ආවරණය කළේය. SO: /programming/7430864/windows-7-prevent-application-from-losing-focus හි ගැටළුව සාකච්ඡා කරන ලදී