Ngăn chặn các ứng dụng đánh cắp tập trung


191

Có giải pháp nào để ngăn chặn các ứng dụng đánh cắp trọng tâm từ cửa sổ đang hoạt động không?

Điều này đặc biệt khó chịu khi tôi bắt đầu một ứng dụng, chuyển sang làm việc khác và ứng dụng mới bắt đầu nhận được nửa câu văn bản.


9
@Ivo Windows 7 trong trường hợp của tôi nhưng tôi nghĩ đối với SuperUser, tất cả các phiên bản Windows sẽ có liên quan
svandragt

3
Người điều hành đã hợp nhất câu hỏi này: superuser.com/questions/199821/ Khăn với câu hỏi hiện tại. Điều này là sai, câu trả lời cho câu hỏi hiện tại không áp dụng cho windows 7, vì vậy nó không nên được hợp nhất. Cho đến nay tôi không thể tìm ra giải pháp cho vấn đề này trong Windows 7
Alex Angelico

17
Đây là một trong những thú cưng số một của tôi với mọi GUI tôi đã từng sử dụng. Bạn đang gõ và blam, một số hộp thoại xuất hiện đánh cắp tiêu điểm và một nửa tổ hợp phím của bạn đi đâu đó. Bạn sẽ nghĩ rằng những người triển khai các hệ thống cửa sổ sẽ tìm ra điều này từ nhiều thập kỷ trước. Nếu có hoạt động trong một cửa sổ, hãy trì hoãn việc tiếp xúc với cửa sổ mới. Ví dụ: không bật bất cứ thứ gì lên GUI cho đến ba hoặc bốn giây kể từ lần nhấp nút cuối cùng hoặc nhấn phím trong cửa sổ hiện đang tập trung. Đừng!
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.Thậm chí còn khó chịu hơn khi một hộp thoại bật lên và bạn vô tình bỏ qua mà không nhìn thấy tin nhắn vì bạn tình cờ nhấn Spacehoặc Entertrong khi gõ một câu.
Synetech

3
Đây thực sự là một cách khó chịu hơn, tôi nói rằng đó là một rủi ro bảo mật. Không có gì để ngăn chặn một ứng dụng bật lên khi bạn đang nhập mật khẩu và lấy dữ liệu nhập của bạn.
Chris Peacock

Câu trả lời:


51

Điều này là không thể nếu không có sự thao túng rộng rãi của các phần bên trong Windows và bạn cần phải vượt qua nó.

Có những khoảnh khắc trong việc sử dụng máy tính hàng ngày khi điều thực sự quan trọng là bạn thực hiện một hành động trước khi hệ điều hành cho phép bạn thực hiện một hành động khác. Để làm điều đó, nó cần phải khóa sự tập trung của bạn vào một số cửa sổ nhất định. Trong Windows, quyền kiểm soát hành vi này phần lớn được dành cho các nhà phát triển các chương trình riêng lẻ mà bạn sử dụng.

Không phải mọi nhà phát triển đều đưa ra quyết định đúng đắn khi nói đến chủ đề này.

Tôi biết rằng điều này rất bực bội và khó chịu, nhưng bạn không thể có bánh của bạn và cũng ăn nó. Có thể có nhiều trường hợp trong suốt cuộc sống hàng ngày của bạn, nơi bạn hoàn toàn ổn với việc lấy nét được chuyển đến một thành phần UI nhất định hoặc một ứng dụng yêu cầu tiêu điểm vẫn bị khóa trên đó. Nhưng hầu hết các ứng dụng có phần bằng nhau khi quyết định ai là người dẫn đầu ngay bây giờ và hệ thống không bao giờ có thể hoàn hảo.

Cách đây một thời gian, tôi đã nghiên cứu sâu rộng về việc giải quyết vấn đề này một lần và mãi mãi (và thất bại). Kết quả nghiên cứu của tôi có thể được tìm thấy trên trang dự án phiền toái .

Dự án cũng bao gồm một ứng dụng liên tục cố gắng lấy tiêu điểm bằng cách gọi:

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;

