응용 프로그램이 포커스를 훔치는 것을 방지


191

응용 프로그램이 활성 창에서 포커스를 훔치는 것을 방지하는 솔루션이 있습니까?

이것은 응용 프로그램을 시작할 때 특히 성가신 일이며 다른 것으로 전환하면 새 응용 프로그램이 텍스트의 절반 문장을 받기 시작합니다.


9
나는 모든 창은 슈퍼 유저에 대한 생각 내 경우에는 윈도우 7 @Ivo하지만 버전은 관련이있을 것이다
svandragt

3
중재자는이 질문 ( superuser.com/questions/199821/…) 을 현재 질문과 병합했습니다 . 이것은 틀 렸습니다. 현재 질문에 대한 대답은 Windows 7에 적용되지 않으므로 병합해서는 안됩니다. 지금까지 Windows 7에서이 문제에 대한 해결책을 찾지 못했습니다
Alex Angelico

17
이것은 내가 사용했던 모든 GUI와 함께 내 애완 동물 중 하나입니다. 타이핑하고 비난하는 중입니다. 일부 블 리핑 대화 상자가 포커스를 훔치고 키 입력의 절반이 다른 곳으로 이동합니다. 창 시스템의 구현자가 이것을 수십 년 전에 이것을 알아 냈을 것이라고 생각할 것입니다. 창에 활동이 있으면 새 창의 노출을 지연시킵니다. 예를 들어 현재 초점이 맞춰진 창에서 마지막 버튼을 클릭하거나 키를 누른 후 3 ~ 4 초가 지나야 GUI에 아무 것도 나타나지 않습니다. 도!
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.대화 상자가 나타나면 더 성가 시며 문장 을 누르 Space거나 Enter입력하는 동안 메시지를 보지 않아도 의도 치 않게 메시지를 닫지 않습니다.
Synetech

3
이것은 실제로 성가신 것 이상입니다. 보안 위험이라고 말하고 싶습니다. 암호를 입력하고 입력을 잡는 중에 응용 프로그램 팝업을 중지하는 것은 없습니다.
Chris Peacock

답변:


51

Windows 내부 를 광범위하게 조작 하지 않으면 불가능 하며이를 극복해야합니다.

운영 체제에서 다른 작업을 수행하기 전에 한 가지 작업을 수행하는 것이 중요 할 때 매일 컴퓨터를 사용하는 순간이 있습니다. 그렇게하려면 특정 창에 초점을 고정해야합니다. Windows에서이 동작에 대한 제어는 주로 사용하는 개별 프로그램 개발자에게 맡겨집니다.

이 주제와 관련하여 모든 개발자가 올바른 결정을하는 것은 아닙니다.

나는 이것이 매우 실망스럽고 성가시다는 것을 알고 있지만 케이크를 가지고 먹을 수도 없습니다. 일상 생활 전반에 걸쳐 포커스가 특정 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;

이 스 니펫에서 알 수 있듯이 내 연구는 내가 싫어하는 사용자 인터페이스 동작의 다른 측면에도 중점을 두었습니다.

이 문제를 해결하는 방법은 모든 새 프로세스에 DLL을로드하고 다른 창을 활성화시키는 API 호출을 연결하는 것입니다.
마지막 부분은 멋진 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;
}

당시의 테스트에서 이것은 훌륭하게 작동했습니다. 모든 새로운 프로세스에 DLL을로드하는 부분을 제외하고. 상상할 수 있듯이, 너무 가볍게 취할 필요는 없습니다. 당시 AppInit_DLLs 접근 방식을 사용했습니다 (단순하지 않습니다).

기본적으로 이것은 훌륭하게 작동합니다. 그러나 DLL을 새로운 프로세스에 올바르게 주입 하는 것을 작성할 시간을 찾지 못했습니다 . 그리고 이것에 투자 한 시간은 초점을 훔치는 것이 나를 괴롭히는 것을 크게 어둡게합니다.

DLL 삽입 문제 외에도 Google 코드 구현에서 다루지 않은 포커스 스틸 링 방법이 있습니다. 동료는 실제로 몇 가지 추가 연구를 수행하고 그 방법을 다루었습니다. 문제는 SO에서 논의되었습니다 : https : //.com/questions/7430864/windows-7-prevent-application-from-losing-focus


