トップページ⇒tech
1001コメント290KB

Win32API質問箱 Build47

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/13(月) 08:56:12
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。

過去スレ、関連リンクは>>2-5くらい。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn.microsoft.com/library/)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
0186デフォルトの名無しさん2006/11/19(日) 22:08:26
>>185
そもそもそんなとこから教えなきゃならん事態が既に間違ってるってことはわかってるか?
0187デフォルトの名無しさん2006/11/19(日) 22:09:13
GlobalAllocで割り当てたメモリが入ってるpMemを黙って上書きしてるのも
教えた側の責任か? それ見てこれ以上付き合う気なくしたんだが。
0188デフォルトの名無しさん2006/11/19(日) 22:10:40
ここはあくまで善意の質問箱であり
プログラム教室ではない
0189デフォルトの名無しさん2006/11/19(日) 22:13:33
×俺も新人にCやDOSコマンドを教えた事があるが、理解できなかった時は常に教えた側に
問題があったぞ。
○俺も新人のときCやDOSコマンドを教わった事があるが、この俺様に理解できなかった
のだから常に教えた側の問題に決まってる。

×この手段に対して何も触れてないじゃないか。
○とっとと手段を教えろよ情報を小出しにしやがって使えねーパソヲタども

つーか本当にそこが問題でできないなら聞き返してさえこない時点でオ�hル
0190デフォルトの名無しさん2006/11/19(日) 22:15:29
テンプレすら読めない人がデカい顔してるスレはここですか?
>・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
0191デフォルトの名無しさん2006/11/19(日) 22:20:54
GlobalAllocにGMEM_FIXEDフラグを入れれば直接アドレスが返ってくるのも知らんのか。
格下に聞いちまったようだな。
0192デフォルトの名無しさん2006/11/19(日) 22:23:48
触らない方がいいのかな
0193デフォルトの名無しさん2006/11/19(日) 22:28:02
>知らないから答えられません。
って素直に言えばいいのによ
0194デフォルトの名無しさん2006/11/19(日) 22:29:55
知らないから答えられません
0195デフォルトの名無しさん2006/11/19(日) 22:31:15
知ってても答えません
0196デフォルトの名無しさん2006/11/19(日) 22:34:48
本当は知らないんだけど、知らないっていうの癪だから
知ってるけど、教えてやらない。
0197デフォルトの名無しさん2006/11/19(日) 23:12:47
ヒープてことは動的だけど、
ttp://www.kumei.ne.jp/c_lang/sdk2/sdk_123.htm
(くメィさん使わしてもらいます)
これじゃないの?やるのは。
0198デフォルトの名無しさん2006/11/19(日) 23:12:58
> GlobalAllocにGMEM_FIXEDフラグを入れれば直接アドレスが返ってくるのも知らんのか。
そんなことぐらい誰でも知ってる。
問題はそこじゃねーよアホ。メモリリークという言葉も知らんのか

> 知らないから教えてください
って素直に言えばいいのに
0199デフォルトの名無しさん2006/11/19(日) 23:17:04
>>197
全然関係ない。
つーか>>172でコピー先がヒープであることは本質的じゃない。
別にVirtualAllocでもいいから(むしろMSの推奨はそっちだった気がする)
>>180が何を笑ってるのかよくわからん。
問題は意味もなくGlobalAllocしてメモリリーク起こすようなコードを平然と書く奴に
手取り足取り教えてられるほど暇じゃないってこと。

つーかコードをメモリ上でコピーするやり方はAdvanced Windowsに載ってるんだから
マジで読んでくれ
0200デフォルトの名無しさん2006/11/19(日) 23:31:39
推奨はVirtualってか、Virtualは仮想メモリに直接確保、Globalはプロセスのヒープに確保じゃなかったかいの?
MSがGlobalよりこっち使えって言ってるのは確かHeapAlloc
0201デフォルトの名無しさん2006/11/19(日) 23:49:05
>>198
嘘吐け、俺が教えてやったから言えるんだろうが。
最初は頭下げてただろうが下衆野郎。しらねーくせに威張ってんじゃねえよ。

