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も見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
ExcelVBAでAPIを使って外部ウインドウのエディットテキストを取得する方法
Visual Basic(VBA)
-
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
Excel VBAで他アプリケーションの文字列取得
Excel(エクセル)
-
-
4
親ウインドウにあるOKボタンを押す方法
Visual Basic(VBA)
-
5
WinAPIで電卓をクリック
Visual Basic(VBA)
-
6
EnumChildWindowsの使い方(VBA)
Visual Basic(VBA)
-
7
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
8
ウインドウハンドルのつかみ方について質問です。
Visual Basic(VBA)
-
9
エクセルVBAでフォームのListboxをスクロールするには?
その他(Microsoft Office)
-
10
テキストボックスのカーソル位置の取得・設定方法
Visual Basic(VBA)
-
11
別のアプリケーションのテキストフィールドに入力する方法
Visual Basic(VBA)
-
12
VBAで、なぜかSendkeyが効きません。
PowerPoint(パワーポイント)
-
13
【VBAユーザーフォームで閉じるボタンを表示したくない】
Visual Basic(VBA)
-
14
メッセージボックスのOKボタンをVBAでクリックさせたい
Visual Basic(VBA)
-
15
VBAでエクセル内の情報を他のアプリケーションへ自動入力したいです
Visual Basic(VBA)
-
16
ExcelVBAのコントロールの種類の取得方法
Visual Basic(VBA)
-
17
vbaから他のアプリを終了
Visual Basic(VBA)
-
18
API32 コントロールのEditテキストの文字列の取得・出力について
Visual Basic(VBA)
-
19
Excel VBA で外部アプリケーションのコンテキストメニューを操作したい
その他(プログラミング・Web制作)
-
20
フォーム上の現在アクティブなコントロールの取得
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DEVICECHANGE() の受け取り
-
他のウィンドウのボタンを自動...
-
システム例外のメッセージを変...
-
キーボード入力をHSPでさせたい...
-
デスクトップ上のアイコンの位...
-
マウスの右クリック+Shiftキー...
-
VB6でシャットダウン、ログオフ...
-
vbaから他のアプリを終了
-
WM_CLEARなど使えないメッセー...
-
SendMessage で ESC など
-
メッセージハンドラ
-
CloseHandle()
-
SetWindowText関数について
-
メッセージボックスの選択ボタ...
-
エクセルで作った新しいウイン...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
フォントの大きさ
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
メッセージボックスの選択ボタ...
-
他のウィンドウのボタンを自動...
-
msgboxの表示位置
-
VBAでコントロールのハンドルを...
-
デスクトップ上のアイコンの位...
-
メッセージハンドラ
-
SendMessage で ESC など
-
SetWindowText関数について
-
VB.netでFindWindowExやると・...
-
点滅で知らせる方法
-
CloseHandle()
-
SetWindowsHookEx(グローバル...
-
Excel VBA で外部アプリケーシ...
-
VBA 複数セルが空白なら印刷さ...
-
WM_NCLBUTTONUPについて
-
VBでRegisterWindowMessage関数...
-
システム例外のメッセージを変...
-
アプリケーション間での操作
-
マウスホイールをフックしたい
おすすめ情報