Như chúng ta có thể thấy từ đoạn trích này, nghiên cứu của tôi cũng tập trung vào các khía cạnh khác của hành vi giao diện người dùng mà tôi không thích.

Cách tôi cố gắng giải quyết vấn đề này là tải một DLL vào mọi quy trình mới và nối các lệnh gọi API khiến một cửa sổ khác được kích hoạt.
Phần cuối cùng là phần dễ nhất, nhờ các thư viện kết nối API tuyệt vời ngoài kia. Tôi đã sử dụng thư viện mhook rất tuyệt vời :

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

Từ các thử nghiệm của tôi hồi đó, điều này đã làm việc rất tốt. Ngoại trừ phần tải DLL vào mọi quy trình mới. Như người ta có thể tưởng tượng, đó là không có gì để xem nhẹ. Tôi đã sử dụng cách tiếp cận AppInit_DLLs trước đó (đơn giản là không đủ).

Về cơ bản, điều này làm việc tuyệt vời. Nhưng tôi không bao giờ tìm thấy thời gian để viết một cái gì đó đúng tiêm DLL của tôi vào quy trình mới. Và thời gian đầu tư vào việc này phần lớn làm lu mờ sự khó chịu mà việc đánh cắp tiêu điểm gây ra cho tôi.

Ngoài vấn đề tiêm DLL, còn có một phương pháp đánh cắp tiêu điểm mà tôi không đề cập đến trong quá trình triển khai trên Google Code. Một đồng nghiệp thực sự đã làm một số nghiên cứu bổ sung và đề cập đến phương pháp đó. Vấn đề đã được thảo luận trên SO: https://stackoverflow.com/questions/7430864/windows-7-prevent-application-from-loses-f Focus


Bạn có nghĩ rằng giải pháp này của bạn có thể được chuyển sang Java? Tôi đã tìm kiếm và đặt câu hỏi nhưng không tìm thấy gì. Có lẽ tôi có thể nhập chính thư viện hook trong java bằng cách sử dụng jne?
Tomáš Zato

@ TomášZato: Không có ý kiến. Tôi không tích cực sử dụng mã này cho mình.
Der Hochstapler 04/03/2015

Tôi đang cố gắng biên dịch nó thành C ++ ít nhất (và sau đó tiêm / xóa DLL đã biên dịch khỏi Java). Nhưng điều đó cũng không đi quá tốt. Tôi không muốn thảo luận về nó ở đây trong các bình luận, nhưng nếu bạn thực sự có thể giúp tôi làm cho nó hoạt động, tôi sẽ rất duyên dáng! Tôi đã tạo một phòng trò chuyện, nếu tôi làm việc đó, tôi sẽ đăng bình luận về cách thực hiện tại đây: chat.stackexchange.com/rooms/21637/ mẹo
Tomáš Zato

23

Trong Windows 7, ForegroundLockTimeoutmục đăng ký không còn được kiểm tra, bạn có thể xác minh điều này với Process Monitor. Thực tế, trong Windows 7, họ không cho phép bạn thay đổi cửa sổ nền trước. Đi và đọc về chi tiết của nó , nó thậm chí đã ở đó kể từ Windows 2000.

Tuy nhiên, các tài liệu hút và họ đuổi theo nhau và tìm cách xung quanh đó .

Vì vậy, có một lỗi nào đó đang xảy ra với SetForegroundWindowhoặc các hàm API tương tự ...

Cách duy nhất để thực sự làm điều này đúng cách là tạo một ứng dụng nhỏ gọi định kỳ LockSetForegroundWindow, hầu như vô hiệu hóa bất kỳ cuộc gọi nào đến chức năng API lỗi của chúng tôi.

Nếu điều đó là không đủ (một cuộc gọi API lỗi khác?) Bạn có thể đi xa hơn và thực hiện một số giám sát API để xem điều gì đang xảy ra, và sau đó bạn chỉ cần thực hiện các cuộc gọi API trên mọi quy trình mà sau đó bạn có thể loại bỏ bất kỳ cuộc gọi nào gây rối tiền cảnh. Tuy nhiên, trớ trêu thay, điều này lại bị Microsoft ...


