< January 2005 | February 2005 | March 2005 >

February 23, 2005

非同期イベント発生コントロール

時間のかかる処理をイベントと非同期に処理したいことがあり、ウインドウメッセージを使って非同期にイベントを発生させるユーザコントロールを作成しました。マルチスレッドではないので並列処理はできませんが、以外に使えるのでおいておきます。VB6用。

続きを読む...

ウインドウを一時的にアクティブにして最前面に持ってくる

後ろで動いてるアプリを手前に持ってくる関数です。いつも作るうえに、毎回調べないと作れないので載せておきます。

ちなみに、ウインドウが「常に」最前面に表示されるようにするには、SetWindowPos 関数で HWND_TOPMOST を渡します。でもこれはググればごろごろサンプル出てくるんですけどね。

続きを読む...

February 20, 2005

WSH よりクリップボードを使う

最近のバージョンの IE ではセキュリティが厳しくなったためこの手法は使いづらくなりました。
[WSH よりクリップボード、次の手] も参照してみてください。(2010.10.08)

WSH よりクリップボードにアクセスすることはできない。しかし、調べてみたところ、Internet Explorer がクリップボードにアクセスするためのインターフェースを公開していることがわかった(常套手段?)。

そんなわけで、文字列をコピー & 取得する部分をクラス化した。

使い方はこんな感じで。

var clipboard = new Clipboard ();
var s = clipboard.getText ();
WScript.Echo (s);
clipboard.setText (s.replace (/my/gi, "Your"));
続きを読む...

February 10, 2005

デスクトップの作業領域

私は今まで、VBでウインドウの配置を決めるのに、デスクトップのサイズを下のようにして得ていた。

Dim lngRet          As Long
Dim udtRcDesktop    As RECT

'' デスクトップ全体の矩形を取得します
lngRet = GetWindowRect( GetDesktopWindow(), udtRcDesktop )

でも、これだとタスクバーを含んじゃうんだよね。で、SystemParametersInfo関数を使うと、タスクバーを含まない、デスクトップの作業領域の矩形を得ることができます。

'' デスクトップの作業領域の矩形を取得します
lngRet = SystemParametersInfo( SPI_GETWORKAREA, 0&, udtRcDesktop, 0& )

続きを読む...

ListBox に水平スクロールバーを表示する

VB6のリストボックスは、項目が長くても横スクロールできない。横スクロールバーを出すには、LB_SETHORIZONTALEXTENT メッセージを送る必要がある。

項目追加するたびに横スクロールバーを調整するのはこんな感じ

Option Explicit
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const LB_GETHORIZONTALEXTENT    As Long = &H193
Private Const LB_SETHORIZONTALEXTENT    As Long = &H194&

'------------------------------------------------------------------
'プロシージャ名:  :AddItemAndSetScrollBar
'説明:            :リストボックスに項目を追加し、必要に応じて横スクロールバーを表示する
'引数:            :pListBox           I   リストボックス
'                 :pItem              I   追加する文字列
'                 :pIndex             I   追加位置
'------------------------------------------------------------------
Private Sub AddItemAndSetScrollBar(pListBox As VB.ListBox, pItem As String, Optional pIndex As Variant)
Dim sngTextWidth        As Single
Dim lngCurPixels        As Long
Dim lngNewPixels        As Long
    
    
    '' ここは説明は不要でしょう
    Call pListBox.AddItem(pItem, pIndex)
    
    '' 現在の幅を取得
    lngCurPixels = SendMessage(pListBox.hWnd, LB_GETHORIZONTALEXTENT, 0&, ByVal 0&)
    
    '' テキストの幅から必要なスクロール幅を計算
    '' 計算方法は適宜修正のこと
    '' リストボックスのフォントとフォームのフォントが同じならこんな感じで求められる
    With pListBox.Parent
        sngTextWidth = .TextWidth(pItem)                            '' 文字列の幅
        lngNewPixels = .ScaleX(sngTextWidth, .ScaleMode, vbPixels)  '' ピクセルに変換
    End With
    
    '' 余白分を足す
    '' ここでは適当に4ピクセル足してるが、システム標準の値とかあるのかしら
    '' GetSystemMetrics( SM_CXEDGE ) * 2 あたりがに合わしておくといいかも
    lngNewPixels = lngNewPixels + 4&
    
    '' 現在の幅がちっちゃければ設定します。
    If (lngNewPixels > lngCurPixels) Then
        Call SendMessage(pListBox.hWnd, LB_SETHORIZONTALEXTENT, lngNewPixels, ByVal 0&)
    End If
End Sub
続きを読む...