Mencegah aplikasi dari mencuri fokus

191

Apakah ada solusi untuk mencegah aplikasi mencuri fokus dari jendela aktif?

Ini sangat menjengkelkan ketika saya memulai aplikasi, beralih untuk melakukan sesuatu yang lain dan aplikasi baru mulai menerima setengah kalimat teks.

svandragt
sumber
9
@Ivo Windows 7 dalam kasus saya tapi saya pikir untuk SuperUser semua jendela versi akan relevan
svandragt
3
Moderator menggabungkan pertanyaan ini: superuser.com/questions/199821/… dengan yang sekarang. Ini salah, jawaban untuk pertanyaan saat ini tidak berlaku untuk windows 7, jadi itu tidak boleh digabung. Sejauh ini saya tidak dapat menemukan solusi untuk masalah ini di Windows 7
Alex Angelico
17
Ini adalah salah satu kencing hewan peliharaan nomor satu saya dengan setiap GUI yang pernah saya gunakan. Anda mengetik dan salah, beberapa kotak dialog bleeping mencuri fokus dan setengah penekanan tombol Anda pergi ke tempat lain. Anda akan berpikir bahwa para pelaksana sistem windowing akan menemukan ini satu dekade yang lalu. Jika ada aktivitas di jendela, tunda pemaparan jendela baru. Misalnya jangan memunculkan apa pun pada GUI hingga tiga atau empat detik sejak klik tombol terakhir atau keystroke di jendela yang saat ini difokuskan. 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.Ini bahkan lebih menjengkelkan ketika sebuah dialog muncul dan Anda secara tidak sengaja mengabaikannya bahkan tanpa melihat pesan karena Anda menekan Spaceatau Entersaat mengetik kalimat.
Synetech
3
Ini sebenarnya jauh lebih menyebalkan, saya katakan itu risiko keamanan. Tidak ada yang menghentikan aplikasi yang muncul ketika Anda sedang mengetik kata sandi dan mengambil input Anda.
Chris Peacock

Jawaban:

51

Ini tidak mungkin tanpa manipulasi internal Windows yang ekstensif dan Anda harus mengatasinya.

Ada saat-saat dalam penggunaan komputer sehari-hari ketika sangat penting bagi Anda untuk melakukan satu tindakan sebelum sistem operasi memungkinkan Anda melakukan hal lain. Untuk melakukan itu, Anda perlu mengunci fokus Anda pada jendela tertentu. Di Windows, kontrol atas perilaku ini sebagian besar diserahkan kepada pengembang program individual yang Anda gunakan.

Tidak semua pengembang membuat keputusan yang tepat dalam hal topik ini.

Saya tahu ini sangat membuat frustrasi dan menjengkelkan, tetapi Anda tidak dapat memiliki kue dan memakannya juga. Mungkin ada banyak kasus sepanjang kehidupan sehari-hari Anda di mana Anda baik-baik saja dengan fokus dipindahkan ke elemen UI tertentu atau aplikasi yang meminta agar fokus tetap terkunci di sana. Tetapi sebagian besar aplikasi agak sama ketika memutuskan siapa yang memimpin saat ini dan sistem tidak akan pernah sempurna.

Beberapa waktu yang lalu saya melakukan penelitian yang luas untuk menyelesaikan masalah ini sekali dan untuk semua (dan gagal). Hasil penelitian saya dapat ditemukan di halaman proyek gangguan .

Proyek ini juga mencakup aplikasi yang berulang kali mencoba meraih fokus dengan menelepon:

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;

Seperti yang dapat kita lihat dari cuplikan ini, penelitian saya juga difokuskan pada aspek lain dari perilaku antarmuka pengguna yang tidak saya sukai.

Cara saya mencoba menyelesaikan ini adalah dengan memuat DLL ke dalam setiap proses baru dan menghubungkan panggilan API yang menyebabkan windows lain diaktifkan.
Bagian terakhir adalah yang mudah, berkat pustaka hooking API yang luar biasa di luar sana. Saya menggunakan perpustakaan mhook yang sangat hebat :

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

Dari tes saya saat itu, ini bekerja dengan baik. Kecuali untuk bagian memuat DLL ke dalam setiap proses baru. Seperti yang bisa dibayangkan, itu bukan masalah. Saya menggunakan pendekatan AppInit_DLL saat itu (yang tidak cukup).

