VBでRegisterWindowMessage関数を利用したメッセージの取得

このQ&Aのポイント
  • VBでRegisterWindowMessage関数を使用して、メッセージの取得方法について悩んでいます。
  • APIを使用するのが初めてで、調べたものの理解に苦しんでいます。
  • 質問者と同じ問題に取り組んでおり、ウインドウハンドルを渡す方法は解決済みですが、メッセージIDの取得方法が分からず困っています。
回答を見る
  • ベストアンサー

VBでRegisterWindowMessage関数を利用したメッセージの取得 2

http://oshiete1.goo.ne.jp/kotaeru.php3?q=1042889 の質問者の方と同じことで悩んでおります。 ---回答引用--- (1)VB側のウインドウハンドル(Me.hWnd)をAPIに渡す。 (2)RegisterWindowMessage("キーワード")でメッセージIDを取得する。 (3)VB側のウインドウをサブクラス化して、(2)のメッセージIDをフックする。 -------------- ということなのですが、 (1)は解決できたと思います。 (2)で、メッセージIDを取得する方法で悩んでいます。 "キーワード"は任意の文字列でいいのでしょうか? APIを使用するのが初めてで、いろいろ調べたのですが、なかなか理解できないで困っております。 APIについておすすめのURLでもよいので教えていただけますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • takkunnet
  • ベストアンサー率74% (32/43)
回答No.1

任意で問題ありません。 設定側と呼び出し側で共通の値を使用するだけです。

oxox_monkey
質問者

お礼

takkunnetさん> やっとすっきりしました。 どうもありがとうございました。 (3)でまたつまづきそうですが…