이 솔루션을 Java로 이식 할 수 있다고 생각하십니까? 검색하고 질문했지만 아무것도 찾지 못했습니다. 어쩌면 내가 사용하여 후크 라이브러리 자체를 Java로 가져올 수 jne있습니까?
Tomáš Zato

@ TomášZato : 몰라요. 이 코드를 직접 사용하고 있지 않습니다.
Der Hochstapler 2016 년

적어도 C ++로 컴파일하려고 시도한 다음 Java에서 컴파일 된 DLL을 주입 / 제거합니다. 그러나 그것은 너무 잘 진행되지 않습니다. 나는 여기서 의견에 대해 토론하고 싶지 않지만 실제로 작동하도록 도와 줄 수 있다면 매우 우아 할 것입니다! 나는 대화방을 만들었습니다. 그것이 작동하게된다면 여기에 의견을 게시하겠습니다 : chat.stackexchange.com/rooms/21637/…
Tomáš

23

Windows 7에서 ForegroundLockTimeout레지스트리 항목을 더 이상 확인하지 않으면 Process Monitor로이를 확인할 수 있습니다. 실제로 Windows 7에서는 전경 창을 변경할 수 없습니다. 이동 및 읽기 의 세부 사항에 대해 심지어 윈도우 2000 년부터있어왔다.

그러나 문서는 짜증나고 서로 쫓아 가서 그 주위의 길을 찾습니다 .

그래서 버그가 SetForegroundWindow있거나 비슷한 API 함수가 있습니다 ...

실제로 이것을 올바르게 수행하는 유일한 방법은 LockSetForegroundWindow버그가있는 API 함수에 대한 호출을 사실상 비활성화 하는 작은 응용 프로그램을 주기적으로 호출하는 것입니다.

그것으로 충분하지 않으면 (또 다른 버그가있는 API 호출?) 더 나아가서 진행 상황 을 확인하기 위해 API 모니터링 을 수행 한 다음 모든 프로세스에서 API 호출을 연결하면 혼란스러워 하는 호출을 제거 할 수 있습니다. 전경. 그러나 아이러니하게도 이것은 Microsoft에 의해 권장되지 않습니다 ...


3
누구나 Windows 7에서 재현 가능한 유스 케이스를 가지고 있습니까? 사람들이 오히려 그 반대를 경험한다고 가정하면 (예를 들어, 종종 현재 창 뒤에 까다로운 Windows가 숨겨져 있음을 발견 함) Windows 7에서 이런 일이 발생하는 것을 아직 보지 못했지만 응용 프로그램을 작성하는 것은 꽤 성가 시지만 그것을 테스트하십시오. 또한 Microsoft는 Windows 7에서 더 이상 이런 일이 발생하지 않을 것이라고 밝혔습니다. 최고의 사람들은 우연히 키보드의 포커스를 바꿀 수 있다는 것을 알게 되었으므로이 API 호출로 해결할 수는 있지만 실제로 작동하는지 테스트하는 방법을 모르겠습니다. .
타마라 Wijsman

1
설치 프로그램 (InnoSetup 기반)은 다른 프로세스와 가능한 다른 (숨겨진) 설정을 시작하지만 기반이되는 설정 작성자는 모르겠습니다.
Daniel Beck

6
@TomWijsman : regedit를 열고 찾을 수없는 임의의 텍스트를 검색하십시오. 다른 앱으로 이동하여 입력을 시작하십시오. 검색이 끝나면 regedit가 포커스를 훔칩니다.
endolith

1
@endolith : 여기에서는 Windows 8 Replase Preview를 사용하여 재현 할 수 없습니다. 어떤 OS를 사용하고 있습니까? 내 경우에는 맨 아래에있는 응용 프로그램 만 강조 표시하지만 검색을 방해하지는 않습니다.
Tamara Wijsman

21
예, Win7 Pro 64 비트. 그리고 초점을 잃는 것은 프로세스가 좋지 않은 경우 <Enter>를 누르는 것을 포착하고 실수로 시스템에 호스를 뿌려주기 때문에 높은 프로세스에서는 더 나빠집니다. 아무것도한다 이제까지 초점을 도용 할 수 없습니다.
endolith 2016