Pada dasarnya, ini bekerja dengan baik. Tapi saya tidak pernah menemukan waktu untuk menulis sesuatu yang benar menyuntikkan DLL saya ke dalam proses baru. Dan waktu yang diinvestasikan dalam hal ini sebagian besar menutupi kekesalan yang mencuri perhatian saya.

Selain masalah injeksi DLL, ada juga metode mencuri fokus yang tidak saya bahas dalam implementasi di Google Code. Seorang rekan kerja sebenarnya melakukan riset tambahan dan membahas metode itu. Masalahnya dibahas pada SO: https://stackoverflow.com/questions/7430864/windows-7-prevent-application-from-losing-focus

Der Hochstapler
sumber
Apakah Anda pikir solusi Anda ini dapat diangkut ke Jawa? Saya sudah mencari dan mengajukan pertanyaan tetapi tidak menemukan apa pun. Mungkin saya bisa mengimpor pustaka kait itu sendiri di java menggunakan jne?
Tomáš Zato
@ TomášZato: Tidak tahu. Saya sendiri tidak aktif menggunakan kode ini.
Der Hochstapler
Saya mencoba mengkompilasinya sebagai C ++ setidaknya (dan kemudian menyuntikkan / menghapus DLL yang dikompilasi dari Jawa). Tapi itu juga tidak berjalan dengan baik. Saya tidak ingin membahasnya di sini dalam komentar, tetapi jika Anda benar-benar dapat membantu saya membuatnya bekerja, saya akan sangat anggun! Saya membuat ruang obrolan, jika berhasil, saya akan memposting komentar bagaimana melakukannya di sini: chat.stackexchange.com/rooms/21637/…
Tomáš Zato
23

Di Windows 7, ForegroundLockTimeoutentri registri tidak lagi dicentang, Anda dapat memverifikasi ini dengan Monitor Proses. Bahkan, di Windows 7 mereka melarang Anda mengubah jendela latar depan. Pergi dan baca tentang perinciannya , bahkan sudah ada sejak Windows 2000.

Namun, dokumentasinya payah dan mereka saling mengejar dan mencari jalan keluar .

Jadi, ada sesuatu yang bermasalah dengan kereta SetForegroundWindow, atau fungsi API serupa ...

Satu-satunya cara untuk benar-benar melakukan ini dengan benar adalah membuat aplikasi kecil yang secara berkala melakukan panggilan LockSetForegroundWindow, hampir menonaktifkan semua panggilan ke fungsi API kereta kami.

Jika itu tidak cukup (panggilan API kereta lain?) Anda dapat melangkah lebih jauh dan melakukan beberapa pemantauan API untuk melihat apa yang terjadi, dan kemudian Anda cukup mengaitkan panggilan API pada setiap proses setelah itu Anda dapat menyingkirkan semua panggilan yang mengacaukan latar depan. Namun, ironisnya, ini tidak disarankan oleh Microsoft ...

Tamara Wijsman
sumber
3
Adakah yang punya kasus penggunaan yang dapat direproduksi ini di Windows 7? Mengingat bahwa orang agak mengalami yang sebaliknya (misalnya, saya sering menemukan Windows yang menuntut untuk disembunyikan di balik jendela saya saat ini) dan bahwa saya belum melihat ini terjadi di Windows 7, akan sangat menjengkelkan untuk menulis aplikasi tetapi tidak dapat menguji. Lebih jauh, seperti yang dinyatakan Microsoft, ini seharusnya tidak lagi terjadi dengan Windows 7. Paling-paling orang-orang menemukan bahwa itu hanya bisa mengganti fokus keyboard secara tidak sengaja, panggilan API ini akan memperbaikinya, tetapi saya tidak tahu bagaimana cara menguji apakah itu benar-benar berfungsi .. .
Tamara Wijsman
1
Pemasang (berdasarkan InnoSetup) meluncurkan proses lain dan kemungkinan pengaturan lainnya (tersembunyi), tapi saya tidak tahu pembuat pencipta yang mereka pakai.
Daniel Beck
6
@ TomWijsman: Buka regedit, cari beberapa teks acak yang tidak akan ditemukan. Pergilah ke aplikasi lain dan mulai mengetik. Ketika pencarian selesai, regedit akan mencuri fokus.
endolith
1
@endolith: Tidak dapat direproduksi, menggunakan Windows 8 Replase Preview di sini. OS apa yang Anda gunakan? Dalam kasus saya itu hanya menyoroti aplikasi di bagian bawah tetapi tidak mengganggu penjelajahan saya sama sekali ...
Tamara Wijsman
21
Ya, Win7 Pro 64-bit. Dan mencuri fokus bahkan lebih buruk untuk proses yang ditinggikan, karena mereka menangkap Anda menekan <Enter> saat tidak seharusnya, dan Anda mengatakannya untuk menyemprot sistem Anda secara tidak sengaja. Tidak ada yang harus pernah bisa mencuri fokus.
endolith
18

