非同期イベント発生コントロール
時間のかかる処理をイベントと非同期に処理したいことがあり、ウインドウメッセージを使って非同期にイベントを発生させるユーザコントロールを作成しました。マルチスレッドではないので並列処理はできませんが、以外に使えるのでおいておきます。VB6用。
時間のかかる処理をイベントと非同期に処理したいことがあり、ウインドウメッセージを使って非同期にイベントを発生させるユーザコントロールを作成しました。マルチスレッドではないので並列処理はできませんが、以外に使えるのでおいておきます。VB6用。
後ろで動いてるアプリを手前に持ってくる関数です。いつも作るうえに、毎回調べないと作れないので載せておきます。
ちなみに、ウインドウが「常に」最前面に表示されるようにするには、SetWindowPos 関数で HWND_TOPMOST を渡します。でもこれはググればごろごろサンプル出てくるんですけどね。
最近のバージョンの 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"));
私は今まで、VBでウインドウの配置を決めるのに、デスクトップのサイズを下のようにして得ていた。
Dim lngRet As Long
Dim udtRcDesktop As RECT
'' デスクトップ全体の矩形を取得します
lngRet = GetWindowRect( GetDesktopWindow(), udtRcDesktop )
でも、これだとタスクバーを含んじゃうんだよね。で、SystemParametersInfo関数を使うと、タスクバーを含まない、デスクトップの作業領域の矩形を得ることができます。
'' デスクトップの作業領域の矩形を取得します
lngRet = SystemParametersInfo( SPI_GETWORKAREA, 0&, udtRcDesktop, 0& )
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