18

이를 수행하는 TweakUI 에는 옵션 이 있습니다. 모호한 소프트웨어 개발자가 앱에 집중하기 위해 사용하는 대부분의 일반적인 트릭을 방지합니다.

그래도 진행중인 무기 전쟁이므로 모든 것이 효과가 있는지 모르겠습니다.

업데이트 : EndangeredMassa 에 따르면 TweakUI는 Windows 7에서 작동하지 않습니다.


2
tweakui는 Windows 7과 호환됩니까?
frankster

@ 프랭크 스터. 잘 모르겠습니다. 미안합니다. 다운로드하여 사용해보십시오. 모두 알고 있다면 다시 신고하십시오.
Simon P Stevens

5
TweakUI가 설정 한 레지스트리 설정을 사용해도 Win7에서 작동하지 않습니다.
멸종 위기에 처한 마사

@EndangeredMassa 어떤 레지스트리 키입니까?
n611x007

2
레지스트리 키는 HKEY_CURRENT_USER \ Control Panel \ Desktop \ ForegroundLockTimeout (밀리 초)입니다. 그리고 예, 더 이상 Windows 7에서는 작동하지 않습니다.
foo

14

"스틸 링 포커스"의 두 가지 방법이 있기 때문에 약간의 혼란이있을 수 있다고 생각합니다.

여기서 언급 된 문제는 아마도 사용자의 요청이나 허가없이 창을 전경으로 가져 와서 초점을 요구하는 두 번째 문제 일 것입니다.

토론은 XP와 7 사이에서 분리되어야합니다.

윈도우 XP

XP에는 XP가 Windows 7과 동일하게 작동하여 응용 프로그램이 포커스를 훔치는 것을 방지하는 레지스트리 해킹이 있습니다.

  1. regedit를 사용하여 다음으로 이동하십시오 HKEY_CURRENT_USER\Control Panel\Desktop..
  2. 를 두 번 클릭 ForegroundLockTimeout하고 16 진수로 값을 설정 하십시오 30d40.
  3. 확인을 누르고 regedit를 종료하십시오.
  4. 변경 사항을 적용하려면 PC를 재부팅하십시오.

윈도우 7

(아래의 논의는 대부분 XP에도 적용됩니다.)

Windows가 응용 프로그램이 포커스를 훔치고 기능을 유지하지 못하도록 완전히 차단할 수있는 방법은 없습니다. 예를 들어, 파일을 복사하는 동안 바이러스 백신이 가능한 위협을 감지하고 수행 할 작업을 요청하는 창을 팝업으로 표시하려는 경우이 창이 차단되면 사본이 종료되지 않는 이유를 절대 알 수 없습니다.

Windows 7에서는 Windows 자체의 동작에 대해 하나의 수정 만 가능합니다. 즉, MS-Windows focus-follows-mouse Registry hacks 를 사용하면 포커스 및 / 또는 활성화가 항상 커서 아래의 창으로 이동합니다. 응용 프로그램이 데스크탑 전체에 팝업되지 않도록 지연을 추가 할 수 있습니다.
이 문서를 참조하십시오. Windows 7- 마우스 호버로 창을 활성화 합니다.

그렇지 않으면 유죄 프로그램을 감지하고 무력화해야합니다.이 응용 프로그램이 항상 포커스를받는 동일한 응용 프로그램 인 경우이 응용 프로그램은 포커스를 갖도록 프로그램되어 있으며 컴퓨터에서 시작하지 못하도록 설정하거나이 기능을 사용하지 못하게 할 수 있습니다. 이 동작을 피하려면 해당 응용 프로그램에서 제공 한 일부 설정을 사용하십시오.

VB 코드에 포함 된 VBS 스크립트를 사용하여 포커스를 훔치는 사람을 식별 할 수 있습니다. 작성자는 프린터 소프트웨어의 "콜홈"업데이터로 범인을 식별하는 데 사용했습니다.

다른 모든 방법이 실패했을 때 필사적 인 조치는 잘못 프로그래밍 된 응용 프로그램을 식별 한 경우 응용 프로그램을 최소화하는 것입니다. Best Free Application Minimizer에 나열된 무료 제품 중 하나를 사용하여 트레이에 더 강력한 최소화 방법이 있습니다.