Ada opsi di TweakUI yang melakukan ini. Ini mencegah sebagian besar trik biasa yang digunakan pengembang perangkat lunak yang meragukan untuk memaksa fokus pada aplikasi mereka.

Ini adalah perang senjata yang sedang berlangsung, jadi saya tidak tahu apakah itu bekerja untuk semuanya.

Pembaruan : Menurut EndangeredMassa , TweakUI tidak berfungsi di Windows 7.

Simon P Stevens
sumber
2
apakah tweakui kompatibel dengan windows 7?
Frankrank
@ Frankster. Tidak tahu, maaf, saya kira mungkin tidak. Unduh dan coba. Laporkan kembali jika Anda melakukannya, semua orang tahu.
Simon P Stevens
5
Bahkan menggunakan pengaturan registri yang set TweakUI tidak berfungsi pada Win7.
EndangeredMassa
@ EndangeredMassa kunci registri apa itu?
n611x007
2
Kunci registri adalah HKEY_CURRENT_USER \ Control Panel \ Desktop \ ForegroundLockTimeout (dalam milidetik). Dan ya, itu tidak berfungsi di Windows 7 lagi.
foo
14

Saya percaya bahwa beberapa kebingungan mungkin ada, karena ada dua cara "mencuri fokus": (1) jendela datang ke latar depan, dan (2) jendela menerima penekanan tombol.

Masalah yang dimaksud di sini mungkin yang kedua, di mana jendela mengklaim fokus dengan membawa dirinya sendiri ke latar depan - tanpa permintaan atau izin pengguna.

Diskusi harus dibagi di sini antara XP dan 7.

Windows XP

Di XP ada peretasan registri yang membuat XP berfungsi sama dengan Windows 7 dalam mencegah aplikasi mencuri fokus:

  1. Gunakan regedit untuk pergi ke: HKEY_CURRENT_USER\Control Panel\Desktop.
  2. Klik dua kali ForegroundLockTimeoutdan tetapkan nilainya dalam heksadesimal menjadi 30d40.
  3. Tekan OK dan keluar dari regedit.
  4. Reboot PC Anda agar perubahan diterapkan.

Windows 7

(Diskusi di bawah ini sebagian besar berlaku untuk XP juga.)

Harap mengerti bahwa tidak ada cara di mana Windows dapat benar-benar memblokir aplikasi dari mencuri fokus dan tetap berfungsi. Sebagai contoh, jika selama file-copy anti-virus Anda mendeteksi kemungkinan ancaman dan ingin memunculkan jendela yang meminta Anda untuk mengambil tindakan, jika jendela ini diblokir maka Anda tidak akan pernah mengerti mengapa salinan tidak pernah berakhir.

Di Windows 7 hanya ada satu modifikasi yang mungkin untuk perilaku Windows itu sendiri, yaitu menggunakan MS-Windows focus-following-mouse hacks Registry , di mana fokus dan / atau aktivasi selalu berjalan ke jendela di bawah kursor. Penundaan dapat ditambahkan untuk menghindari aplikasi yang muncul di seluruh desktop.
Lihat artikel ini: Windows 7 - Mouse Hover Membuat Jendela Aktif - Aktifkan .

Kalau tidak, kita harus mendeteksi dan menetralkan program yang bersalah: Jika ini selalu aplikasi yang sama yang mendapatkan fokus, maka aplikasi ini diprogram untuk mengambil fokus dan mencegah hal ini dapat dilakukan dengan menonaktifkannya dari memulai dengan komputer, atau gunakan beberapa pengaturan yang disediakan oleh aplikasi itu untuk menghindari perilaku ini.

Anda dapat menggunakan skrip VBS yang termasuk dalam Kode VB yang mengidentifikasi siapa yang mencuri fokus , yang penulis gunakan untuk mengidentifikasi pelakunya sebagai pembaru "panggilan rumah" untuk perangkat lunak printer.

