Uygulamaların odağı çalmasını önleme


191

Etkin pencereden odağı alan uygulamaların önlenmesi için herhangi bir çözüm var mı?

Bu, özellikle bir uygulamaya başladığımda, başka bir şey yapmaya başladığımda can sıkıcı oluyor ve yeni uygulama yarım cümle almaya başlıyor.


9
@Ivo Windows 7 benim durumumda ama SuperUser için tüm Windows sürümleri alakalı olacağını düşünüyorum
svandragt

3
Moderatör bu soruyu birleştirdi: superuser.com/questions/199821/… . Bu yanlıştır, mevcut sorunun cevabı windows 7 için geçerli değildir, bu yüzden birleştirilmemelidir. Şimdiye kadar Windows 7'de bu soruna bir çözüm bulamadım
Alex Angelico

17
Bu şimdiye kadar kullandığım her GUI ile bir numaralı evcil hayvan kabuğumdan biri. Yazıp suçluyorsunuz, bazı sızdırma iletişim kutuları odağı çalıyor ve tuş vuruşlarınızın yarısı başka bir yere gidiyor. Pencereleme sistemlerinin uygulayıcılarının bunu yıllar önce çözeceğini düşünürdünüz. Bir pencerede etkinlik varsa, yeni pencerenin pozlamasını geciktirin. Örneğin, şu anki odaklanmış penceredeki son düğmeye basıldığında veya tuşa basılmasından bu yana üç ya da dört saniyeye kadar GUI'de hiçbir şey açmayın. Doh!
Kaz

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.Bir iletişim kutusu açıldığında ve bir cümle yazarken Spaceveya Enterbasarken bir mesaj görmeden bile istemeden reddetmeniz daha da can sıkıcıdır .
Synetech

3
Bu aslında can sıkıcı bir şey değil, bunun bir güvenlik riski olduğunu söyleyebilirim. Bir şifre yazmaya ve girişinizi almaya başladığınızda, bir uygulamanın ortaya çıkmasını durduracak hiçbir şey yoktur.
Chris Peacock

Yanıtlar:


51

Bu, Windows dahili dosyalarının kapsamlı bir şekilde manipülasyonu olmadan mümkün değildir ve üstesinden gelmeniz gerekir.

Günlük bilgisayar kullanımında, işletim sisteminin başka bir işlem yapmanıza izin vermeden önce bir işlem yapmanızın gerçekten önemli olduğu anlar vardır. Bunu yapmak için, odağınızı belirli pencerelere kilitlemesi gerekir. Windows'ta, bu davranışın kontrolü, büyük ölçüde kullandığınız programların geliştiricilerine bırakılmıştır.

Bu konuyla ilgili olarak her geliştirici doğru kararları vermez.

Bunun çok sinir bozucu ve can sıkıcı olduğunu biliyorum, ama pastanı yiyip de yiyemezsin. Gündelik yaşamınız boyunca, odaklamanın belirli bir UI öğesine taşınması ya da odağın üzerinde kilitli kalmasını isteyen bir uygulamada tamamen iyi olduğunuz muhtemelen bir çok durum vardır. Ancak, çoğu uygulama şu anda kimin lider olduğuna ve sistemin hiçbir zaman mükemmel olamayacağına karar verme konusunda biraz eşittir.

Bir süre önce, bu konuyu bir kez ve herkes için (ve başarısız olarak) çözmek için kapsamlı bir araştırma yaptım. Araştırmamın sonucunu rahatsız edici proje sayfasında bulabilirsiniz .

Proje aynı zamanda şunu arayarak odağı art arda almaya çalışan bir uygulama içeriyor:

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;

Bu snippet'ten görebileceğimiz gibi, araştırmam da sevmediğim kullanıcı arayüzü davranışının diğer yönlerine odaklandı.

Bunu çözmeye çalıştığım yol, her yeni işleme bir DLL yüklemek ve başka bir pencerenin etkinleştirilmesine neden olan API çağrılarını bağlamaktı.
Son bölüm kolay olanıdır, orada bulunan harika API kütüphaneleri sayesinde. Çok iyi mhook kütüphanesini kullandım :

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

O zamanki testlerimden itibaren, bu harika oldu. Her yeni işleme DLL dosyasını yükleme bölümü hariç. İnsanın hayal edebileceği gibi, bu çok hafif alınacak bir şey değildir. Kullandığım AppInit_DLLs (sadece yeterli değildir) sonra tekrar yaklaşım.