절망적 인 순서의 마지막 아이디어는 Desktops 또는 Dexpot 과 같은 제품을 사용하여 실제로 데스크탑을 파괴 하고 기본 이외의 다른 데스크탑에서 작업을 수행하는 것입니다.

[편집하다]

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
"이 창이 차단되면 복사가 끝나지 않는 이유를 절대 이해할 수 없습니다."사실이 아닙니다. 올바른 동작은 깜박이는 작업 표시 줄 아이콘 (또는 풍선 팝업 또는 토스터 알림 등)을 사용자에게 알리는 것입니다. 키 입력을 가로채는 창으로 사용자를 방해한다는 것은 안티 바이러스 소프트웨어가 임의의 조치를 취하도록 지시하는 것입니다. 일을하는 좋은 방법은 아닙니다.
endolith

1
"이 창이 차단되면 복사가 끝나지 않는 이유를 절대 이해할 수 없습니다."사실이 아닙니다. 올바른 동작은 사용자에게 깜박이는 작업 표시 줄 아이콘으로 알리는 것입니다. 실행중인 프로그램에서 단추 나 다른 항목을 클릭하여 새 모달 대화 상자가 만들어지는 경우가 있습니다 (예 : 파일 열기 ). 대화 상자를 만들기 전에 다른 프로그램으로 전환합니다. 결과적으로 대화 상자가 숨겨지고 다른 프로그램을 전환 할 수 없으며 대화 상자를 닫을 수 없습니다. 작업 표시 줄 버튼도 Alt-Tab작동 하지 않습니다 . 대화 상자를 맨 앞으로 만 강제합니다.
Synetech

1
@Synetech : 때때로 비 프론트 대화에 대한 유일한 해결책은 작업을 종료하는 것입니다. Windows의 포커스 알고리즘은 정말 시끄 럽습니다.
harrymc

2
@ harrymc, 나는 앱 중 하나를 죽일 필요가 없습니다. 방금 창 조작 프로그램을 실행하고 ( WinSpy ++ 은 트릭을 훌륭하게 수행합니다) 창을 숨기고 붙어있는 대화 상자를 닫은 다음 숨겨진 창을 다시 표시 할 수 있습니다. 편리하지는 않지만 두 프로세스 중 하나를 종료하는 것보다 낫습니다.
Synetech 2016 년

1
@harrymc, 실제로는 아닙니다. 앱을 죽이고 물건을 잃어 버리면 더 많은 증기가 발생하고 모달 대화 상자 (부모 ​​창을 잠그고 작업 표시 줄 버튼이없는) 인 경우 Alt+Tab목록에 표시되지 않으며 경험상 창 에는 표시되지 않습니다 모달 대화 상자가 열려있는 Alt+Tab경우, 특히 대화 상자에 포커스를 변경 하지 않은 경우 모달 대화 상자가 항상 표시 되지는 않습니다. :-|
Synetech

2

Ghacks에는 가능한 해결책이 있습니다.

일부 응용 프로그램은 팝업으로 활성 창의 초점을 훔치는 하루에 여러 번 발생합니다. 예를 들어 파일을 추출하거나 전송이 완료되면 여러 가지 이유로 발생할 수 있습니다. 이 일이 발생하는 대부분의 시간은 중요하지 않지만 때로는 기사를 쓰고 있는데 단어를 다시 입력해야 할뿐만 아니라 집중력을 잃어 집중력을 회복하기 위해 클릭해야한다는 것을 의미합니다.

프로 검토 자 웹 사이트는이를 방지하는 방법에 대한 팁이있다. 포커스 도용을 방지하는 가장 쉬운 방법은 "애플리케이션 도용 방지"라는 설정이있는 Tweak UI를 사용하는 것입니다. 이 옵션을 선택하면 다른 응용 프로그램이 갑자기 팝업되어 현재 작업중인 창의 초점을 훔치지 않습니다.

응용 프로그램이 이전에 최소화 된 경우에만 작동합니다. 포커스를 훔치는 대신 Tweak UI 의 동일한 메뉴에서 정의 할 수있는 여러 번 깜박 입니다. Tweak UI를 사용하지 않으려면 Windows 레지스트리에서 설정을 변경할 수 있습니다.