Langkah putus asa ketika semua yang lain gagal, dan jika Anda telah mengidentifikasi aplikasi yang tidak terprogram ini, adalah untuk meminimalkannya dan berharap hal itu tidak akan muncul. Bentuk minimalisasi yang lebih kuat adalah ke baki dengan menggunakan salah satu produk gratis yang tercantum dalam Best Free Application Minimizer .

Gagasan terakhir dalam urutan keputus-asaan adalah mematahkan desktop Anda secara virtual dengan menggunakan produk seperti Desktops atau Dexpot , dan melakukan pekerjaan Anda di desktop lain daripada default.

[SUNTING]

Karena Microsoft telah pensiun dari Arsip Arsip, berikut adalah kode VB di atas yang direproduksi:

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
harrymc
sumber
48
"Jika jendela ini diblokir maka Anda tidak akan pernah mengerti mengapa salinan tidak pernah berakhir" Itu tidak benar. Perilaku yang benar adalah memberi tahu pengguna dengan ikon bilah tugas yang berkedip (atau mungkin balon sembul atau pemberitahuan pemanggang roti atau sesuatu). Mengganggu pengguna dengan jendela yang memotong penekanan tombol mereka berarti bahwa mereka memberi tahu perangkat lunak antivirus untuk mengambil satu tindakan atau lainnya secara acak. Jelas bukan cara yang baik untuk melakukan sesuatu.
endolith
1
"Jika jendela ini diblokir maka Anda tidak akan pernah mengerti mengapa salinan tidak pernah berakhir" Itu tidak benar. Perilaku yang benar adalah memberi tahu pengguna dengan ikon bilah tugas yang berkedip ... Ada kalanya saya mengklik tombol atau sesuatu dalam program yang sedang berjalan yang menyebabkan dialog modal baru dibuat (misalnya, buka file ), tetapi kemudian Saya beralih ke program lain sebelum dialog dibuat. Akibatnya, dialog disembunyikan dan program lainnya tidak dapat dialihkan ke dan dialog tidak dapat diabaikan. Tombol bilah tugasnya tidak Alt-Tabberfungsi; hanya memaksakan dialog ke depan.
Synetech
1
@ Sinetech: Terkadang satu-satunya solusi untuk dialog non-depan adalah mematikan tugas. Algoritma fokus di Windows benar-benar buruk.
harrymc
2
@harrymc, saya tidak perlu resor untuk membunuh salah satu aplikasi. Saya baru saja menjalankan program manipulasi jendela ( WinSpy ++ berhasil dengan sangat baik) dan menyembunyikan jendela di depan, kemudian saya dapat mengabaikan dialog macet, kemudian menampilkan kembali jendela yang tersembunyi. Ini tidak nyaman, tetapi lebih baik daripada membunuh salah satu proses.
Synetech
1
@harrymc, tidak juga; membunuh aplikasi dan kehilangan hal-hal hanya membuat lebih banyak uap, dan jika itu adalah dialog modal (yang mengunci jendela induk dan tidak memiliki tombol bilah tugas), maka itu tidak akan muncul dalam Alt+Tabdaftar, dan, dalam pengalaman saya, sebuah jendela yang memiliki dialog modal terbuka tidak selalu (tidak pernah?) menunjukkan dialog modal dengan Alt+Tab, terutama jika dialog tidak pernah memiliki perubahan untuk mendapatkan fokus. :-|
Synetech
2

Ghack memiliki solusi yang memungkinkan:

Ini terjadi beberapa kali sehari bahwa beberapa aplikasi mencuri fokus jendela aktif dengan muncul. Ini bisa terjadi karena sejumlah alasan, ketika saya mengekstrak file atau transfer selesai misalnya. Tidak masalah sebagian besar waktu ketika ini terjadi tetapi kadang-kadang saya menulis artikel dan itu tidak hanya berarti bahwa saya harus mengetik beberapa kata lagi tetapi juga bahwa saya kehilangan konsentrasi dan harus mengklik untuk mendapatkan kembali fokus.

Situs web Pro Reviewer memiliki tip tentang cara mencegah hal ini terjadi. Cara termudah untuk mencegah mencuri fokus adalah dengan menggunakan Tweak UI yang memiliki pengaturan yang disebut "Mencegah aplikasi dari mencuri fokus". Memeriksa opsi ini mencegah aplikasi lain muncul tiba-tiba dan mencuri fokus jendela yang sedang Anda gunakan.

