Tips Area

 API No.1 タスクバーの位置とサイズを考慮して画面領域を取得


 皆さんは、スクリーンの座標範囲をどのように取得して使用していますか?
 一番の基本形は下のような感じでしょうか。

(0,0)    
 
 
 
    (Screen.Width,Screen.Height)

 場合によっては、Screen.TwipsPerPixelXなどで割っているかも知れません。でも、基本はこれかなと。
 ところが、場合によってはこれじゃ困ることがあります。
 つまり、「スクリーン領域」ではなくて、「デスクトップ領域」の方を取得したい場合です。

 これを取得するAPIがSystemParametersInfoです。
 これを使えば、ワークエリア(タスクバーを除いた、デスクトップ領域)の範囲の取得ができます。

 まず、VBで新規プロジェクトを作成します。
 Form1を下の画面のようにデザインします。もちろん、デザインは任意です。
 下の6つのコントロールが配置してあればOKです。

  • lblLeft (ラベル)
  • lblTop (ラベル)
  • lblRight (ラベル)
  • lblBottom (ラベル)
  • Command1 (コマンドボタン)
  • Command2 (コマンドボタン)

画面デザイン

 まず、コードモジュールを追加して、以下のコードをコードモジュールに追加します。

Declare Function SystemParametersInfo Lib "USER32" Alias "SystemParametersInfoA" (ByVal uAction&, ByVal uParam&, lpvParam As RECT, ByVal fuWinIni&) As Long↓
Public Const SPI_GETWORKAREA = 48 '(Win95)スクリーンのサイズ(ピクセル)↓
↓
↓
Type RECT↓
    Left As Long '矩形の左上隅のx座標↓
    Top As Long '同、y座標↓
    Right As Long '矩形の右下隅のx座標↓
    Bottom As Long '同、y座標↓
End Type↓

 次に、フォームモジュールを開き、以下のコードを貼りつけます。

Private Sub Command1_Click()↓
    Dim stWorkArea As RECT↓
    Dim lRetValue As Long↓
    ↓
    lRetValue = SystemParametersInfo(SPI_GETWORKAREA, 0&, stWorkArea, 0&)↓
    If lRetValue = 0 Then↓
        '戻り値が 0 の場合はエラー↓
        MsgBox "ワークエリアの取得に失敗しました。", vbCritical Or vbOKOnly, "APIs No.1 エラー報告"↓
    Else↓
        '戻り値が 0 以外の場合は正常終了↓
        lblLeft.Caption = stWorkArea.Left↓
        lblTop.Caption = stWorkArea.Top↓
        lbLRight.Caption = stWorkArea.Right↓
        lblBottom.Caption = stWorkArea.Bottom↓
    End If↓
End Sub↓
↓
↓
Private Sub Command2_Click()↓
    Dim stWorkArea As RECT↓
    Dim lRetValue As Long↓
    ↓
    lRetValue = SystemParametersInfo(SPI_GETWORKAREA, 0&, stWorkArea, 0&)↓
    If lRetValue = 0 Then↓
        '戻り値が 0 の場合はエラー↓
        MsgBox "ワークエリアの取得に失敗しました。", vbCritical Or vbOKOnly, "APIs No.1 エラー報告"↓
    Else↓
        '戻り値が 0 以外の場合は正常終了↓
        Me.Left = stWorkArea.Left * Screen.TwipsPerPixelX↓
        Me.Top = stWorkArea.Top * Screen.TwipsPerPixelY↓
        Me.Width = (stWorkArea.Right - stWorkArea.Left) * Screen.TwipsPerPixelX↓
        Me.Height = (stWorkArea.Bottom - stWorkArea.Top) * Screen.TwipsPerPixelY↓
        '※1:各行で Screen.TwipsPerPixelX(or Y) を掛けているのは、↓
        '     SystemParametersInfo API で取得した値がピクセル単位であるため。↓
        '        ==> [ピクセルでの値] * Screen.TwipsPerPixelX <----> [Twipsでの値]↓
        '※2:.Right は右側の座標なので、幅を出すには「右の座標 - 左の座標」とする↓
        '     必要があります。高さも同様です。↓
    End If↓
End Sub↓

 コードを貼りつけたら、実行してみます。
 「取得」ボタンをクリックすると、タスクバーを除いた画面領域のサイズが表示されます。
 「取得&セット」ボタンをクリックすると、タスクバーを除いた画面領域のサイズ一杯にウィンドウを拡大します。
 Screen.Widthなどを使うと、タスクバーの下にもぐり込みますが、この場合は大丈夫です。


 今回の Tips のサンプルが下でダウンロードできます。
 サンプルには実行ファイルは含まれていません。

 タスクバーの位置とサイズを考慮して画面領域を取得するサンプル(VB5以降) (2.00KB)
   Download 

→ Tips  → Top  

Build & Management is Wajin Kisaragi
WK Project 1998-2001

Mail address is feb_tr@mail.goo.ne.jp