関連するQ&A

  • VBでRegisterWindowMessage関数を利用したメッセージの取得

    ICカードのリーダにアクセスする開発ツールでコールバック関係のAPIが提供されているのですが、「メッセージ値の取得はWindows APIのRegisterWindowMessage関数を利用して行う」とマニュアルにあり、呼び元でどのようにコーディングしたらよいか知識不足の為、わかりません。。。 API開発元に照会するべき事は照会しようと考えていますが、VBにてRegisterWindowMessage関数を利用したメッセージの取得方法についてサンプル等あれば、教えてください。 (VBほとんど初心者に近い腕前です。よろしくお願いします。) 参考の為にAPIの引数を記載します。(APIはVC++及びVBにて使用可能でありマニュアル上の記載はVC++でされています。)   関数名:set_call_back_parameters 引数(in): int handle; //ハンドラ unsigned char* message_of_card_find;     //カード認識時送信メッセージ unsigned char* message_of_card_loss;    //カード認識NG送信メッセージ unsigned long inerval;    //認識行う間隔 ミリ秒 unsigned long retry_count    //リトライカウント値 回数  ※引数のうちhandleがメッセージ値取得に関連していると思われるのですが、何をセットするのかわかりません。 (API開発元に照会すべき事であればそうします。)

  • ほかのアプリケーションからのメッセージの取得

    他のアプリケーションからのメッセージの取得方法を教えて下さい。 現在マインスイーパを起動し、そのボタンが押下される順番を記憶するプログラミングを制作しています。 マウスの左クリックに関するメッセージを取得すれば良いと思い、 GetMessage(&msg, hWnd, WM_LBUTTONDOWN, WM_LBUTTONUP);←hWndはマインスイーパのウィンドウハンドル のように書いたんですが、うまくいきませんでした。 調べてみるとGetMessageの第二引数は呼び出し側のスレッドに所属していなくてはならないということで、 この辺が原因なのだろうと思うのですが…。 どなたかご教授ねがいます。 <環境>  Windows Vista Home Premium  Visual C++ Express Edition

  • アクティブウインドウのIMEコンテキスト取得を取得したい。

    アクティブウインドウのIMEコンテキスト取得を取得したい。 以下、問題のコードです。 ---ここから 'アクティブウインドウのハンドルを取得API宣言 Private Declare Function GetActiveWindow Lib "user32" () As Long 'IMEコンテキスト取得API宣言 Private Declare Function ImmGetContext Lib "imm32.dll" _ (ByVal hWnd As Long) As Long Private Sub CommandButton1_Click() 'アクティブウインドウのハンドルを取得 Dim hWnd As Long hWnd = GetActiveWindow() 'IMEコンテキスト取得 Dim himc As Long himc = ImmGetContext(hWnd) End Sub ---ここまで 上記のコードでアクティブウインドウ(上記例の場合、エクセル)でのIMEコンテキスト取得 したいと思っています。 hWndでは、ハンドルを取得できているのですが、 himcの戻り値が0になってしまって、IMEコンテキスト取得が失敗しています。 目的は、アクティブウインドウでのIMEの入力をローマジ入力の半角英数のみにすることです。 そのため、IMEコンテキスト取得を取得したいのですが、上記方法のどこがいけないでしょうか? どうぞよろしくお願いします。 言語:VBA(Excel 2007) OS:Vista

  • コンソールアプリケーションでのWIN32 APIメッセージ処理

    コンソールアプリケーションでのWIN32 APIメッセージ処理 VisualStdio.NET 2005のC++で作成しているコンソールアプリケーションで、 PostMessageでメッセージを送信しているのに、PeekMessageで検出できません。 下のプログラムに誤った点があるのでしょうか? 尚、ウィンドウハンドルの確認部分はパスしますが、 PostMessageとPeekMessageの引数hWndをNULLに置き換えるとメッセージの検出はできるので、 やはり、ウィンドウハンドルに問題があるのかもしれません。 #include <windows.h> #include <stdio.h> void main( void ) {   char OldTitle[1024], NewTitle[1024];   char WindowText[1024], ConsoleTitle[1024];   HWND hWnd;   MSG Msg;   /*** ウィンドウハンドルの取得 ***/   GetConsoleTitle( OldTitle, 1024 );   wsprintf( NewTitle, "%d/%d", GetTickCount(), GetCurrentProcessId());   SetConsoleTitle( NewTitle );   Sleep(40);   hWnd = FindWindow( NULL, NewTitle );   SetConsoleTitle( OldTitle );   /*** ウィンドウハンドルの確認 ***/   GetWindowText( hWnd, WindowText, 1024 );   GetConsoleTitle( ConsoleTitle, 1024 );   if ( strcmp( WindowText, ConsoleTitle ) != 0 ){     printf( "ウィンドウハンドルが不正です" );     return;   }   /*** メッセージの送信と検出 ***/   PostMessage( hWnd, 1050, 0, 0 );   do{     while ( PeekMessage( &Msg, hWnd, 0, 0, PM_REMOVE )){       printf( "メッセージを検出しました" );       return;     }   } while( 1 ); }

  • VB6.0で外部アプリの値を取得したい

    VB6.0で外部アプリケーションのエディトエディトボックスに書かれている値を取得したいのですが、どのように取得したらわからず困っております。 外部アプリケーションのハンドルIDも、その中にあるエディトボックスのハンドルIDも取得できたのですがその値を取得する方法を調べておりますが、よくわかりません。判る方いらっしゃいましたら教えて下さい。

  • VB.NETで他のアプリが完全に起動するまで待機する方法を教えて

    VB.NET+WinXP環境なのですが、VB.NETで他のアプリを開いて MainWindowTitleでウィンドウタイトルを取得して、 それを元にFindWindowExでハンドル(Hwnd)を取得したいのですが Process.Start(ApplicationA) でアプリが完全に起動し終わる前に次の処理へ移ってしまい、 MainWindowTitleを取得する時に中身が""になってしまったり、 本来なら例えば 「Yahoo! JAPAN - Microsoft Internet Explorer」となるべきところを 「 - Microsoft Internet Explorer」の状態で取得して 次に進んでしまったりします。 起動を実行した後に、Sleep(2000)などを入れると大丈夫なのですが、 必要なSleep時間はマシンや開くアプリによって違うので不都合があります。 APIのWaitForInputIdleもHwndが取得できてからでないと使用できないようです。 恐れ入りますが、良い方法がありましたら、 ご教示頂きたく、お願い致します。

  • 起動したアプリケーションを最大化したいのですが。(VB.NET)

    先日からご回答を頂いて試行錯誤しているのですが、 どうしても実現できずに、再度質問させて頂きました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2089161 の方法でMainWindowHandleを取得して、 そのウィンドウを最大化する動作なのですが、 スプラッシュウィンドウがあるせいか変化が見られません。 試しにHwndを取得する前にSTOPを入れて完全に起動する まで待ってから実行したりもしてみたのですが、 やはり変化がありませんでした。 別の方法として、その起動したアプリケーションのIDやタイトルバーに出ているウィンドウの名前を VBのサイトから引用させていただいた下記のコードで Dim localByName As Process() = Process.GetProcessesByName("notepad") Dim p As Process For Each p In localByName Console.WriteLine("{0} / {1} : {2}", p.Id, p.ProcessName, p.MainWindowTitle) Next 知ることが出来たのでそのIDやMainWindowTitleを手がかりに もう一度hWndを設定し直してShowWindow(hWnd, SW_MAXMIZE)を実行したいのですが、 hWndのところにはIDを入れてもだめなようなので、 IDの内容をhWndと同じ内容に変換する事が出来ればと考えています。 何度ももうしわけありませんが、どうかお助けください。m(__)m

  • IP Address Controlから値を取得して利用するコード

    ■環境 Windows7 VS2008 SP1 ■質問 IP Addressコントロールから値を取得するAPIは SendMessageでIPM_GETADDRESSで取得できている様なのですが、 私はIpAddressに値が入っていると思っているのですが どのように、加工して値を取得すればいいでしょうか? たとえば IP Addressコントロールに 172.16.255.255 となっていてOKボタンを押したら、 どうやってIpAddressから、172.16.255.255を解析しますか? よくわからないのでご教授願いますm(__)m else if(LOWORD(wParam)==IDOK_ADDPORT) { SendMessage( // returns LRESULT in lResult hIp, // (HWND) handle to destination control IPM_GETADDRESS, // (UINT) message ID wParam, // = 0; not used, must be zero IpAddress // = (LPARAM)(LPDWORD) pdwAddr; );

  • Wordでウィンドウハンドル(Hwnd)を取得したい

    Word2007、2002を使用しています。 Wordでウィンドウハンドル(Hwnd)を取得したいと思ったのですが、 どのように取得して良いかわかりませんでした。 Excelであれば以下のように取得できました。  Excel.Application.Hwnd どのようなプログラムを書けばHwndは取得できますでしょうか? 私なりに調べてみたのですが、うまく見付けられませんでした。 もしご存知でしたら、ご教示お願いいたします。

  • ウィンドウのないActiveXコントロールへのメッセージ通知方法

     内部的にWinsock2を使用して別のサーバアプリケーションと通信を行うActiveXコントロールを作成しています。サーバからのデータ受信を非同期で行うため、WSAAsyncSelect()関数を使用して指定したウィンドウにWinsockからイベントメッセージ(メッセージIDはWM_USER+1を使用)を通知させます。 コントロールをウィンドウなしのアクティベーション使用で開発しているので、WSAAsyncSelect()のメッセージ通知対象ウィンドウがコントロール内にありません。 コンテナによりコントロール充てにメッセージを送ってくれるということなので、コンテナのウィンドウハンドルを取得し、WSAAsyncSelect()のメッセージ通知対象ウィンドウに設定しました。が、コントロールのOnMessageWindowless()にWM_USER+1のイベントは来ていないようです。 私が試したウィンドウハンドルは、次のコードで取得できるものです。 1. AfxGetMainWnd()->m_hWnd 2. CWnd::GetActiveWindow()->m_hWnd (CWndは使用するなとありましたが)  取得するウィンドウハンドルが間違っているのでしょうか?それとも、コンテナアプリケーションはWM_USERメッセージをコントロールに送ることができないのでしょうか?もしくは、コンテナにWM_USER+1のメッセージはコントロールへ、という設定をしてやる必要があるのでしょうか?  なお、なぜウィンドウありのコントロールにしないかと申しますと、ウィンドウありだとコンテナ(IEを想定)に乗った直後にウィンドウが生成されず、自分のウィンドウハンドルを取得しようとするとNULLが返ってしまうからです。ユーザがマウスで一度クリックすればOKなのですが・・・オブジェクト生成時に自動的にウィンドウを生成する方法がわかりませんでした。もしこちらが分かればウィンドウありで行くこともできますので、分かる方いらっしゃいましたらお願いいたします。