Temel olarak, bu harika çalışıyor. Ancak, DLL'mi yeni işlemlere düzgün bir şekilde enjekte eden bir şey yazmaya zaman bulamadım . Buna harcanan zaman büyük ölçüde odaklanmanın bana neden olduğu sıkıntıyı gölgede bırakıyor.

DLL ekleme sorununa ek olarak, Google Kodundaki uygulamada kapsamadığım bir odak çalma yöntemi de var. Bir meslektaş aslında bazı ek araştırmalar yaptı ve bu yöntemi ele aldı. Sorun SO'da tartışıldı: https://stackoverflow.com/questions/7430864/windows-7-prevent-application-from-losing-focus


Bu çözümünüzün Java ile taşınabileceğini düşünüyor musunuz? Sorular araştırıyor ve soruyorum ama hiçbir şey bulamadım. Belki de kanca kütüphanesini java kullanarak kendi kendine alabilirim jne?
Tomáš Zato,

@ TomášZato: Fikrim yok. Bu kodu aktif olarak kendim kullanmıyorum.
Der Hochstapler

En azından C ++ olarak derlemeye çalışıyorum (ve derlenmiş DLL'i Java'dan enjekte / kaldır). Fakat bu da pek iyi gitmiyor. Yorumlarda burada tartışmak istemiyorum, ama gerçekten işe yaraması için bana yardım edebilirseniz çok zarif olurum! Bunu yapmak için bir sohbet odası oluşturdum, bu işe yaramazsa burada nasıl yapacağımı yorumlayacağım: chat.stackexchange.com/rooms/21637/…
Tomáš Zato

23

Windows 7'de ForegroundLockTimeoutkayıt defteri girdisi artık denetlenmiyor, bunu İşlem İzleyicisi ile doğrulayabilirsiniz. Aslında, Windows 7'de ön plan penceresini değiştirmenize izin vermezler. Git ve ayrıntılarını oku , hatta Windows 2000'den beri de var.

Ancak, belgeler berbat ve birbirlerini kovalarlar ve bununla ilgili yollar bulurlar .

Yani, devam eden bir şey var SetForegroundWindowya da benzer API işlevleri var ...

Bunu gerçekten doğru şekilde yapmanın tek yolu, düzenli aralıklarla çağıran küçük bir uygulama yapmaktır LockSetForegroundWindow, buggy API işlevimize yapılan çağrıları neredeyse tamamen devre dışı bırakır.

Bu yeterli değilse (başka bir buggy API araması?) Daha da ileri gidebilir ve neler olup bittiğini görmek için bazı API izleme işlemleri yapabilir ve ardından her çağrıda API çağrılarını düzenleyebilir ve sonrasında aradığınız her türlü çağrıdan kurtulabilirsiniz. ön plan. Ancak, ironik olarak, bu Microsoft tarafından cesaretlendirilir ...


3
Windows 7'de bunun tekrarlanabilir bir kullanım durumu olan var mı? İnsanların bunun aksini deneyimlemeleri yerine (örneğin, sık sık Windows'un geçerli penceremin arkasına gizlenmesini talep ediyorum) ve bunun henüz Windows 7'de gerçekleştiğini görmedim göz önüne alındığında, bunun için bir uygulama yazmak oldukça can sıkıcı olurdu ancak Dene. Ayrıca, Microsoft bunun artık Windows 7'de gerçekleşmemesi gerektiğini belirtti. En iyi insanlar klavyenin odağını sadece yanlışlıkla değiştirebileceğini keşfettiğinde, bu API çağrısı bunu düzeltirdi, ancak gerçekten çalışıp çalışmadığını nasıl test edeceğimi bilmiyorum. .
Tamara Wijsman

