CLRを使ったメッセージの送信方法とは?

このQ&Aのポイント
  • CLRを使って他のアプリケーションにメッセージを送信する方法をご紹介します。
  • Visual C++で新しいプロジェクトCLR Windowsフォームアプリケーションを作成し、Form1の内容を他のアプリケーションに送信する方法を解説します。
  • Form1のウィンドウプロシージャの仕組みや使い方についても説明します。
回答を見る
  • ベストアンサー

CLRのメッセージの送信について。

WIN32APIを使って今までプログラムを作っていましたが、CLRを使ってプログラミングをしようと思い始めたのですが要領がつかめません。 やりたいことは他のアプリケーションにメッセージを送信することです。APIのPostMessage(HWND_BROADCAST, Message, 1, 0); のような感じでForm1の設定の内容を送りたいのですがどうすればそのようなことができるのでしょうか? Visual C++ で新しいプロジェクトCLR Windows フォームアプリケーション を選択してプロジェクトを作りました。 そのあとどうすればよいか教えてください。 そもそもForm1のウィンドウプロシージャはどうなってるのかすらわかりません。仕組みがちんぷんかんぷんでした。

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

  • ベストアンサー
回答No.1

 こんばんは。  PlatformSDKさえインストールされていれば、「共通言語ランタイムサポート」をONにして、windows.hをインクルードして、普通にPostMessage()を呼び出せると思います。  逆にForm1でメッセージを受け取りたいのであるならば、WndProcをオーバーライドして  http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.wndproc(VS.80).aspx  virtual void WndProc(Message% m) override  {   switch(m.Msg)   {   case WM_???://引っ掛ける   }   this->Form::WndProc(m);  }  と言った具合だと思います。  通常はイベントで受け取ります。  http://msdn.microsoft.com/ja-jp/library/system.windows.forms.form_members(VS.80).aspx  イベントには存在しないメッセージを受け取りたい時など、余程の理由が無い限りWndProcをオーバーライドする事は無く、普段はWndProcの存在すら気にされていない感じです。

yozakura20
質問者

補足

回答ありがとうございます。Form1でもメッセージを受け取れるんですね。自分でユーザー定義のメッセージをたくさんつかうので役立ちそうです。 あとPostMessage()の問題ですが、普通に使えるんですね。 でも、自分の環境で使うと未解決のトークンというエラーでコンパイルできませんでした。それでネットで調べたところhttp://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200601/06010032.txt で同じような問題のスレがあり #pragma comment(lib, "user32.lib") を追加したところ実行することができました。 それで質問なのですが、なぜuser32.libをリンクするライブラリに登録する必要があるのでしょうか。いままでこのようなことを行ったおぼえがありません。あと、他に何か設定しておくライブラリってありますか?

その他の回答 (1)

回答No.2

 こんにちは。補足頂きました。  おお、書き忘れておりました。必要なライブラリをリンクしなければいけませんでした。  それぞれのAPIが収められたライブラリはMSDNの一番下「対応情報」に書かれているので一目瞭然です。  http://msdn.microsoft.com/ja-jp/library/cc410952.aspx  「何故リンクを追加するハメに陥ったか」と言う事ですが、WIN32プロジェクトを作成すると、「基本的なWIN32APIのリンクは行ってくれる設定にしてくれる」からではないでしょうか。  CLRの方はWIN32を使用する事が前提に無いので、「使用する場合は任意で」と言った解釈で良いと思います。  要は本来必要な設定をプロジェクトの種類に応じてVCが自動で行ってくれると言う事なのでは。  例えば当方が使用しているVC2005Expressは、WIN32プロジェクト自体が作成出来ないので、作成出来る様にする為に設定を行いました。  更にWIN32プロジェクトを作成するにも、必要となるリンクは全て自分で行う必要があります。  製品版ではないので其処までしてくれませんでした。他社のコンパイラを使用するともなれば、フォルダの構成から何から、1から全てを書く必要があります。  この辺りは「環境」による違いに左右される事ですので、チョッと一言では説明出来ません・・・。  で、肝心な「この先何が必要になるか」と言う事ですが  kernel32.lib  user32.lib  gdi32.lib  winspool.lib  comdlg32.lib  advapi32.lib  shell32.lib  ole32.lib  oleaut32.lib  uuid.lib  winmm.lib  辺り迄、リンクしてあれば後先楽にはなりそうです。

yozakura20
質問者

お礼

丁寧な回答ありがとうございます。やはりCLRの開発では基本的にAPIは使わないのですね、となるとまたいろいろ覚えなければならないのか。。。 でもAPIも問題なく使えるようになったので安心です。 とりあえずライブラリの設定はしておきます。 ありがとうございました。

関連するQ&A

  • コンソールアプリケーションでの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 ); }

  • Visual Basic 2005にてプログラミングの学習を行っている

    Visual Basic 2005にてプログラミングの学習を行っているのですが、どうしても解決しない疑問が出てきてしまいましたのでご質問させて頂きました。 Form1(スタートアップフォーム)とForm2を同じプロジェクト内に用意しています。 そこで、Form1からForm2にむかってメッセージを送信したいと思い、 PostMessageを使用する事にしました。 引数として、 (Form2のウィンドウハンドル, メッセージID, 0, 0) を設定しましたが、戻り値が0(失敗)になってしまいます。 以上のような方法でメッセージのやり取りをする事はできないのでしょうか? ご存知の方がいらっしゃいましたらよろしくお願いいたします。 以上です。

  • PostMessageについて

    Windows2000でPostMessage関数を引数"HWND_BROADCAST" で実行した場合の動作について教えてください。

  • ウィンドウメッセージについて

    Visual C++ で初歩のプログラミングをさせていただいてますが、 実現できない点があるのでご回答いただけると幸いです。 環境は以下になります。 SDK: Visual C++ 6.0 OS: Windows XP 今やっているのは、他のウィンドウの動きを監視するというものです。 対象のウィンドウがリサイズされたら、サイズがいくつに変更されたかメッセージボックスを出します。 以下の手順でプログラミングしました。 MSG msg; RECT r; HWND hWnd = FindWindow("Notepad", "無題 - メモ帳"); if(hWnd != NULL) { return 0; } while( GetMessage(&msg, hWnd, 0, 0) ) { if(msg.message == WM_SIZE) { GetClientRect(hWnd, &r) ... } } このように書くと、コンパイルも通ったのですが、 リサイズどころかウィンドウを動かすこともできなくなってしまいました。 こういうのって力技でしょうか・・・。 フリーソフトなどでも多いですが、ウィンドウを監視するプログラム のコアな部分はどのように書かれているものなのでしょう? よい例があればご教授よろしくお願いします。

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

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

  • C++/CLIとMFC

    よろしくお願いします。 環境はVisual C++ 2005です。 ご存知の方がいらっしゃいましたらご教授ください。 一つのプロジェクトで作成した親Formに対して、 もう一つのプロジェクトで作成した子ウィンドウをプラグインさせ、MDIを作ろうとしているのですが [CLR]->[Windowsフォームアプリケーション]で作成したプロジェクトのFormに対して MFCで作成した子ウィンドウをプラグインさせることは可能なのでしょうか? C++/CLIでMDIを作る時は MDIの親となるFormのIsMdiContainerプロパティをtrueに設定し、 MDIの子となるFormのMdiParentプロパティをMDIの親Formの インスタンスに設定する必要があると思うのですが、 子の部分をMFCを使って作成した場合どのようにすれば 親子関係が作れるのかわからず質問させていただきました。 よろしくお願いします。

  • Visual Studio関連でAPIを使った学習方法は効率的でしょうか。

    C++の勉強をしようと思い、Visual C++ 2005 Express Edition を使って勉強しています。 本屋さんに行くと古めの本には、windowsプログラムはAPI関数も使って勉強した方がバグなどの対応にも融通が効くと書かれていますが、2008年の現時点でvisual studio関連の製品も発展していると思いますが、API関数を使ったプログラムの勉強方法は効率的でしょうか。 API関数を使ったプログラミングの本(Visual C++(1) 山本信雄著)を購入しをプログラミングを始めたばかりですが、windowsの仕組みも少しは理解出来たと思います。 またMFCなどを使ったプログラミングを行った方が良いのでしょうか。 宜しくお願いします。

  • msgが定義されていない

    Visual Studio2019でwindowsアプリケーションでゲームを作っているんですが、 どうやってもmsgが定義されていないが直りません。 #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); //WinMain関数 int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { //ウィンドウクラスの登録 //メインウィンドウの生成 //メッセージループ return (int)msg.wParam; } //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { //メッセージごとにやりたいことを記述する } return 0; } ご教示お願いします。

  • .NetでのDirectDrawの使用について

    現在会社のプロジェクトでC++でDirectDrawを使った業務用アプリケーションを開発しようとしているのですが,普段DirectDrawを用いたアプリケーションはwindows APIを使って開発を行なうことが多いと思うのですが,visual studio 2005 +.Netを用いてdirectdrawを使ったアプリケーションを作成することは可能なのでしょうか. お答えいただけると幸いです. 開発環境 visual studio 2005 .NET Framework 2.0 DirectX 7.0

  • ダイアログ間のメッセージの送信について

    いつもお世話になっております。 現在、Visual Studio 2005にてMFCのダイアログベースのアプリケーションを作成しており、メッセージの送信の件で詰まった箇所があり質問させて頂きました。 現在のアプリケーションの全体像なのですが、 ダイアログベースなので、アプリケーション立ち上げ時に1つメインダイアログが表示されます。 そのメインダイアログ内にボタンを設置したとして、それぞれのボタン1,ボタン2からダイアログ1,ダイアログ2をDoModal()で表示させます。 それぞれのダイアログ1,2にはボタンが1つずつ設置されているとします。 質問させて頂きたいことは メインダイアログへダイアログ1,2からメッセージ送信をする場合には ::SendMessage(GetParent()->GetSafeHwnd(),MYMSG,0); でメッセージ送信をすることは出来ました。 しかしメインダイアログから呼び出されるダイアログ1,2間でメッセージを送信する場合に,例えばダイアログ1からダイアログ2へメッセージを送信させたいときに void C****1Dlg::OnBnClicked(){ C****2Dlg m_dlg2; ::SendMessage(m_dlg2.GetSafeHwnd(),MYMSG,0); とダイアログ1のボタンクリック時の関数内にコードを入力してもダイアログ2へメッセージは送信されず(ダイアログ2内のメッセージ受信関数OnMyMsg()が呼ばれず)、そのままスルーされるようなのです。 上述のコードで何か間違えている箇所があるでしょうか? メッセージを扱うのは初めてで、とにかく相手先のウィンドウのハンドルを取得できればいいのかなと思ってコードを書いてみたのですが。。 ご存知の方がいらっしゃいましたら、ご意見宜しくお願い致します。 尚、開発環境は Windows CE 6.0 Visual Studio 2005 です。