5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Python(pywin32)でWordを操作する[6] - 特定のタイトルが付いているウィンドウの操作

Last updated at Posted at 2018-06-03

#概要

「特定のタイトルが付いているウィンドウを閉じる - Qiita」をpywin32で焼き直して、もう少し深堀してみます。閉じる・移動・リサイズ・最前面表示・サインアウトをやります。

原因はよくわかりませんが、qtconsoleだとうまく実行できないため、.pyに保存して実行してください。
※Application.Tasks以下のメソッド・プロパティにアクセスすると制御が戻ってこなくなる。

Tasks.ExitWindows()を呼ぶと、本当に突然サインアウトしてしまう ので、注意してください。

次は、Documents.Open()を使った既存文書の開き方(+名前付き引数)について説明します。
(予想以上にDocuments.Openの分量が多くなったのでSentencesなどを使った文書の読み書きはそのあとでやります。)

#今回利用するWordオブジェクト

word_obj.png

オブジェクト名 プロパティ/メソッド 説明 リンク
Tasks - 現在実行中のすべてのTaskのコレクション msdn
Count コレクション内のTaskの数 msdn
Exists() 指定されたTaskの存在を確認 msdn
ExitWindows() サインアウトする msdn
Task - 実行されている 1 つのタスク(アプリケーション)を表すオブジェクト msdn
Name 名前 msdn
Visible ウィンドウの表示/非表示 msdn
WindowState ウィンドウの状態(最大/最小/標準) msdn
Top ウィンドウの垂直方向位置 msdn
Left ウィンドウの水平方向位置 msdn
Width ウィンドウの幅 msdn
Height ウィンドウの高さ msdn
Activate() ウィンドウを最前面にする msdn
Close() ウィンドウを閉じる(アプリケーションを終了する) msdn
Move() ウィンドウを移動する msdn
Resize() ウィンドウをサイズを変更する msdn
SendWindowMessage() Windowsメッセージを送る msdn

SendWindowMessage()は、Close()メソッドと等価なWM_CLOSEメッセージだけ紹介します。

#コード
原因はよくわかりませんが、qtconsoleだとうまく実行できないようです。
※Application.Tasks以下のメソッド・プロパティにアクセスすると制御が戻ってこなくなる。

今回は.pyを作成して適宜実行しています。(ファイル名は、wintask.pyにしています。)

↓の「★なんらかの処理★」部分に記述しているイメージで読んでください。

新しいインスタンスを作成しないとうまく動かないケースがあったので、今回はwin32com.client.DispatchExにしています。

wintask.py
# -*- coding: utf-8 -*-
import win32com.client

#Wordを起動する : Applicationオブジェクトを生成する
Application=win32com.client.DispatchEx("Word.Application")

なんらかの処理

#Wordを終了する : Quitメソッドを呼ぶ
Application.Quit()

##準備
以下をテキストエディタにコピペし、"target.hta"として保存してダブルクリックで実行します。
簡易アプリが起動するので、これを操作してみます。

target.hta
<html>
<head>
<title>ターゲット</title>
</head>
<body>
これを操作します。
</body>
</html>

target.png

##タイトルが「ターゲット」のウィンドウを探す

Tasks.Exist("ターゲット")で「"ターゲット"というタイトルを持つウィンドウがあるか?」を確認できます。

if Application.Tasks.Exists("ターゲット"):
    print("ターゲットが存在")
> python wintask.py
ターゲットが存在

また、Tasks("ターゲット")で、そのウィンドウを操作するためのTaskオブジェクトにアクセスできます。

if Application.Tasks.Exists("ターゲット"):
    print("ターゲット:"+Application.Tasks("ターゲット").Name)
> python wintask.py
ターゲット:ターゲット

部分一致なので似たようなタイトルや同一タイトルの別ウィンドウもヒットしてしまうので、厳密性には欠けます。

if Application.Tasks.Exists("ターゲット"):
    print("ターゲット:"+Application.Tasks("ターゲット").Name)

if Application.Tasks.Exists("ターゲ"):
    print("ターゲ:"+Application.Tasks("ターゲ").Name)

if Application.Tasks.Exists("ゲット"):
    print("ゲット:"+Application.Tasks("ゲット").Name)
> python wintask.py
ターゲット:ターゲット
ターゲ:ターゲット
ゲット:ターゲット

##ウィンドウを閉じる

「特定のタイトルが付いているウィンドウを閉じる - Qiita」の焼き直しです。

