ウインドウメッセージについて
ウインドウメッセージについて
コンソールで下記のような関数を作ってウインドウメッセージを送信することができました。webサイトに乗っていました。そして、受信プログラムも探したのですがコンソールで動くプログラムがありませんでした。どのようにすれば受信できるのでしょうか。明日までの課題です。
os windows8
VC++2012Ex
os windows8
VC++2012Ex
Re: ウインドウメッセージについて
状況がまるで不明なので、これだとは言えませんが。
コードから察するに、他プロセスのウィンドウとのやりとりをしたいのでしょうか。
もしそうであるならば、ちょっと面倒です。
Windows では、各プロセスの仮想メモリはそれぞれ独立してますから、ウィンドウプロシージャの差し替えなどは出来ません。
ですから、DLL等の共有空間を利用する事になります。
おそらく、システムフックを利用するのが、一般的なのでは無いでしょうか。
コードから察するに、他プロセスのウィンドウとのやりとりをしたいのでしょうか。
もしそうであるならば、ちょっと面倒です。
Windows では、各プロセスの仮想メモリはそれぞれ独立してますから、ウィンドウプロシージャの差し替えなどは出来ません。
ですから、DLL等の共有空間を利用する事になります。
おそらく、システムフックを利用するのが、一般的なのでは無いでしょうか。
Re: ウインドウメッセージについて
--- send.c ---
受信は、ウインドウメッセージを受けるんだから、ウインドウを作る必要があります。
--- recv.c ---
コンパイル
cl send.c user32.lib
cl recv.c user32.lib gdi32.lib
実行は、一つのコマンドプロンプトから、
recv
別のコマンドプロンプトから
send
#include <windows.h>
int main()
{
HWND hWnd = FindWindow("ReceiveApp", NULL);
char msg[] = "hello, world";
COPYDATASTRUCT cd;
cd.dwData = 0;
cd.cbData = sizeof msg;
cd.lpData = msg;
SendMessage(hWnd, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&cd);
return 0;
}
--- recv.c ---
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int main()
{
char *className = "ReceiveApp";
HINSTANCE hInstance = GetModuleHandle(0);
WNDCLASSEX wcex;
HWND hWnd;
MSG msg;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = className;
wcex.hIconSm = NULL;
if (!RegisterClassEx(&wcex)) return FALSE;
hWnd = CreateWindow(className, "Recv Window",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
320, 240, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
case WM_COPYDATA:
{
COPYDATASTRUCT *pCD = (COPYDATASTRUCT*)lParam;
MessageBox(hWnd, (LPCSTR)pCD->lpData, "", MB_OK);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, msg, wParam, lParam));
}
return 0;
}
cl send.c user32.lib
cl recv.c user32.lib gdi32.lib
実行は、一つのコマンドプロンプトから、
recv
別のコマンドプロンプトから
send
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: ウインドウメッセージについて
ウィンドウ処理である必要があるのか?って事も考えないといけませんね。
あとスレッドじゃダメなのとか?
プロセス間のデータの受け渡しはTCP/IP通信やら、共有メモリ、pipeやら色々方法は有るので何をしたいかをまず明確にしてもらった方が良いと思います。
あとスレッドじゃダメなのとか?
プロセス間のデータの受け渡しはTCP/IP通信やら、共有メモリ、pipeやら色々方法は有るので何をしたいかをまず明確にしてもらった方が良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ウインドウメッセージについて
本当にコンソールでウィンドウメッセージを受信することが課題なのでしょうか?さこさこ さんが書きました:明日までの課題です。
もし違うとしたら、元の課題の内容は何でしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ウインドウメッセージについて
返信ありがとうございます。
dxライブラリを使ってウインドウメッセージを受信したいのですが、どうすればいのでしょうか。
かずま様の受信のプログラムをどのようにdxライブラリを使用したプログラムに組み込めばいいのか教えてください。
課題というのは自由課題です。
まだ完成していない人が多かったので来週の今日まで延期になりました。
回答お待ちしています。
dxライブラリを使ってウインドウメッセージを受信したいのですが、どうすればいのでしょうか。
かずま様の受信のプログラムをどのようにdxライブラリを使用したプログラムに組み込めばいいのか教えてください。
課題というのは自由課題です。
まだ完成していない人が多かったので来週の今日まで延期になりました。
回答お待ちしています。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: ウインドウメッセージについて
なぜウィンドウメッセージであるかの説明に成っていないんですが、「なぜウィンドウメッセージ」じゃないといけないのでしょう?さこさこ さんが書きました:返信ありがとうございます。
dxライブラリを使ってウインドウメッセージを受信したいのですが、どうすればいのでしょうか。
かずま様の受信のプログラムをどのようにdxライブラリを使用したプログラムに組み込めばいいのか教えてください。
課題というのは自由課題です。
まだ完成していない人が多かったので来週の今日まで延期になりました。
回答お待ちしています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: ウインドウメッセージについて
ウィンドウメッセージ以外も既に提案してあるんですが、スルーされているみたいなので。softya(ソフト屋) さんが書きました:ウィンドウ処理である必要があるのか?って事も考えないといけませんね。
あとスレッドじゃダメなのとか?
プロセス間のデータの受け渡しはTCP/IP通信やら、共有メモリ、pipeやら色々方法は有るので何をしたいかをまず明確にしてもらった方が良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: ウインドウメッセージについて
そもそも2つのプロセスに分けて何をするんでしょうか?
それが分からないとスレッド化できるかも分かりません。
DXライブラリのプログラムに対して、もう一つの通信相手のプログラムにはどんな役割が与えられているかと言うことです。
それを説明しないと2つのプログラムが動作する条件や通信するデータの量などが分かりません。と言うことは最適な回答もできません。
DXライブラリのプログラム同士でウィンドウメッセージで通信はできますが、Win32APIを勉強したいという理由がないなら、まず使わない機能です。
それよりは、スレッドを覚えたり、TCP/IPの方が使うことは多いでしょう。大量にデータを通信するなら共有メモリという選択肢もあります。
それが分からないとスレッド化できるかも分かりません。
DXライブラリのプログラムに対して、もう一つの通信相手のプログラムにはどんな役割が与えられているかと言うことです。
それを説明しないと2つのプログラムが動作する条件や通信するデータの量などが分かりません。と言うことは最適な回答もできません。
DXライブラリのプログラム同士でウィンドウメッセージで通信はできますが、Win32APIを勉強したいという理由がないなら、まず使わない機能です。
それよりは、スレッドを覚えたり、TCP/IPの方が使うことは多いでしょう。大量にデータを通信するなら共有メモリという選択肢もあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ウインドウメッセージについて
a.exeで文字を入力してエンターキーを押すとb.exeに入力した文字を表示するプログラムです。
そんなにたくさんのデータを送信するわけではないです。
自分としてはa.exeで適当な変数を定義してそのメモリにb.exeがアクセスしてその内容を表示する。
というプログラムを作ろうとしています。そのためには最初に変数のポインタをb.exeに渡してあげないとだめなのでその方法を考えています。
a.exeでファイルを作ってポインタを書き込んでb.exeで読み込むという方法を考えたのですが新たなファイルを作ったりしたくありません。
またアドレスを1度渡せばいいのでTCPとか使うのはあまり効率の良い方法ではないと思いました。そこでa.exeはコンソールアプリでb.exeはDXライブラリを使ったソフトなのでウインドウメッセージを考え付きました。というかそんな単語を聞いた覚えがあたのでその方法しか頭にありませんdした。1度しか使わないので何か良い方法はないでしょうか。
そんなにたくさんのデータを送信するわけではないです。
自分としてはa.exeで適当な変数を定義してそのメモリにb.exeがアクセスしてその内容を表示する。
というプログラムを作ろうとしています。そのためには最初に変数のポインタをb.exeに渡してあげないとだめなのでその方法を考えています。
a.exeでファイルを作ってポインタを書き込んでb.exeで読み込むという方法を考えたのですが新たなファイルを作ったりしたくありません。
またアドレスを1度渡せばいいのでTCPとか使うのはあまり効率の良い方法ではないと思いました。そこでa.exeはコンソールアプリでb.exeはDXライブラリを使ったソフトなのでウインドウメッセージを考え付きました。というかそんな単語を聞いた覚えがあたのでその方法しか頭にありませんdした。1度しか使わないので何か良い方法はないでしょうか。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: ウインドウメッセージについて
>そのためには最初に変数のポインタをb.exeに渡してあげないとだめなのでその方法を考えています。
a.exeのメモリにb.exeがアクセスするのは仮想記憶の仕組みからして、かなり面倒な知識を必要とします。
なので、これは避けましょう。一度しか使わないなら覚えることが多すぎます。
そう言う意味でWM_COPYDATAを使えると思っているのなら勘違いです。
WM_COPYDATAはグローバルヒープに有るポインタが得れるだけので、a.exeのメモリに直接アクセスしているわけではありません。
a.exe → グローバルヒープにコピー → b.exeがグローバルヒープから受け取る。
ここは、ちゃんと理解してください。
簡単な使い方だけ見ると、a.exeを直接覗いているようにみえるかもしれませんが。
そういう事なら、かずま さんの書いたものをDXライブラリにアレンジすればOKです。
「DXライブラリでのウインドウ最大化について • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=8279#p67684
こんな事をしますが、WndProcなどWin32APIによるメッセージ処理は理解できていますか?
a.exeのメモリにb.exeがアクセスするのは仮想記憶の仕組みからして、かなり面倒な知識を必要とします。
なので、これは避けましょう。一度しか使わないなら覚えることが多すぎます。
そう言う意味でWM_COPYDATAを使えると思っているのなら勘違いです。
WM_COPYDATAはグローバルヒープに有るポインタが得れるだけので、a.exeのメモリに直接アクセスしているわけではありません。
a.exe → グローバルヒープにコピー → b.exeがグローバルヒープから受け取る。
ここは、ちゃんと理解してください。
簡単な使い方だけ見ると、a.exeを直接覗いているようにみえるかもしれませんが。
そういう事なら、かずま さんの書いたものをDXライブラリにアレンジすればOKです。
「DXライブラリでのウインドウ最大化について • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=8279#p67684
こんな事をしますが、WndProcなどWin32APIによるメッセージ処理は理解できていますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ウインドウメッセージについて
私はほぼc言語の文法しか知らないといっても過言ではありません。
WndProcと言われても全くわかりません。
コンソールアプリa.exeで入力してもらった文字をdxライブラリを使って作ったアプリで受信して表示できればいいのです。
1秒間に30回送信したいです。データはそんなに多くないです。
a.exeのある変数のアドレスが0096EDD4だとするとこのアドレスをb.exeに渡してその値を読むということは簡単だと思ったのですが難しいのですね。
どうすればいいのか・・・
WndProcと言われても全くわかりません。
コンソールアプリa.exeで入力してもらった文字をdxライブラリを使って作ったアプリで受信して表示できればいいのです。
1秒間に30回送信したいです。データはそんなに多くないです。
a.exeのある変数のアドレスが0096EDD4だとするとこのアドレスをb.exeに渡してその値を読むということは簡単だと思ったのですが難しいのですね。
どうすればいいのか・・・
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: ウインドウメッセージについて
そもそもプロセス間の通信自体がOSの仕組みのちょっと難しい部分を利用するものです。
なので、OSの仕組みをある程度を理解しないと使いこなせないシロモノなのです。
やりたい事がちょっと高レベルなので、やはり勉強してもらわないとバグでハマりそうです。
>1秒間に30回送信したいです。データはそんなに多くないです。
それなりに一秒あたりの回数が多いですね。一度には送れないんでしょうか。
どうしても通信じゃないとダメというのなら勉強してもらうって事しか無いと思います。
なので、OSの仕組みをある程度を理解しないと使いこなせないシロモノなのです。
やりたい事がちょっと高レベルなので、やはり勉強してもらわないとバグでハマりそうです。
>1秒間に30回送信したいです。データはそんなに多くないです。
それなりに一秒あたりの回数が多いですね。一度には送れないんでしょうか。
どうしても通信じゃないとダメというのなら勉強してもらうって事しか無いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ウインドウメッセージについて
勉強します。
今ちょうど大学の夏休みなのでいい機会です。
何を勉強すればいのでしょうか。
私はc言語の文法程度しかわかりません。
ポインタも理解しています。
その程度です。
OSとの関係とかはわかりません。
今ちょうど大学の夏休みなのでいい機会です。
何を勉強すればいのでしょうか。
私はc言語の文法程度しかわかりません。
ポインタも理解しています。
その程度です。
OSとの関係とかはわかりません。
Re: ウインドウメッセージについて
http://hw001.spaaqs.ne.jp/k-okada/compu ... d_doc.html
をみてもポインタが使えないことがわかりました
をみてもポインタが使えないことがわかりました
Re: ウインドウメッセージについて
http://www.argv.org/~chome/shmem.html
で共有メモリのプログラムが載っていたのですがc言語で書きたいのですが如何すればいいでしょうか。
共有メモリ方法は高速な通信はできるのでしょうか。
で共有メモリのプログラムが載っていたのですがc言語で書きたいのですが如何すればいいでしょうか。
共有メモリ方法は高速な通信はできるのでしょうか。
Re: ウインドウメッセージについて
このサイトのコードなら、さこさこ さんが書きました:http://www.argv.org/~chome/shmem.html
で共有メモリのプログラムが載っていたのですがc言語で書きたいのですが如何すればいいでしょうか。
・関数名の前についている::を全て取る
・using namespace std;を消す
・cout << なんとか << flush; → puts(なんとか); に書き換える
・cerr << なんとか << flush; → fputs(なんとか,stderr); に書き換える
・#include <iostream> → #include <stdio.h> に書き換える
・#include <ctime> → #include <time.h> に書き換える
これでコンパイルできると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ウインドウメッセージについて
Wikipediaよりさこさこ さんが書きました:共有メモリ方法は高速な通信はできるのでしょうか。
(このWikipediaからの文はクリエイティブ・コモンズ 表示-継承 3.0 Unportedライセンスの下で利用可能です)Wikipedia さんが書きました:共有メモリシステムでは、全プロセッサがデータを共有しているためプログラミングが比較的容易で、同じメモリ位置へのアクセスによって高速なプロセッサ間通信が可能である。
実際に高速と言えるかどうかは、要求される仕様にもよると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: ウインドウメッセージについて
一方通行なら共有メモリでも構わないですが、どちらにしてもデータを更新したことを通知する手段が必要です。
そうなると、ウィンドウメッセージなどに頼ることになります。
と言うことで少データで通信するならウィンドウメッセージだけを使うのが無難ということになりますね。【誤解を招きそうなので修正】
ということで元に返ってかずまさんのコードを理解したほうが良いとなりますね。
「標準 Windows API」
http://wisdom.sakura.ne.jp/system/winap ... index.html
「Win32API(C言語)編 トップページ」
http://www.geocities.jp/ky_webid/win32c/
そうなると、ウィンドウメッセージなどに頼ることになります。
と言うことで少データで通信するならウィンドウメッセージだけを使うのが無難ということになりますね。【誤解を招きそうなので修正】
ということで元に返ってかずまさんのコードを理解したほうが良いとなりますね。
「標準 Windows API」
http://wisdom.sakura.ne.jp/system/winap ... index.html
「Win32API(C言語)編 トップページ」
http://www.geocities.jp/ky_webid/win32c/
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: ウインドウメッセージについて
DXライブラリうんぬんは良かったんですか?さこさこ さんが書きました:かずま様のプログラムを使用させていただくことにしました。
ありがとうございました
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。