3
Có ai có trường hợp sử dụng tái tạo này trong Windows 7 không? Cho rằng mọi người thay vì trải nghiệm ngược lại (ví dụ, tôi thường thấy Windows bị ẩn sau cửa sổ hiện tại của mình) và tôi vẫn chưa thấy điều này xảy ra trong Windows 7, sẽ rất khó chịu khi viết một ứng dụng nhưng không thể kiểm tra nó Hơn nữa, vì Microsoft tuyên bố điều này sẽ không còn xảy ra với Windows 7. Tốt nhất mọi người phát hiện ra rằng nó chỉ có thể chuyển đổi trọng tâm của bàn phím một cách tình cờ, cuộc gọi API này sẽ khắc phục điều đó nhưng tôi không biết cách kiểm tra xem nó có thực sự hoạt động không .. .
Tamara Wijsman

1
Trình cài đặt (dựa trên InnoSetup) khởi chạy các quy trình khác và các thiết lập (ẩn) khác có thể, nhưng tôi không biết người tạo thiết lập mà họ dựa vào.
Daniel Beck

6
@TomWijsman: Mở regedit, tìm kiếm một số văn bản ngẫu nhiên sẽ không được tìm thấy. Đi vào một ứng dụng khác và bắt đầu gõ. Khi tìm kiếm kết thúc, regedit sẽ đánh cắp trọng tâm.
endolith

1
@endolith: Không thể sao chép, sử dụng Windows 8 Alternase Preview tại đây. Bạn đang sử dụng hệ điều hành nào? Trong trường hợp của tôi, nó chỉ làm nổi bật ứng dụng ở phía dưới nhưng không làm gián đoạn trình duyệt của tôi ...
Tamara Wijsman

21
Có, Win7 Pro 64-bit. Và ăn cắp tập trung thậm chí còn tồi tệ hơn đối với các quy trình nâng cao, vì chúng bắt bạn nhấn <Enter> khi chúng không nên và bạn nói điều đó vô tình làm hỏng hệ thống của bạn. Không có gì nên bao giờ có thể ăn cắp tập trung.
endolith

18

Có một tùy chọn trong TweakUI thực hiện điều này. Nó ngăn chặn hầu hết các thủ thuật thông thường mà các nhà phát triển phần mềm đáng ngờ sử dụng để buộc tập trung vào ứng dụng của họ.

Tuy nhiên, đây là một cuộc chiến vũ trang đang diễn ra, vì vậy tôi không biết liệu nó có hiệu quả với mọi thứ không.

Cập nhật : Theo EndangeredMassa , TweakUI không hoạt động trên Windows 7.


2
có điều chỉnh tương thích với windows 7 không?
frankster

@frankster. Không có ý tưởng, xin lỗi, tôi nghi ngờ nó có thể không. Tải về và thử nó. Báo cáo lại nếu bạn làm như vậy mọi người đều biết.
Simon P Stevens

5
Ngay cả khi sử dụng cài đặt đăng ký mà TweakUI đặt cũng không hoạt động trên Win7.
nguy cơ tuyệt chủng

@EndangeredMassa đó là khóa đăng ký nào?
n611x007

2
Khóa đăng ký là HKEY_CURRENT_USER \ Control Panel \ Desktop \ ForegroundLockTimeout (tính bằng mili giây). Và vâng, nó không hoạt động trong Windows 7 nữa.
foo

14

Tôi tin rằng một số nhầm lẫn có thể tồn tại, vì có hai cách "đánh cắp tiêu điểm": (1) một cửa sổ đến tiền cảnh và (2) cửa sổ nhận tổ hợp phím.

Vấn đề được đề cập ở đây có lẽ là vấn đề thứ hai, trong đó một cửa sổ yêu cầu sự tập trung bằng cách đưa chính nó lên nền trước - mà không có yêu cầu hoặc sự cho phép của người dùng.

Các cuộc thảo luận phải phân chia ở đây giữa XP và 7.

