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

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

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

PyAutoGUIは、Windows、Mac OS、Linuxに対応した、Python用のGUI自動化ライブラリです。

Python

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

Q&A

解決済

2回答

6236閲覧

半角/全角ボタンを常にOFFの状態にする

python01

総合スコア11

PyAutoGUI

PyAutoGUIは、Windows、Mac OS、Linuxに対応した、Python用のGUI自動化ライブラリです。

Python

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

0グッド

0クリップ

投稿2021/03/15 15:32

編集2021/03/18 12:59

前提・実現したいこと

Pyautoguiを用いてメールを自動送信しようとしています。
メールアドレスは半角のため、日本語入力がONの時はOFFの状態にしたいので、
下記コードを作成しました。

Python

1import pyautogui as pg 2import ctypes 3 4pg.press('win') 5pg.write('mail') 6pg.press('enter') 7 8# 0=日本語ON 9VK_KANJI = pg.platformModule.keyboardMapping['kanji'] 10print(ctypes.windll.user32.GetKeyState(VK_KANJI)) 11 12if ctypes.windll.user32.GetKeyState(VK_KANJI) == 0: 13 pg.press('kanji') 14 print("おしました") 15 16print(ctypes.windll.user32.GetKeyState(VK_KANJI)) 17 18pg.press("a") 19

発生している問題・エラーメッセージ

上記コードの結果は毎回下記通りです。

0 おしました 1

しかしメールアプリに入力される文字は毎回切り替わっています。

1回目:a 2回目:あ 3回目:a 4回目:あ

試したこと

下記を試しましたが、結果は同じでした。
・VK_KANJI = 0x19

・下記コードを試すと、0↔1に切り替わるので、pg.press('kanji')は
機能しているようです。

pg.press('kanji') VK_KANJI = pg.platformModule.keyboardMapping['kanji'] print(ctypes.windll.user32.GetKeyState(VK_KANJI))

試したこと② 3/18追加

  • 各動作時のキー状態確認

 windowsキーを押すと0になっているようです。

Python

1import pyautogui as pg 2import ctypes 3import time 4 5VK_KANJI = pg.platformModule.keyboardMapping['kanji'] 6 7print("起動直後:",ctypes.windll.user32.GetKeyState(VK_KANJI)) 8 9pg.press('win') 10print("win入力後:",ctypes.windll.user32.GetKeyState(VK_KANJI)) 11 12pg.write('mail') 13time.sleep(1) 14pg.press('enter') 15time.sleep(1) 16print("メールアプリ開いた後:",ctypes.windll.user32.GetKeyState(VK_KANJI)) 17 18pg.press('kanji') 19print("press'kanji'後:",ctypes.windll.user32.GetKeyState(VK_KANJI)) 20 21if ctypes.windll.user32.GetKeyState(VK_KANJI) == 0: 22 pg.press('kanji') 23 print("おしました") 24print("press'kanji'後:",ctypes.windll.user32.GetKeyState(VK_KANJI)) 25 26pg.press("a")

↓出力結果

起動直後: 1 win入力後: 0 メールアプリ開いた後: 0 press'kanji'後: 1 press'kanji'後: 1 ※毎回同じ出力
  • 参考資料確認

 難しくて詳細は理解できていませんが、
下記資料によると、日本語入力キーの取得状態は
アプリが変わると認識できないようです。

https://teratail.com/questions/137570

補足情報(FW/ツールのバージョンなど)

OS:windows10 64bit
Python:3.8.3
pip:21.0.1
PyAutoGUI:0.9.52

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

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

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

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

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

etherbeg

2021/03/15 23:34

「下記コードを試すと、0↔1に切り替わる」とのことですので、いちど実際のコードでも、まず 'kanji' キーを押してから、キーの状態を取得して分岐してみて、取得されるキーの状態にどういう変化があるか(ないか)、また取得されるキーの状態と実際の入力の関係を確認されてみてはいかがでしょうか。
python01

2021/03/16 13:13 編集

どうも半角ボタンを押したことを正しく認識していないようです。 ①半角入力の状態で下記コードを実行  VK_KANJI = pg.platformModule.keyboardMapping['kanji']  (または VK_KANJI = 0x19)  print(ctypes.windll.user32.GetKeyState(VK_KANJI))  結果:0 ②半角ボタンをおし、日本語入力の状態で上記コードを実行  結果:0 ③下記コードを追加して実行  pg.press('kanji')  結果:1
etherbeg

2021/03/16 15:22

お答えいただいた文章からは、私の意図が正しく伝わっての結果なのか、私の書き方が悪くて意図が伝わらなかったのか、判断がつかないので、私がして欲しかったことを、回答欄の方にもう一度書きます。申し訳ありませんが、私は Windows 機を持っていないので自分で試すことができません。また、すでに私の意図通りお試しいただいていたら、申し訳ありません。
guest

回答2

0

自己解決

1)IMEの設定で無変換キーをMEI OFFに割り当てる。