레지스트리 키 HKEY_CURRENT_USER> 제어판> 데스크탑으로 이동하여 ForegroundLockTimeout 값을 30d40 (16 진수) 또는 200000 (10 진수)으로 변경하십시오. ForeGroundFlashCount 키는 0이 무제한을 의미하는 경우 사용자에게 경고하는 창의 플래시 양을 정의합니다.


20
XP 이후의 OS에서는 작동하지 않습니다. 해당 레지스트리 값은 이미 기본적으로 설정되어 있으며 기본적으로 작동하지 않습니다.
멸종 위기에 처한

1
두 번째로, 나는 포커스 스 테일링 (최종 활성화시 VS 2012)을 경험하고 위의 레지스트리 제안이 이미 자리 잡은 Windows 7 (64 비트)을 사용하고 있습니다. 이 답변에 기술 확인 : superuser.com/a/403554/972
마이클 Paulukonis

2

Der Hochstapler의 답변 에서 영감을 받아 64 및 32 비트 프로세스에서 작동하고 Windows 7 이상에서 포커스 도용을 방지하는 DLL 인젝터를 작성하기로 결정했습니다. https://blade.sk/stay-focused/

작동 방식은 새로 생성 된 창 (을 사용하여 SetWinEventHook)을 감시 하고 Der Hochstapler의 창과 매우 유사한 DLL을 창 프로세스에 주입합니다 (아직없는 경우). DLL을 언로드하고 종료시 원래 기능을 복원합니다.

내 테스트에서 지금까지 매우 잘 작동합니다. 그러나 문제는 앱을 호출하는 것보다 더 심오한 것으로 보입니다 SetForegroundWindow. 예를 들어 새 창을 만들면 자동으로 전경으로 이동하여 사용자가 다른 창에 입력하는 것을 방해합니다.

다른 초점 도용 방법을 다루기 위해서는 더 많은 테스트가 필요하며 발생하는 시나리오에 대한 의견을 보내 주셔서 감사합니다.


0

프로그래밍 방식으로 다른 프로세스에서 해당 프로세스의 기본 창을 활성화, 최대화 및 초점을 맞춘 후 TaskBar가 새로 활성화 된 대상 창을 깜박이지 않게하는 방법을 알아 냈습니다. 우선,이 작업의 허용 여부에 대한 많은 제한이 있습니다.

"시스템은 포 그라운드 창을 설정할 수있는 프로세스를 제한합니다. 프로세스는 다음 조건 중 하나에 해당하는 경우에만 포 그라운드 창을 설정할 수 있습니다.

  • 프로세스는 포 그라운드 프로세스입니다.
  • 포 그라운드 프로세스에 의해 프로세스가 시작되었습니다.
  • 프로세스가 마지막 입력 이벤트를 수신했습니다.
  • 포 그라운드 프로세스가 없습니다.
  • 포 그라운드 프로세스가 디버깅되고 있습니다.
  • 포 그라운드가 잠겨 있지 않습니다 (LockSetForegroundWindow 참조).
  • 포 그라운드 잠금 시간 종료가 만료되었습니다 (SystemParametersInfo의 SPI_GETFOREGROUNDLOCKTIMEOUT 참조).
  • 활성화 된 메뉴가 없습니다.

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

따라서 제어 프로세스가 포 그라운드에 있는 경우 대상 프로세스 의 프로세스 IDAllowSetForegroundWindow 를 호출 하여 다른 프로세스가 포 그라운드를 완전히 훔칠 수 있습니다 . 그런 다음 대상 프로세스는 자체 창 핸들을 사용하여 SetForegroundWindow 자체를 호출 할 수 있으며 작동합니다.

분명히, 이것은 두 프로세스간에 약간의 조정이 필요하지만 작동하지만, 모든 탐색기 클릭 실행을 기존 앱 인스턴스로 리디렉션 하는 단일 인스턴스 앱 을 구현하기 위해이 작업을 수행하는 경우 이미 수행됩니다. 어쨌든 사물을 조정하기 위해 (예를 들어) 명명 된 파이프를 갖습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.