ウィンドウ・ハンドルの取得

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

さて、本文。

先日(2016-06-17)「LuaCOM 代替:VBScript 利用
を書いて以降、
Lua 単独(と云っても GSL Shell だが)で、やりたい!

その為に、
先ずは、
対象ウインドウに対しする“キーボード”&“マウス”操作について、

マウス・カーソルの制御

“SendKeys”もどき

で、何とか出来そう。


ならば、
対象のウインドウをどうやって特定するか?


(<紙>にとって)学習すべき記事を見つけた。

「プログラミングのメモ帳」の「可視ウインドウの列挙

  タスクマネージャの「アプリケーション」タブで表示される
  可視属性のウインドウだけを列挙するには
  EnumWindows 関数と IsWindowVisible 関数を組み合わせると出来ます。
  列挙する可視属性の条件は次のようになります。

   1. 可視ウインドウか調べる(IsWindowVisible)
   2. オーナーのウインドウか調べる(GetWindow)
   3. キャプションが有るか調べる(空でない文字列)
   4. クラスが Progman 以外か調べる(lstrcmp)
   5. (1)~(4)までの条件が一致したら列挙対象となります。

  ・・・・・
  ・・・・・

ここで使っている関数は、
“EnumWindows”“GetWindowText”“IsWindowVisible”“IsWindowOwner”
その他。


これで学習した。

“EnumWindows”の使い方は、・・・・・
FFI Semantics
の、
  Callback resource handling
にある“例”そのもの。


それで、
'Visible' で、トップ・レベルのウインドウ一覧を取得する、
<紙>流の処理を、コード化してみた。

始めは、“IsWindowOwner”が「見つかりません」と出たので、
代わりに、“GetWindowLong”を使ってみた。

でも、“GetWindowLong”や“GetWindowText”が「見つかりません」と出る?

これらは、(当てずっぽうで)
“GetWindowLongA”や“GetWindowTextA”としたら動いた。


結局のところ、・・・・・
Int = |x| ffi.cast( 'int', x )
ffi.cdef[[
typedef int ( __stdcall* WNDENUMPROC )( void* hwnd, intptr_t l );
int EnumWindows( WNDENUMPROC func, intptr_t l );

int IsWindowVisible( int hWnd );
int GetWindowLongA( int hWnd, int nIndex );
int GetWindowTextA( int hWnd, char* lpString, int nMaxCount );
]]
buf = ffi.new( 'char[256]' )
Wcnt=0; WinIDT={}; WinHT={}; WtxtT={}

ffi.C.EnumWindows( function( hwnd, l )
if ffi.C.IsWindowVisible( Int(hwnd) ) == 1 then -- '1'=='true' / '0'=='false'
y = ffi.C.GetWindowLongA( Int(hwnd), -8 ) -- '-8'==GWL_HWNDPARENT:親ハンドル
if y ==0 then -- 自身が親か?
x = ffi.C.GetWindowLongA( Int(hwnd), -12 ) -- '-12'==GWL_ID:ウィンドウ ID
ffi.C.GetWindowTextA( Int(hwnd), buf, 255 ) -- ウインドウ名
txt = ffi.string(buf)
if #txt > 0 then
Wcnt = Wcnt + 1
WinIDT[Wcnt]=x; WinHT[Wcnt]=hwnd; WtxtT[Wcnt]=txt
end
end
end
return true
end, 0)

print( 'Wondows count=' .. Wcnt )
これで行ける?


更なる学習ダ。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


160518,20,603
関連記事
スポンサーサイト

コメントの投稿

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

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