KWF (kami's Window Functions) モジュール

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

さて、本文。

先月(2016-07-11)の記事「ウィンドウ・ハンドル関連関数群定義
で書いた、
“win_list.txt”プログラムを、
“モジュール”化した。

名前は、“KWF.lua”

そこには、2つの関数を定義した。

1つ目は“List”関数。

  Visible で、親(最上位)の、ウィンドウ一覧を取得する。
  戻り値は、1つの数値と4つのテーブル。

  N, whT, ttT, piT, thT = KWF.List( )

  N  : テーブルのエントリ数
  whT : ウィンドウ・ハンドルのテーブル
  ttT : ウィンドウのタイトルバーのテキストのテーブル
  piT : プロセス ID のテーブル
  thT : スレッド ID のテーブル


2つ目は“MovW”関数。

 指定されたウィンドウを指定位置・サイズで前面に設定する。
 戻り値は、無し。

  KWF.MovW( hwnd, x0, y0, xx, yy )

  hwnd : ウィンドウのハンドル
  x0  : ウィンドウの横方向の位置
  y0  : ウィンドウの縦方向の位置
  xx  : ウィンドウのサイズ、横幅
  yy  : ウィンドウのサイズ、高さ


このモジュールを利用する例:
----- test_Main.gsl:KWF.lua 利用サンプル -----
ffi.cdef[[ void Sleep( int ms ); ]]

function printf( f, s, ... )
f = f or io.stdout
f:write(s:format(...))
end
------------------------------------------------------------------
os.execute( 'start notepad' ); ffi.C.Sleep(1000)

local kwf = require'KWF' --「~.List()」「~.MovW( whnd, x0, y0, xx, yy )」

Wcnt, WhndT, WtxtT, pIDT, thrdT = kwf.List()

for k=1,Wcnt do
printf( nil, '%s %s %s %s\n', WhndT[k], pIDT[k], thrdT[k], WtxtT[k] )
end

kk = 0
for k=1,Wcnt do
if string.find( WtxtT[k], 'メモ帳' ) then
print( k, WtxtT[k] ); kk=k; break
end
end
if kk>0 then
kwf.MovW( WhndT[kk], 0, 0, 800, 600 )
end
と云った感じ?


なお、「KWF.lua」は以下の如し:
----- KWF.lua -----
local KWF = { }

voidA = |x| ffi.cast( 'void*', x )
ffi.cdef[[
int IsWindowVisible( void* hWnd );
int GetWindowLongA( void* hWnd, int nIndex ); // 取得するデータの指定
int GetWindowTextA( void* hWnd, char* lpString, int nMaxCount ); // テキストバッファ, 最大文字数
int GetWindowThreadProcessId( void* hWnd, void* lpdwProcessId ); // スレッドID、プロセスID 取得
void MoveWindow( void* hWnd, int X, int Y, int Width, int Height, int bRepaint );
int ShowWindow( void* hWnd, int nCmdShow );
int SetForegroundWindow( void* hWnd );

typedef int ( __stdcall* WNDENUMPROC )( void* hwnd, intptr_t l );
int EnumWindows( WNDENUMPROC func, intptr_t l );
]]
---------------------------- 関数 ----------
function KWF.List( )
local Wcnt=0 -- Window数
local WhndT, WtxtT, pIDT, thrdT = {}, {}, {}, {}
local b = ffi.new('char[256]')
local p = ffi.new('int[1]')
ffi.C.EnumWindows( function( hwnd, l )
local tf = ffi.C.IsWindowVisible( hwnd ) -- 先ず、これで絞る。
if tf==1 then -- true==1 / false==0
local h = ffi.C.GetWindowLongA( hwnd, -8 )
-- GWL_HWNDPARENT : 親Windowハンドル
if h == 0 then ----- 自分が親か?
local t = ffi.C.GetWindowThreadProcessId( hwnd, voidA(p) )
ffi.C.GetWindowTextA( 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)
return Wcnt, WhndT, WtxtT, pIDT, thrdT
end

function KWF.MovW( hwnd, x0, y0, xx, yy )
ffi.C.ShowWindow( hwnd, 4 ) -- 元のサイズ ( 5 でも可? )
ffi.C.MoveWindow( hwnd, x0, y0, xx, yy, 1 )
ffi.C.SetForegroundWindow( hwnd )
end

return KWF
これでOK?


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


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

コメントの投稿

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

おきてがみ/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
ブックマーク