Windows XP

Trong XP, có một bản hack registry khiến XP hoạt động giống như Windows 7 trong việc ngăn chặn các ứng dụng đánh cắp trọng tâm:

  1. Sử dụng regedit để đi đến : HKEY_CURRENT_USER\Control Panel\Desktop.
  2. Nhấp đúp vào ForegroundLockTimeoutvà đặt giá trị của nó theo hệ thập lục phân thành 30d40.
  3. Nhấn OK và thoát regedit.
  4. Khởi động lại PC của bạn để những thay đổi có hiệu lực.

Windows 7

(Cuộc thảo luận dưới đây cũng chủ yếu áp dụng cho XP.)

Vui lòng hiểu rằng không có cách nào Windows hoàn toàn có thể chặn các ứng dụng lấy cắp trọng tâm và duy trì chức năng. Ví dụ: nếu trong quá trình sao chép tệp, phần mềm chống vi-rút của bạn phát hiện ra mối đe dọa có thể xảy ra và muốn bật lên một cửa sổ yêu cầu bạn thực hiện hành động, nếu cửa sổ này bị chặn thì bạn sẽ không bao giờ hiểu tại sao bản sao đó không bao giờ chấm dứt.

Trong Windows 7, chỉ có một sửa đổi có thể đối với hành vi của chính Windows, đó là sử dụng các bản hack Registry của chuột theo tiêu điểm MS-Windows , trong đó tiêu điểm và / hoặc kích hoạt luôn đi đến các cửa sổ dưới con trỏ. Có thể thêm độ trễ để tránh các ứng dụng xuất hiện trên máy tính để bàn.
Xem bài viết này: Windows 7 - Mouse Hover Makes Window Active - Enable .

Mặt khác, người ta phải phát hiện và vô hiệu hóa chương trình phạm tội: Nếu đây luôn là cùng một ứng dụng đang tập trung, thì ứng dụng này được lập trình để lấy nét và ngăn chặn điều này có thể được thực hiện bằng cách vô hiệu hóa nó bắt đầu với máy tính, hoặc sử dụng một số cài đặt được cung cấp bởi ứng dụng đó để tránh hành vi này.

Bạn có thể sử dụng tập lệnh VBS có trong Mã VB để xác định kẻ đánh cắp tiêu điểm mà tác giả đã sử dụng để xác định thủ phạm là trình cập nhật "gọi về nhà" cho phần mềm máy in.

Một biện pháp tuyệt vọng khi tất cả những thứ khác đều thất bại, và nếu bạn đã xác định được ứng dụng được lập trình xấu này, là giảm thiểu nó và hy vọng rằng nó sẽ không tự đưa mình ra phía trước. Một hình thức giảm thiểu mạnh mẽ hơn là vào khay bằng cách sử dụng một trong những sản phẩm miễn phí được liệt kê trong Công cụ tối thiểu hóa ứng dụng miễn phí tốt nhất .

Ý tưởng cuối cùng theo thứ tự tuyệt vọng là phá vỡ máy tính để bàn của bạn hầu như bằng cách sử dụng một sản phẩm như Máy tính để bàn hoặc Dapidot , và thực hiện công việc của bạn trong một máy tính để bàn khác thay vì mặc định.

[BIÊN TẬP]

Vì Microsoft đã nghỉ hưu Thư viện Lưu trữ, đây là mã VB ở trên được sao chép:

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
"Nếu cửa sổ này bị chặn thì bạn sẽ không bao giờ hiểu tại sao bản sao không bao giờ chấm dứt" Điều đó không đúng. Hành vi đúng là thông báo cho người dùng bằng biểu tượng thanh tác vụ nhấp nháy (hoặc có thể là thông báo bật lên bóng bay hoặc máy nướng bánh mì hoặc một cái gì đó). Làm gián đoạn người dùng bằng một cửa sổ chặn các tổ hợp phím của họ có nghĩa là họ bảo phần mềm chống vi-rút thực hiện hành động này hay hành động khác một cách ngẫu nhiên. Chắc chắn không phải là một cách tốt để làm việc.
endolith