1
Yükleyici (InnoSetup'a dayanarak) diğer işlemleri ve olası diğer (gizli) kurulumları başlatır, ancak hangi kurulum düzenleyicisine dayandığını bilmiyorum.
Daniel Beck

6
@TomWijsman: Regedit'i açın, bulunmayacak rastgele bir metni arayın. Başka bir uygulamaya gidin ve yazmaya başlayın. Arama bittiğinde, regedit odağı çalacak.
endolith

1
@endolith: Burada Windows 8 Replase Preview kullanılarak tekrarlanabilir değil. Hangi işletim sistemini kullanıyorsunuz? Benim durumum sadece altta uygulamayı vurgular ancak göz
atmamı

21
Evet, Win7 Pro 64-bit. Odak çalmak, daha yüksek işlemler için daha da kötüdür, çünkü yapmamaları gerektiğinde <Enter> tuşuna bastığınızı yakalarlar ve bunu yanlışlıkla sisteminize hortumlamanız gerektiğini söylersiniz. Hiçbir şey olmalıdır şimdiye odağı çalmak mümkün.
endolith

18

TweakUI'da bunu yapan bir seçenek var . Yazılım geliştiricilerin uygulamalarına odaklanmak için kullandıkları olağan hilelerin çoğunu engeller.

Bu devam eden bir silah savaşı, bu yüzden her şey için işe yarayıp yaramadığını bilmiyorum.

Güncelleme : EndangeredMassa'ya göre , TweakUI Windows 7'de çalışmıyor.


2
tweakui Windows 7 ile uyumlu mu?
Frankster

@frankster. Hiçbir fikrim, üzgünüm, muhtemelen olmadığından şüpheleniyorum. İndirin ve deneyin. Bunu yaparsanız geri bildirin, böylece herkes bilir.
Simon P Stevens

5
TweakUI'nin ayarladığı kayıt defteri ayarını kullanmak bile Win7'de çalışmıyor.
EndangeredMassa

@EndangeredMassa hangi kayıt defteri anahtarı bu?
n611x007

2
Kayıt defteri anahtarı HKEY_CURRENT_USER \ Control Panel \ Desktop \ ForegroundLockTimeout (milisaniye cinsinden) şeklindedir. Ve evet, artık Windows 7'de çalışmıyor.
foo

14

“Odak çalmanın” iki yolu olduğundan bazı karışıklıkların olabileceğine inanıyorum: (1) ön plana gelen bir pencere ve (2) tuş vuruşlarını alan pencere.

Burada sözü edilen problem, muhtemelen, kullanıcının isteği veya izni olmadan bir pencerenin kendisini ön plana çıkararak odağı talep ettiği ikincisidir.

Tartışma burada XP ile 7 arasında bölünmelidir.

Windows XP

XP'de, uygulamaların odağını çalmasını engellemek için XP'yi Windows 7 ile aynı şekilde çalıştıran bir kayıt defteri kesmesi vardır:

  1. Gitmek için regedit kullanın: HKEY_CURRENT_USER\Control Panel\Desktop.
  2. Üzerine çift tıklayın ForegroundLockTimeoutve değerini onaltılık olarak ayarlayın 30d40.
  3. OK tuşuna basın ve regedit'ten çıkın.
  4. Değişikliklerin etkili olması için PC'nizi yeniden başlatın.

Windows 7

(Aşağıdaki tartışma çoğunlukla XP için de geçerlidir.)

Lütfen, Windows'un uygulamaların odağı çalmasını tamamen engellemesinin ve işlevsel kalmasının bir yolu olmadığını anlayın. Örneğin, bir dosya kopyası sırasında, virüsten koruma yazılımınız olası bir tehdit tespit ettiğinde ve sizden yapılması gerekenleri soran bir pencere açmak, bu pencere engellenmişse, kopyanın neden sonlanmadığını asla anlayamazsınız.

Windows 7'de , odağın ve / veya aktivasyonun her zaman imlecin altındaki pencerelere gittiği MS-Windows fokus-takipçisi-Kayıt Defteri saldırılarını kullanmak olan, Windows'un davranışında yalnızca bir değişiklik yapılabilir . Masaüstünde tüm uygulamaların ortaya çıkmasını önlemek için bir gecikme eklenebilir.
Bu makaleye bakın: Windows 7 - Fare Vurgusu Pencereyi Etkinleştiriyor - Etkinleştiriyor .

Aksi takdirde, kişi suçlu programın tespit edilmesi ve etkisiz hale getirilmesi gerekir: Bu, her zaman odağı alan aynı uygulama ise, bu uygulama odağı alacak şekilde programlanır ve bunun önlenmesi, bilgisayardan başlayarak engellenerek yapılabilir. Bu davranışı önlemek için o uygulama tarafından sağlanan bazı ayarları kullanın.

VBS Kodunda bulunan VBS kodunda, kimin odağını çaldığını , yazarın da suçluyu bir yazıcı yazılımı için "evdeyim" güncelleyicisi olarak tanımlamak için kullandığını tanımlayabilirsiniz.

Herkes başarısız olduğunda ve bu kötü programlanmış uygulamayı tanımladıysanız çaresiz bir önlem, onu en aza indirgemek ve daha sonra kendisini öne getirmeyeceğini ummaktır. En İyi Ücretsiz Uygulama Küçültücü'de listelenen ücretsiz ürünlerden birini kullanarak tablanın daha güçlü bir küçültme biçimidir .

Çaresizlik sırasındaki son fikir, Masaüstleri veya Dexpot gibi bir ürün kullanarak masaüstünüzü neredeyse parçalamak ve çalışmanızı varsayılandan farklı bir masaüstünde yapmaktır.

[DÜZENLE]

Microsoft, Arşiv Galerisi'nden emekli olduktan sonra, yukarıdaki VB kodu yeniden üretildi:

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
“Bu pencere engellenirse, kopyanın neden sonlanmadığını asla anlamazsınız” Bu doğru değil. Doğru davranış, kullanıcıyı yanıp sönen bir görev çubuğu simgesiyle (veya bir balon açılır veya ekmek kızartma bildirimi veya başka bir şeyle) bildirmektir. Kullanıcının, tuş vuruşlarını engelleyen bir pencereyle yarıda kesilmesi, virüsten koruma yazılımına rasgele bir şekilde bir eylemde bulunmasını söylemeleri anlamına gelir. Kesinlikle bir şeyler yapmanın iyi bir yolu değil.
Endolith

1
“Bu pencere engellenirse, kopyanın neden sonlanmadığını asla anlamazsınız” Bu doğru değil. Doğru davranış, kullanıcıya yanıp sönen bir görev çubuğu simgesiyle bildirmektir. Çalışan bir programda yeni bir modal iletişimin oluşturulmasına neden olan (örneğin, açık dosya ) bir düğmeyi veya bir şeyi tıklattığım zamanlar oldu , ama sonra Diyalog oluşturulmadan önce başka bir programa geçiyorum. Sonuç olarak, iletişim kutusu gizlenir ve diğer programa geçilemez ve iletişim kutusu görevden alınamaz. Ne görev çubuğu düğmesi ne de Alt-Tabçalışıyor; sadece iletişim kutusunu öne doğru zorlamak.
Synetech

1
@ Synetech: Bazen ön olmayan diyaloğun tek çözümü görevi öldürmektir. Windows'taki odak algoritmaları gerçekten kötü.
harrymc

2
@harrymc, uygulamalardan birini öldürmek için hiçbir zaman başvurmam gerekmiyor. Sadece pencere işleme programımı çalıştırıyorum ( WinSpy ++ işe yaramazsa hile yapıyor) ve öndeki pencereyi gizledim, sonra sıkışmış iletişim kutusunu kaldırabilirim, sonra gizli pencereyi tekrar gösterebilirim. Uygun değil, ancak her iki işlemi de öldürmekten daha iyi.
Synetech

1
@harrymc, gerçekten değil; Bir uygulamayı öldürmek ve bir şeyleri kaybetmek sadece daha fazla buhar yaratır ve kalıcı bir iletişim kutusu ise (ana pencereyi kilitleyen ve görev çubuğu düğmesi olmayan), o zaman Alt+Tablistede görünmez ve benim deneyimime göre kalıcı bir iletişim kutusu açık olduğunda Alt+Tab, özellikle iletişim kutusu hiçbir zaman odaklanmak için bir değişiklik yapmadıysa, modal iletişim kutusunu her zaman göstermez (hiçbir zaman?) . :-|
Synetech

2

Ghacks’in olası bir çözümü var:

Günde birkaç kez, bazı uygulamalarda, etkin pencerenin odağını açarak çalıyor. Bu, örneğin dosyaları çıkarttığımda veya bir aktarım bittiğinde çeşitli nedenlerle olabilir. Bunun ne zaman olduğu çoğu zaman önemli değil ama bazen bir makale yazıyorum ve bu sadece bazı kelimeleri tekrar yazmam gerektiği anlamına gelmiyor, aynı zamanda konsantrasyonumu kaybettiğim ve odağı yeniden kazanmak için tıklamam gerektiği anlamına geliyor.

Pro Yorumcu web sitesi Bunu engellemek için nasıl bir uca sahiptir. Odak çalmanın önlenmesinin en kolay yolu, “Uygulamaları odağın çalmasını önle” ayarında Tweak UI kullanmaktır. Bu seçeneğin işaretlenmesi, diğer uygulamaların aniden ortaya çıkmasını ve çalışmakta olduğunuz pencerenin odağını çalmasını önler.

Bu yalnızca uygulama daha önce simge durumuna küçültüldüğünde çalışır. Odağı çalmak yerine, Tweak UI'daki aynı menüde tanımlanabilen birkaç kez yanıp söner . Tweak UI kullanmak istemiyorsanız, ayarı Windows Kayıt Defteri'nde değiştirebilirsiniz.

HKEY_CURRENT_USER> Control Panel> Desktop Kayıt defteri anahtarına gidin ve ForegroundLockTimeout değerini 30d40 (Onaltılık) veya 200000 (Ondalık) olarak değiştirin. Anahtar ForeGroundFlashCount, kullanıcıyı 0 sınırsız anlamına geldiğinde uyarmak için pencerenin yanıp sönme miktarını tanımlar.


20
Bu XP'den sonra herhangi bir işletim sisteminde çalışmıyor. Bu kayıt defteri değeri zaten buna ayarlanmış (varsayılan olarak, inanıyorum) ve yine de çalışmıyor.
EndangeredMassa

1
Windows 7'de (64-bit) olduğumu ve odağını çalmaktan (son olarak aktif olduğunda VS 2012, örnek olarak) yaşıyorum ve yukarıdaki kayıt defteri önerisi zaten yerinde. Bu cevabın teknik teyidi: superuser.com/a/403554/972
Michael Paulukonis

2

Der Hochstapler'in cevabından esinlenerek , hem 64 hem de 32 bit işlemlerle çalışan ve Windows 7 veya daha yenisine odaklanmayı önleyen bir DLL enjektörü yazmaya karar verdim: https://blade.sk/stay-focused/

Çalışma şekli yeni oluşturulmuş pencereleri izliyor (kullanıyor SetWinEventHook) ve zaten mevcut değilse, pencereyi der Hochstapler'ınkine çok benzeyen DLL'i enjekte ediyor. DLL'leri kaldırır ve çıkışta özgün işlevselliği geri yükler.

Testlerime göre, şu ana kadar çok iyi çalışıyor. Ancak, sorun yalnızca arama yapan uygulamalardan daha derinleşiyor gibi görünüyor SetForegroundWindow. Örneğin, yeni bir pencere oluşturulduğunda, otomatik olarak ön plana çıkarılır ve bu da kullanıcının başka bir pencereye yazmasını engeller.

Diğer odak çalma yöntemleriyle başa çıkmak için, daha fazla test gereklidir ve gerçekleştiği senaryolar hakkındaki geri bildirimlerini takdir ediyorum.


0

Bu işlemin ana penceresini başka bir işlemden programlı olarak etkinleştirdikten, en üst düzeye çıkardıktan ve odakladıktan sonra Görev Çubuğunun yeni etkinleştirilen bir hedef pencerenin yanıp sönmesini nasıl durduracağımı öğrendim. Her şeyden önce, bu işleme izin verilip verilmeyeceği konusunda birçok kısıtlama var.

"Sistem, hangi işlemlerin ön plan penceresini ayarlayabileceğini kısıtlar. Bir işlem yalnızca ön koşul penceresini yalnızca aşağıdaki koşullardan biri geçerli olduğunda ayarlayabilir:

  • Süreç ön plan sürecidir.
  • Süreci ön plan süreci ile başladı.
  • İşlem son girdi olayını aldı.
  • Ön plan işlemi yoktur.
  • Ön plan işlemi hata ayıklanıyor.
  • Ön plan kilitli değil (bkz. LockSetForegroundWindow).
  • Ön plan kilitleme zaman aşımı süresi doldu (bkz. SystemParametersInfo'daki SPI_GETFOREGROUNDLOCKTIMEOUT).
  • Hiçbir menü aktif değil.

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

Yani eğer kontrol süreci ön planda, bu geçici olabilir etkinleştirmek tamamen arayarak ön planı çalmak için başka bir işlem AllowSetForegroundWindow ile işlem kimliği hedef sürecinin. Bundan sonra, hedef işlem kendi pencere tutamacını kullanarak SetForegroundWindow kendisini çağırabilir ve çalışacaktır.

Açıkçası, bu iki süreç arasında bir miktar koordinasyon gerektiriyor, ancak işe yarıyor ve eğer bunu bütün Explorer tıklama başlatmalarını mevcut uygulama örneğine yönlendiren tek bir uygulama uygulamak için yapıyorsanız , o zaman zaten Her şeyi koordine etmek için bir boru (örneğin) boruya sahip olmak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.