You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python的wmi模块检测指定标题窗口并终止其进程?

Absolutely! This is totally achievable with Python's wmi module, paired with a few Windows API utilities to track window creation and tie it back to the responsible process. Let’s break down how to build this solution:

Step 1: Install Required Dependencies

First, make sure you have the necessary packages installed. The wmi module relies on pywin32 to interact with Windows APIs, so install both via pip:

pip install wmi pywin32
Step 2: The Implementation Code

Here’s a complete script that monitors for the "Foo Bar" window and terminates its parent process as soon as it’s detected:

import wmi
import time
import win32process
import win32gui

def get_pids_for_window_title(target_title):
    """Fetch all process IDs associated with windows matching the target title"""
    matching_pids = []
    
    def window_enumeration_callback(handle, extra_data):
        window_title = win32gui.GetWindowText(handle)
        if window_title == target_title:
            _, process_id = win32process.GetWindowThreadProcessId(handle)
            extra_data.append(process_id)
        return True  # Continue enumerating other windows
    
    win32gui.EnumWindows(window_enumeration_callback, matching_pids)
    return matching_pids

# Initialize WMI connection
wmi_connection = wmi.WMI()

# Set up a watcher for new process creation events
process_start_watcher = wmi_connection.Win32_ProcessStartTrace.watch_for()

print("Monitoring for 'Foo Bar' window creation... (Press Ctrl+C to stop)")

try:
    while True:
        # Wait for a new process to start
        new_process = process_start_watcher()
        
        # Give the process a moment to spawn its window (adjust delay if needed)
        time.sleep(0.5)
        
        # Check if this process created the target window
        target_pids = get_pids_for_window_title("Foo Bar")
        if new_process.ProcessId in target_pids:
            print(f"Detected 'Foo Bar' window from process {new_process.ProcessId} — terminating...")
            # Terminate the process
            process_to_kill = wmi_connection.Win32_Process(ProcessId=new_process.ProcessId)[0]
            process_to_kill.Terminate()
except KeyboardInterrupt:
    print("\nStopping monitoring session.")
Key Details & Notes
  • Process-Window Link: The get_pids_for_window_title function uses win32gui to enumerate all open windows, matching titles to their associated process IDs.
  • Event Monitoring: We use Win32_ProcessStartTrace to listen for new process launches, which lets us react quickly when the target window’s parent process starts.
  • Delay Adjustment: The time.sleep(0.5) gives the process time to fully initialize and create its window. If you’re missing detections, try increasing this slightly (e.g., to 1 second).
  • Admin Rights: Some processes require elevated privileges to terminate. Run your script as an administrator if you hit permission errors.
  • Fuzzy Matching: If you need to match partial titles, modify the check in window_enumeration_callback to use target_title in window_title instead of an exact equality.

内容的提问来源于stack exchange,提问作者Ram Rachum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:09:04