1
"Nếu cửa sổ này bị chặn thì bạn sẽ không bao giờ hiểu tại sao bản sao không bao giờ chấm dứt" Điều đó không đúng. Hành vi đúng là thông báo cho người dùng bằng biểu tượng thanh tác vụ nhấp nháy ... Đã có lần tôi nhấp vào nút hoặc thứ gì đó trong chương trình đang chạy khiến hộp thoại phương thức mới được tạo (ví dụ: mở tệp ), nhưng sau đó Tôi chuyển sang chương trình khác trước khi hộp thoại được tạo. Kết quả là, hộp thoại bị ẩn và chương trình khác không thể được chuyển sang và hộp thoại không thể bị loại bỏ. Nút thanh tác vụ của nó cũng không Alt-Tabhoạt động; chỉ buộc hộp thoại ra phía trước.
Synetech

1
@Synetech: Đôi khi giải pháp duy nhất cho hộp thoại không phía trước là giết tác vụ. Các thuật toán tập trung trong Windows thực sự tệ hại.
harrymc

2
@harrymc, tôi không bao giờ phải dùng đến việc giết một trong những ứng dụng. Tôi chỉ chạy chương trình thao tác cửa sổ của mình ( WinSpy ++ thực hiện thủ thuật tuyệt vời) và ẩn cửa sổ phía trước, sau đó tôi có thể bỏ qua hộp thoại bị kẹt, sau đó hiển thị lại cửa sổ ẩn. Nó không thuận tiện, nhưng tốt hơn là giết một trong hai quy trình.
Synetech

1
@harrymc, không thực sự; giết một ứng dụng và mất đồ chỉ tạo ra nhiều hơi nước hơn và nếu đó là hộp thoại theo chế độ (khóa cửa sổ cha mẹ và không có nút thanh tác vụ), thì nó sẽ không xuất hiện trong Alt+Tabdanh sách và theo kinh nghiệm của tôi, một cửa sổ có một hộp thoại phương thức mở không phải lúc nào cũng (không bao giờ?) hiển thị hộp thoại theo chế độ Alt+Tab, đặc biệt nếu hộp thoại không bao giờ có thay đổi để lấy nét. :-|
Synetech

2

Ghacks có một giải pháp khả thi:

Nó xảy ra nhiều lần trong ngày khi một số ứng dụng đánh cắp trọng tâm của cửa sổ đang hoạt động bằng cách bật lên. Điều này có thể xảy ra vì một số lý do, khi tôi giải nén tập tin hoặc chuyển khoản kết thúc chẳng hạn. Điều này không quan trọng trong hầu hết thời gian khi điều này xảy ra nhưng đôi khi tôi đang viết một bài báo và điều đó không chỉ có nghĩa là tôi phải gõ lại một số từ mà còn làm tôi mất tập trung và phải nhấp để lấy lại sự tập trung.

Các Pro Reviewer trang web có một mẹo về cách để ngăn chặn điều này xảy ra. Cách dễ nhất để ngăn chặn hành vi ăn cắp tiêu điểm là sử dụng Tweak UI có cài đặt được gọi là ứng dụng Ngăn chặn lấy cắp các tiêu điểm. Kiểm tra tùy chọn này sẽ ngăn các ứng dụng khác bật lên đột ngột và đánh cắp trọng tâm của cửa sổ bạn hiện đang làm việc.

Điều này chỉ hoạt động khi ứng dụng đã được giảm thiểu trước đó. Thay vì đánh cắp tiêu điểm, nó sẽ flash một số lần có thể được xác định trong cùng một menu trong Tweak UI . Nếu bạn không muốn sử dụng Tweak UI, bạn có thể thay đổi cài đặt trong Windows Registry.

Điều hướng đến khóa Sổ đăng ký HKEY_CURRENT_USER> Bảng điều khiển> Máy tính để bàn và thay đổi giá trị ForegroundLockTimeout thành 30d40 (Hệ thập lục phân) hoặc 200000 (Số thập phân). Khóa ForeGroundFlashCount xác định số lượng nhấp nháy của cửa sổ để cảnh báo người dùng trong đó 0 có nghĩa là không giới hạn.


