連載:VB 6ユーザーのための
これならマスターできるVB 2005超入門

第12回 VB 2005でWin32 APIを利用する

羽山 博
2007/10/26
Page1 Page2 Page3 Page4

■フレーム・ウィンドウのハンドルを取得する関数

 引数として渡されたウィンドウ・ハンドルを基に、そのフレーム・ウィンドウのハンドルを取得する関数は、以下のようなFunctionプロシージャとして作成した。

Private Function GetFrameWindow(ByVal hTarget As Integer) As Integer

  Dim hDesktop, hParent As Integer

  ' デスクトップのハンドルを取得する
  hDesktop = GetDesktopWindow()

  ' ターゲットとなるウィンドウの親ウィンドウのハンドルを取得する
  hParent = GetParent(hTarget)

  ' 親がデスクトップかNothingになるまでさかのぼる
  Do While (Not (hParent = hDesktop Or hParent = Nothing))
    hTarget = hParent ' 親をターゲットにする
    hParent = GetParent(hTarget)
  Loop
  Return hTarget
End Function
フレーム・ウィンドウのハンドルを取得するGetFrameWindow関数
  まず、デスクトップのウィンドウ・ハンドルを取得しておく。
  引数として渡されたウィンドウ・ハンドルの親ウィンドウのハンドルを取得する。
  親ウィンドウのハンドルがデスクトップのウィンドウ・ハンドルと等しくなるか、親ウィンドウのハンドルが存在しないようになるまで、処理を繰り返す。
  検索のターゲットとなるウィンドウのハンドルに親ウィンドウのハンドルを代入する。
  さらに親を探す。
  繰り返しを抜けた時点で変数hTargetにはフレーム・ウィンドウのハンドルが入っているので、それを返す。

 この関数の中では、GetDesktopWindow APIとGetParent APIを呼び出しているが、処理そのものは地道に親ウィンドウを探しているだけである。

 実のことをいうと、この関数を自作しなくても、GetAncestorというAPIを利用すれば同じことが簡単にできてしまう。が、先に触れたWin32API.txtにはこのAPIが掲載されていなかったので、今回はあえてGetFrameWindow関数を自作してみたというわけだ。

 ちなみに、GetAncestor APIの宣言と、関連する定数の宣言は、以下のようになる。

Private Declare Function GetAncestor Lib "user32" Alias "GetAncestor" (ByVal hWnd As Integer, ByVal gaFlags As Integer) As Integer

Private Const GA_PARENT = 1
Private Const GA_ROOT = 2
Private Const GA_ROOTOWNER = 3

このように宣言しておけば、ウィンドウのサイズを変えるコード(MyBase.MouseDownイベント・ハンドラ)の中にある、

hWndTarget = GetFrameWindow(hWndTarget)

は、

hWndTarget = GetAncestor(hWndTarget, GA_ROOT)

と記述できる。2番目の引数は、どのように親ウィンドウを探すかを指定する。GA_PARENT(=1)ならば、直接の親ウィンドウのハンドルを返し、GA_ROOT(=2)ならば親をたどっていきルート・ウィンドウ(これまでフレーム・ウィンドウと呼んできたもの)のハンドルを探して、それを返す。GA_ROOTOWNER(=3)ならばオーナー・ウィンドウのルート・ウィンドウを返す。

 例えば、対象となるウィンドウがダイアログ・ボックスであれば、GA_ROOTの場合はダイアログ・ボックスのウィンドウ・ハンドルが返され、GA_ROOTOWNERの場合はダイアログ・ボックスを表示した元のウィンドウのハンドルが返される。

■そのほかのコード

 残りのコードの説明は恐らく不要だろう。ラジオボタンをクリックしたときに、テキストボックスにウィンドウの幅と高さを入れるコードと、プログラムを終了させるためのコードだ。コードが煩雑になるのを避けるために、テキストボックスに値を入れるコードはSubプロシージャにまとめてある。

Private Sub SelectSize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbSize4.Click, rbSize3.Click, rbSize2.Click, rbSize1.Click
  If rbSize1.Checked Then
    SetSize(640, 480)
  ElseIf rbSize2.Checked Then
    SetSize(800, 600)
  ElseIf rbSize3.Checked Then
    SetSize(1024, 768)
  Else
    SetSize(1280, 1024)
  End If
End Sub

Private Sub SetSize(ByVal x, ByVal y)
  txtWidth.Text = x
  txtHeight.Text = y
End Sub

Private Sub ExitProc(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
  Application.Exit()
End Sub
ラジオボタンのイベント・ハンドラと終了のためのコード
4つのラジオボタンでイベント・ハンドラを共有している。それぞれのCheckedプロパティを調べ、チェックされているラジオボタンに従って、テキストボックスの値を設定している。

結び − クラス・ライブラリとWin32 APIの使い分け

 Win32 APIの機能のうち、かなりの部分は.NET Frameworkのクラス・ライブラリを利用しても実現できる。使い分けの基本的な方針としては、.NET Frameworkのクラス・ライブラリでできるならそれを使うのがベスト。Win32 APIを使うのはどうしてもWin32 APIでしかできない機能を利用したいときに限定したおいた方がよい。

 機能の対応については「Microsoft Win32 と Microsoft .NET Framework API との対応」というページに詳しいのでそちらを参照されるといいだろう。ただし、完全に1対1に対応しているわけではないことにも注意してほしい。

 例えば、親ウィンドウを取得するGetParent APIに対応するものとして、フォームのParentプロパティが取り上げられている。しかし、フォーム内で親コントロールやコンテナを探すことはできるが、今回のサンプル・プログラムのように、ほかのウィンドウの親ウィンドウを探すことはできない。

 さて、この連載もこれで終わりとなりました。筆者としては、やはり人気度が気になるところで、白状すると、毎週月曜日になるとランキング(トップ・ページの「過去30日の人気記事 Top10」)をチェックしていました(さすがに、自分でアクセスして、ページビューを稼ぐなんてことはしませんでしたが)。

 幸い、ランキングにおいては好評なようで、何回か1位に輝くこともありました。それもこれも、つたない文章にもかかわらず、我慢して読んでくださった読者の皆さんのおかげです。また、私の不勉強に鋭いツッコミを入れてくださった編集担当の遠藤さんや一色さんにもずいぶんとお世話になりました。この場を借りて感謝の意を表したいと思います。どうもありがとうございました。そして、またお会いしましょう。End of Article


 INDEX
  VB 6ユーザーのためのこれならマスターできるVB 2005超入門
  第12回 VB 2005でWin32 APIを利用する
    1.サンプル・プログラム18 − ウィンドウのサイズを変更するプログラム
    2.プログラムの考え方とWin32 APIの宣言
    3.マウスのャプチャとウィンドウのリサイズ
  4.フレーム・ウィンドウのハンドル取得
 
インデックス・ページヘ  「これならマスターできるVB 2005超入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH