🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

解決済

2回答

13937閲覧

pyautoguiでゲーム画面を操作したいが、反応しないので、操作できるようにしたい

vibrato

総合スコア52

Python

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

0グッド

0クリップ

投稿2021/01/09 13:10

編集2021/01/10 06:26

試したこと

ゲーム画面がアクティブになってからキー入力「1」をしたかった

python

1import pyautogui 2from win32gui import GetWindowText, GetForegroundWindow 3 4while True: 5  if GetWindowText(GetForegroundWindow()) == "ゲーム名": 6    pyautogui.press("1")

試したゲーム名
・セガNET麻雀MJ
・Minecraft

試行結果

エラーなし無反応(キー入力無し)

原因調べた結果

おそらくゲーム自体にキーボードからの手入力と、プログラムコード操作の違いを判別している?

その他試したこと

ゲームウインドウがアクティブの時
pyautogui.position()はポジションを取得しており正常に動作している。
pyautogui.moveTo(x,y)や
pyautogui.press("キー"各種)のゲーム操作に関する部分は動作しない。

追記(原因予測と試行中に起こった事象)

ゲーム画面で動作しない原因が
・A[キーボード直接手入力]
・B[pyautogui.press()でのコード入力]
の違いから起こるものと考えたのですが、それを確かめるために
キーボード直接手入力とpyautogui.press()でのコード入力の違いを検知できる方法はありますでしょうか?
という質問をさせていただきAとBで違いがあることを明確にできました。

【新たに表れた問題点】
AとBの違いを検知している時に、起こった事象なのですが

python

1import keyboard 2while True: 3 if keyboard.is_pressed("esc"): 4 break 5 # aが押されるまで待つ。 6 keyboard.wait("a") 7 print("ハードウェアキーボードの'a'が押下されました。")

上記の質問で教えていただいたコードなのですが、
ゲーム画面がアクティブの時だけキーボード直接手入力が検知できない
ということが起こりました。単に「仮想キーまたは直接キー」の違いだけではない様です。

改善方法はありますでしょうか?
ご教授よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

自己解決

参考ページ
こちらのページを参考にさせていただき「Minecraft」では入力可能になりました。

「Minecraft」であっても仮想キーでは受け付けずasciiコードでの入力であれば受け付けました。

投稿2021/01/20 12:58

vibrato

総合スコア52

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

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

0

メモ帳で質問者さんのコードを試しました。
その際、何も入力されなかったので、下記のように変更してみたところ、おそらく質問者さんの動作イメージに近いと思う結果になりました。

Python

1import pyautogui 2from win32gui import GetWindowText, GetForegroundWindow 3 4while True: 5 if GetWindowText(GetForegroundWindow()) == "無題 - メモ帳": 6 pyautogui.press("1") 7 pyautogui.press("2") 8 pyautogui.press("3") 9 break 10 else: 11 print(GetWindowText(GetForegroundWindow()))

入力はされていますが、「2と3」のみでした。

Python

1import time 2time.sleep(0.5)

を追加することで入力されましたので、プログラムが入力する速度が速すぎることが問題かと思います。

そのため、ゲームに手入力等の判別をするものがあるわけではないのだと思います。(ゲームのタイトルの不明のため、推測です)

---追記---

検索ワード

  • pyautogui directx
  • pywinauto directx

参考になるかもしれないサイト

  • [Pyautoguiがゲームウィンドウで機能しない

](https://python5.com/q/tbqsbvwk)

](https://python5.com/q/oahsfzmg)

投稿2021/01/09 23:48

編集2021/01/10 02:21
norapomu

総合スコア224

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

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

vibrato

2021/01/10 00:12

回答ありがとうございます。回答をいただくまでの間にsleepを入れ試したのですが結果は変わりませんでした。単純な文字入力アプリ上などでは動作しましたが、ゲームとなると変わらずでした。 試したゲームは多くないですが ・セガNET麻雀MJ ・Minecraft こちらの二つは同じくpyautogui.press(”キー”各種)が動作しませんでした。
norapomu

2021/01/10 01:27

試されたゲームをもってないので試せないです・・・。 おそらく確認されてるとは思いますが、動作していないのはpyautogui.press("キー"各種)の部分で、if文の判定は正しく評価されて、その処理が動作するはずなのに動作していない・・・ということですよね? ブラウザのChromeでも、タブの名称が変わるだけで取得してくるウインドウ名が変わるようですので、一応念のためにと・・・
vibrato

2021/01/10 01:55

>動作していないのはpyautogui.press("キー"各種)の部分で、if文の判定は正しく評価されて、その処理が動作するはずなのに動作していない おっしゃる通り、その状態です。ほかにも試したことがあるとすれば、ゲームウインドウがアクティブの時 pyautogui.position()はポジションを取得しており正常に動作している。 pyautogui.moveTo(x,y)や pyautogui.press("キー"各種)のゲーム操作に関する部分は動作しない。 状態です。何か改善策があればいいのですか…
norapomu

2021/01/10 02:14

自分もわからないため、軽く調べてみました。 その結果、「DirectXで実行されるゲームは、仮想キーの送信を無視する」とのことで、現在の方法だと不可能なようです。 ただ、まったく方法がないというわけではないようです。 自分の環境では検証出来ないので、検索ワードを回答のほうに記載しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問