
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
すみません、説明がVBベースでした・・・。
メッセージのキャッチ目的なら、KenKen_SPさんの
仰るとおりで完璧だと思います。
もしUserFormをサブクラスせず別オブジェクトに専属させたいのであれば、
RegisterClass,CreateWindow API関数で別の親ウインドウを作成して
クラスモジュールでメッセージハンドラ用プロシージャを
用意して当てればモジュールがすっきりします。
スモールアイコン、拡張スタイルは無関係なので Ex いらずです。
互換プログラミングスタイルで私はVB、VBAでも極力APIで埋め込みますが、
小規模ならKenKen_SPさんのやり方を適用するべきです。
No.3
- 回答日時:
> ウインドウメッセージを捕らえたいのではなく、(特殊な方法で)
> ウインドウメッセージを送りたいのです。
WinSock から通知されてくるメッセージ、例えば FD_READ を捕らえ
たら、recv() をコール...するといった処理をさせるわけではない..
ということですね?
ダミーで良いなら、通知先は Userform で良いのでは?
#2 のコードで得られたハンドルで良いと思います。
Frame などは下記のようなコードで取れるは取れるのですけど、確実に
「この Frame のハンドル」とは取れないのです。
例えば、Form 内に Frame が 2つ配置されていたり、ListBox も配置
されていたら、その内のどれかのハンドル...といった具合です。
したがって、「取れる・取れない」というレベルでは、「取れる」なの
ですが、実用に使えるものではありません。
# これが Excel VBA の仕様なのでどうしようもないんです...
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _
ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
Private Sub CommandButton1_Click()
Dim hWnd As Long
hWnd = FindWindow("ThunderDFrame", Me.Caption)
hWnd = FindWindowEx(hWnd, 0&, "F3 Server 60000000", vbNullString)
hWnd = FindWindowEx(hWnd, 0&, "F3 Server 60000000", vbNullString)
MsgBox hWnd
End Sub
興味本位で恐縮ですが、メッセージを受け取らないのに、なぜ通知先
が必要なんでしょう? だとしたら、WSAAsyncSelect の意図がよく
分かりません。
あまりご期待に沿う回答ができず、すみません。
この回答への補足
> WinSock から通知されてくるメッセージ、例えば FD_READ を捕らえ
> たら、recv() をコール...するといった処理をさせるわけではない..
> ということですね?
そういう処理をしたいのですが、そういう処理をダミーとして配置したコントロールのイベントとして記述しようとしているのです。
> 興味本位で恐縮ですが、メッセージを受け取らないのに、なぜ通知先
> が必要なんでしょう? だとしたら、WSAAsyncSelect の意図がよく
> 分かりません。
メッセージは受け取りたいのです。メッセージを受けるコントロールがダミーなだけで、メッセージを受けても処理しないわけではありません。
考えていた方法では困難そうですので、
方向転換して、UserFormをサブクラス化する方向で少し検討してみませす。
ありがとうございました。
No.2
- 回答日時:
VBA の標準コントロール(Microsoft Forms2 Object Library)は、
一部( ListBox や Frame )を除いてウインドウハンドルを取得
できません。SPY++ で調べるとわかります(^^;
# テキストボックスなどはハンドルが無いので、FindWindowEx
# を使っても取得できません。
これは、VB6.0 との差別化のための仕様だと思いますが...
WSAAsyncSelect について詳しくはありませんが、ウインドウ
メッセージを捕らえるなら、別にコントロールでなくとも
Userform のウインドウハンドルが取得できれば良いのでは
ありませんか?
Userform のハンドル取得方法は FindWindow API を使用します。
注意点としては、Excel97 と Excel2000以降のバージョンで
クラス名が変更になっている点です。
クラス名: "ThunderXFrame" ' Excel 97
クラス名: "ThunderDFrame" ' Excel 2000 Later
もし Excel97 での動作も視野に入れるなら下記のようなコード
で条件分岐させれば良いでしょう。
sClass = IIf(Val(Application.Version) <= 9, _
"ThunderXFrame", _
"ThunderDFrame")
hWnd = FindWindow(sClass, UserForm1.Caption)
あとはこのハンドルを使って、Userform をサブクラス化すれば
メッセージをフックできると思います。
この回答への補足
丁寧な回答ありがとうございます。
ListBox や Frameのハンドルが取得できるのであれば、目的は達成できるのですが、これはどのようにすれば取得できるのでしょうか?
> WSAAsyncSelect について詳しくはありませんが、ウインドウ
> メッセージを捕らえるなら、別にコントロールでなくとも
> Userform のウインドウハンドルが取得できれば良いのでは
> ありませんか?
ウインドウメッセージを捕らえたいのではなく、
(特殊な方法で)ウインドウメッセージを送りたいのです。(実際に送るのはシステム?がします)
そのために、送り先のコントロールのハンドルが必要になっています。
WSAAsyncSelectは、その為の設定をします。
[使用イメージ]
WSAAsyncSelect(ソケット, 送り先のハンドル, 送信メッセージ, イベント) as エラーコード
メッセージを受けるコントロールはダミーなので、ListBox でも問題ありません。
No.1
- 回答日時:
コントロールハンドルでしたらやはり
≫コントロール名.hwnd(Button1.hwnd のように)
で取得できますが取得実体がなければ、
1.EnumChildWindows 関数で列挙
2.GetClassName 関数でクラス名を照合させて洗い出す
後者は動的コントロール作成でも使えます。
(VBプログラマはほとんど使わないですけど・・・)
この回答への補足
早速の回答ありがとうございます。
しかし、、、
Button1.hWnd のようにしてみましたが、「コンパイルエラー メソッド又はデータメンバーが見つかりません」となります。(入力補完でもでてきませんが、なぜか"w"は自動的に大文字になります。Button1.hWnd()ともしてみましたが、同じでした)
> 1.EnumChildWindows 関数で列挙
> 2.GetClassName 関数でクラス名を照合させて洗い出す
これについては、使用方法がわかりませんが、もう少し調べてみます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 「Excelのオプション」の「ユーザーインターフェイスのオプション」の設定値をVBAで取得したい 1 2022/07/31 23:49
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Visual Basic(VBA) VBAでPDFのアクティブページ番号取得 1 2023/05/25 12:41
- Visual Basic(VBA) Excel VBA ファイル取得について フォルダの中に、ファイル名“会議“を含むファイルが1つまた 9 2022/10/12 01:18
- Visual Basic(VBA) 【VBA】先月分の取得ができない理由が分かりません。 2 2022/04/24 11:16
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Visual Basic(VBA) EXCEL VBAで教えてください。 1 2022/12/22 04:20
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- Visual Basic(VBA) 最終列の右へSUM関数を作成するため下記コードを実行しましたが、最終列「10月28日」が上書きされて 3 2022/12/05 20:32
- Visual Basic(VBA) Sheet1のA列にコードB列にメアド、Sheet2のB列にコード一覧とD列にメアド一覧があり、Sh 3 2022/10/19 11:57
このQ&Aを見た人はこんなQ&Aも見ています
-
Excel VBA で外部アプリケーションのコンテキストメニューを操作したい
その他(プログラミング・Web制作)
-
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
UserForm
Visual Basic(VBA)
-
-
4
【エクセルのマクロ】クリップボードのbitmapをフォームに表示させたい
Visual Basic(VBA)
-
5
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
6
エクセルVBAでマルチページの切り替え方法の件で
Excel(エクセル)
-
7
ExcelVBAでAPIを使って外部ウインドウのエディットテキストを取得する方法
Visual Basic(VBA)
-
8
ExcelVBAでListViewが使用できない
Visual Basic(VBA)
-
9
プロセスIDの取得方法について
Visual Basic(VBA)
-
10
コマンドボタンやイメージにマウスをのせるとボタン名を表示したい
Excel(エクセル)
-
11
ユーザーフォームをホイールでスクロールする方法(Excel2000VBA)
Excel(エクセル)
-
12
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
13
VBAのリストボックスで、横スクロールバーを表示するには?
Visual Basic(VBA)
-
14
Excel VBAでブックを閉じる時、複数のブックが開いていると・・・。
Excel(エクセル)
-
15
エクセル ユーザーフォームにオートシェープ(図形)を貼り付けるこは可能なのでしょうか?
Excel(エクセル)
-
16
【Excel VBA】マクロでExcel自体を終了させたい
Excel(エクセル)
-
17
VBA ユーザーフォームの Keypreview について
Visual Basic(VBA)
-
18
親ウインドウにあるOKボタンを押す方法
Visual Basic(VBA)
-
19
ユーザーフォームで動的(Me.Controls.Add)に作成したコントロールの削除
Visual Basic(VBA)
-
20
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メッセージボックスの選択ボタ...
-
SetWindowText関数について
-
VB.netでFindWindowExやると・...
-
メッセージハンドラ
-
vbaから他のアプリを終了
-
textboxに文字列を挿入したい。
-
キーボード・フックのアプリを...
-
他のウィンドウのボタンを自動...
-
Javaでグローバルフックは不可能?
-
VC++で他のアプリケーションを...
-
WM_NCLBUTTONUPについて
-
VBAでコントロールのハンドルを...
-
キーボードフックについて
-
WM_CLEARなど使えないメッセー...
-
ダイアログを閉じるとメモリー...
-
システム例外のメッセージを変...
-
マウスの左クリックの内容を知...
-
VBA アクティブウインドウの取...
-
エクセルで作った新しいウイン...
-
グラフの交点の求め方(Excel)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
msgboxの表示位置
-
メッセージボックスの選択ボタ...
-
SetWindowText関数について
-
他のウィンドウのボタンを自動...
-
VB.netでFindWindowExやると・...
-
デスクトップ上のアイコンの位...
-
メッセージハンドラ
-
VBAでコントロールのハンドルを...
-
システム例外のメッセージを変...
-
VBでRegisterWindowMessage関数...
-
VC++(MFC)でタスクバーに常駐し...
-
VBA 複数セルが空白なら印刷さ...
-
16進数入力制限方法
-
グローバルフック(SetWindowsH...
-
マウスホイールをフックしたい
-
WM_NCLBUTTONUPについて
-
キーボード入力をHSPでさせたい...
-
点滅で知らせる方法
-
チェックボックスのキーダウン...
おすすめ情報