アプリ(入力モードをハックする)
Top
インストール
Python #1 入力モードをハッキングするアプリ
Pythonでアプリを作成してみよう、
入力モード(半角/全角)をウインドウ枠の色で判別するアプリです。
判定には、PyAutoGuiのlocateOnScreenを使用、
すべての解説はできませんので、ソースコードをアップします。
見てみて下さいね!
https://simple-and-useful.net/main/src/inpmode.html
機能について
ウインドウをクリックして選択すると、ウインドウ枠が表示され、
この色によって現在漢字モードかどうかを識別することができます。
コントロールキーを押しながらウインドウをクリックすると、
ウインドウ枠に色が付きます。
終了は、上のラベル「あ、A、*」をクリックです。
デスクトップ、タスクバーをクリックすると、画面の左上に小さく表示されます。
使用するモジュール
Tkinter
クロスプラットフォームなGUIライブラリ
PyAutoGUI
マウスやキーボード操作の自動化
win32api,win32gui
PythonでWindowsのAPIを可能にする
mouse,keyboard
マウス操作をフックして監視したり、
マウス操作を行う事もできます
-----------------------------------
画像位置を取得する
モジュール PyAutoGui
座標位置 = locateOnScreen
( "none.png",
grayscale=True,
confidence=0.950,
region=(0,0, 1920,1080 )
)
-----------------------------------
次は、入力モードの判定ですね!
locateOnScreenは、\n画面から指定画像の位置を求めるもので、
画像が一致しない場合は、Noneが返ります
これで漢字モードがどうかを判定しています。
引数には、\ngrayscale、confidence、regionが、
あります。
fgrayscaleやregionでスピードUPできます
動画の字幕
整理されていませんが、何かお役に立てば!
$100
-----------------------------------
入力モードをハッキング
-----------------------------------
f入力モードをハッキング
漢字変換モードを判定して、\n見やすくするアプリを作ってみましょう!
$200
-----------------------------------
[入力モード判定アプリ]
-----------------------------------
チョットこれを見てくださいね
アプリを起動すると左上に小さいラベルが出てきます
コントロールキーを押しながら、ウインドウをクリックします
f何かでましたね
このウインドウ枠の色で判定ができますよ
切替えてみますね
fいいですね、赤が漢字モードかぁ
終わりにしたい時は、ここをクリックします
$300
-----------------------------------
漢字入力モードかを判定する
-----------------------------------
今回は、このアプリを作ってみましょう!
f漢字入力モードかを判定するアプリですね
ソースファイルをネット上に上げてありますので、
参考にしてみて下さい
f変更して自分好みしたいです
是非、頑張ってね!
#98 0.5 1,97 0.8 0.5
$400
----------------------------------------------
アプリの仕組み
ウインドウがクリックされたら
コントロール押下をチェックして
ウインドウ枠を表示
半角/全角キーが押されたら、
入力モードを調べて
ウインドウ枠の色を反映させる
----------------------------------------------
fプログラムは、どのようになっているのですか?
マウスとキーボードをフックして監視します。
マウスのクリックとコントロールキーをチェックして、
クリックされたウインドウに枠を表示させます
半角/全角キーが押されたら、
今の入力モードを調べて、
モードによりウインドウの枠色を変えています。
f大変そうだなぁ
色々なモジュールを使用して実現させてまぁ~す
$500
-----------------------------------
使用するモジュール
Tkinter
クロスプラットフォームなGUIライブラリ
PyAutoGUI
マウスやキーボード操作の自動化
win32api,win32gui
PythonでWindowsのAPIを可能にする
mouse,keyboard
マウス操作をフックして監視したり、
マウス操作を行う事もできます
-----------------------------------
使用するモジュールの説明をします
fTkinter
クロスプラットフォームなGUIライブラリですね
Windows,Mac,Linuxでも動きます
fウインドウを作成したい時に使うのですね
fPyAutoGUI
マウスやキーボード操作の自動化ができるモジュールです
画像認識ができるので便利です
fwin32api,win32gui
PythonでWindowsのAPIを使う事ができるモジュールです
fmouse,keyboard
よくある名前で迷いそうですが、これはモジュールですよ
マウス(キーボード)操作をフックして監視したり、
マウス(キーボード)の操作を行う事もできます
f操作の自動化ですね
#98 0.5 1,97 1 0.8
$600
-----------------------------------
Tkinter
root = tkinter.Tk()
root.geometry('20x20+0+0')
root.overrideredirect(True)
root.wm_attributes("-topmost", True)
root.configure(bg='white')
root.wm_attributes(
"-transparentcolor", "white")
-----------------------------------
Tkinterは、ウインドウ表示ができる\nGUIのモジュールです
今回は、透明なウインドウ枠を表示しています
fウインドウとは、思えなかったですねぇ~
では順番に、
ウインドウの位置とサイズ
f幅、高さ、X座標、Y座標
ウインドウのタイトルバーを消しています
ウインドウを最前面に表示
fあっ、いつも上に表示されて邪魔な奴にするのですね
いゃいゃいゃ
最後は背景色の設定とウインドウを透明にします
#98 0.5 1,97 1 0.6
$700
-----------------------------------
ラベルの設定
var = tkinter.StringVar()
var.set("*")
lbl = tkinter.Label(root, textvariable=var )
lbl.pack( anchor ="s")
※処理中に、「var.set("??")」で変更が可能
-----------------------------------
ラベルを変更する場合は、ちょっと面倒かもしれないね
fStringVarで作成したオブジェクトにsetすれば、\n変更できるのですね。
ラベルに固定文字を表示するだけなら、簡単なんだけどね!
#98 0.5 1.0,97 1 0.9
$800
-----------------------------------
入力操作の監視
バックグラウンドで、マウス操作を取得
mouse.hook( mouseCallback )
(キーボード操作取得)
keyboard.hook( keyCallback )
-----------------------------------
f入力操作の監視ですね
このメソッドは、バックグランドでマウスの操作を
取得する優れもんだよ
fそぅかぁ~、普通アプリは自分で\nイベントを処理しているもんね
そう、裏で盗み見ているような感じかなぁ~
引数には、呼び出される関数を書いてくださいね
f呼びだされるのかぁ~
マウス操作があったら、呼び出されますよ!
$900
-----------------------------------
キーボード操作を監視
def keyCallback( event ):
if "ctrl" == event.name:
if "up" == event.event_type:
ctrlSW =False
print("ctrlSW", ctrlSW)
else:
ctrlSW =True
print("ctrlSW", ctrlSW)
#バックグラウンドで、キーボード操作を取得
keyboard.hook( keyCallback )
-----------------------------------
実際のコードで見てみましょう
event.nameがキーの種類で、
event.event_typeがキーの状態です
キーの状態とは、押されている、放されたがわかります
fこの関数は、コントロールキーが押されているかが、
fわかるのですね
hookは1回だけ書けば良いですからね
fキーボード操作があったら\n呼び出されるのですね
#97 1 0.8
$1000
-----------------------------------
画像位置を取得する
モジュール PyAutoGui
座標位置 = locateOnScreen
( "none.png",
grayscale=True,
confidence=0.950,
region=(0,0, 1920,1080 )
)
-----------------------------------
f次は、入力モードの判定ですね!
はい
locateOnScreenは、\n画面から指定画像の位置を求めるもので、
画像が一致しない場合は、Noneが返ります
fこれで漢字モードがどうかを判定しているのですね
はい、そうですね
引数には、\ngrayscale、confidence、regionが、
あります。
調整が必要ですね
fgrayscaleやregionでスピードUPできますね、
f最適なものを求めなきゃ!
ダウンロード(画像含む)
# -*- coding: utf-8 -*-
#!python2
ctrlSW=False
svWhnd =None
# //-------------------------------------------------------
# //漢字モードの判定
# //-------------------------------------------------------
def chkMode():
global var, root, canvas
time.sleep(0.1)
# //locate0 = pyautogui.locateCenterOnScreen( "none.png", grayscale=True,confidence=0.950)
# //locate1 = pyautogui.locateCenterOnScreen( "alpa.png", grayscale=True,confidence=0.950)
# //locate2 = pyautogui.locateOnScreen( "kanji.png", grayscale=True,confidence=0.950, region(xx-100,yy-50,xx,yy))
locate2 = pyautogui.locateOnScreen('kanji.png', grayscale=True,confidence=0.8,region=(xx-200,yy-50, xx,yy ))
# //if locate0 != None:
# //var.set("×")
# //root.configure(bg='black')
# //elif locate1 != None:
# //var.set("A")
# //root.configure(bg='green')
# //elif locate2 != None:
# //var.set("あ")
# //root.configure(bg='red')
# //else:
# //var.set("*")
# //root.configure(bg='white')
haba = 4
if locate2 != None:
var.set("あ")
# //root.configure(bg='red')
col ="red"
canvas.create_rectangle(haba, haba, tarW, tarH, outline= col, width="%d" %haba)
else:
var.set("A")
# //root.configure(bg='green')
col ="green"
canvas.create_rectangle(haba, haba, tarW, tarH, outline= col, width="%d" %haba)
def timer():
try:
chkMode()
except Exception as e:
print(e )
root.after(1000, timer)
# //-------------------------------------------------------
# //キー入力のイベント
# //-------------------------------------------------------
'''
チェックするキー
コントロールキー
半角/全角
'''
def keyCallback( event ):
global ctrlSW
print( event )
if "半角/全角" == event.name and "down" == event.event_type:
# //if "半角/全角" == event.name:
chkMode()
if "ctrl" == event.name:
if "up" == event.event_type:
ctrlSW =False
print("ctrlSW", ctrlSW)
else:
ctrlSW =True
print("ctrlSW", ctrlSW)
# //-------------------------------------------------------
# //マウスのイベント
# //-------------------------------------------------------
def mouseCallback( event ):
global ctrlSW,root,svWhnd, tarW, tarH
# //print('mouseCallback-Event:', event )
# //print('mouseCallback-Event:', type(event) == mouse.ButtonEvent )
whnd = win32gui.WindowFromPoint(win32api.GetCursorPos() )
textName = win32gui.GetWindowText(whnd)
className = win32gui.GetClassName(whnd)
# //print( "textName", textName)
# //print( "className", className)
if "CiceroUIWndFrame" == className:
time.sleep(0.2)
chkMode()
return True
if type(event) == mouse.ButtonEvent:
px,py = pyautogui.position()
# //if event.event_type == "down" and event.button=="left":
# //rect = win32gui.GetWindowRect(whnd)
# //x = rect[0]
# //y = rect[1]
# //"""
# //int cxSizeFrame = GetSystemMetrics(SM_CXSIZEFRAME); // 境界線幅X方向
# //int cySizeFrame = GetSystemMetrics(SM_CYSIZEFRAME); // 境界線幅Y方向
# //int cyCaption = GetSystemMetrics(SM_CYCAPTION); // タイトルバーの高さ
# //"""
# //capH = win32api.GetSystemMetrics(win32con.SM_CYCAPTION)
# //kyoY = win32api.GetSystemMetrics(win32con.SM_CYSIZEFRAME)
# //ttlH = capH + (kyoY*2)
# //print("ttlH=",ttlH)
# //if (px >x and px < rect[2]) and ctrlSW==False:
# //if py > y and py < y+ ttlH:
# //root.geometry( "20x20+0+0" )
# //canvas.create_rectangle(5, 5, tarW, tarH, outline= "white", width="5")
# //svWhnd = None
# //return
if event.event_type == "up" and event.button=="left":
# //print("event_type", event.event_type )
# //print("button", event.button )
whnd = win32gui.WindowFromPoint(win32api.GetCursorPos() )
textName = win32gui.GetWindowText(whnd)
className = win32gui.GetClassName(whnd)
# //print( "textName", textName)
# //print( "className", className)
if className == "Static":
# //tkinter.messagebox.showinfo("終了", "終了します")
root.quit()
sys.exit()
"""
if className == "TkChild":
print("TkChild")
# //pyautogui.hotkey('hanja')
# //chkMode()
return
"""
if className == "MSTaskListWClass" or className == "SHELLDLL_DefView":
# //if className == "SHELLDLL_DefView":
root.geometry( "20x20+0+0" )
canvas.create_rectangle(5, 5, tarW, tarH, outline= "white", width="5")
svWhnd = whnd
return False
"""
if className == "IMEModeButton":
time.sleep(0.1)
chkMode()
return
"""
rect = win32gui.GetWindowRect(whnd)
x = rect[0]
y = rect[1]
if svWhnd == whnd:
time.sleep(0.2)
chkMode()
else:
if ctrlSW:
canvas.create_rectangle(5, 5, tarW, tarH, outline= "white", width="5")
tarW = rect[2]-x
tarH = rect[3]-y
root.geometry( "%dx%d+%d+%d" %(tarW-7,tarH-7, x+3, y) )
# //root.geometry( "10x20+10+10")
# //time.sleep(0.5)
chkMode()
svWhnd = whnd
return True
import time,os,sys
import tkinter as tkinter
import mouse
import keyboard
import pyautogui
import win32gui
import win32api
import win32con
xx, yy = pyautogui.size()
print(xx,yy)
# //メインウインドウ用
root = tkinter.Tk()
root.geometry('20x20+0+0')
root.overrideredirect(True)
root.wm_attributes("-topmost", True)
root.configure(bg='white')
root.wm_attributes("-transparentcolor", "white")
tarW =xx
tarH =yy
canvas = tkinter.Canvas(root, width=tarW, height=tarH, bg="white")
canvas.place(x=-2, y=-2)
#ラベル
var = tkinter.StringVar()
var.set("*")
lbl = tkinter.Label(root, textvariable=var )
lbl.pack( anchor ="s")
# //timer()
mouse.hook( mouseCallback )
keyboard.hook( keyCallback )
# //root.iconbitmap(default='/Users/kobay/Downloads/left.ico')
root.mainloop()
©2022 Kenji Kobayashi
YouTube