Tasks("ターゲット")でTaskオブジェクトを特定し、Close()メソッドを呼びます。
簡易アプリが終了してしまうので、手で再起動してください。

# ウィンドウを閉じる
Application.Tasks("ターゲット").Close()

SendWindowMessage()でWM_CLOSE(0x0010)を送信しても同じ効果です。

# ウィンドウを最前面にする
Application.Tasks("ターゲット").Activate()

import time
time.sleep(3)

# WM_CLOSE(0x0010)を送信する
Application.Tasks("ターゲット").SendWindowMessage(0x0010, 0, 0)

##ウィンドウを最前面にする
Activate()メソッドを呼ぶと最前面化します。

# ウィンドウを最前面にする
Application.Tasks("ターゲット").Activate()

##ウィンドウの幅と高さを取得・設定する。

WidthとHeightを読むと現在の値を取得できます。

if Application.Tasks.Exists("ターゲット"):
    w=Application.Tasks("ターゲット").Width
    h=Application.Tasks("ターゲット").Height
    print(f"width={w}, height={h}")

読み書き可能なプロパティなので設定もできます。(ウィンドウのサイズが変更されます)
Resize(Width,Height)メソッドで同等のことができます。

# ウィンドウを最前面にする
Application.Tasks("ターゲット").Activate()

# 幅200pt x 高さ100pt のウィンドウにする
Application.Tasks("ターゲット").Width=200
Application.Tasks("ターゲット").Height=100

# 3秒待つ
import time
time.sleep(3)

# 幅100pt x 高さ200pt のウィンドウにする
Application.Tasks("ターゲット").Resize(100,200)

##ウィンドウの位置を取得・設定する。

TopとLeftを読むと現在の値を取得できます。読み書き可能なプロパティなので設定もできます。

if Application.Tasks.Exists("ターゲット"):
    l=Application.Tasks("ターゲット").Left
    t=Application.Tasks("ターゲット").Top
    print(f"left={l}, top={t}")

TopとLeftに値を設定しても同じですが、Move(Left,Top)メソッドを使ってウィンドウを動かしてみます。
5秒間かけて(0,0)から(500,500)まで移動します。(左上から斜めに移動します。)

import time
Application.Tasks("ターゲット").Activate()
if Application.Tasks.Exists("ターゲット"):
    for i in range(500):
        # Move(Left,Top)メソッドを使ってウィンドウを動かす。
        Application.Tasks("ターゲット").Move(i,i)
        time.sleep(0.01)

##ウィンドウの状態(最大/最小/標準)を取得・設定する。

WindowStateを読み書きすると、ウィンドウの状態(最大/最小/標準)を取得・設定できます。
設定できる値は下表の通り。

WdWindowState列挙(msdn)

名前 説明
wdWindowStateMaximize 1 最大化
wdWindowStateMinimize 2 最小化
wdWindowStateNormal 0 標準

最大化→1秒待ち→最小化→1秒待ち→標準と遷移させてみます。

import time
if Application.Tasks.Exists("ターゲット"):
    Application.Tasks("ターゲット").Activate()

    # ウィンドウを最大化する
    Application.Tasks("ターゲット").WindowState=1

    time.sleep(1)

    # ウィンドウを最小化する
    Application.Tasks("ターゲット").WindowState=2

    time.sleep(1)

    # ウィンドウを標準にする
    Application.Tasks("ターゲット").WindowState=0

    Application.Tasks("ターゲット").Activate()

##サインアウトする

Tasks.ExitWindows()を呼ぶとサインアウトします。なぜ、Wordにこのメソッドがあるのかわかりませんが、 本当に突然サインアウトしてしまう ので注意してください。

# サインアウトする
Application.Tasks.ExitWindows()

#関連
Python(pywin32)でWordを操作する[1] - Wordオブジェクトモデル
Python(pywin32)でWordを操作する[2] - Wordを起動/終了する
Python(pywin32)でWordを操作する[3] - 新規ドキュメント作成
Python(pywin32)でWordを操作する[4] - 文字列を入力/取得/削除する
Python(pywin32)でWordを操作する[5] - ドキュメントをファイルに保存する、Wordのオプション変更
Python(pywin32)でWordを操作する[6] - 特定のタイトルが付いているウィンドウの操作
Python(pywin32)でWordを操作する[7] - 既存文書を開く/閉じる(Documents.Open(), Document.Close())
Python(pywin32)でWordを操作する[8] - 段落単位の文字列取得, 統計(ページ数, 段落数,etc)取得

アプリのスクリーンショットをpngファイルにする - Qiita

#参考

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?