CLRを使ったメッセージの送信方法とは?
- CLRを使って他のアプリケーションにメッセージを送信する方法をご紹介します。
- Visual C++で新しいプロジェクトCLR Windowsフォームアプリケーションを作成し、Form1の内容を他のアプリケーションに送信する方法を解説します。
- Form1のウィンドウプロシージャの仕組みや使い方についても説明します。
- ベストアンサー
CLRのメッセージの送信について。
WIN32APIを使って今までプログラムを作っていましたが、CLRを使ってプログラミングをしようと思い始めたのですが要領がつかめません。 やりたいことは他のアプリケーションにメッセージを送信することです。APIのPostMessage(HWND_BROADCAST, Message, 1, 0); のような感じでForm1の設定の内容を送りたいのですがどうすればそのようなことができるのでしょうか? Visual C++ で新しいプロジェクトCLR Windows フォームアプリケーション を選択してプロジェクトを作りました。 そのあとどうすればよいか教えてください。 そもそもForm1のウィンドウプロシージャはどうなってるのかすらわかりません。仕組みがちんぷんかんぷんでした。
- yozakura20
- お礼率74% (81/109)
- C・C++・C#
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 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の存在すら気にされていない感じです。
その他の回答 (1)
- machongola
- ベストアンサー率60% (434/720)
こんにちは。補足頂きました。 おお、書き忘れておりました。必要なライブラリをリンクしなければいけませんでした。 それぞれの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 辺り迄、リンクしてあれば後先楽にはなりそうです。
お礼
丁寧な回答ありがとうございます。やはり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 ); }
- ベストアンサー
- C・C++・C#
- Visual Basic 2005にてプログラミングの学習を行っている
Visual Basic 2005にてプログラミングの学習を行っているのですが、どうしても解決しない疑問が出てきてしまいましたのでご質問させて頂きました。 Form1(スタートアップフォーム)とForm2を同じプロジェクト内に用意しています。 そこで、Form1からForm2にむかってメッセージを送信したいと思い、 PostMessageを使用する事にしました。 引数として、 (Form2のウィンドウハンドル, メッセージID, 0, 0) を設定しましたが、戻り値が0(失敗)になってしまいます。 以上のような方法でメッセージのやり取りをする事はできないのでしょうか? ご存知の方がいらっしゃいましたらよろしくお願いいたします。 以上です。
- ベストアンサー
- Visual Basic
- ウィンドウメッセージについて
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) ... } } このように書くと、コンパイルも通ったのですが、 リサイズどころかウィンドウを動かすこともできなくなってしまいました。 こういうのって力技でしょうか・・・。 フリーソフトなどでも多いですが、ウィンドウを監視するプログラム のコアな部分はどのように書かれているものなのでしょう? よい例があればご教授よろしくお願いします。
- 締切済み
- C・C++・C#
- ほかのアプリケーションからのメッセージの取得
他のアプリケーションからのメッセージの取得方法を教えて下さい。 現在マインスイーパを起動し、そのボタンが押下される順番を記憶するプログラミングを制作しています。 マウスの左クリックに関するメッセージを取得すれば良いと思い、 GetMessage(&msg, hWnd, WM_LBUTTONDOWN, WM_LBUTTONUP);←hWndはマインスイーパのウィンドウハンドル のように書いたんですが、うまくいきませんでした。 調べてみるとGetMessageの第二引数は呼び出し側のスレッドに所属していなくてはならないということで、 この辺が原因なのだろうと思うのですが…。 どなたかご教授ねがいます。 <環境> Windows Vista Home Premium Visual C++ Express Edition
- 締切済み
- C・C++・C#
- 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を使って作成した場合どのようにすれば 親子関係が作れるのかわからず質問させていただきました。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- Visual Studio関連でAPIを使った学習方法は効率的でしょうか。
C++の勉強をしようと思い、Visual C++ 2005 Express Edition を使って勉強しています。 本屋さんに行くと古めの本には、windowsプログラムはAPI関数も使って勉強した方がバグなどの対応にも融通が効くと書かれていますが、2008年の現時点でvisual studio関連の製品も発展していると思いますが、API関数を使ったプログラムの勉強方法は効率的でしょうか。 API関数を使ったプログラミングの本(Visual C++(1) 山本信雄著)を購入しをプログラミングを始めたばかりですが、windowsの仕組みも少しは理解出来たと思います。 またMFCなどを使ったプログラミングを行った方が良いのでしょうか。 宜しくお願いします。
- ベストアンサー
- C・C++・C#
- 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; } ご教示お願いします。
- 締切済み
- C・C++・C#
- .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 です。
- ベストアンサー
- C・C++・C#
補足
回答ありがとうございます。Form1でもメッセージを受け取れるんですね。自分でユーザー定義のメッセージをたくさんつかうので役立ちそうです。 あとPostMessage()の問題ですが、普通に使えるんですね。 でも、自分の環境で使うと未解決のトークンというエラーでコンパイルできませんでした。それでネットで調べたところhttp://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200601/06010032.txt で同じような問題のスレがあり #pragma comment(lib, "user32.lib") を追加したところ実行することができました。 それで質問なのですが、なぜuser32.libをリンクするライブラリに登録する必要があるのでしょうか。いままでこのようなことを行ったおぼえがありません。あと、他に何か設定しておくライブラリってありますか?