Ini hanya berfungsi ketika aplikasi telah diminimalkan sebelumnya. Alih-alih mencuri fokus, ia akan mem-flash beberapa kali yang dapat didefinisikan dalam menu yang sama di Tweak UI . Jika Anda tidak ingin menggunakan UI Tweak, Anda dapat mengubah pengaturan di Windows Registry.

Arahkan ke kunci Registry HKEY_CURRENT_USER> Control Panel> Desktop dan ubah nilai ForegroundLockTimeout menjadi 30d40 (Hexadecimal) atau 200000 (Decimal). Kunci ForeGroundFlashCount menentukan jumlah blitz jendela untuk mengingatkan pengguna di mana 0 berarti tidak terbatas.

Ivo Flipse
sumber
20
Ini tidak berfungsi pada OS apa pun setelah XP. Nilai registri itu sudah diatur untuk itu (secara default, saya percaya) dan tidak berfungsi.
EndangeredMassa
1
Yang kedua bahwa saya menggunakan Windows 7 (64-bit), mengalami mencuri fokus (VS 2012 ketika akhirnya aktif, misalnya), dan saran registri di atas sudah di tempat. Konfirmasi teknis dalam jawaban ini: superuser.com/a/403554/972
Michael Paulukonis
2

Terinspirasi oleh jawaban Der Hochstapler , saya memutuskan untuk menulis injektor DLL, yang bekerja dengan proses 64 dan 32-bit dan mencegah fokus mencuri pada Windows 7 atau yang lebih baru: https://blade.sk/stay-focused/

Cara kerjanya adalah ia mengawasi windows yang baru dibuat (menggunakan SetWinEventHook) dan menyuntikkan DLL sangat mirip dengan Der Hochstapler ke dalam proses jendela jika belum ada. Ini membongkar DLL dan mengembalikan fungsionalitas asli saat keluar.

Dari pengujian saya, ini bekerja dengan sangat baik sejauh ini. Namun, masalah ini tampaknya lebih dalam dari sekadar pemanggilan aplikasi SetForegroundWindow. Misalnya ketika jendela baru dibuat, itu secara otomatis dibawa ke latar depan, yang juga mengganggu pengguna mengetik ke jendela lain.

Untuk menangani metode mencuri fokus lainnya, diperlukan lebih banyak pengujian dan saya menghargai umpan balik tentang skenario di mana itu terjadi.

Pedang
sumber
0

Saya menemukan cara untuk menghentikan TaskBar dari mem-flash jendela target yang baru diaktifkan setelah Anda secara terprogram mengaktifkan, memaksimalkan, dan memfokuskan jendela utama proses itu dari proses lain. Pertama-tama, ada banyak batasan apakah operasi ini akan diizinkan.

"Sistem membatasi proses mana yang dapat mengatur jendela latar depan. Suatu proses dapat mengatur jendela latar depan hanya jika salah satu dari kondisi berikut ini benar:

  • Prosesnya adalah proses foreground.
  • Proses dimulai oleh proses latar depan.
  • Proses menerima input acara terakhir.
  • Tidak ada proses foreground.
  • Proses latar depan sedang di-debug.
  • Foreground tidak dikunci (lihat LockSetForegroundWindow).
  • Batas waktu kunci latar depan telah kedaluwarsa (lihat SPI_GETFOREGROUNDLOCKTIMEOUT di SystemParametersInfo).
  • Tidak ada menu yang aktif.

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

Jadi jika proses pengendalian ada di latar depan, sementara itu dapat mengaktifkan proses lain untuk sepenuhnya mencuri latar depan dengan memanggil AllowSetForegroundWindow dengan id proses dari proses target. Kemudian setelah itu, proses target dapat memanggil SetForegroundWindow sendiri, menggunakan pegangan jendela sendiri, dan itu akan berfungsi.

Jelas, ini membutuhkan beberapa koordinasi antara kedua proses, tetapi itu berhasil, dan jika Anda melakukan ini untuk menerapkan aplikasi satu-contoh yang mengarahkan semua peluncuran Explorer-klik ke instance aplikasi yang ada, maka Anda sudah akan memiliki (misalnya) pipa bernama untuk mengoordinasikan hal-hal.

Glenn Slayden
sumber