>>199
最初から本でも書いときゃ良いだろうがよ。暇じゃない割に2chにへばりついてやがんな。
0202デフォルトの名無しさん2006/11/19(日) 23:54:10
>俺が教えてやったから言えるんだろうが
0203デフォルトの名無しさん2006/11/19(日) 23:58:18
ここでおかしな流れをぶった切って・・・


>>153
WSHなら自分自身を削除できるし、コマンドプロンプトも出ない。

var fso = WScript.CreateObject("Scripting.FileSystemObject");
fso.DeleteFile("c:\\test.js");

これでアンインストーラを作ったことはないがなw
0204デフォルトの名無しさん2006/11/20(月) 00:05:47
>>203
簡易的には使えそう。
どうせならバッチファイルで
0205デフォルトの名無しさん2006/11/20(月) 00:18:02
>>203
98以降には一応装備されているから、バージョンが古いけど簡単な操作なら充分かもしれない。
どうしても駄目なら「BATファイルで御免なさい」ですね。
0206デフォルトの名無しさん2006/11/20(月) 00:27:54
>>200
WinXP SP2から、VirtualAllocでPAGE_EXECUTE付けて、
その領域のコードを実行できるようにせんと
アクセス違反になるんじゃなかったけ?
たしか、バッファーオーバーフローで任意コードを実行されるのを防ぐためとかだったはず。
ただのデータ置き場ならGlobalAllocでもいいけど。
0207デフォルトの名無しさん2006/11/20(月) 00:36:24
>>204
や、バッチファイルだとコマンドプロンプトが出てしまうって話でそ?
まあバッチファイルでも、CreateProcess()でDETACHED_PROCESSで起動すれば
コマンドプロンプトは出ないはず。
0208デフォルトの名無しさん2006/11/20(月) 00:43:53
ショートカットを右クリックして「リンク先を探す」を実行すると、
エクスプローラが立ち上がって、当該ファイルが選択されますが、
これと同じことをするにはどうすればいいんでしょうか?