20
Điều này không hoạt động trên bất kỳ hệ điều hành nào sau XP. Giá trị đăng ký đó đã được đặt thành (theo mặc định, tôi tin) và dù sao cũng không hoạt động.
nguy cơ tuyệt chủng

1
Chỉ thứ hai là tôi đang dùng Windows 7 (64-bit), bị đánh cắp tiêu điểm (VS 2012 khi cuối cùng hoạt động, ví dụ f'r) và đề xuất đăng ký ở trên đã được đưa ra. Xác nhận kỹ thuật trong câu trả lời này: superuser.com/a/403554/972
Michael Paulukonis

2

Lấy cảm hứng từ câu trả lời của Der Hochstapler , tôi đã quyết định viết một trình tiêm DLL, hoạt động với cả quy trình 64 và 32 bit và ngăn chặn việc đánh cắp tập trung trên Windows 7 hoặc mới hơn: https://blade.sk/stay-f Focused /

Cách thức hoạt động của nó là nó theo dõi các cửa sổ mới được tạo (sử dụng SetWinEventHook) và đưa DLL rất giống với cửa sổ Der Hochstapler vào quy trình của cửa sổ nếu chưa có. Nó giải nén các DLL và khôi phục chức năng ban đầu khi thoát.

Từ thử nghiệm của tôi, nó hoạt động rất tốt cho đến nay. Tuy nhiên, vấn đề dường như đi sâu hơn là chỉ gọi ứng dụng SetForegroundWindow. Chẳng hạn, khi một cửa sổ mới được tạo, nó sẽ tự động được đưa vào nền trước, điều này cũng gây cản trở cho người dùng gõ vào một cửa sổ khác.

Để đối phó với các phương pháp đánh cắp tiêu điểm khác, cần phải thử nghiệm nhiều hơn và tôi đánh giá cao bất kỳ phản hồi nào về các tình huống xảy ra.


0

Tôi đã tìm ra cách ngăn TaskBar nhấp nháy cửa sổ mục tiêu mới được kích hoạt sau khi bạn lập trình kích hoạt, tối đa hóa và tập trung cửa sổ chính của quy trình đó từ một quy trình khác. Trước hết, có rất nhiều hạn chế về việc liệu hoạt động này có được phép hay không.

"Hệ thống hạn chế các quy trình có thể đặt cửa sổ nền trước. Một quy trình chỉ có thể đặt cửa sổ nền trước nếu một trong các điều kiện sau là đúng:

  • Quá trình này là quá trình tiền cảnh.
  • Quá trình được bắt đầu bởi quá trình tiền cảnh.
  • Quá trình nhận được sự kiện đầu vào cuối cùng.
  • Không có quá trình tiền cảnh.
  • Quá trình tiền cảnh đang được gỡ lỗi.
  • Tiền cảnh không bị khóa (xem LockSetForegroundWindow).
  • Hết thời gian khóa nền trước đã hết hạn (xem SPI_GETFOREGROUNDLOCKTIMEOUT trong SystemParameterInfo).
  • Không có menu nào đang hoạt động.

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

Vì vậy, nếu quá trình kiểm soát nằm ở phía trước, nó có thể tạm thời cho phép một quá trình khác đánh cắp hoàn toàn tiền cảnh bằng cách gọi Allow setForegroundWindow với id tiến trình của quy trình đích. Sau đó, quá trình đích có thể gọi SetForegroundWindow , sử dụng tay cầm cửa sổ của chính nó và nó sẽ hoạt động.

Rõ ràng, điều này đòi hỏi một số phối hợp giữa hai quy trình, nhưng nó hoạt động và nếu bạn đang làm điều này để triển khai một ứng dụng đơn lẻ chuyển hướng tất cả các lần nhấp Explorer vào ứng dụng hiện có, thì bạn đã có một ống (ví dụ) được đặt tên để phối hợp mọi thứ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.