質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

30070閲覧

Pythonを使って指定したWindowのハンドルを取得したい

watarusugimoto

総合スコア47

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2016/08/17 00:31

編集2016/08/21 11:31

###指定したウィンドウのハンドルをPythonを使って取得したい
Win32PAIのこともよく分かっていないのですが、指定したウィンドウのハンドルを取得するのに手間取っています。
どなたか、Win32APIについて詳しい方教えてください。

###発生している問題・エラーメッセージ
様々なタブ名を入力してみましたが、全て以下の様に表示されます。

0L

###該当のソースコード

>>> import winxpgui >>> hWnd = winxpgui.FindWindow(0,"電卓") >>> hWnd 722534 >>>

###試したこと
上記のプログラムが下記のサイトに掲載されていて、

ウィンドウキャプションからならハンドルを取得できることはわかりました。

ですが、自分で色々なウィンドウで試してみましたが、”電卓”の部分をタブの名称に変えても

うまくいきませんでした。

http://hellkite.hatenablog.com/entry/20070110/1168385711

###追記
説明が足らずにすいませんでした。

実行環境については、Python2.7 Windows10を使っています。

ハンドルを取ろうとしていた対象はウェブブラウザのハンドルで、

ソースコードに示した"電卓"の部分にタブのタイトルを入れてみたのですが、英語名だとハンドルが取れたのですが、日本語名だとハンドルが取得できていませんでした。

###追記2
ブラウザの種類はgooglechromeです。

今、ハンドルとウィンドウタブの名称をPowershellで取得しましたので、そのソースコードを下記に記します。
この結果として
ハンドル 2338
ウィンドウタイトル名 アメーバピグ|無料で遊べる!自分そっくりキャラで楽しもう! - Google Chrome
となりました。
このウィンドウタイトルを上のソースコードの電卓の部分に入力しましたが、ハンドルは0として返ってきました。

###ソースコード2
$psArray = [System.Diagnostics.Process]::GetProcesses()
foreach ($ps in $psArray){
[String]$ps.Handles + " : " + $ps.MainWindowTitle
}

###追記3
下記のように.decode("shift_jis")を入れてみたところ、以下のようなエラーが出ました。

import winxpgui hWnd = winxpgui.FindWindow(0,"Python - Pythonを使って指定したWindowのハンドルを取得したい(44543)|teratail - Google Chrome".decode("shift_jis"))

エラーコード

--------------------------------------------------------------------------- UnicodeDecodeError Traceback (most recent call last) <ipython-input-3-2553d809ec60> in <module>() 1 import winxpgui 2 ----> 3 hWnd = winxpgui.FindWindow(0,"Python - Pythonを使って指定したWindowのハンドルを取得したい(44543)|teratail - Google Chrome".decode("shift_jis")) UnicodeDecodeError: 'shift_jis' codec can't decode bytes in position 29-30: illegal multibyte sequence

回答についていけていなくてすいません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argius

2016/08/17 15:44

実行環境について追記お願いします。私の環境はWin7, Python3.5.2, pywin32=build220ですが、動作しました。
argius

2016/08/17 16:07

「様々なタブ名を入力してみました」というのはブラウザーのことを指しているんですね? 本文中にブラウザーと書かれていないので少し分かりにくいと思います。ブラウザーの種類も書いてください。
guest

回答2

0

指定しているタイトル文字列が、ウィンドウ名とは異なっている可能性があります。

Firefoxの場合、タブのタイトルの後ろに - Mozilla Firefoxを付けた文字列でないと検索できませんでした。
Chromeの場合は、同じく - Google Chromeを付ける必要があります。

但し、どちらのブラウザーでもそのウィンドウのアクティブタブでないと取得できませんでした。
(アクティブでないものを取得する方法は今のところ不明です。)

以下のスクリプトを実行すると、すべてのウィンドウ名を出力します。
これで目的のウィンドウ名が何なのかを確認してみて下さい。

※大量に出るので注意!

lang

1# -*- coding: utf-8 -*- 2 3from __future__ import print_function 4import win32gui 5 6win32gui.EnumWindows(lambda x, _: print(win32gui.GetWindowText(x)), None)

winxpguiはWindowsXP用で情報も少ないみたいなので、調べるときはwin32guiでしたほうが良いかもです。

投稿2016/08/17 17:01

編集2016/08/17 17:16
argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argius

2016/08/18 12:22

Windows10 + Python2.7でも確認しましたが、やり方は同じでできるはずです。 回答に書いた通り、アクティブでないタグの場合は、当然取得できません。 以下をお試しいただけますでしょうか。 ・他のブラウザーでも試してみてください。 ・上記Pythonスクリプトを実行して、目的のタイトルは表示されますか?
watarusugimoto

2016/08/18 13:32

ありがとうございます。 試してみてからまたコメントしたいと思います。
watarusugimoto

2016/08/21 08:36

上のプログラムを回してみました。 文字化けがしているんですが、"- Google Chrome"という部分は読み取れました。 以下のような感じです。 �A���[�o�s�O�b�����ŗV�ׂ�I������������L�����Ŋy������I - Google Chrome FireFoxで試したところ、以下のような感じで同様に文字化けしていました。これが原因なのでしょうか? �A���[�o�s�O�b�����ŗV�ׂ�I������������L�����Ŋy������I - Mozilla Firefox
argius

2016/08/21 09:22

どこかで文字コードの設定を変えているのかも知れませんね。 コマンドプロンプトだとShift_JISがデフォルトになっていると思うのですが。 winxpgui.FindWindow(0,"電卓".decode("shift_jis")) のようにしたらどうなりますか?
watarusugimoto

2016/08/21 11:34

.decode("shift_jis")を追加して実行してみました。 追加3に記述しました。 shift_jisや文字コードのことが良くわかっていないので理解できていません。 PowerShellからコピーしてきただけなので、手打ちで書いてみて試してみたいと思います。
argius

2016/08/21 11:41

IPythonだとダメなのかも知れません。 コマンドプロンプトから実行できますか?
guest

0

本筋から逸れますがSpy++を使ってウィンドウの構造(名前やウィンドウクラスなど)がどうなっているのかあらかじめ調べておくのは役に立つと思います。昔はVisual C++に標準で付いてきたツールです。

それと、最終的に何がやりたいのかわからないのですが、タブのウィンドウハンドルを取得しても、それはブラウザのクライアント領域(サイトの中身が表示されている領域)であるとは限りません。今ちょっと試せないのですが、タブ名から引いたウィンドウハンドルがなんなのか、Spy++で確認しておくとよいと思います。

投稿2016/08/18 12:48

編集2016/08/18 12:52
sharow

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

watarusugimoto

2016/08/18 13:31

ありがとうございます。 Spy++というソフトを使ってみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問