普通文本  |  64行  |  1.56 KB

# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Quits Chrome.

This script sends a WM_CLOSE message to each window of Chrome and waits until
the process terminates.
"""

import optparse
import pywintypes
import sys
import time
import win32con
import win32gui
import winerror

import chrome_helper


def CloseWindows(process_path):
  """Closes all windows owned by processes whose path is |process_path|.

  Args:
    process_path: The path to the process.

  Returns:
    A boolean indicating whether the processes successfully terminate within
    30 seconds.
  """
  start_time = time.time()
  while time.time() - start_time < 30:
    process_ids = chrome_helper.GetProcessIDs(process_path)
    if not process_ids:
      return True

    for hwnd in chrome_helper.GetWindowHandles(process_ids):
      try:
        win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)
      except pywintypes.error as error:
        # It's normal that some window handles have become invalid.
        if error.args[0] != winerror.ERROR_INVALID_WINDOW_HANDLE:
          raise
    time.sleep(0.1)
  return False


def main():
  usage = 'usage: %prog chrome_path'
  parser = optparse.OptionParser(usage, description='Quit Chrome.')
  _, args = parser.parse_args()
  if len(args) != 1:
    parser.error('Incorrect number of arguments.')
  chrome_path = args[0]

  if not CloseWindows(chrome_path):
    raise Exception('Could not quit Chrome.')
  return 0


if __name__ == '__main__':
  sys.exit(main())