お願いします。
0209デフォルトの名無しさん2006/11/20(月) 00:57:40
>>201
> 最初は頭下げてただろうが
誰に言ってるの? 頭大丈夫?
> 最初から
>>1に書いてるが何か?
0210デフォルトの名無しさん2006/11/20(月) 01:00:07
> しらねーくせに威張ってんじゃねえよ。
鏡に向かって話すのが好きなんですね
0211デフォルトの名無しさん2006/11/20(月) 01:02:28
>>206
GlobalAllocでもHeapAllocでもスタックでもVirtualProtectでPAGE_EXECUTEを
付けてやれば実行できるようになる。
当然同じページにある周囲のメモリも巻き込まれるのであまりよろしくないけど
0212デフォルトの名無しさん2006/11/20(月) 01:05:09
> 教えてやったから言えるんだろうが
いやあ仮にそのとおりだとしても
返すものがハンドルだろうがポインタだろうがメモリリークしてることに変わりないし
そもそもGlobalALlocを呼び出す意味自体一切ないと教えてあげてるのに
理解しないばかりか逆切れしてるどっかのバカには負けますよw
0213デフォルトの名無しさん2006/11/20(月) 01:16:20
(´・ω・`)   n
⌒`γ´⌒`ヽ( E)
( .人 .人 γ ノ
ミ(こノこノ `ー´
)にノこ(
0214デフォルトの名無しさん2006/11/20(月) 02:11:17
intを戻す関数の中で、return 0;を書く位置が早いとちゃんとreturnされるが、
遅い(関数の最後)だと エラーがでる。
少しずつreturn 0をずらして書いてみると、ある位置より早ければちゃんとreturnされる。

コンパイル時はエラー0となってて実行時に メモリがreadになれませんでした。となる。
関数のなかで、他の関数を呼びまくってるから呼び出し元がどこだったかを忘れてるのでしょうか?
どうすればいいのやら??
0215デフォルトの名無しさん2006/11/20(月) 02:15:57
APIと何の関係もないな
0216デフォルトの名無しさん2006/11/20(月) 02:18:11
んな馬鹿な。単に「他の関数」とやらで落ちているのだろ。
その原因は呼び方の間違いだろうがな。
0217デフォルトの名無しさん2006/11/20(月) 02:27:04
>>216も同じ意味かもしれんが、returnで落ちるなら
呼び出し規約とかシグネチャが違うとか?
0218デフォルトの名無しさん2006/11/20(月) 02:34:40
a();

return 0;  ← 正常に戻る

b();

return 0;  ← 落ちる


だと、明らかに b() の中で落ちてるだろ
0219デフォルトの名無しさん2006/11/20(月) 02:37:19
相手してくれてありがとう。

int Kansu{

MessageBox(NULL,"1","めっせじ",MB_OK);
//return 0; //ここならもちろん戻る。

//中略
//中略

MessageBox(NULL,"2","めっせじ",MB_OK); // ここまでの処理は全部やってくれてるのに・・
return 0;  //ここで落ちる。"0x33333231"の命令が"0x33333231"のメモリを参照しましただって・・

}

下記のようにダイアログベースのボタんから読んでるだけの超単純なものなのに。
中略部分がややこしいことしてるのでソースは書けないです。
-------------------------------------------------------
case IDC_BUTTON1:
Kansu();
MessageBox(NULL,"もどったよ","よびだしもと",MB_OK);
return TRUE;
-------------------------------------------------------
わからん。 いままでこんなことなかったのに・・。ねるしかないか・・
0220デフォルトの名無しさん2006/11/20(月) 02:37:20
デバッガ使えば
0221デフォルトの名無しさん2006/11/20(月) 02:39:00
デバッガ使い方わかんないです。 messageboxをはさみまくってたしかめる方法でいままでがんばってきました。
お笑いですね。。
0222デフォルトの名無しさん2006/11/20(月) 02:40:21
> 中略部分がややこしいことしてるのでソースは書けないです。
明らかにそこのせいだろ。>>217も言ってるが呼び出し規約が怪しい
0223デフォルトの名無しさん2006/11/20(月) 02:41:18
悪いことは言わんからデバッガの使い方学習して来い。
もう一度言うけどWin32 APIぜんぜん関係ないので
0224デフォルトの名無しさん2006/11/20(月) 03:11:27
解決しました。構造体のメモリ確保が1個分足りないのが原因でした。
デバッガは学習してきます。圧倒的初心者のお相手ありがとうございました。
すみませんでした。
0225デフォルトの名無しさん2006/11/20(月) 03:16:17
途中の関数でスタック壊してるんじゃ舞か
そしてとんでもないアドレスにリターンしようとしているのでわ
0226デフォルトの名無しさん2006/11/20(月) 03:22:38
>>224
1回使い方分かっちゃえばめっさ楽になるからガンバレ
0227デフォルトの名無しさん2006/11/20(月) 07:29:04
ウィンドウメッセージの数値から、
WM_**の文字列で取得するAPIがありましたら教えてください。
0228デフォルトの名無しさん2006/11/20(月) 08:10:36
取得するもなにも switch( message ) で case WM_***: やってると思うけど
0229デフォルトの名無しさん2006/11/20(月) 08:20:12
>>184
ありがとうできました。
0230デフォルトの名無しさん2006/11/20(月) 09:40:32
>>227
無いよ。自分で変換テーブル作れ。
02312272006/11/20(月) 10:06:05
>>228>>230
分かりました。ありがとうございます。
0232デフォルトの名無しさん2006/11/20(月) 10:10:31
Jeffrey Richter
バッチのサンプル
 ttp://www.microsoft.com/msj/archive/SF9C.aspx
 ここのW32Q0196.zip
FILE_FLAG_DELETE_ON_CLOSEのサンプル
 ttp://www.microsoft.com/msj/0198/win320198.aspx
 なぜかダウンロードできない。XPでは不調でした。
0233デフォルトの名無しさん2006/11/20(月) 11:06:10
以前に、EXE自分自身を削除するプログラムを作ることがあって、
いろいろ見つけたサンプルを元に FILE_FLAG_DELETE_ON_CLOSE
を試行錯誤してみたが、うまくいかなかった。
(例) 98系と2000系で挙動が違う (すまん、どう違ったかは覚えてない)
(例) EXEがネットワークドライブ上だとうまくいかない

で、結局、俺は以下のようにした。
(1) 削除用プログラム(自分自身)を「<GetTempPath()のディレクトリ>\DeleteMe.tmp」にコピー
(2) (1)をMoveFileEx( MOVEFILE_DELAY_UNTIL_REBOOT )で削除予約。
(3) (1)をCreateProcess()、自分自身は終了。

(1)はユーザーがリブートするまで消えないが、ユーザーの目に触れなきゃOK!
0234デフォルトの名無しさん2006/11/20(月) 11:10:42
試さずに書くが・・・・・
0235デフォルトの名無しさん2006/11/20(月) 11:12:41
(スマン、234はしくじった)

試さずに書くが・・・・・

バッチ(command.com/cmd.exe)をSW_HIDEでCreateProcessしては?
0236デフォルトの名無しさん2006/11/20(月) 13:03:52
>>233
その方法も良いと思います。
>>234-235
少なくとも ShellExecute ではうまくいきました。

皆さんお世話になりました。お騒がせしました。
0237デフォルトの名無しさん2006/11/20(月) 13:11:39
>>232
参考になりました。
0238デフォルトの名無しさん2006/11/20(月) 20:31:37
メインのGetMessageをまわしているループとは別のスレッドから、
SendMessageでWndProcへ構造体をわたそうと思っています。
wParamか、lParamにポインタ入れて。
この構造体を入れる領域をHeapAllocでとって、そこに値を入れてSendMessageで渡した後、
WndProcで処理した後、HeapFreeで開放してやりたいのですが、
開放するタイミングはWndProcしかないのでしょうか。
WndProcへwParamとか、lParamでわたってくるマウスの情報とかは、
WndProcで開放しないのでなんかお作法みたいなのがあるように思えますが、
なにか標準のお作法がありますでしょうか。
お作法、または、ドキュメントへの道しるべ等お教えいただけないですか。
0239デフォルトの名無しさん2006/11/20(月) 20:36:47
もしかして、SendMessageを呼び出した後は、
イベントがWndProcで処理されるまで戻ってこないので、
−メモリ確保
−SendMessage(ここから投げたスレッドはブロック)
−−メインのGetMessageで取得されて、WndProcで処理される
−SendMessageから戻ってくるのでメモリ開放
といった形になるのでしょうか?
とりあえず、AdvancedWindowsの第26章をみてます。
0240デフォルトの名無しさん2006/11/20(月) 20:43:23
SendMessageで送信したメッセージの処理内でしか使わないのなら
SendMessageから帰ってきたところで消せばいい

ちなみにSendMessageはGetMessageで取得じゃなくて、SendMessageが直接プロシージャを呼ぶ
0241デフォルトの名無しさん2006/11/20(月) 20:51:19
>240

>SendMessageで送信したメッセージの処理内でしか使わないのなら
>SendMessageから帰ってきたところで消せばいい
ありがとうございます。
確信がなかったのですが、自信が持てました。

>ちなみにSendMessageはGetMessageで取得じゃなくて、SendMessageが直接プロシージャを呼ぶ
AdvancedWindowsをちゃんとよんでみたら書いてありました。
スレッド間でのSendMessage呼び出しは複雑だと知り、勉強になりました。
ご指摘、ありがとうございました。
0242デフォルトの名無しさん2006/11/21(火) 00:30:29
>メインのGetMessageをまわしているループとは別のスレッドから、SendMessage
する状況なら、
>ちなみにSendMessageはGetMessageで取得じゃなくて、
>SendMessageが直接プロシージャを呼ぶ
は間違いだよ。それは同一スレッドの時限定。
0243デフォルトの名無しさん2006/11/21(火) 01:02:03
でもそんな感じだと思っていて構わないと思う。
Advanced Windows読むまで知らなかった。
0244デフォルトの名無しさん2006/11/21(火) 01:25:56
実は16bitWindowsの頃からGetMessageで取得していた
0245デフォルトの名無しさん2006/11/21(火) 10:07:07
ヘッダ見てるといろんな構造体にbiSizeとかcbSizeとか構造体のサイズを設定するところがありますがこれって何のためですか?
構造体を渡す側はsizeof(構造体)でこのセットするサイズわかるし渡される側も構造体がわかってるからsizeof(構造体)でとれますよね
0246デフォルトの名無しさん2006/11/21(火) 10:23:12
>>245
後で拡張されてサイズが増える場合があるから
0247デフォルトの名無しさんNGNG?2BP(200)
>>245
最後に char hoge[1] みたいな可変長メンバのプレースホルダがあったりして
sizeof では正しいサイズを得られない場合があるから。
0248デフォルトの名無しさん2006/11/21(火) 13:40:05
構造体によっては、コンパイル時の_WIN_VERの値で使用可能なメンバの数が変わったりする
そうなると当然構造体のサイズも変わる
おk?
0249デフォルトの名無しさん2006/11/21(火) 14:27:23
でも、NOTIFYICONDATAとか結構ぐだぐだだよな。
同じ名前を流用するより、
OSVERSIONINFO/OSVERSIONINFOEXみたく、
個別に構造体を定義したほうがスマートに見える。
0250デフォルトの名無しさん2006/11/21(火) 14:31:14
まぁ、俺らがここでそれを言っても
MSがそれに気付いてやってくれないとどうにもならないからな・・・
0251デフォルトの名無しさんNGNG?2BP(200)
>>246>>248
その場合はコンパイル環境とターゲット環境が一致している限りは問題ない。
sizeof自体が役に立たないのは、BITMAPINFOみたいな可変長メンバを含む場合。
0252デフォルトの名無しさん2006/11/21(火) 16:41:25
>>251
一致してれば、な
0253デフォルトの名無しさん2006/11/21(火) 17:01:43
>>251
お客さんのPCのGDI32.DLL の類がどんな環境で
いつコンパイルされたかなんか普通わからんと思うぞ。
0254デフォルトの名無しさんNGNG?2BP(200)
>>252
ま、それは要件によるが。

>>253
何の話してるのかね。
0255デフォルトの名無しさん2006/11/21(火) 17:38:04
>>254
>何の話してるのかね。

Win32 API のヘッダで構造体のメンバに構造体のサイズを設定するフィールドがあるのはなぜ、という話で、
「後で拡張されてサイズが増える場合があるから」という答えに対して
「コンパイル環境とターゲット環境が一致している限りは問題ない」とアフォな返しをする奴がいたので、
ターゲット環境がわかるケースは一般的ではないと指摘してみたんだが・・・
0256デフォルトの名無しさんNGNG?2BP(0)
具体例を出さんと>>254は解らなさそうだ
02572452006/11/21(火) 17:55:20
>>246-256
ビットマップをいじるプログラムをさわったらなんとなくわかってきました。
教えてくれて、ありがとう。
あと、C言語ポインタ完全制覇という本に構造体の一番後ろで拡張するタイプの話がのってたので、
そっちも読んで理解してみます。な〜んでだろっていうのがすっきりして助かりました。
0258デフォルトの名無しさん2006/11/21(火) 18:37:27
>>257
ヘッダを開いて、それぞれの構造体の宣言部を見てみるのもいいと思うぞ
#ifdef _WIN_VER〜#endifとかあるから
0259デフォルトの名無しさん2006/11/21(火) 18:47:33
質問です。
C言語をベースに勉強していて、
テキストエディタを作っています。
コモンダイアログの「検索」を出して、
エディタ内の文字列を探す所まではなんとかできたのですが、
その結果をエディタに表示する方法がよくかりません。

エディタの内容をchar配列に移して、
そこからstrstrで検索して、
見つかったら戻り値のポイントを調べて、
SendMessage(MyDataGet_hEdit(), EM_SETSEL,[戻り値], [戻り値 + 検索文字数]);
で結果を明示しようとしています。
見つかった文字列がエディタ内に表示されている状態ならば、
これでもよさそうなのですが、
表示されていない場合、スクロールを自分で動かして、
どこが選択されているか調べないといけないという、
検索した意味のない状態になってしまっています。

どうしたら普通の検索のように、
検索結果(選択状態の文字列)まで、
画面表示を自動スクロールさせられるのか、ヒントをください。

0260デフォルトの名無しさんNGNG?2BP(200)
>>255
ターゲット環境が「分かる」必要なんか無いだろ。
ターゲット環境は「作るときに決める」物なんだから。

「ターゲットを決めうちする限りは問題ない」とする回答に「ターゲットが分からない」と
返す方がよっぽどAFOだと思うが。
0261デフォルトの名無しさん2006/11/21(火) 19:08:29
なんでおまえの限定の話に乗っからないといけないんだよ
0262デフォルトの名無しさん2006/11/21(火) 19:29:22
>>245
biSizeは言ってみれば構造体のバージョンナンバー。
BITMAPINFOHEADER, BITMAPV4HEADER, BITMAPV5HEADERのように
構造体が拡張された場合に、API側がbiSizeを見てどの構造体なのか
判断している。

これのおかげで、BITMAPINFOHEADERを要求するAPIにV4やV5の
構造体を渡すことができる。
0263デフォルトの名無しさんNGNG?2BP(200)
>>261
ターゲットが分からないなんてのもお前限定の話だろ。
客のターゲットも調べないで要件を定義するのか?
02642592006/11/21(火) 19:50:09
流れ無視してゴメンなさい。自己解決しました。
SendMessage(HANDLEエディタ, EM_SCROLLCARET, 0, 0);
基本的なメッセージ関連を勉強しなおしてきます。orz
0265デフォルトの名無しさん2006/11/21(火) 19:55:23
ターゲットを限定しないとバージョンアップのたびに金を取れないだろ。
0266デフォルトの名無しさん2006/11/22(水) 08:17:04
>>262
>biSizeは言ってみれば構造体のバージョンナンバー。
同意同意。

本当はマズいんだと思うんだけどね。
過去バージョン互換とか考えるとなー。

0267デフォルトの名無しさん2006/11/22(水) 09:47:00
ビットマップ等の場合、渡されるOS側がサイズを確定できないのだから仕方が無い
Windows3.0以前から一応ソースレベルの互換性を維持してきたツケだな
0268デフォルトの名無しさん2006/11/22(水) 13:03:41
ここでGDI+の質問してもOKでしょうか?

FillRectangle + LinearGradientBrushを使って四角形を描画すると
Rectのサイズによってはグラデーション開始位置に、グラデーション終了色が
出ます。(LinearGradientModeVerticalモード時は上1行だけ)
これはどうやれば防げるんでしょうか?
0269デフォルトの名無しさん2006/11/22(水) 13:30:27
どういうコード書いてるかも言わずに解るわけないだろ
02702682006/11/22(水) 13:50:10
失礼しました。以下のコードです。

Graphics g(hdc);
Rect rect(10, 10, 100, 11);
LinearGradientBrush brush( rect, Color(255,255,0,0), Color(255,0,0,0), LinearGradientModeVertical );
g.FillRectangle(&brush, rect);

四角形の上が赤、下が黒になるはずなんですが、一番上の行が黒になってしまいます。2行目以降は
正常です。Y座標を変えると全て正常に表示されることもあります。
0271デフォルトの名無しさん2006/11/22(水) 13:52:17
GetMessageの戻り値が負になるのはどういう時でしょうか。

終了の0の時は、閉じるボタンorWM_CLOSEをPost、
WM_CLOSEはDefWindowProcで処理、
WM_DESTROYが来て、そこでPostQuitMessage(0)、
WM_QUITが来た時、同時にGetMessageの戻り値が0になり
メッセージループを抜けるという感じだと思うんですけど。
0272デフォルトの名無しさん2006/11/22(水) 14:45:03
>>271
MSDNくらい嫁や
0273デフォルトの名無しさん2006/11/22(水) 15:22:58
>>271
わん わん わわわん わん わん くんくん
(GetMessage関数は、WM_QUIT以外のメッセージを取得した場合は、TRUEを返すんだよ)

わん わん わわわん わん わん
(また、WM_QUITメッセージを取得した場合は、FALSEを返すんだよ)

わん わん くーん?
(わかったかな?)
0274デフォルトの名無しさん2006/11/22(水) 16:03:37
>>273
>>272
02752712006/11/22(水) 16:21:50
ありがとうございます。

>>223
エラーが発生した場合、-1が返ると書いてあります。
しかし、それで戻り値がintでなくBOOLなのがなぞですが。

WM_CLOSE、WM_DESTROY、WM_QUITを経由して
-1を返してくるか、いきなり-1を返すのかが分かりません。
実験しようにも-1戻り値エラーが発生したことがありませんし。
0276デフォルトの名無しさん2006/11/22(水) 16:30:37
typedef int   BOOL;
0277デフォルトの名無しさん2006/11/22(水) 16:45:15
そういやさ、MSDNのGetMessageの解説には、
GetMessageは「0、-1、other」の3種類の戻り値が有るから「while (GetMessage(lpMsg, hWnd, 0, 0))」は良くないって書いてあるけど
VCが自動生成するメッセージループって「while (GetMessage(lpMsg, NULL, 0, 0))」なんだよな
これってどうなんかねw
0278デフォルトの名無しさん2006/11/22(水) 16:48:57
>>275
> それで戻り値がintでなくBOOLなのがなぞですが。
GetMessageの戻り値は以前はTRUEとFALSEだけだった。
0279デフォルトの名無しさん2006/11/22(水) 16:50:37
GetMessageのウィンドウハンドルの引数に無効な値(削除されたウィンドウのハンドルなど)
を渡すと-1が帰ってくると聞いたことがある。
0280デフォルトの名無しさん2006/11/22(水) 16:55:46
>>279
そうか、そういう場合に失敗するのか。

いや、いままでGetMessageが失敗したことなんて無いもんだから。
面倒だから、こういうやり方してしまっているけど

while ( GetMessage( &msg, NULL, 0, 0) > 0 )
{
}
0281デフォルトの名無しさん2006/11/22(水) 16:59:55
つか、MSDNの警告に従えば、GetMessageはwhileの条件式に書かないほうがいいってことだから
while(true)とかで回すことになって、益々ヤバイことにならんか
02822712006/11/22(水) 18:30:03
>>279
なるほど。
こわいですが、わざと変な値を使ってエラーさせて実験してみます。
0283デフォルトの名無しさん2006/11/22(水) 18:48:41
他のプログラムの出しているウィンドウへのキー入力もフックに引っかけたくて、
DLLを記述して、

hhk = SetWindowsHookEx(WH_KEYBOARD,// フックタイプはキーストローク
hHOOKKEY, // フック処理プロシジャへ
hInstDLL, //フックプロシジャは同一ファイルで記述
NULL); // 対象スレッドはすべて
if (hhk == NULL)
  MessageBox( NULL,TEXT("フックかけられない"),TEXT("Error"),MB_OK)

と記述したところ、フック設定は毎回うまく行っているように見えるのですが、

自分で作成しウインドウへの入力は拾えても、他のプログラムの出した窓への入力
は拾えません。「グローバルフック」はキーロガーのように全部拾ってくれる
と思っていたのですが、こんなもんなんでしょうか。

WinXP,VisualC++2005 です。
0284デフォルトの名無しさん2006/11/22(水) 19:35:05
>>283
拾えるのはDLLの注入されたプロセス自身だけ
他のプロセスのメッセージを拾いたいなら、
何らかのプロセス間通信を使って自分のプロセスに送らないと駄目
0285デフォルトの名無しさんNGNG?2BP(200)
>>283
グローバルフックを仕込んだdllをパスの通ったディレクトリに置く。
■ このスレッドは過去ログ倉庫に格納されています