キー入力エミュレーション関数群定義

2016-07-10 :  PCクリニック
本文の前に、
-・・・ -・-
現時点での blogramのランクインカテゴリは、
7、2、0、0、1、 0、0、0、0、0(40)で、換算ポイント 88pt 。
「Perl」「化学業界」「硝子業界」「グルコサミン」「Python」、
「Firefox」bg値変動。「C言語」「FM COCOLO」「e-radio」「FM青森」変化無し。
・-・ - -・

さて、本文。

前(2016-07-08)の記事「マウス操作関数群定義ファイル」で、
“マウスの制御”についてはほぼ出来た?

なので、
先月(2016-06-20)の記事「“SendKeys”もどき
で書いた、
“キーボード入力”のエミュレーション関数群をまとめた。


なお、“仮想キーコード”については、
前回の記事で参照した「仮想キーコード
及び、
涼の頁 - 工房
も参考にさせて頂いた。


ファイル名は“KB_fn.txt”で、
中には、4つの関数を定義。

function SendKey( i, k )
  ----- 引数(バイナリコード)1つは、単独キー押下
  ----- 2つのキーの同時押しは、引数2つ指定(共にバイナリコード)

これは基本的に、内部で使用する関数
以下の3つが、基本的に外から利用するもの

function SendKeys( ... )
  ----- 上記SendKey バイナリコード1つの“並び”

function SendStr( ... )
  ----- 普通(?)の文字列(ASCII コード:0x20~0x7F)の“並び”

function SendACS( ACS )
  ----- Alt(%)、Ctrl(^)、Shift(+)キーとの同時押下(2文字)
  ----- 2文字目は小文字で指定


と云うことで、作ったのは:
----- KB_fn.txt -----
ASC = string.byte
SS = |s,j| string.sub(s,j,j)
----- この様な abbreviation(短縮形)は便利だ。

ffi.cdef[[
typedef unsigned char Byte;
typedef unsigned int DWord;
void keybd_event( Byte Vk, Byte Scan, DWord Flags, int ExtraInfo );
// 仮想キーコード、スキャンコード、オプション、追加データ
]]

----- 引数1つは、単独キー押下 / 同時押しは、引数2つ指定
function SendKey( i, k )
if k == nil then
ffi.C.keybd_event( i, 0, 0, 0 ) -- キーダウン
ffi.C.keybd_event( i, 0, 2, 0 ) -- キーアップ
else
ffi.C.keybd_event( i, 0, 0, 0 ) -- 1、2 キーダウン
ffi.C.keybd_event( k, 0, 0, 0 )
ffi.C.keybd_event( k, 0, 2, 0 ) -- 2、1 キーアップ
ffi.C.keybd_event( i, 0, 2, 0 )
end
end

----------------------------------------
function SendKeys( ... ) -- SendKey バイナリコード1つの“並び”
local p={...}
for _, c in ipairs(p) do
SendKey( c )
end
end

-- 0x20 ~ 0x7F : ASCII コード( スキャン・コード ) → 仮想キーコード  変換テーブル
CDT={ 0x020, 0x121, 0x122, 0x123, 0x124, 0x125, 0x126, 0x127, 0x128, 0x129, 0x1BA, 0x1BB, 0x0BC, 0x0BD, 0x0BE, 0x0BF ,
0x030, 0x031, 0x032, 0x033, 0x034, 0x035, 0x036, 0x037, 0x038, 0x039, 0x0BA, 0x0BB, 0x1BC, 0x1BD, 0x1BE, 0x1BF ,
0x0C0, 0x141, 0x142, 0x143, 0x144, 0x145, 0x146, 0x147, 0x148, 0x149, 0x14A, 0x14B, 0x14C, 0x14D, 0x14E, 0x14F ,
0x150, 0x151, 0x152, 0x153, 0x154, 0x155, 0x156, 0x157, 0x158, 0x159, 0x15A, 0x0DB, 0x0DC, 0x0DD, 0x0DE, 0x1E2 ,
0x000, 0x041, 0x042, 0x043, 0x044, 0x045, 0x046, 0x047, 0x048, 0x049, 0x04A, 0x04B, 0x04C, 0x04D, 0x04E, 0x04F ,
0x050, 0x051, 0x052, 0x053, 0x054, 0x055, 0x056, 0x057, 0x058, 0x059, 0x05A, 0x1DB, 0x1DC, 0x1DD, 0x1DE, 0x0E2 }
----- シフトキー押下対応は、0x100 加算して識別

function SendStr( ... ) -- 文字列(ASCII コード:0x20~0x7F)の“並び”
local p={...}
for _, s in ipairs(p) do
for k=1,#s do
local c = CDT[ ASC( SS(s,k) ) - 0x20 + 1 ]
if c<0x100 then SendKey( c ) -- ASCII コード
else SendKey( 0x10, c-0x100 ) -- Shift + コード
end
end
end
end

function SendACS( ACS ) -- Alt(%)、Ctrl(^)、Shift(+)キーとの同時押下 2文字目は小文字で
local c, v = SS(ACS,1), ASC(SS(ACS,2))
if c=='%' then SendKey( 0x12, v ) -- Alt + v
elseif c=='^' then SendKey( 0x11, v ) -- Ctrl + v
elseif c=='+' then SendKey( 0x10, v ) -- Shift + v
-------------
end
end
これで、ほぼ出来た?

なお、仮想キーコード“0xE5”は効かない様ダ???


此(と前回の mouse_fn.txt)を使った、最初の一歩:
----- test_KB_fn.gsl -----
dofile('mouse_fn.txt')
dofile('KB_fn.txt')

cBK = 0x08; cTAB = 0x09; -- Backspace、Tab
cIn = 0x2D; cDEL = 0x2E; -- Insert、Delete
cCR = 0x0D; cESC = 0x1B; -- Enter、Esc
cUp=0x26; cDw=0x28; cLt=0x25; cRt=0x27; -- 矢印: ↑、↓、←、→
PF={}; for k=1,24 do PF[k]=0x70+k-1 end; -- F1 ~ F24
cShift, cCtrl, cAlt = 0x10, 0x11, 0x12; -- Shift、Ctrl、Alt
-------------------------------------------------------------
SetMouseXY( 20, 200 ) ----- この辺りに「メモ帳」画面がある?
LeftClick()
ffi.C.Sleep(500)
-------------------------------------------------------------

SendStr( 'b9G', 'A5' ) -- 'b9G' と 'A5'  5文字の一文字列でも可

SendKeys( cCR, cCR ) -- CR(コード) 2回

ffi.C.Sleep(100)
SendACS( '%F' ) -- Alt + 'F'

ffi.C.Sleep(3000)
SendKey( cAlt, PF[4] ) -- Alt + [F4]キー --- 内部関数直接
取り敢えずの動作確認はOK?


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


160516
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク