ウィンドウ・ハンドル関連関数群定義

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

さて、本文。

先日(2016-07-08)の記事「マウス操作関数群定義ファイル
で“mouse_fn.txt”を作った。
そして、
続く(2016-07-10)の記事「キー入力エミュレーション関数群定義
で“KB_fn.txt”を作った。

この2つの関数群で、
カレントのウインドウに対する、
“マウス”と“キーボード”のエミュレーションが出来そう。

そして、
先月(2016-06-25)の記事「ウィンドウ・ハンドルの取得
でのコードで、ほぼ完成形に近いモノがあり。

今回は、最終形(?)コードを作った。
ファイル名は“win_list.txt”とした。

ここで使う(MSの)関数は:
  ・EnumWindows
  ・IsWindowVisible
  ・GetWindowLongA
  ・GetWindowTextA
  ・GetWindowThreadProcessId
  ・GetWindowRect
  ・MoveWindow
それと、
自作(Web入手)関数:
 “split”と“printf”

出来たのは、・・・・・
----- win_list.txt ----------
voidA = |x| ffi.cast( 'void*', x )
Int = |x| ffi.cast( 'int', x )
function split( str, sep )
if sep == nil then sep = '%s' end
local t={} ; i=1
for s in string.gmatch( str, "([^"..sep.."]+)") do
t[i] = s i=i+1
end
return t
end
function printf( f, s, ... )
f = f or io.stdout
f:write(s:format(...))
end

ffi.cdef[[
typedef unsigned int DWord;
typedef struct tagRECT{
int left; int top; // 左上 x座標、y座標
int right; int bottom; // 右下 x座標、y座標
} RECT;

int IsWindowVisible( int hWnd );

int GetWindowLongA( int hWnd, int nIndex );
// ウィンドウハンドル、取得するデータの指定

int GetWindowTextA(
int hWnd, // ウィンドウハンドル
char* lpString, // テキストバッファ
int nMaxCount // コピーする最大文字数
);

DWord GetWindowThreadProcessId( // スレッドID、プロセスID 取得
int hWnd, // ウィンドウハンドル
void* lpdwProcessId // プロセスID
);

void GetWindowRect( int hWnd, void* pRect );
// ウィンドウハンドル、RECT構造体のアドレス

void MoveWindow(
int hWnd, // ウィンドウハンドル
int X, // 横方向の位置
int Y, // 縦方向の位置
int nWidth, // 幅
int nHeight, // 高さ
int bRepaint // 再描画オプション
);

typedef int ( __stdcall* WNDENUMPROC )( void* hwnd, intptr_t l );
int EnumWindows( WNDENUMPROC func, intptr_t l );

]]
---------------------------- 以下:処理部 ------------------------
local b = ffi.new('char[256]')
local p = ffi.new('int[1]')
Wcnt=0; WhndT={}; WtxtT={} -- Window数、WHND、Windowテキスト
pIDT={}; thrdT={} -- プロセスID、スレッドID

ffi.C.EnumWindows( function( hwnd, l )
tf = ffi.C.IsWindowVisible( Int(hwnd) ) -- 先ずは、これで絞る。
if tf==1 then -- true==1 / false==0
local h = ffi.C.GetWindowLongA( Int(hwnd), -8 )
-- GWL_HWNDPARENT : 親Windowハンドル
if h == 0 then ----- 自分が親か?
local t = ffi.C.GetWindowThreadProcessId( Int(hwnd), voidA(p) )
ffi.C.GetWindowTextA( Int(hwnd), b, 255 )
local s = ffi.string(b)
if #s > 0 then
Wcnt = Wcnt + 1
WhndT[Wcnt]=hwnd; WtxtT[Wcnt]=s
pIDT[Wcnt]=p[0]; thrdT[Wcnt]=t
end
end
end
return true
end, 0)
でしょうか?


動作確認プログラム:“test_win_mouse_KB.gsl”

処理手順(概要):
1.目的のアプリ(メモ帳)を起動&時間待ち:
   os.execute('start notepad'); ffi.C.Sleep(1000)

2.dofile('win_list.txt')
   結果: Wcnt、WhndT[]、WtxtT[]、pIDT[]、thrdT[]
  定義済み関数:「MoveWindow」など、
   ffi.C.MoveWindow( Int(voidA(WhndT[5])), 0, 0, 800, 600, 1 )

3.dofile('mouse_fn.txt')
  定義済み関数:
   SetMouseXY( x, y )  -- マウス座標設定
   GetMouseXY()      -- マウス座標取得
   LeftClick()     -- 左ボタンクリック
   RightClick()      -- 右ボタンクリック
   MiddleClick()    -- 中ボタンクリック

4.dofile('KB_fn.txt')
  定義済み関数:
   内部関数:SendKey( i[, k] )
   SendKeys( ... ) -- バイナリコード1つの“並び”
   SendStr( ... )  -- 文字列(ASCII コード:0x20~0x7F)の“並び”
   SendACS( ACS )  -- Alt(%)、Ctrl(^)、Shift(+) キーと1文字
          ----- '%f'、'^e'、'+;' 等(1文字はシフトしないで)
   ASC = string.byte
   SS = |s,j| string.sub(s,j,j)


それで、作ったのは:
----- test_win_mouse_KB.gsl -----
ffi.cdef[[
void Sleep( int MilliSeconds );
]]
------------------------------------------------------------------
os.execute('start notepad'); ffi.C.Sleep(1000)

dofile('win_list.txt')
printf( nil, 'Window count=%d\n', Wcnt )
printf( nil, '----------- Window_handle pID thread _____Window text_____\n' )
for k=1,Wcnt do
printf( nil, '%s %s %s %s\n', WhndT[k], pIDT[k], thrdT[k], WtxtT[k] )
end
------- 存在チェック ----- 日本語でOK
kk = 0
for k=1,Wcnt do
if string.find( WtxtT[k], 'メモ帳' ) then
print( k, WtxtT[k] ); kk=k; break
end
end

ffi.C.MoveWindow( Int(voidA(WhndT[kk])), 0, 0, 800, 600, 1 )

------------------------------------------------------------------
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
------------------------------------------------------------------

ffi.C.Sleep(500)
SetMouseXY( 20, 200 )
RightClick(); ffi.C.Sleep(10); SendKeys( cESC )

ffi.C.Sleep(10)
SendStr( 'b9G', 'A5' ) -- 'b9G' と、'A5'

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

SendKey( cShift, PF[4] ) -- Shift + [F4]キー ( 内部関数直接 )

ffi.C.Sleep(500)
SendACS( '%F' ) -- Alt + 'F'
これで、
何となくOK???


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


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

コメントの投稿

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

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



おきてがみ

最新記事
カレンダー
07 | 2017/08 | 09
- - 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 31 - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

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

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


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

Google Analytics
ブックマーク