イメージ説明

2)メールアプリ立ち上げ後、無変換キーを押す。

Python

1pg.press("nonconvert")

これでメールアプリ立ち上げ後は常に日本語offの状態になりました。

etherbeg様
正攻法ではなく逃げの方法になりましたが、
なんとか解決できました。
ご協力ありがとうございました。

投稿2021/03/18 13:59

python01

総合スコア11

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

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

etherbeg

2021/03/18 14:26

解決のご報告ありがとうございます。 なるほどWindowsだとこんなことできるんですね。スマートな解決方法だと思いました。 私は「pg.press("a") → hotkey('ctrl', 'a') → hotkey('ctrl', 'x') → クリップボードのデータのバイト数を調べる」などという強引で美しくない方法を思いついて、試してもらおうかと思っていたところでした(笑) 解決してよかったです。
guest

0

①以下のプログラムをコマンドラインから繰り返し実行した時の出力結果が知りたいです。質問文中の「下記コードを試すと、0↔1に切り替わるので」以下の一節から判断すると、この出力結果は、実行するたびに、0 → 1 → 0 → 1 と切り替わるはずです。それで間違いありませんか?

python

1import pyautogui as pg 2import ctypes 3 4pg.press('kanji') 5VK_KANJI = pg.platformModule.keyboardMapping['kanji'] 6print(ctypes.windll.user32.GetKeyState(VK_KANJI))

②以下のプログラムをコマンドラインから繰り返し実行した時の、その都度の出力結果と、メールアプリに入力される文字を知りたいです(コード中にコメントしてあるように、質問文中のコードとは同じではありませんのでご注意ください)。

python

1import pyautogui as pg 2import ctypes 3 4pg.press('win') 5pg.write('mail') 6pg.press('enter') 7 8pg.press('kanji') # この1行を追加 9VK_KANJI = pg.platformModule.keyboardMapping['kanji'] 10print(ctypes.windll.user32.GetKeyState(VK_KANJI)) 11 12if ctypes.windll.user32.GetKeyState(VK_KANJI) == 0: 13 pg.press('kanji') 14 print("おしました") 15 16print(ctypes.windll.user32.GetKeyState(VK_KANJI)) 17pg.press("a")

投稿2021/03/16 15:23

etherbeg

総合スコア1195

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

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

python01

2021/03/16 15:55

etherbeg様の意図を間違えておりました。 先ほどご教示頂いたコードを試した結果は下記です。 1回目:0→1→1→a 2回目:0→1→1→あ
etherbeg

2021/03/17 06:01 編集

①の実行結果は、実行するたびに、「0」→「 1」→「0」→「1」と交互に出力される、で間違いありませんか? ②の方の「1回目:0→1→1→a」は、1回の実行で、コンソールには「0」「1」「1」と出力されて、メールアプリには「a」と入力されたということですか? ②のプログラム内には数字がprintされる箇所は2 箇所しかないはずなのですが、なぜ3回も出力されているのでしょうか…
python01

2021/03/17 14:47

すみません。①と②をいじっていました。 再度①と②それぞれで動作確認しました。 <結果>  ①:「0」→「 1」→「0」→「1」の交互出力  ②:1回目・・・「 1」→「 1」→「a(メールアプリ)」    2回目・・・「 1」→「 1」→「あ(メールアプリ)」 <考察>  よくわからなくなってきたのですが、下記の考察で正しいでしょうか?  ・何度実行しても「おしました」が出力されないので、   pg.press('kanji') の行で半角キーは1になっている。   ⇒プログラムが終了すると半角キーの認識は0になっている  ・常に「1」の状態(日本語OFF)なのに、   メールアプリに入力する文字は「a」と「あ」の繰り返し。   ⇒ctypes.windll.user32.GetKeyState(VK_KANJI)では    日本語入力ON/OFFを認識できていない?  ということは、日本語入力ON/OFFを認識させるためのコードが間違っている?
etherbeg

2021/03/17 15:23

①の結果が「0」→「 1」→「0」→「1」の交互出力なので、プログラムが終了すると半角キーの認識が0になるのではなくて、メールアプリが立ち上がると半角キーの認識が0になるのではないか? と疑っています。アプリごとに起動するときの半角キーの状態が決まっているとか、ありますか? よくわからないのは、常に「1」の状態(日本語OFF)なのに、メールアプリに入力する文字は「a」と「あ」の繰り返し、なことですね。おっしゃる通り、ctypes.windll.user32.GetKeyState(VK_KANJI)の状態は、必ずしも日本語入力のON/OFFを反映していないのでは?と疑っています。 自分で試す環境がないのに首を突っ込んでしまって、有益な情報も解決策も提供できず、申し訳ありません…。
python01

2021/03/18 12:21

とんでもないです。 一緒に考えてくれる方がいて、とても心強いです。 etherbeg様のおかげで 原因推察と検証の進め方がわかってきたので、 いろいろ考えてやってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問