Win32API 質問箱 Build6

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
スレ立てるまでもない、Win32APIについての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
でも、最低限Web検索ぐらいはしてね。

過去スレ
Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/
Win32API 質問箱 Build4
http://pc3.2ch.net/test/read.cgi/tech/1023361418/
Win32API 質問箱 Build3
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Win32API【2】
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Win32API 質問箱
http://pc.2ch.net/tech/kako/991/991576947.html

参考
MSDN Online
http://www.microsoft.com/japan/msdn/default.asp
猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang/index.html
2デフォルトの名無しさん:02/09/21 04:18
2ゲットし放題!
3デフォルトの名無しさん:02/09/21 04:25
前スレの>>968
是非お願いします。

http://210.153.114.238/cgi-bin/upbbs2/imgboard.cgi
ここにUPして頂けますか?
4デフォルトの名無しさん:02/09/21 04:30
>>3
猫でも〜にもあったが、あれじゃいかんの?
>>前スレ973

それが出来ないから困ってるんですよ
たとえばMSゴシック11ptだと全角の幅=半角*2にならないので、
GetTextExtentPoint32等を含む通常のAPIでは描画結果がずれるのです。

なので、手動で補正もしくはExtTextOutで強制的に幅を指定しないといけないのですが、
自前で調整するには文字が半角か全角かを判別しなければなりません。
で、SJISだけなら問題なかったのですが、UNICODE(UCS2)だと、
すべての文字が2byteで表されるわけで、困っちゃったな、ということです。

プロポーショナルだと楽なんですが、そういうわけにも行かないので。
6前スレ959:02/09/21 04:41
取得したいのは論理単位でです。
おなじ12ptでもフォントによってTEXTMETRICのtm.tmHeightは異なるので
上限があるのかなと思ったのですが…

高さの上限は決められていないのでしょうか。
わかる方お願いします。
>>3
http://210.153.114.238/img-box/img20020921043840.zip
うぷした。
パスワードはsplitterね。

ウインドウクラスにControlを継承させてからSetControlする。
それから、HandleMessageに適切なメッセージを渡せば使えるはず。
>>5
Unicode文字をANSIに変換してバイト数を得るのはまずいのか?
でもあんただったらそのくらい分かりそうから、ボツなんだろうな。
9デフォルトの名無しさん:02/09/21 04:45
>>4
あの方法で、3つや4つに分割できますか?
10デフォルトの名無しさん:02/09/21 04:46
>>7
どうもありがとうございます
早速DLさせてもらいます
>>6
フォント作成時にサイズを-xとかにしたら?
>>8
UNICODE化の目的は似非I18nなので、
UNICODE->ANSI(SJIS)にマッピング出来ない文字もあるわけでして…
スクロールバーをつまんでで移動したとき
漏れのアプリだとボタンを話すまで再描画されないのだが
他のアプリは バーが動くとすぐ描画されてる気がする

なんか指定しないといかんの?
SetScrollInfoでSIF_TRACKPOSを指定してないとか
15 :02/09/21 06:47
>>5
固定ピッチなら、明らかに半角であると分かっている文字の幅より
広ければ全角とみなして構わないのではないか?
16デフォルトの名無しさん:02/09/21 08:47
ListViewで、特定の行だけ色を変えたいんですが
どうすればいいでしょうか。
ListView_SetTextColorとかだと全体が色変わっちゃうし。
>>15
なんかしょぼ〜んだけど、以外とそれが正解クサイかも
全角半角の整合が取れなくても、それぞれ半角同士全角同士は整合取れてるはずだから。
サンクス!
>>5
Unicodeの半角全角の表。これ使ってみる?
http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt
説明はこれ。
http://www.unicode.org/unicode/reports/tr11/
>>前976 >>18
どうもです。
しかし、これを見ると文字幅は一意に決定することが出来ないようですね。
emacsのように独自の多言語コードに変換するのがスッキリしているみたいです。
FIXED PITCHという文化とWin(覗くXP)のフォントが憎くなってきました。
>>6
LOGFONTの説明を見れ。フォントマッパは指定されたサイズを越えない
最大のフォントを探すとある。だから、12ptと指定したなら最大のサイズは
12ptなんじゃないの? 論理単位で。
21ねこま:02/09/21 13:38
CreateFile についてなのですが,以下に
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_createfile.htm
1.ハードディスク x を開くには、lpFileName パラメータで \\.\PHYSICALDRIVEx と指定します
2.フロッピーディスク x や、ハードディスクのパーティション x を開くには、lpFileName パラメータで \\.\x: と指定します
と書かれています.

1.の,「ハードディスク x を開く」
2.の,「ハードディスクのパーティション x を開く」
という違いがわからないのですが,このあたり明るい方教えてください.
ここ読めとかでもいいです.

やってみると,うちでは
\\.\PHYSICALDRIVEx はハードディスクのすべてで失敗し,フロッピードライブである A と B で成功する
\\.\X: ハードディスクのすべてで成功する
となりました.
1.はMBRを含むハードディスク全体
2.はその中の各パーティション
どうして失敗するのかは知らん
23デフォルトの名無しさん:02/09/21 14:16
>>21
\\.\PHYSICALDRIVE0 なら一台目のハードディスクという意味では
976 :デフォルトの名無しさん 本日のレス :02/09/21 11:21
>>970
Unicodeか・・・ちなみにギリシア文字(アルファとかベータとか)は全角だと思いますか?半角だと思いますか?
>>21
2. の方は日本語訳が間違ってるよ。英語版の方では...

When opening a volume or floppy drive, x, the lpFileName
string should be of the form \\.\x:.

となっていて、パーティションと言う言葉は出てこない。
参照: ttp://msdn.microsoft.com/library/en-us/fileio/base/createfile.asp

ただ日本語訳のほうもその後を読めば、\\.\X はドライブ指定であること
は、普通わかるはず。

失敗する時は、エラーコードぐらい示したら ?
どうせ、Windows 9x でやってるか、Windows NT の一般ユーザー権限で
やっていると言うオチだろうが...。
26デフォルトの名無しさん:02/09/21 14:37
Win32APIの書籍でお勧めなのってありませんか?
27ねこま:02/09/21 14:39
>>22さん
DISK_GEOMETRY の内容を表示すると,確かにそうですね!なるほど
同じハンドルしか返ってこないし

>>23さん
MSDN より
>\\.\PHYSICALDRIVE2
>ユーザーのコンピュータの 3 番目の物理ドライブのハンドルを取得します。
なのでその通りでした.勘違いしてました.

どうもありがとうございます.
>>26
Windows95 APIバイブル1,2
\\.\X: ハードディスクのすべてで成功する

と書いているのですから,読めばそんなオチではない事
は、普通わかるはずでは?
>>29
> 読めばそんなオチではない事は、普通わかるはずでは?
これは、Windows9x の方か ? 権限の方か ?
確かに Windows9x は、\\.\x もダメみたいだな。ちょっと勘違いしてた
よ。

でも、そんなことぐちゃぐちゃ言ってる暇あったら...
> 失敗する時は、エラーコードぐらい示したら ?
の方をやってみたらどうよ。
31デフォルトの名無しさん:02/09/21 15:50
Windowの画面全体をメニューバー(マウスでドラッグすると移動できる)
みたいにするにはどうすればいいんでしょうか?

Tcalenderのようなメニューバーはなくて画面表示のみ、
それで、画面をクリックしながら動かせば移動が可能、とやりたいのです。
メニューバー?タイトルバー?
3331:02/09/21 16:02
すみません。
タイトルバーのことです。
タイトルバーもメニューもない、内容だけのWindowを作って、
なおかつそれをドラッグで移動させたいのです。
>>33
case WM_NCHITTEST: return HTCAPTION;
WM_NCHITTESTでHTCAPTIONを返す
FAQだな
3634:02/09/21 16:32
かぶった
37デフォルトの名無しさん:02/09/21 16:49
>>16
NM_CUSTOMDRAWを調べよう。

>>33
WM_NCHITTESTに対して常にHTCAPTIONを返すとか。
3831:02/09/21 16:50
>>34さん、>>35さん、
できました!
2時間悩んでいたので感激です!!!
どうもありがとうございました。
3937:02/09/21 16:50
さらにかぶった。鬱。
4031:02/09/21 16:56
>>37さん、ありがとうございます。
FAQだったのですね。検索が甘く失礼しました。
>>11
そのxをどうやって求めるかを知りたいのですが・・・
>>41
xは自分が作りたいフォントのサイズなのだが。
>>42
いやあの、あるサイズのフォントを作りたいのでは無くて、高さを知りたいんです。
例えば12ptの任意のフォントで描画された文字列を矩形で囲むとしたら
その矩形の高さをどう求めたらよいのかということです。
矩形の高さはポイントによって固定したく、
12pt→RECT rc12;
13pt→RECT rc13;
 :
 :
と対応させて矩形を表します。
rc12内へ12ptサイズのフォントを表示させれば、どんなフォントでも上下が
はみ出さずに表示できるようにするには、rc12の高さをどう設定すればよいのでしょうか。 
>>43
ねぇねぇ、もしかしてポイントサイズからドットサイズへ変換する式がわからないとか言う話?
フォントサイズといえば、CreateFontのnHeightパラメータの説明、

0 指定された値をデバイス単位に変換し、それを利用可能な各フォントのセルの高さと比較します。
<0 指定された値をデバイス単位に変換し、その絶対値を利用可能な各フォントの文字の高さと比較します。

これ、思いっきり謎なんだけど、誰か解説出来る人いますか。
昔、本で高さには負数を入れろと書いてあったのを覚えているんだけど、
絶対値で比較されるなら差がないと思うんだけど、どうだんでしょ。
46デフォルトの名無しさん:02/09/21 20:33
>nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

ちなみに、MSDNの例では負数を入れてますね。

旧スレが上がっているのでage
>>45
正だったらフォントの (* セル *) の高さ。
負だったらフォントの (* 文字 *) の高さ。

文字の高さ (em height としても知られている) とは、文字セルの高さ
から内部レディング (アクセント記号などのためのスペース) の高さを
引いたものです。
>>47
レスどうもです。
文字の大きさを基準にスペースを決定したい場合は負数で、
スペースを基準に文字を収めようとする場合には正の数ということですね。
>>48
ちょっと違う、 Á, Ö みたいにアクセント/ウムラウト等の文字の上につ
く記号のためのスペースを含むかどうか。(もちろん、文字としては含まな
い、セルとしては含まれる。)
ttp://amalfi.dis.unina.it/~carlosan/F3+BD/chap2/default.htm
の真中辺の Fig. 2-3 を参照のこと。
>>49
えっと、混乱してきました。
文字の高さ = otmMacAscent + otmMacDescent
セルの高さ = otmMacAscent + otmMacDescent + otmMacLineGap = tmHeight + tmExternalLeading
ですよね?

# 記号のスペースがtmInternalLeadingって事ですよね。
tmHeightにはtmInternalLeadingが含まれますが、
tmHeightを基準にするか(セル)、tmHeight - tmInternalLeading(文字)を基準にするかと言うことでしょうか?

そうだとすると、US ASCIIとかSJISの文字を表示するときはスペースの利用効率で負数を使って、
ウムラウト文字を含むような西欧文字を表示するときには正の数を使う、ってことですか。
最後の2行はなんか違う気がしてきました、
読み捨てて下さい
>>43
君がッ
LOGFONTのヘルプを見るまでッ
僕はッ
LOGFONTのヘルプを見ろと言うのをやめないッ!!
>>50
> セルの高さ = otmMacAscent + otmMacDescent + otmMacLineGap
> = tmHeight + tmExternalLeading
これは、違う。
セルの高さ = 文字の高さ + tmInternalLeading
 = otmMacAscent + otmMacDescent + tmInternalLeading
詳細は、
ttp://www.topposystem.co.jp/DL/Win32API/font/Font09.htm
の下のほうの図を参照のこと。
>>53
馬鹿におつきあい頂きありがとうございました。
それぞれの値が意味する物はわかりましたが、使い分けがさっぱりだったりします。
55デフォルトの名無しさん:02/09/21 22:37
>>44
矩形の高さは
 MulDiv(m_nFontSize, pDC->GetDeviceCaps(LOGPIXELSY), 72)
で計算したのですがArial Blackなどの一部のフォントだと下が切れてしまうんです。
フォントは
 lf.lfHeight = -MulDiv(m_nFontSize, pDC->GetDeviceCaps(LOGPIXELSY), 72);
で高さを指定しています。

lf.lfHeightに入れる値を正数にすれば矩形内には収まりますが、
それだとワードパッドで表示した同じポイントのフォントより明らかに小さく描画されてしまいます。

というわけでこの方法ではうまくいかないものだと思い、ここで質問させていただきました。
それはつまりワードパッドと同じ大きさのフォントにすると下が切れるってことだろ
ここで聞いて解決するような問題なのか?
57デフォルトの名無しさん:02/09/21 22:56
AGEテオキマス
クソスレageんなヴォケ
>>56
ワードパッド(に限らずIEや他のペイントソフトなど)と同じポイントを指定してるので
できれば同じ大きさで描画されて欲しいです。
60デフォルトの名無しさん:02/09/22 01:58
スライダーコントロールの色を指定したいのですが、やり方がわかりません。
システム色ではなく、赤とか青とかいろいろな色で作りたいのです。
ご存知の方、教えてください。

よろしくお願いします。
61デフォルトの名無しさん:02/09/22 04:15
Win95以降に使えるようになったコモンコントロールの
リファレンスみたいなのが載ってる本はないでしょうか?

MSDNはその部分日本語化されてないし、
ネットで探しても、ごく一部分だけの解説とかしか
見つからないのです。
検索しても見つからんなら大人しく英語版読むのが吉。
あと具体的にどのコントロールのことを知りたいのか書けば
知ってる奴が教えてくれると思う。
>>59
で、切れてもいいのか?
お前が何をやりたいのかさっぱりわからんのだが。
6461:02/09/22 04:54
たしかに、具体的にやりたいことがあってそのやり方が分からない
という時なら、それで事足ります。

でも、たまに暇な時に何となく説明を読んでたら
「おお、このコントロールにはこんな機能があったのか!」
みたいな便利機能発見して嬉しくなることができないなぁと。
>>61
MFCのドキュメント。
SDKとの対応がだいたい想像付く。その逆も。
6661:02/09/22 05:18
>>65
成程!
それは盲点でした。
ありがとうございます。
>>64
なんとなく読むだけの暇があるんなら最初から英語版に目を通せや・・
68デフォルトの名無しさん:02/09/22 05:48
>>7
うまく出来ました!
とても参考になりました。
ありがとう。
>>63
切れないように。矩形内に収まるように。と書いてあるが。
70デフォルトの名無しさん:02/09/22 17:16
自作でエディットコントロール見たいな奴を作ろうと思ったんですが、
WM_CHARを取ろうと思っても親にSendMessageしてもらわないとできません。
標準のエディットコントロールでは、そんなことせずにできるんですが、
どうやったらいいのでしょうか。
RegistClassあたりでそういうのがあるんでしょうか。
71デフォルトの名無しさん:02/09/22 17:51
>>70
サブクラス化すればいいだけじゃないの?
7270:02/09/22 17:56
>>71
サブクラス化とは何でしょうか?
7370:02/09/22 18:28
>>72
そこまでバカではない。
>>71
エディットコントロールをですか?
それじゃ意味が無いような。
意味無いならやめろ。
>>70
ダイアログに置いてあるなら WM_GETDLGCODE をヘルプで見てみるとよいよ
自作のウィンドウクラスの中に置いてあるなら何もしないでも来るはず
7670:02/09/22 21:09
ありがとう御座います。見てみますね。
>>70
WM_GETDLGCODEあたりの問題ですか?
7877:02/09/22 21:28
げふぉ。
>>69
そしたらワードパッドと大きさが違ってくるんだろ。
ようするに要求が矛盾してるんだよ。
奴がやりたいことを整理して出直してくるまで放置だな。
80デフォルトの名無しさん:02/09/23 02:31
>>79
やりたいこと。
・固定高の矩形内におさめる
・表示はワードパッドやIEで表示したものと同じ大きさで
これだけです。
この条件で「(矩形の高さの)上限は求められますか?」ということと、
「可能ならその方法を教えてください」というのが元の質問の意味です。
固定高にワードパッドやIEと同じ大きさというが、
固定高の高さによって表示が切れるのは当然だと思うが
上限があるかって質問なんだから「ありません。」で終わるやんか。
何をぐだぐだ言っとんねん。
まあ、アレだ。
その部分のソースを出せば解決するんじゃないのか?
84デフォルトの名無しさん:02/09/24 03:07
http://www.forest.impress.co.jp/article/2002/09/20/goostick.html
こういうツールバーってどうやって作るの?
どこかに資料ありませんかぁ?
理論的には、unicodeの1〜10万いくつまでGetTextExtent32Wを
発行すればできるんでないか。まあ、表示文字列に対して
GetTextExtを発行した方が速いけどナ
何言ってるんだ?
ちょっと聞きたいのですが。
C言語でプログラムを書いたんですが、バックグラウンドで
動かす(MS-DOSプロンプトウインドウを出さないで動かす)には、どんなAPI
を使えばよいのでしょうか?
ご教授いただきたいですが^^
mainをやめてWinMainで作ればコンソール出なくなるよ
>>85
カーニングがあるからすべての2文字の組み合わせで
やらなければいけない≒事実上不可能
どこかにIMEで再変換するサンプルコードがありますでしょうか?
RECONVERTSTRING 構造体を「どーにか使う」というところまで辿りついたのですが、
まったく使用例が見つからず、肝心の「どう使うのか」が分からず行き詰まってしまいました。
どなたか、お助けいただけますでしょうか。
ウィンドウアプリケーションから
標準出力(coutとか)に文字列とか吐き出すと
どう処理されるんですか?
92デフォルトの名無しさん:02/09/25 00:18
Win2Kですが、非同期シリアル通信で、
SetCommMask( ,0)で
別スレッドでの受信待ちのWaitCommEventをキャンセルしているのですが、
処理が戻るまでに数秒〜数十秒かかってしまいます。
なにか、心当たりある方いらっしゃいますでしょうか?
93素人ですが。:02/09/25 00:30
教えて君ですみません。

過去にVBA(Access97)で組んだGetSaveFileNameの記述なんですが、Windows 2000になってから
動かなくなりました。
OPENFILENAME構造体が拡張されてサイズが変わったらしいこと、拡張された部分まではわかったんですが、
構造体の拡張部分をVBでどのように宣言したらいいのかわかりません。
つーのも、pvReservedがvoid*らしいのですが、VBにはどうやら該当するデータ型が見当たらないのです。
(試しにVariantで宣言したらダメでした。)
うまく動かないのは、ここの宣言が間違っているからと睨んでいます。
TypeからEnd Typeまでの記述はどうすればいいのでしょうか??
>>91
標準出力に相当するハンドルが標準では存在しないため、
未オープンファイルへ書いた場合と同様にEBADFとなる。
>>93
lStructSizeの値が76に設定されていれば、古い定義のままで動くはずだ。
どうしても新しいのが使いたければLongで宣言しておけ。
>94
了解しました
ありがとー
>89
カーニングは高さを変化さすのか?初耳だが。
>>92
その別スレッドの処理がものすごいことになってるのでは?
100デフォルトの名無しさん:02/09/25 10:21
ソケット通信なんですが、
Java側で

 ObjectOutputStream oout = new ObjectOutputStream(socket.getOutputStream());
 PrintWriter out = new PrintWriter(new OutputStreamWriter(oout, "SJIS"));
 out.println("hogehoge");
 out.flush();

と送って来て、それを recv しているんですが、
文字化けしてしまいます。

unicode変換とかが必要なんでしょうか?
102デフォルトの名無しさん:02/09/25 12:05
>>100
とりあえず、受信側でデータがSJISできてるか確認してみれば?
(スレ違いだと思うけど)
103質問はここでも受け付けてるよ:02/09/25 12:58
【マルチ】ぼるじょあ(・3・)のマルチ質問箱【大好き】
http://pc.2ch.net/test/read.cgi/pcqa/1032847313/l50
104デフォルトの名無しさん:02/09/25 16:41
教えて君ですみませんが

アプリケーションから(「に」ではありません)エクスプローラ,デスクトップ
orETCにドラッグ・アンド・ドロップしてファイルコピーをしたいのですが・・・
SimpDNDサンプルだとコピー先のファイル名がスクラップになってしまいます
どうしたらいいのでしょうか?
参考のURLがありましたら教えてください
105デフォルトの名無しさん:02/09/25 21:42
ageます
だれかおながいします
10693:02/09/25 21:49
>>95
ありがとうございます。
今日さらに突っ込んで調べてみたら、確かにlStructSizeは拡張前76、拡張後88でした。
でも76じゃ、CommDlgErrorExの値が構造体サイズ不正だったんです。
おっしゃる通りlongで定義(←他でヒント見つけました)したら、構造体サイズエラーは回避できました。
が、今度は初期化失敗のエラーが。
原因がわかりそうになかったら、また質問させて下さい。
10793:02/09/25 22:24
× CommDlgErrorEx
○ CommDlgExtendedError
10892:02/09/25 23:35
>99
単に受信待ちしてて、受信後にメッセージ送るだけです。
通信せずに終わると比較的早く、何度か通信してからだと大抵遅くなります。

>>104
DoDragDrop()に渡すIDataObjectで、CF_HDROPフォーマット
に対応しろ。DROPFILES構造体あたりを調べてみろ。
あとは必要に応じてCF_IDLISTにも対応(コピーだけなら不要)。
コピーだけなら CF_FILECONTENTSというのもあるが
これはあまりおすすめできんぞ、ボケナス。
>>109
ありがたうごじゃいます
やってきます
111デフォルトの名無しさん:02/09/26 02:19
104ではないですが。

DragFinish() って内部では何をやっているんでしょうか?
GlobalFree()? GlobalUnLock()?
112111:02/09/26 02:41
自己レス。GlogalFlags() で調べたら GlobalFree() のようでした。ども。
113デフォルトの名無しさん:02/09/26 10:19
windowsのコンソールアプリでパイプ使いたいんですけど
どうすればいいんですか?
114113:02/09/26 10:21
あ、これだけじゃわかりませんね。
アプリからコプロセスを起動して、その標準出力を取りこみたいのです。
115113:02/09/26 10:24
あ、popenってwindowsにもあるみたいですね。
お騒がせしました。
116113:02/09/26 11:34
でもMSDNのpopenのサンプルがフリーズしてうまく動かない。
これはどうしたことか。
PerlやPHPをやってるとWindowsプログラムをやりたくなくなる・・
一度甘い汁を吸うと駄目ですね・・
>>92
漏れはそんなことにならなかったから、イマイチ分からない。
ここからサンプルを落として、ttyというサンプルを読むといいかも
http://download.microsoft.com/download/vstudio60pro/Utility/6.0/W98NT42KMeXP/EN-US/vs6samples.exe
ログファイルに書き込むときに、排他的に開くと起動中にログファイルが読めなくなるので
FILE_SHARE_READで開こうかと思うんですが、これって書き込み中に他のアプリが
ログファイルを読み込んだりしてもファイルが壊れたりはしないですよね?
>>119
壊れないとは思うけど、LockFileを使うとイイ!
121デフォルトの名無しさん:02/09/26 13:42
疲れたので寝ます。。。。。。。。。。
>>113-116
GetStdHandle(STD_INPUT_HANDLE)はどうよ
123122:02/09/26 14:20
よく読んだら、外してる
124SevenTH ◆BI2EKkq. :02/09/26 15:27
>>116
Win98 と NTでは、パイブの挙動が違う。
125113:02/09/26 19:01
>>124
今Win98SE上で作ってます。
NTだとうまく機能するのかもしれませんね。
実際、さっき試したら自分で作ったEXEの標準出力は取りこめたので。
DIRとかのcommand.comのシェル関数を使うと駄目っぽいです。
126デフォルトの名無しさん:02/09/26 19:06
このスレッドで良いのかわかりませんが、質問させてください。
AccessのMDB形式のデータベースをC言語でのWin32SDKとかから
VBの様にSQL発行したりしてアクセスしたいんですが、方法は
あるでしょうか。(このためだけにVB使うのは気が引けるので)
ExcelみたいにCOM経由ででもできればいいんですが。
127デフォルトの名無しさん:02/09/26 19:12
IMEの入力モードについてなのですが...
ローマ字入力/かな入力の切換え関数を教えて下さい。

Win2K+VC6+MS-IME2000です。

...出来れば、入力モードの取得関数もお願いします。m(_ _)m
まさか、popen("dir",...)な口ではなかろうな、、、
>126
ADOをCOM経由で叩いたり、DAO使ったり、ODBC叩いたり
すればいいとは思うけど。
>>127
ImmSetConversionStatus とかかなぁ
131127:02/09/26 21:22
レスどーもです。

>ImmSetConversionStatus とかかなぁ
↑は半角/全角とかの入力モードの変更関数です。

知りたいのはIME2000プロパティ上の
「入力設定」-「ローマ字入力/かな入力」の変更方法と取得方法なんです...

よろしくお願いします。m(_ _)m
13293:02/09/26 21:28
解決したので、一応ご報告しときます。
全然違う所で引っかかってたようです、すみません。

Win95で開発当時、OPENFILENAME構造体を次のように定義していたのですが…
  Type
   …
   lpstrFilter As String
   …
  End Type
2000では、こうするとまともになりました。
  Type
   …
   lpstrFilter As Long
   …
  End Type
95でも、これで大丈夫みたいです。

ここはVBではStringにするようになってたはずだと思うんですが、なぜLongに変える必要があったんでしょうか?
結果オーライでは今一つ不安なので、どなたか理由を教えて下さいです。
133訂正@93:02/09/26 21:30
>>132は間違い、
lpstrCustomFilter As String
 ↓
lpstrCustomFilter As Long
です。
lpstrCustomFilterに自分で値をセットしない限りは、
どっちでもまったく同じ。
135134:02/09/26 21:57
つまり、このメンバを使わないのなら という意味ね。
136126:02/09/26 22:14
ODBCが簡単そうなので、これでいってみます
ありがとうございました。
>>131
それって、カナロック?
138名無しさん@Emacs:02/09/26 23:11
>>90
レスがつかないようなので。
HPは、なくなっているようだけど
ImeReconvでぐぐってみそ。
13993:02/09/26 23:35
>>134
いかにも、lpstrCustomFilterに0だのNullだの入れるとおかしくなったけど、無視したらまともでした。
でも、なんでLongだと問題が解決したのか知りたいです。
140134:02/09/27 00:11
>>139
Long型の初期値(宣言後に何も入れてない状態)は 0。
これにコード内で明示的に0を入れても元の値のまま。

String型の初期値はvbNullString。(他の言語で言えばNULLポインタ)
これをAPIに渡すのと、Long型の 0を渡すのはまったく同じ。
しかしコード内で "" を入れてしまうと、この値は変化し、
長さゼロの文字列へのポインタとなる。
明示的に初期化したいのであれば vbNullString を入れろ。

API呼び出し以外の場面では、(普通は)両者の違いを意識する必要はない。
>>94
ナラネーヨ
なにげに存在してるぞ。コンソールに反映されないだけで
142127:02/09/27 09:27
>>137
レスどーもです。
そです。「Alt+ローマ字」キーで切替えるトコです。

入力モード/変換モードは変更出来るんですが、
ローマ字入力/かな入力の切替えが出来なくて...

よろしくお願いしますm(_ _)m
>>141
バッファリングって知ってる?
>>143
関係ないよ
コンソールが存在してないんだから
145デフォルトの名無しさん:02/09/27 10:55
質問させていただきます。
マルチスレッドを勉強しているのですが、
クリティカルセクションとミューテクスの違いがわからなくて困っています。

両方、フラグがOFF(他のスレッドで排他処理を行っていない)状態になるまで
待機するものと思うのですが、なにか使い分けはあるでしょうか。
Mutexはプロセスを超える
>>142
keybd_eventじゃダメなの?
>>143-144
コンソールアプリでなくてもリダイレクトすると
ちゃんと標準出力の内容をファイルに落とせる。
つまりコンソールがないから見えないだけで
標準出力はちゃんと存在するんだな。
149127:02/09/27 11:19
>>147
キーボードイベントでも変更出来るんですけど、
ON/OFFの状態が判らないと、必要が無いのにイベントを投げちゃいそうで...
150127:02/09/27 11:49
モードがローマ字入力の時に「Alt+ローマ字」のイベントを投げたら、
モードはかな入力になりますよね?
それだと、困るんですよ...色々と

諦めるって訳にも逝かないし...脳味噌から煙が...
151デフォルトの名無しさん:02/09/27 11:55
今さら??
というような問題で悩んでおります。
MessageBox("テスト",NULLL,MB_YESNO|MB_ICONQUESTION);
見てのとおりのメッセージボックスなのですが、
MB OKなら「ポン♪」って音がなりますよね?
↑のコードじゃならなくて困ってます。
直前にMessageBeep入れてもできるとは思いますが、
どうも根本的な解決じゃないような。。
ご指導よろしくおねがいします。
152 :02/09/27 11:56
>>148
すまんが、確認したOSは?
>>151
キミの環境ではサウンドのプロパティのメッセージ(問い合わせ)が
設定されてないだけだと思ふ。
>>152
98と2000とXP
9xだと常駐ソフトの絡みか何かでファイルに落ちないことは
あるけどそういうときはコンソールアプリも落ちない(リダイレ
クトしてるのにコンソールに吐かれる)から単なるバグだと思う。
あと処理系によってはGUIアプリのとき標準出力の準備を
省略することがあるかも(>>148を確認したのはVC++ 6.0)
155 :02/09/27 12:48
>>154
変だね。当然、標準出力をわざわざ作ってはないよな?
156154:02/09/27 12:55
GUIアプリのprintfデバッグによく使ってる手なんで
幻を見てるって事はないはずなんだけど…
157154:02/09/27 12:57
>>155
スタートアップコードが標準出力を作ってるかもしれないけど
プログラム内で明示的に作ったりはしてないです
158147:02/09/27 13:11
>>149
GetKeyStateで取得すれば?
159 :02/09/27 13:13
>>157
は、リダイレクトを指定しないとき、ハンドルが存在するか確認はしてないわけだな?

リダイレクトすると、自動作成されるってのが結論なのかねぇ。
>>159
DOS窓から実行させればリダイレクトしなくても表示されますが?
161127:02/09/27 14:26
>>158
以下のよーな感じですよね?GetKeyState関数の使い方は
引っ掛かりませんでしたけど...ね

if(GetKeyState(VK_KANA) & 0x0001){
  // かな_ON
}else{
  // かな_OFF
}
指定してる仮想キーを間違えてるのかなぁ...
160age
163デフォルトの名無しさん:02/09/27 14:48
LoadLibraryでDLLをマップしようとすると、NT系ではOKですが、
9x系ではGetLastError「このアプリケーションの実行に必要なライブラリ ファイル
のうちの 1 つが見つかりません。」と返してきます。

MSDNには、
「DllMainがWin32 関数の Unicode 版を呼び出そうとした場合も、LoadLibrary は失敗します。」
とあるので、これが気になっているのですが・・・。

DLLはCOMサーバで、unicodeプログラムになっています。
>>160
表示されないぞ
>>163
何のDLL使おうとしてるんだか知らんが、そのDLLがリンクしてるDLLがNT系固有なんじゃないか?
Dependency Walkerでも見ろ。
166147:02/09/27 15:21
>>161
合ってるよ。
それで取得できるはずだけど。
167147:02/09/27 15:56
>>161
あ、IME2000固有のカナモード切換のこと?
だったら多分無理だよ。
(ごめん、キーボードのカナロックかと思った)

以前にMSのサポート技術情報ページで、
IME97かIME98あたりからAPIでの変更が不可能に
なったというのを読んだことがある。
168127:02/09/27 16:45
>>167
むぅ...「Alt+ローマ字」で切替えるヤシは
APIで変更が出来ないのか...

(゚д゚)マズーだな...こりゃ...
さて、どーしよ
16993:02/09/27 19:48
>>140
ありがとうございます。
Stringで宣言していた時は、Chr(0)だのvbNullCharだので初期化してたのですが、
あちこちコードをいじり倒したので、今となってはよくわからなくなってしまいました。
今後の参考にさせて頂きます。
170名無し@沢村:02/09/27 21:04
皆様方、ボタンなのですが、ボタンは子ウインドウなのでマウスでクリックしたとき、そのウインドウのハンドルを取得したいのですが、どうすればできますか?
いろいろなボタンをクリックしたときに、そのボタンに応じたハンドルを取得できますか?
>>170
GetDlgItem
>>168
keybd_event で何か入力させてみて、何が入力されたか調べる・・・とかいう最終手段もなきにしもあらず
173名無し@沢村:02/09/27 22:11
コントロール(ボタン)上で、マウスボタンが押されたときと離されたときで、違う処理をさせたい場合は?
>>173
サブクラス化したほうが早いんじゃない?
175名無し@沢村:02/09/27 23:15
>>174
サンキュー、サブクラス化したらなったよ。
でもCallWindowProcをしたら1番目の引数がlong (__stdcall *)(void *,unsigned int,unsigned int,long)' から 'int (__stdcall *)(void)' に変換できません。(新しい機能 ; ヘルプを参照)とエラーが出たよ。
本に書いてあるようにしたのにどうして?
どうやって解決するの?
17692:02/09/28 00:51
>118
ありがとうございました。
サンプルを参考にWaitCommEventの最後の引数をNULLにしたら直りました。
理由は不明ですが・・
>>176
CallWindowProcのヘルプ嫁

STRICTを定義するのはデフォルトと思ってたがなあ・・・
178177:02/09/28 00:56
しもうた176じゃなくて175だ
K&R本によるとfgetcは内部でgetcを使って一文字ずつ読んでいるようですが、
Win32APIには一行ずつを読むAPIは無いので同じような関数を作るとすれば、
ReadFileで一文字ずつ読み込んでいくのが妥当ですよね?
それとも他に便利なAPIありますか?
180sage:02/09/28 01:18
同じような関数を作るくらいなら、fgets使ったほうがいいんじゃない?
>138
ありがとうございます。参考にします。
>>179
おいおい、ReadFileで1文字ずつ読んだら
めちゃくちゃ時間かかると思うよ。
何のためにストリームがあると思ってんの?
fgetsだと行末がバッファからはみ出てたら、やばくね?
>>183
やばいね。

>>182
ReadFileってバッファリングしなかったっけ?
ReadFileで一気にバッファに読み込んでそのバッファで1行処理
やって処理がバッファの終わりまで来たらまた読み込んでじゃ駄目なの?
メモリマップしてが――っと読んでイケ。
この話題って、定期的に出ますな。で、いっつも
 1文字ずつ読むんですか?→バッファに少しずつまとめて読め→メモリマップ使え
の流れ。
>>187
で実際メモリマップ最強ってことでええの?
>>188
だめ。少なくとも、windowsではローレベルI/O汁
windowsのメモリマップは直接マッピングしてくれずに勝手にキャッシュするから。
ではこの質問がきたら
「バッファに少しずつまとめて読め」
ということね。FAQ認定
>>189
キャッシュされるとなにがまずい?
少なくともNT系ではマップした方が速いのだが。
よくでる質問の割に定石って無いわけ?
>>191
ディスク>キャッシュ>マップされたメモリ となる。
キャッシュの分オーバーヘッドが掛かり、遅くなる。
>>159
まともな知識のある奴は一人もいないのかね。
ウィンドウズアプリでは標準出力のハンドルが割り当てられない。
GetFileType(GetStdHandle(STD_OUTPUT_HANDLE))してGetLastError()
を取ると、ERROR_INVAID_HANDLEが返ってくることからも分かる。
ランタイムのstdoutやcoutは存在するため、一見出力できるように思えるが、
バッファがフラッシュされたタイミングでエラーになる。
ただしリダイレクトされている場合は別だ。親プロセスが標準出力に
正しいハンドルを割り当てた状態をリダイレクトと呼ぶのだから、
出力できるのがあたりまえだ。
195 :02/09/28 06:58
>>194
半日かけて、よく調べた。感動した。
196151:02/09/28 08:31
>153
さんの言う通りでした。
いつの間に設定がなくなったんでしょう。
XPでは始めは設定されてないのかな。
とにかく無事解決しました。
ありがとうございました。
>>193
PAGE_NOCACHEしても?
>>194
試してみたらちゃんとハンドルが返ってきましたが?
もちろんリダイレクトなんかしてませんが?

と思ってたらようやく原因が分かった。
エントリをmainにしていて/subsystem:windows /entry:mainCRTStartupで
リンクするとコンソール用のスタートアップが走るせいか標準出力の
ハンドルが準備される。
エントリをWinMainにしたら0(INVALID_HANDLE_VALUEじゃない。MSDNの嘘つき)
が返ってきてGetLastError()もERROR_INVALID_HANDLEになりますた。
って今テストしたら0(FILE_TYPE_UNKNOWN)が返ってきた。何か勘違いしてたらしい。
じゃ結局、AllocConsole()を使え。という結論でよろしいか。
201デフォルトの名無しさん:02/09/28 15:01
既に起動済みの他アプリ(自作ではない)のボタン等のコントロールを非表示にする
ことは可能でしょうか?
FindWindowとかWindowFromPointとかでどうにかハンドルを手に入れれば
あとはなんとでも
203デフォルトの名無しさん:02/09/28 23:45
スタートボタンとウィンドウズキーを使用不可にするジョークソフト
作りたいんですが検索キーワードを教えて下さい
プラットフォームSDKが英語で嫌になりました
まず英語勉強しろ
>>203
マウスメッセージとキーメッセージをフックしたら?
>>205
NC(非クライアント)関係をやれば出来ますか?
EM_SETSELで指定できる値の上限を知りたいのですが、
私の環境(Win98SE)では0x7FFFまでのようなのですが、
NT系ではどうなんでしょうか?
208201:02/09/29 03:01
>>202
FindWindowでハンドルを得て、CaptionやIconの変更は出来たのですが,,
申し訳ありませんが、もう少しご助言いただけませんでしょうか?
>>208
FindWindowで得られるのは親ウィンドウのハンドル。
そのハンドルを元にGetDlgItemやFindWindowExや
GetWindow等を使って、対象のコントロールの
ウィンドウハンドルを取得。
そしてそれをShowWindowかSetWindowPosで非表示にする。
210名無し@沢村:02/09/29 12:20
皆様方、私はボタンが押されたときと、離されたときで違う処理をしたいと思ってここで聞いたら、
サブクラス化したらいいと教わったので、サブクラス化したところ、ちょっとうまういったんです^^;
違う処理についてはちょっとうまういったんですが、ボタンが押されたときも離されたときもじっとして動かない(見た目が)のです。
またボタンの上のフォントも作ったフォントではなく、普通のフォントが表示されるのですが、どうしたらいい?
>>210
意味がワカラン

ボタンを持つ主体は自分なのか他人なのか、
フック内でどんな処理を行っているのか
フォントを作った後にどうしているのか

これくらい書け
212201:02/09/29 18:54
>>209
試行錯誤しながらやってみたのですがうまくいきません。
具体的にはMSOffice上のボタンを非表示にしたいのですが、もう少し
ご助言いただけないでしょうか。

現在
HWND thehwnd = FindWindow( "XLMAIN", NULL );
thehwnd = FindWindowEx( thehwnd, NULL, "Button", "ヘルプ(&H)" );

とやっていますが、thehwndにはNULLが入ってしまいます。
213209:02/09/29 19:02
>>212
その前に、そのコントロールは間違いなくウィンドウなの?

Office系では単に親ウィンドウ内にコントロールの絵を
描画しているだけのことが多いよ。
具体的にはExcelのどの部分のボタンですか?
214201:02/09/29 19:37
>>209
プレビュー画面の各ボタンです。
215デフォルトの名無しさん:02/09/29 19:58
教えてほしいっす。
ウインドウズプログラムではスレッドごとにカーネルとユーザーモードの
スタックを持っていますが、これはスレッドごとにメモリ上に実際に確保される
スタックの位置が違うと解釈していいのでしょうか?
216209:02/09/29 20:19
>>214
Excel2000で確認してみたところ、
子ウィンドウの子ウィンドウ(孫)だから

HWND thehwnd = FindWindow( "XLMAIN", NULL );
thehwnd = FindWindowEx( thehwnd, NULL, "EXCELC", "" );
thehwnd = FindWindowEx( thehwnd, NULL, "Button", "ヘルプ(&H)" );
のような感じで取得できると思う。
>>215
> ウインドウズプログラムではスレッドごとにカーネルとユーザーモードの
> スタックを持っていますが、

こっちの真偽は、よく知らんが...

> これはスレッドごとにメモリ上に実際に確保される
> スタックの位置が違うと解釈していいのでしょうか?

これは、正しい。
218201:02/09/29 20:45
>>209
ありがとうございました!期待通りの操作ができました。
わかりやすい説明に確認までしていただきまして感謝しています。

あと、図々しいかと思いますが、もうひとつ。
EXCEL2000で確認とありましたが、それはどのように調べるものな
のでしょうか?
219209:02/09/29 22:07
>>218
Excel2000の印刷プレビューの画面を確認したという意味です。
俺はVC++に付属している SPY++というツールで確認しました。
ただ、EnumChildWindows等を使えばツールがなくても
比較的簡単に調べられます。
220名無し@沢村:02/09/29 22:11
皆様方、私はボタンが押されたときと、離されたときで違う処理をしたいと思ってここで聞いたら、
サブクラス化したらいいと教わったので、サブクラス化したところ、ちょっとうまういったんです^^;
違う処理についてはちょっとうまういったんですが、ボタンが押されたときも離されたときもじっとして動かない(見た目が)のです。
またボタンの上のフォントも作ったフォントではなく、デフォルトのフォントが表示されるのですが、どうしたらいい?
フック内ではボタンが押されたときと、離されたときで違う処理だけ行なっています。
フォントはメインウインドウ内でつくった後なにもしていません。
>フォントはメインウインドウ内でつくった後なにもしていません。
オモロイ
222215:02/09/29 22:50
>>217
わかったっす。ありがとー
223名無し@沢村:02/09/30 00:06
皆様方、大変初歩的な質問で申し訳ないのですが、
コンボボックスをつくったのですよ。
そしてfor(i=0;i<100;i++)
SendMessage(hwnd,CB_ADDSTRING,2,(LPARAM)szbuffer[i]);
としたのですがコンボボックス内に何も字が表示されないのですよ。
本に書いてあるとおりにしたのに、どうしてでしょう?
どう考えてもわかりません…
>>223
wParamの2って何?
とりあえずダイアログエディタで、コンボボックスの矢印の部分をクリックして、
出てきた枠を下にぐ――――んと広げてみれ。
225名無し@沢村:02/09/30 01:30
>>224
ヌヒよ、ダイアログじゃねーよ、ヌヒよ。
226名無し@沢村:02/09/30 01:35
皆様方、コンボボックスですが、解決しました。
コンボボックスをつくるとき高さを充分にとってやればよかったのね…。
でも矢印をクリックしないと字が出てこないのですが…。
つまり一番上のスペースに字が最初から出ていないのですが…。
よくソフトなんかでは一番上のスペースに字もが最初から字が出ていますが、あれはどうするの?
>>226
CB_SETCURSEL
228デフォルトの名無しさん:02/09/30 16:47
Windows のマクロで 9x 系か NT 系かを判定する方法ってありませんかね?
具体的には、プリプロセッサーの処理の時点で NT 系だけに存在する関数を
#ifdef で条件コンパイルしたいんです。
関数でなら GetVersionEx() というものを使えばいいらしいんですが、
これだと条件コンパイルできませんし。よろしくお願いします。
>>228
もう一度頭の中を整理したほうがいいぞ
>228
コンパイルしている環境のOSと、
動かすべき環境のOSは違うかもしれないんだが。
231228:02/09/30 17:43
>229-230
あっ、そういえば……ありがとうございました。
解決できたので吊ってきます。
232名無し@沢村:02/10/01 01:06
>>227
ありがとうございました。
CB_SETCURSELとしたところ、初めから字がコンボボックスに出ました!!
それからもうひとつ質問ですが、コンボボックスをつくるとき高さをだんだん低くしてやってみたのですが、
いくら低くしてもこれ以上低くならないというのが何かあるみたいなのです…。
よくソフトなんかでは、もっと低くてカッコいいコンボボックスを見かけるのですが、
よく見かけるソフト並みにコンボボックスの高さを低くするにはどうしたらいいの?
またそんな方法があるの?
自アプリに限らない登録済みホトッキー一覧を取得するにはどうすればよいのでしょう?
>>233
 const int id = 123;
 bool used[8][256];
 for (int mod = 0; mod < 8; mod++){
  for (int vk = 0; vk < 256; vk++){
   used[mod][vk] = !::RegisterHotKey(hWnd, id, mod, vk);
   ::UnregisterHotKey(hWnd, id);
  }
 }
現在webブラウザを作っています。
レンダリング結果を自然にするため、
文字のカーニングを行いたいのですが、
フォントから情報を取得する方法が分かりません。

参考になるサイトなど教えて下さい
GetKerningPair っつう API があるけど?
MFCでダイアログベースのHTTPクライアントを作っています。
InternetReadFileで読み込んでいるのですが、読み込み中は
ダイアログの何処をクリックしても反応がありません。
他に良い方法は無いでしょうか・・・
238名無し@沢村:02/10/01 20:44
皆様方、コンボボックスの高さの件ですが、誰にも聞かずに解決しましたヨ!!
CB_SETITEMHEIGHTとすれば良かったのね!!
あと皆様方、コンボボックスにたくさんデータを入れたのですが、
データの一番下までスクロールすると、データの一番下の字のもっと下の部分に空白ができるのですが、この空白のなくす方法はないものでしょうか?
良くソフトなんかでは、データの一番下の字までで終わりになっていてカッコいいので、あんなふうにしたいのですが…?
>>238
CBS_NOINTEGRALHEIGHTを外すのだ外すのだ外すのだ
>>237
INTERNET_FLAG_ASYNCで開け。
またはスレッドを作る。
>>240
async・・というと非同期ですか。
ちょいとやってみます、thx!
242名無し@沢村:02/10/01 22:54
皆様方、私は我ながらすごいこと発見いたしましたので、皆様方にお教えいたします。
それは{mciSendStringなんですが、{mciSendStringでopenとやってplayとやると、
演奏が終わったあと再びボタンを押しても演奏されないんです。
しかし停止ボタンで演奏途中で停止した場合は、もう一度演奏ボタンを押しても演奏されるんですね…^^;
私はこの事実に注目して演奏がひとりでに終わったあと再びボタンを押しても演奏されるようにする大発見をしたんです!!
それは皆様方、まず、{mciSendStringでcloseとやったあとopenとやってplayとやるといいんですよ!!
何故なら停止ボタンはmciSendStringのcloseから成り立っているからなんですねっ!
ちょっと邪道のような気もしますが何も問題は発生しないのでいいと思うんですが…。
皆様方はどう思われます?
いつも教わってばかりなので、たまには私が教えたのですが、いかがでしたでしょうか?
>>242
ここに書き散らすよりも、ホームページにTipsとして書いたほうが
後の人のためだと思う。
>>243
いや、どう見てもネタだろ・・・
>>244
うるせえ黙れオナニーならホムペでやってろ
とやんわりと言ってるのだと思われ
>>242
一つだけ言わせてもらえれば、馴れ合いたいだけなら
どっか他所でやってくれ。
Tips かよ?
248デフォルトの名無しさん:02/10/02 14:35
アプリケーションモーダルなダイアログを自前で作りたいんですが
親ウィンドウを設定したあと子ウィンドウが閉じられるまで
親ウィンドウにフォーカスを移さなくするにはどうすればいいんですか
EnableWindow()ではなんか違うよう気がするんですが…
何が違うんだよ。EnableWindow()でいいんだよ。
250デフォルトの名無しさん:02/10/02 14:47
違う気がする…
おまえの脳内妄想なんかには付き合ってらんねーよ。
そのまま一生悩んでろ。
>>248
DialogBox()使ってるの?
Win95以降MFC使ってるからDialogBox()の動作よくしらへんけど
親にフォーカスが来たタイミングでダイアログにフォーカスを移してやれば
いいと思うんだがダメかね。
254デフォルトの名無しさん:02/10/02 16:05
MessageBox(hWndParent,"","",MB_OK);
としたときのメッセージボックスと
hWndParentの関係のようなものにしたいんですが
なんとかいっぱつでできるような方法はないでしょうか
>>252
自前でって書いてるからアプリケーションモーダルの
ふるまいをエミュレートしたいって解釈したんだけど
>>254
違うんだったらDialogBox()
つーか>>252は無視か? とっとと首くくって氏ね
MFCは、DoModalすると、modelessでdialogつくって、
親をEnableWindow(FALSE)してるが。

つか、何がどう違うんだよ。釣れた、とかいうのは勘弁な。
257252:02/10/02 17:06
>>255
>自前でって書いてるからアプリケーションモーダルの
>ふるまいをエミュレートしたいって解釈したんだけど
書き込んでから248を読み直してきがついた。249が正解とオモタ
でも、どうやってダイアログを表示してるか書いてないんで
一応252の書き込みしててもいいかとオモタ
258デフォルトの名無しさん:02/10/02 17:11
ポップアップメニューって、位置とアラインを指定(TPM_XXALIGN)してやると、
領域が画面内に収まるように位置が自動調整されるじゃないですか。

これを普通のウィンドウでやりたいんですが、位置を計算してくれる APIなど
ありますか?やっぱ、自分でしこしこ計算するしかないんですかね?
259248:02/10/02 17:13
ウィンドウを2つCreateWindow()で作成して
それを>>254のような関係にしたいんです。
言葉足らずですみません…
260252:02/10/02 17:24
ところで、EnableWindow()やけどOLEオートメーションの動作に関係する?
Visio2002をオートメーションで制御使用として、オートメーションで取得したHWNDを
EnableWindow(FALSE)したら、それ以降オートメーションでの操作ができなくなったけど
ちなみにVisio2000までのバージョンなら正常に動作します。
オートメーションの仕様に変更か何かありました?
スレ違いかもしれませんし、別に困ってもいないんでほんとはどうでもいいです。
もし知ってる人が答えてくれたら夜ぐっすり眠れます(いまでもぐっすりですが)。
261248:02/10/02 17:25
>>255
それです。。。
ウィンドウを自前で作成して
アプリケーションモーダルの動作をエミュレートしたいです
>>261
249,256でいいと思うが253でもできる
というか、アプリケーションモーダルで意識のずれがある?
NT系のOSではwaveOutOpenの引数にコールバック関数ではなく
スレッドを使用すべきという事を聞いたことがあるんですが
本当なんでしょうか?
264名無し@沢村:02/10/02 22:15
皆様方、私はボタンが押されたときと、離されたときで違う処理をしたいと思ってここで聞いたら、
サブクラス化したらいいと教わったので、サブクラス化したところ、ちょっとうまういったんです^^;
違う処理については処理のようになったんですが、ボタンが押されたときにへこまないのです。
ボタンのプロシージャ内では、その処理についてだけ書いていますが、ボタンがへこむようにするには何か別なことも書かなくちゃいけないの?
ボタンが押されたときにへこむようにするにはどうすればいいのでしょう?
>>264

もとのウィンドウ関数を実行している?
恥をしのんで聞くけど、うまういったってどういう意味?
267名無し@沢村:02/10/02 23:17
>>265
はい、 return (CallWindowProc(lpfnProc[i],hwnd,uMsg,wParam,lParam));とすれば
残りの処理はもとのウインドウ関数がやってくれると本で読んだので、一応書いています。
それ以上のことはさっぱりわからないです…^^;
>>263
どこで聞きましたか?(void風)

以下俺の感想。

waveOutのコールバックが呼びだされるコンテキストって結構怪しかったと思う。
コールバックの中から呼び出せるAPIに限りがあったりするし。
↑こういうのをキモいと思うなら、別スレッドでEventをWaitForすると
スッキリするぜ、みたいな。
>>267
(1) WM_LBUTTONDOWNの処理をした後にも元のウィンドウ関数を呼ぶ
(2) ネタと思われないよう、ちゃんとした日本語を書く
270248:02/10/03 10:35
ごめんなさい>>251の言うとおりでした…
GetParent()を繰り返して一番親にあたるウィンドウを探して
それをEnableWindow()で無効にしていたんですが
親ウィンドウを探す処理でミスがあって
別のウィンドウを無効にしていたようです
( ´,_ゝ`)プッ
272デフォルトの名無しさん:02/10/03 12:47
外部EXEからEXCELを操作しています。
プレビューを表示させようとして調べた結果(winshght32使用)

(親)XLMAIN->(子)XLDESK->(子)EXCEL7(キャプション=book1.xls)というウィンドウが

WM_SYSKEYDOWN Dispatched 12h 18d VK_MENU Scan 38h Alt Down
WM_SYSKEYDOWN Dispatched 46h 70d VK_F Scan 21h Alt Down
WM_SYSKEYUP Dispatched 46h 70d VK_F Scan 21h Alt Up
WM_KEYUP Dispatched 12h 18d VK_MENU Scan 38h Alt Up

上記のようなメッセージを受け取っていたので、次のようにコーディングしました。

HWND Hwnd = FindWindow( "XLMAIN", NULL )
Hwnd = FindWindowEx( Hwnd, NULL, "XLDESK", NULL );
Hwnd = FindWindowEx( Hwnd, NULL, "EXCEL7", "book1.xls";

PostMessage( Hwnd, WM_SYSKEYDOWN, VK_MENU, 0 );
PostMessage( Hwnd, WM_SYSKEYDOWN, 'f', 0 );
PostMessage( Hwnd, WM_SYSKEYUP, 'f', 0 );
PostMessage( Hwnd, WM_KEYUP, VK_MENU, 0 );

しかし、実行してみるとプレビューを表示できず、なぜか"6666"という文字が送信されてしまいます。

試行錯誤しながらやってみましたが、原因が私にはわかりません。
どなたか解決のためのヒントやアドバイスをいただけないでしょうか?
>>272
keybd_event()使え
>>273

フォーカスの問題をどうするのよ?
プレビューするのにフォーカス関係あるのか?
フォーカス設定したいなら AttachThreadInput() でスレッドをアタッチしてから SetFocus() すればいい
>外部EXEからEXCELを操作しています。
オートメーション使う手もあるが
277デフォルトの名無しさん:02/10/03 13:58
はじめまして。詳しい方にお聞きしたいのですが、
Win32APIのReadDirectoryChangesWはファイルの変更等を検知することが
できるらしいのですが、不正アクセスなど特殊な手法を用いることで、
この監視を逃れ、見事ファイルの改ざんを行うことが可能なのでしょうか?
皆様方よろしくお願いいたします。
>> プレビューするのにフォーカス関係あるのか?

keybd_event() はフォーカスのあるウィンドウに対して送られる

>> AttachThreadInput() でスレッドをアタッチしてから SetFocus() すればいい

そんなら、本質問のようにメッセージを送って解決する方が簡単だね
>そんなら、本質問のようにメッセージを送って解決する方が簡単だね

解決してないんじゃないの?解決してるの?
どっちだよ
>> 解決してないんじゃないの?解決してるの?

解決してないんじゃないかな。

> PostMessage( Hwnd, WM_SYSKEYUP, 'f', 0 );

これが意味不明だし。
たんに ALT+F でメニュー項目を選択させたいんだから
WM_KeyDown/Up でいいんじゃないか?
仮想キーコードは、アルファベットは大文字だったような…
282デフォルトの名無しさん:02/10/03 14:24
質問です。

現在ミュージックプレイヤーを作っているのですが
プレイヤーがすでに起動されている状態で
もういちどプレイヤーが起動したときに
もういちど起動された実行ファイルの引数(ファイル名)を
もともと起動していたほうのプログラムに渡し、
・多重起動の防止
・引数を渡してその引数が示す曲を再生させる
がしたいのですが
たいのですが
どうすればよいでしょう?

1日考えたり調べたりして
FindWindowをつかい同じ名前のウィンドウがあれば
SendMessageでファイル引数をchar*として渡す、

という方法でやったのですが
Win98ではうまくいってもWin2000だとうまくいきませんでした。
具体的には、文字がうまく渡されてないようで
表示させてみると変に表示されました。

方法が根本的に間違っているような気がしましたので質問させていただきました。
どうかよろしくおねがいします
>>SendMessageでファイル引数をchar*として渡す、

メッセージは何を送ったの?
MediaPlayer のラッパークラスってないの?
285248:02/10/03 15:43
WM_USERは危険…
>>282
NT系では特別に設計されたメッセージ以外は
プロセス境界をまたいでポインタを渡せない。
WM_COPYDATA使え。
>>286

9x系だって渡せない
>>287
はずだが>>282では何の偶然か渡せてるみたいだな
まあ何の保証もないからどちらにせよWM_COPYDATAを
使うように書き換えたほうがいいな
>どちらにせよWM_COPYDATAを
>使うように書き換えたほうがいいな

どちらもプログラム可能なら苦労しないはず
いっそ一つにまとめれば

そうじゃないんでしょ?
>>289
自作のミュージックプレイヤー同士での通信だろ、これ。
291282:02/10/03 18:16
ここで皆さんが教えてくださった
"WM_COPYDATA"
を使ってさっそく書き換えてみたところ
2000と98で両方確かめましたがどっちもうまく行きました。

>>283-289さん
どうもありがとうございました、ほんとに助かりました。
298 だが取り消し。アフォだった。すまん。

> もともと起動していたほうのプログラムに渡し、

これだね。288 さんに賛成
>>291

ちなみに 98 では何のメッセージを送って成功してたの?
WM_SETTEXT なら NT 系でも 9X 系でも必ず成功するよ。
295282:02/10/03 18:28
最初はメッセージ
uint wm_id = RegisterWindowMessage("アプリケーション固有の文字列");
って感じで取得したウィンドウメッセージIDを使ってました。

98でうまくいったのは偶然かもしれないですけどね。
>>295

回答ありがとう。

>98でうまくいったのは偶然かもしれないですけどね。

あり得ない、と思うけどねぇ。アドレス空間が別なんだから。

テキスト渡すだけなら、Width と Height がゼロの EDIT かスタティック
に WM_SETTEXT を送るのが簡単。親で通知メッセージを受け取って、その
変化を認識できる。WM_COPYDATA は、テキストに限らずどんなバイトブロック
でも送れるので、一度覚えてしまうと便利だね。
297デフォルトの名無しさん:02/10/03 19:12
ほかのアプリのウィンドウに貼りつくアプリを作っています。

対象アプリの移動やサイズ変更時追従することは出来るようになりま
した。

そこで、使用者に外部アプリによる貼り付けとわからないように、対
象アプリのタイトルバーの真下に表示させたいのですが、ウィンドウ
のタイトルバーの高さはどのようにして得るのでしょうか?
298297:02/10/03 19:26
すいません、
GetSystemMetrics( SM_CYCAPTION )
でできました。
299名無し@沢村:02/10/03 20:34
>>269
ありがとうございました。
(1) WM_LBUTTONDOWNの処理をした後にも元のウィンドウ関数を呼ぶ
これでやってみたら、ちゃんとなりました。
もうひとつ質問ですが、オーナードローボタンに付けたビットマップの絵柄をボタンが押されたときに描きかえるにはどうしたらいいのですか?
またそのようなことは可能ですか?
>>299

元のウィンドウ関数を処理の<前に>呼んで実行しておく。そしてその後
WM_LBUTTONDOWN でビットマップをボタン表面に描く
>>299
普通にWM_DRAWITEMの処理の中でビットマップを切り替えればいいのでは。
ボタンが押されている状態かどうかは、BM_GETSTATEを送ればわかる。
302263:02/10/04 00:41
亀レスすいません。
265さん回答ありがとうございます。やはりマルチスレッド関係を
勉強しなければいけないみたいですね。

ちなみにこの話の元ねたは某SPCプレイヤーのReadmeからです。
デスクトップのアイコンをツリービューに表示させたいのですが、
上手くいきません。違うアイコンが表示されてしまいます。

// アイテムIDリストを取得
LPITEMIDLISTpidl;
::SHGetSpecialFolderLocation( NULL, CSIDL_DESKTOPDIRECTORY, &pidl );
// イメージリストを作成
HIMAGELIST himagelist;
SHFILEINFO fileinfo;
himagelist = (HIMAGELIST)::SHGetFileInfo( (LPCSTR)pIDList, FILE_ATTRIBUTE_DIRECTORY, &fileinfo, sizeof(SHFILEINFO),
                  SHGFI_PIDL|SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_SMALLICON|SHGFI_SYSICONINDEX );
m_ImageList.Attach( himagelist );
CTreeCtrl &ctrl = GetTreeCtrl();
ctrl.SetImageList( &m_ImageList, TVSIL_NORMAL );

// ツリービューのルートにデスクトップを追加
TVINSERTSTRUCT TvItem;
TvItem.hParent = ctrl.GetRootItem();
TvItem.hInsertAfter = TVI_ROOT;
TvItem.item.mask = TVIF_CHILDREN|TVIF_TEXT|TVIF_IMAGE;
TvItem.item.pszText = pLabel;
TvItem.item.iImage = fileinfo.iIcon;
ctrl.InsertItem(&TvItem);

こんな感じのコードですけど、どこが悪いのでしょうか?
>>302
> 某SPCプレイヤー

アレか...まあいいけど鵜呑みにするのはやめとき。
305名無し@沢村:02/10/04 09:40
皆様方、midiの再生やループや停止の方法はわかったのですが、
ボリュームを上げたり下げたりする方法がわかりません…^^;
またテンポを上げたり下げたりする方法もわかりません。
よくホームページなどでmidiを聞くと、プレイヤーらしきものがホームページの左上についていて、
それを右クリックすると、ボリュームを上げたり下げたり、テンポを上げたり下げたりできるようになっているのですが、
あの機能はどうやって実現するのですか?
現在起動中の他ウィンドウを最前面に持ってこないでアクティブにす
るにはどうすればよいのですか?

その時点で他のウィンドウの下にあればそのままの状態でそのウィン
ドウにフォーカスを移したいのですが。
>306
そんな事ができるアプリを今まで見たことある?
>>306 自分より手前のウィンドウを全部 TOPMOST にした後に...とか(w
309デフォルトの名無しさん:02/10/04 14:08
>>305
::MidiOutShortMsg()
::MidiOutLongMsg()
::SetTimeEvent()
で直接制御すればなんでもできるけど、まぁむずいわな・・・
>>303
> CSIDL_DESKTOPDIRECTORY
シェルのネームスペースのルートなら
CSIDL_DESKTOP
>>307
PowerToysに入ってたXMouse
>>306
SetWindowPosでSWP_NOACTIVATEは付けないで
SWP_NOZORDERを付けるとか
313デフォルトの名無しさん:02/10/04 21:14
今後.NETが流行してAPIの知識が必要なくなったりしないのか?
そこら辺が良く分からんので漏れはわざわざプログラミングWindowsと
C#によるプログラミングWindowsを両方買ってしまったのだが。
今からやるならC#だけとりあえずマスターすればいいんでないの。
OSの機能に直にアクセスしたくなったりしたら、
その都度必要なAPIをInterop使って呼び出せばいい。
> 今後.NETが流行してAPIの知識が必要なくなったりしないのか?

CLR を使ってみれば分かるが、このライブラリはかなり良くできては
いる。その中だけでできることで済む場合は幸せになれる。ちょっと
こみいったことやカスタマイズをしようとするとすぐ限界が見えてくる。
Win アプリを作るなら、API の知識は絶対無駄にはならないと思うよ
316デフォルトの名無しさん:02/10/05 15:21
タスクバーから任意のアイコンを消去(アプリのウィンドウは表示したまま)す
るにはどうしたらよいですか?
317デフォルトの名無しさん:02/10/05 15:56
DLLについて質問です

例えばDLL側に下記のようなクラスがあるとして、
struct A
{
  static smartptr< hoge > a;
};

アプリケーションからこの"a"にインスタンスを代入しました。
するとアプリケーション終了時にこの"a"のデストラクターでアクセス違反が
起きてしまうんですが、このような場合はどうすればいいのでしょうか?


関連するコードを全て書け
319317:02/10/05 16:34
>>318
どういう風に書こうか考えてたら原因がわかりました。

//a.dll
struct A
{
  static smartptr< B > a;
};

struct B
{
  .....
};

//b.dll
struct C :B
{
  static C *createInstance();
};

//app.exe
smartptr< B > ref( C::createInstance() );

てな感じなんで、b.dllはLoadLibraryしてるものなんですが、
デストラクター呼ばれる前に、app終了時FreeLibraryしてるのが原因ですた!
320デフォルトの名無しさん:02/10/06 01:32
まともにプログラムを作るのであれば、APIの知識は無駄に
ならないというよりも、絶対に必要なものだよ。
>>320
そこまで要求されている人ってほとんど居ないと思う
>> そこまで要求されている人ってほとんど居ないと思う

それはレベルの低いプログラマのはなし

「まともにプログラムを作るのであれば」という前提に注目
まともにプログラムを作るという要求自体がほとんどないという
意味だと思われ

趣味ならまともに作るヒマがあるだろうけどねぇ・・・
「まともなプログラムを書くには機械語の知識は絶対必要」
とかいうヨタと同レベルだな
>> 機械語

うふっ、今どき「機械語」なんていう?
しょーもないことでレスのばすな。
必要ならやる。それだけ。
まともっつーのは用はいろんな環境でもバグなしで動くっていうことでしょ。
動かなかったらいくらかっこいい/高機能でも始まらんから。
で、そういうつぶしていくような作業にはどうしたっていろんな知識が必要でしょ。
APIなんてライブラリーを後ろから支えているわけだし。
> まともっつーのは用はいろんな環境でもバグなしで動くっていうことでしょ。

思い込みの押し付けカッコワルイ
329デフォルトの名無しさん:02/10/06 15:27
D&Dされたオブジェクトがファイルか
ディレクトリかを判断するには、どのようにすればいいのでしょうか?宜しくお願いします。
ファイル名を取り出してからGetFileAttribute
331デフォルトの名無しさん:02/10/06 17:13
おい、お前ら!
>参考
>MSDN Online
http://www.microsoft.com/japan/msdn/default.asp
ここにAPIのリファレンスなんてあるんですか?
見つからないのですが。
>>330
このまま無視されて沈んでゆくのかと思ったよ(ワラ
こちらもMSDNで確認しました。
どうもありがとう。
>>331 あるよ
334331:02/10/06 17:17
>>333
嘘ついてんじゃねーぞ、ゴラー!
335本物の331:02/10/06 17:20
>>334
氏ね
336デフォルトの名無しさん:02/10/06 17:26
>>331
http://www.microsoft.com/japan/developer/library/default.asp
の、プラットフォームSDKドキュメント>プラットフォームSDKドキュメント(日本語)

ウィンドウ関連はユーザーインターフェースサービスのウィンドウイングとか

どこに何があるのかサパーリ見当が付かないのもあるので
がんばってほじくりかえせ カス
337本物の331:02/10/06 17:31
>>336
ありがとうございました!
338名無し@沢村:02/10/07 22:03
皆様方、質問があります。
windowsにはボタンがありますよね?
ボタンなんですが、大きいボタンと小さいボタンをつくって、
小さいボタンを大きいボタンの上に重ねてつくり、
小さいボタンは押しても常に大きいボタンの上にある状態にしておくことは可能ですか?
また大きいボタンは小さいボタンの下に隠れている部分は押せずに、
見えている部分だけを押すようにすることはどうすればできますか?
>>338
そのセンスはどうかと思うが、小さいボタンの親を大きいボタンにすればできる。
340デフォルトの名無しさん:02/10/07 23:19
Win32APIで分割ウインドウをつくるのって猫でも分かる〜にあるような方法でしか
出来ないものなのでしょうか。
ほかに何かいい方法があれば教えて欲しいです。
だからスプリタのソース嫁よ、、
342デフォルトの名無しさん:02/10/07 23:30
>>341
ソースってどこにあるんでしょうか。
(開発環境はBC++5.5.1です)
>>340
あんなもんだと思うが、何が気に入らんのだ?
345デフォルトの名無しさん:02/10/07 23:41
>>343
境界の上のほうや、下のほうにマウスで行くと斜めカーソルに変わって、ドラッグすると
一時的に子ウインドウの高さが変更されて汚くなるんです。
あと、スクロールバーが水平・垂直両方出ると、サイズ変更出来てしまう部分が出てしまったり。

そういうのを回避する方法とかってありますでしょうか?
>>344
ありがとうございます。
ちょっと見てみます。
>>345
WM_NCHITTESTを適切に処理したらどうかね?
>>347
ありがとうございます。
それもちょっと調べてみます。
349名無し@沢村:02/10/08 00:28
>>339
>小さいボタンの親を大きいボタンにすればできる

う〜ん、それは私のレベルでは難しい…他に方法はないでしょうか?
それが難しいなら、他に方法はない。
フリーのBorland C++ Compilerをダウンロードしてみたんですが、
早速ウインドウの作り方がわからずDOSのアプリケーションしか作れません。
Borland C++ Compilerに関数の 解説(Cライブラリのマニュアル?)
みたいものはないんでしょうか?
猫でも読んでろ。
353名無し@沢村:02/10/08 00:44
>>350
ボタンをリージョンにして大きいボタンをポリゴンにして小さいボタンを四角にして並べて、
小さいボタンが大きいボタンの上にか乗っかってるように見せかけるという方法なら私のレベルでもできそうです…。
しかしいままでリージョンのボタンはひとつしか作ったことないですが、
リージョンのボタンをたくさんつくって並べることは可能ですか?
またちょんと押せますか?
この方法でよろしいですか?
354デフォルトの名無しさん:02/10/08 00:49
メモ帳などの外部アプリのエディットコントロールで使用されているフォントの
サイズを取得したいのですが、どのようにすればよいのでしょうか?
どなたかご指導ください。
355デフォルトの名無しさん:02/10/08 00:52
Win32APIでHTML表示させるのは自力で解析しないとむりなんでつかね?
>>354
WM_GETFONT -> GetObject
>353
なぜSetParent使わないんだよ。
358354:02/10/08 01:37
>>356
ありがとうございます。
Win標準のエディットコントロールはこれでいけるのですが、
独自に実装しているエディタの場合はどうすればいいでしょうか?
359John ◆Re0z.4Is5E :02/10/08 01:50
今でもAPIいじらなきゃならんのは、かわいそうだな。
アプリケーションが作りたいのに、
アセンブラの環境しかないのと似てる。
>>358
無理。
361354:02/10/08 02:27
>>360
そうなんですか。
どうもありがとうございました。
>>355
無理。ATL使ってもいいならAtlAfxWinInit()して
CreateWindow("AtlAxWin", "Shell.Explorer", ...)
でIEコンポが使えるけど。
おはつにおめにかかります。名無しともうします。
実は(今は)VB6.0使いなのですが、勉強で
floppyのdumpをとりたい&FileSystemを介さずにかきこむrawrite.exe
の二つのプログラムをかきたいのです。

ところが、VB6.0のFileSystemObject、C言語のfopen(),fprint()など、
すべてWindowsのFileSystemObjectをつかってるわけですよね。

floppyのセクタに直接アクセスできるAPIはないでしょうか?
みなさま、かってなお願いですが、よろしく教えていただけないでしょうか?
364デフォルトの名無しさん:02/10/08 22:48
エディットボックスをログの出力に使用しています。
それで、スクロールバーをプログラムで一番下に移動させるために、
エディットボックス内の垂直スクロールバーのハンドルを得たいのですが、うまくいきません。

hChild = GetWindow(hEdit, GW_CHILD);
dwStyle = GetWindowLong(hChild, GWL_STYLE);
while(dwStyle & SBS_VERT == 0){
  hChild = GetWindow(hChild, GW_HWNDNEXT);
  dwStyle = GetWindowLong(hChild, GWL_STYLE);
}
GetScrollRange(hChild, SB_CTL, NULL, &iMaxPos);
SetScrollPos(hChild, SB_CTL, iMaxPos, TRUE);

こんな感じで作りました。
どなかたか教えてください。お願いします
素直にエディットコントロールに
WM_VSCROLL投げて、wParamにLOWORD(SB_BOTTOM)で良いんじゃない。
>363
CreateFile, ReadFile
>>363
DeviceIoControl
>>364
EM_SETSELの方が簡単だと思うが。
369364:02/10/08 23:00
>>365
どうもありがとうございました!

なんか違う方向逝ってたみたいですね・・・
こんなシンプルにできたのかぁ
370364:02/10/08 23:02
>>368
どうも。
それは試しましたが、スクロールされなかったです。
372363:02/10/09 00:15
皆様、情報ありがとうございます。
>366さん、367さん
書き忘れていたのですが、これはWindows2000でもつかえますか?

>371さん
以前、勉強に確認したのですが、
中でつかわれているBIOSをいじる関数が
たしかTurbo-Cのだったので、構成だけ参考にしたのです。
どうもありがとうございます。
374363:02/10/09 00:34
>>373
ばかかおめーら、おれはVBでって言ってるだろうが。
殺伐の予感
>>372
> 書き忘れていたのですが、これはWindows2000でもつかえますか?
使える。Win9xでは使えないけど。
377363:02/10/09 00:58
374さん、かってに私のまねをしないでください。
373さんには非常に感謝しております。
いろんなOSで参考になります。

VBでもAPIはつかえます。
今はVBしかもってないので、VBからAPIをつかうしかないのです。

376さんも情報ありがとうございました。

ちかごろ機械に近いところの勉強の必要性を痛感しておりまして、
いろいろとWebでさがしているのですが、FATの説明は海外の方がくわしかったですね。
私も集めた情報をもとにWebページをたちあげたいです。

この課題がおわったら、Formatとpartitionの設定プログラムを作ろうと
かんがえていますが、そのときも、もちろん自分でもしらべますが、
どうしてもわからないときはおしえてください。
それでは、ありがとうございました。
378名無し@沢村:02/10/09 02:33
>>357
>なぜSetParent使わないんだよ。
小ウインドウと親ウインドウの関係だけでもややこしいのに、
そのまた子ウインドウをつくったら、ややこしすぎてフック関数をどう書けばいいか、
混乱してしまって、私の手に負えないからです…^^;
>>377 >FATの説明は海外の方がくわしかったですね。
これ読んだか?
http://www.vector.co.jp/soft/data/prog/se044198.html
>>372
NT系が >>366 で 9x系が >>367 だな。
>フック関数
って何さ。
382名無し@沢村:02/10/09 07:38
フック船長ですた。
383363:02/10/09 10:12
>>>379
そこも調べたのですが、
あらためてdownloadしてみて、勘違いしてたことがわかりました。
LFN_TUT.DOCではなく、LFN.TUTをよむのですね。

ちなみにわたしが参考にしたのは、
日本のものでは、
ttp://www.geocities.co.jp/SiliconValley/7773/fs/fat.html
ttp://homepage2.nifty.com/railway_pc/pc_saguru_fd.htm

海外のものでは、
ttp://www.systweak.com/fat32/fat12.htm
ttp://averstak.tripod.com/fatdox/fatintro.htm

では、そろそろこのスレの趣旨にもはんするので、
FAT話はこれでおわりにします。
>>383
>趣旨にもはんするので、
そうか?

本家のも見とけ
http://www.microsoft.com/hwdev/hardware/fatgen.asp
385名無し@沢村:02/10/09 13:58
皆様方、ちょっとした発見をしたのでぜひ聞いてください!!
私は先日大きいボタンと小さいボタンをつくり、小さいボタンを大きいボタンの上に置いて、
ボタンを押してもそのままの状態で見える方法をここでお聞きしたんですよ。
そうしたら、小さいボタンを大きいボタンの子ウインドウにする以外方法はないとの答えでした。
しかし皆様方m私はとても簡単な方法を見つけたのですよ。
それは上になるボタンを初めにつくっておき、
下になるボタンをそのあとつくってそこのCreateWindowでWS_CLIPSIBLINGSを指定するだけでいいんですよ!!
そうしたら、どっちのボタンを押してもボタンの上下関係はそのままの状態になるんですよ。
いやあこんな簡単な方法があったなんて…!!
これで面倒な処理は一切なしにピアノの鍵盤がつくれました!!
皆様方、どうもありがとうございました♪
うむ、ちゃんと解決方法まで報告したのは褒めてつかわす。
「解決しますた」しか書かないで消える奴多いからな。
ピアノの鍵盤が作りたかったのか。
用途が一番気になってたので、わかってよかった。
388デフォルトの名無しさん:02/10/09 17:36

accept で取得した socket から
IPアドレスを取得するにはどうすればいいのですか?
389デフォルトの名無しさん:02/10/09 17:41
でも、鍵盤だと押した時に鳴るんじゃないの?
標準のボタンコントロールだと離した時に鳴る事になるのでは?
そこまで求めていないのかな?
>>388
getpeername()
> 標準のボタンコントロールだと離した時に鳴る事になるのでは?
そりゃ実装によるだろ。
>>385
だれかZオーダー教えてやれよ。
393388:02/10/09 18:32
>>390

レス thx です。

こんな感じでやったら OK ですた

sockaddr_in another_addr;
int len = sizeof(another_addr);
getpeername( s, (sockaddr*)&another_addr, &len );
ShowMessage(AnsiString(inet_ntoa(another_addr.sin_addr)) + "|" + AnsiString(ntohs(another_addr.sin_port)));
394デフォルトの名無しさん:02/10/09 19:18
マルチスレッドで質問です

ログをテキストファイルに出力する部分を別スレッド化したいのですが
具体的にどうして良いのか悩んでいます

一応考えついたのは、メインのスレッドでログをバッファへ溜めていって
出力スレッドはそれをクリティカルセッションで受け取って順次書き出すのかなぁという程度なんですが
それだと出力している間はバッファに書き込めなくなっちゃいますよね?

また、ログバッファに数値型を突っ込んだ場合に文字列に変換するような部分も
できれば別スレッド化したいのですが、これに関してはさっぱりアイデアが浮かびません・・・

何か検索ワードかヒントでも良いので教えて下さい
395デフォルトの名無しさん:02/10/09 19:54
SHFileOperationでファイルのコピーをおこなっているのですが、
直後に、転送されたであろうファイルのフルパスをFindFirstFileしても、
その時点ではファイルが見つかりません。Sleep等で待機してみましたが
どうも関数を抜けた後でないとコピーが完了しないみたいなのです。
SHFileOperation処理の完了を待つにはどうしたらよいのでしょうか?

ハンドルは自分のウインドウで、フラグは
FOF_SILENT | FOF_NOCONFIRMMKDIRとしています。
よろしくお願いします。
396395:02/10/09 20:00
書き忘れましたOSはWindows2000です。
今思ったのですが、ライトキャッシュされているのかも。
でも解決策がわからない・・・
>>395-396
さすがにファイルの存在・内容についてはキャッシュされていようと
一貫性は保たれてるはずだぞ。

ところで395の二行目の「直後」って、いったいどの時点なんだ?
4行目で関数を抜けた後とあるが、ということは抜ける前なのか?
398395:02/10/09 20:20
どうもです
int test(〜)
{
 int result = ShFileOperation( 〜;

→私の言った直後はここです
}

CopyFile API でもだめでした・・・
fopenもできない?
>>398
……ありゃ、ほんとだ。
うちの環境でも再現できますた。
ちと驚き。
>>389
>>264-267 >>299-301 あたりだな。結局あれで解決したのか?
402デフォルトの名無しさん:02/10/09 22:41
>>394はスレ違いですか?
マルチスレッド相談室ではWin環境依存な話題はWin32APIスレに書けとあったのですが・・・
>>398
俺のWin98SEでは再現できなかった。
404デフォルトの名無しさん:02/10/10 00:37
この事象は、処理がatomicだから
405???:02/10/10 00:41
この不景気の中、財布がホクホクです♪
先月は21万、ネットで稼がせて頂きました?。
半信半疑始めたサイトでまさか生活できるとは
思ってなかったから実感があんまりないけど
とにかくうれしい!!!
はっきりいってなめてました
初心者の私もできた
なせばなる?。
諦めないこと?。
お陰さまで
来月ハワイへいってきま〜す
http://plaza15.mbn.or.jp/~u_club/
>>395
FindFirstChangeNotificationでどうよ
407名無し@沢村:02/10/10 01:40
>>389
>標準のボタンコントロールだと離した時に鳴る事になるのでは?

一応サブクラス化して押したときに鳴るようにしています。
で離したときにストリームに書き込むと…。
少し胸を張りたい気分です♪
>>394
>ログをテキストファイルに出力する部分を別スレッド化したいのですが
明確な理由が無ければしないほうがよい

>それだと出力している間はバッファに書き込めなくなっちゃいますよね?
クリティカルセクションを使っている場合は、その時点でバッファに
書き込もうとしたスレッドがスリープの状態になるはず、出力している
スレッドがリーブクリティカルセクションした時点でスリープ状態が
解除される。
そもそも、書き込めないようにするためクリティカルセクションを使う

>また、ログバッファに数値型を突っ込んだ場合に文字列に変換する
わるいが何が言いたいのかわからん
409デフォルトの名無しさん:02/10/10 16:29
>>408
>明確な理由
ゲームエンジンのサブクラスなので、ファイルアクセスなどでイチイチ引っかかりたくないのです
そういう理由で
>バッファに書き込もうとしたスレッドがスリープの状態になる
のは困るのですが、うまい回避方法は無いのでしょうか

>>ログバッファに数値型を突っ込んだ場合に文字列に変換する
というのは、現在の実装だと

class ログ管理クラス
{
 std::string ログバッファ;
 template<class T> ログ管理クラス& operator <<(const T& arg)
 {
  std::ostringstream 型の違いを吸収してstd::stringにするための一時クラス
  一時クラス << arg;
  ログバッファ.append(一時クラス.str());
  return (*this);
 }
};

みたいな事やってるんです
で、operator <<()の部分がボトルネックになりそうだから
ここも別スレッド化できたらなぁという意味でございまする
>で、operator <<()の部分がボトルネックになりそうだから
そんなもんなるかよハゲ。
411デフォルトの名無しさん:02/10/10 16:41
>>410
じゃあそっちはどうでもいいので
ファイルの書き込みを別スレッド化する方法を教えて下さい

もしかしてfopenのたんびに_beginthreadするだけですか?
fopenも別スレでやればいいだろ。つーか普通そうする。
413名無し@沢村:02/10/10 20:06
皆様方、私は初めてスクロールバーというものをつくってみたのですよ。
そして本に書いてあるとおりにしたら、動かないのですよ…^^;
本に書いてあるというのは、次のようなことでした。

switch(LOWORD(wParam))
{
case SB_LINERIGHT:
hpos++;SetScrollPos(hScroll,SB_CTL,hpos,TRUE);Debug(hwnd,hpos);
break;
}
つまり、スクロールバーを動かしたとき、hposの値を増やして、それでスクロールバーの位置をセットするというものですが、
何故かスクロールバーは元の位置に戻ってしまうのですが…。
上のプログラムで何か欠けてる部分がありましたら、ご指導の程よろしくお願いいたします。
>>411

OutputDebugString 使っておけば?
>>409
> >バッファに書き込もうとしたスレッドがスリープの状態になる
> のは困るのですが、うまい回避方法は無いのでしょうか

FIFO とか、リングバッファって知ってるか ?
416409=394:02/10/10 21:42
>>415
FIFOバッファは桁溢れしたら溢れた分を一時待避するようなバッファでしたっけ?
リングバッファはバッファの末尾がバッファの先頭に繋がってるバッファですよね

それを実装しろという事ですか?
バッファがクリティカルにロックされててpushできなかったら
どっかに待避しとけと

わかったようなわからないような・・・
>>416
デバグ用のログならこの程度でよいのでは?

書き込み側:
void Log(char* szFormat, ...)
{
char szMessage[MAX_MESSAGE_LEN];
va_list arglist;
va_start( arglist, szFormat );
vsprintf( szMessage, format, arglist );
va_end( arglist );

char* pszMsg = strdup(szMessage);
PostThreadMessage(idThread, MSG_LOG, 0, (LPARAM) pszMsg);
}

受け側スレッド:
FILE* fp=foprn(...);
BOOL bRet;
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0 && bRet != -1)
{
switch(msg.message) {
case WM_LOG:
fprintf(fp, "%s", (char*) msg.lParam);
free((char*) msg.lParam);
break;
case WM_QUIT;
return 0;
}
}
>>416
> FIFOバッファは桁溢れしたら溢れた分を一時待避するようなバッファでしたっけ?

違う。ググルなりしてちゃんと勉強した方がいい。

ちなみに、リングバッファは FIFO を実現する手段の一つ。
>>413
hposをstatic変数にしる。
420394:02/10/10 22:33
>>418
>>バッファに書き込もうとしたスレッドがスリープの状態になる
>のは困るのですが、うまい回避方法は無いのでしょうか

への回答が、つまりFIFOバッファを使えっていう事ですか?

>>417
なるほど、だいたい感じは掴めました
(ofstreamとstringで実装してるのでもうちょっとややこしそうだけど・・・)
421名無し@沢村:02/10/10 23:25
>>419
あなた様、スクロールバーが動かなかった件、めでたく解決いたしました!!
というのもWM_COMMANDでスクロールバーのIDをcase スクロールバーのID:break;としたところ、
突然スクロールバーが動くようになったのであります。
もちろんcase スクロールバーのID:とbreak;の間には何も書いていません。
ただcase スクロールバーのID:とbreak;と書いただけで動くようになったのは実に不思議…?
わけわからん…?
まあしかし動くようになったのでめでたしめでたしであります。

>hposをstatic変数にしる。

それも一案かもしれませんが、またの機会に…。
とにかくあなた様ありがとうございました!!♪
422デフォルトの名無しさん:02/10/10 23:58
Visual Fortran version 6.6でコンパイルしたアプリケーションが起動しません.
”C:\......exe は有効な Win32 アプリケーションではありません.”
と,言われてしまいます.
大きな配列を定義すると,怒られます.
この計算のために2GBのメモリを積んだPCを使ったのですが
どう考えても2GBも使用されてないと思われます.
Win32アプリケーションにはメモリの制限が何かあるのでしょうか?
また,メモリ2GBをフルに一つのアプリケーションで使うにはどうすればいいのでしょうか?
>>422
確か静的には確保できる上限があった記憶。
メモリを動的に確保してみてください。
>>422
積んであるメモリを全部アプリで使う?
簡単だろ。OSの機能を全てアプリに入れてしまえばいい。
そうすれば全てのメモリはお前のものだ。
エクスプローラー等で表示される
自分自身のアイコンを書き換えるのはリソース書き換え以外には
方法無いんでしょうか?
自分自身というのがexeファイルで、
自分のアイコンだけを変えたいということ?

シェル拡張用DLL(アイコンハンドラ)を作ればできるかもしれないが...
普通はできないと思った方がいいな。
427デフォルトの名無しさん:02/10/11 01:24
簡易的なアンインストーラを作ろうと、
GetModuleFileNameで自分自身のフルパスを取得し、
DeleteFileをやってみましたが、アクセスを拒否されます。
自分自身を削除する実行ファイルを作るには、
どうしたらいいでしょうか?
428デフォルトの名無しさん:02/10/11 01:26
>>427
ムリでしょ。
wshで消す
430デフォルトの名無しさん:02/10/11 01:35
427ではないですが、興味アリなので。

一般的なアンインストーラはどうやって
自分自身を消しているのでしょうか?
431デフォルトの名無しさん:02/10/11 01:38
>>430
削除ツール専用の自分削除プロセスを立ち上げるんじゃないの?
それ自身はワケワカラントコロにインストールしておいて。
一般的には
自分をTEMPフォルダ等にコピーして起動
元の自分自身を削除
WININIT.INI(9x系)かMoveFileEx(NT系)でTEMPの自分を消す
かな。

他にはバッチファイルを吐き出して実行とか
アンインストールはinfファイルで起動するとか
ワンポイント・レッスン
最新Windowsプログラミングテクニック

という本にそんな話題が載ってたなぁ
>>432
XPで試したところ、
MoveFileExで逝けました。ありがとうございます。
435427:02/10/11 01:56
434=427です
436デフォルトの名無しさん:02/10/11 02:35
他のマシン(Win2000等)にメッセージボックスを
表示させるAPIってなんでしたっけ。
リモートデバッグとして使うように紹介されてた記憶があるのですが。
記憶違いですかね。
>>436
APIは知らんけど、
NT系にはMessengerサービスが走ってるから、
net send でメッセージを送れる。
>>436
NetMessageBufferSendのこと?
439436:02/10/11 03:02
む、
かなり早いレスにびっくりです。

まだ、はっきりとわからないけど
NetMessageBufferSend
だと思います。
net send も遊んでみました。
どうも
ありがとうございました。
440425:02/10/11 17:58
む〜、DelphiのTIconとかどーなってるんだ(;´Д`)
>>425
> む〜、DelphiのTIconとかどーなってるんだ(;´Д`)

Delphi でも TApplication のアイコンはリソース(*.res) となっていて
exe に取り込まれてる。>>425 の問題は、リソース書き換えればいいのでは?
もちろん、リソースには複数のアイコンをいれられるよ。エクスプローラに
表示されるのは最初のやつなのかな。
442デフォルトの名無しさん:02/10/12 01:04
すいません。APIの質問というかWinアプリ全般についての相談なんですが・・・
皆さんWinアプリを作成する場合にどのように作成していますか?

コンポーネント化とやらを行って拡張性の高いアプリケーションを
作成したくなったのですが、いまいち道が見えません。

現状の自分のレベルとしては
1:WinMainから始まるような通常のアプリケーションは作成できる。
2:C++はそれなりにわかる。
3:超単純な独自インターフェイスのCOMコンポーネントは一応作成できる。
4:ActiveXはよくわかっていない。
5:ATLはよくわかっていない。
6:.NETとやらはこれから勉強する。
VS.NETはほとんど触ってない、VC++6.0とUI違いすぎでいまいちわからんです(^^;)
443442:02/10/12 01:04
つづき

とりあえず考えているのはMDIアプリ風で外側のフレームだけ通常のWinMainのexeにして
実装等はすべてコンポーネント化したいのです。
イメージ的にはMicrosoftWebBrowser(IWebBrowserとか持ってこれるやつ)
みたいにある程度コンポーネント単体でほぼ実装が完結されているような
ものを作成していきたいのです。

そこでこれからのどの道に進んでいけばよいのかわからなくなっています。
今考えているのは
1:ActiveXを自力で作成する勉強をはじめる。
既存のインターフェイス(IOleXXですかね?)から派生してC++でゴリゴリ書く。
2:ATLを勉強してActiveXを作成する。
3:.NETを勉強する。
4:その他?
444442:02/10/12 01:05
つづき

上記4つの方法についていろいろ悩んでいます。
疑問1:ActiveXはもう時代遅れなのだろうか?
これからは.NETというものが主流?
疑問2:ActiveXを自力で作成するのは無意味?
勉強にはいいかもしれないけど、普通はATLで作成するもの?
疑問3:ATLはもう時代遅れなのだろうか?(.NET?)
疑問4:.NETとやらはちゃんと主流になるのか?
(なんかいまいち普及してない感じがしてますが)
疑問5:それいぜんにActiveX、ATL、.NETのどれも普及していない?

どのような道を進むべきか皆さんのご意見をご教授願います。





>>442-444

以下に、あおりでも荒らしでもなく、まじめに答えるつもりです。
是非、Delphi をお試しください。簡単な WebBrowser なら
人にもよりますが、入門して1週間で作れるようになります。
また、将来、来年 .NET にも対応する予定です。C#.NET への
移行も言語やライブラリの構造が似ているため簡単です。

Delphi と C++ と C# ユーザからのアドバイスです。
ATLなら1日で作れるけどね
445です。

追加しますと、Delphi では API レベルの細かなカスタマイズも簡単ですし、
たとえば MDI にもプロパティーをひとつ変更することです容易に対応できます
し、タブコントロールなどのコンポーネントも豊富にありますし、Delphi 自体で
コンポネントを作成して拡張できますし、ActiveX の取り込みもできます。
コンポーネント化といっても程度によりけりですよね。

部品を他のプログラムからも利用したい
→VB、ATL、MFC、etc…汎用を目指す
 →ActiveX
→Borland開発環境に限定してOK
 →VCLコンポーネント
→C#、VB.NET、etc…マネージド言語から使えればいい
 →.NETコンポーネント
→静的リンクできればそれでいい
 →単にC++のクラスとして作る

えとせとら
質問させていただきます。
検索はかけましたが相応しくないかもしれません。その際はご容赦ください。

最近フルカラー640*480で、D3DもDirectDrawも使わないのに高速半透明をするゲームが増えてきました
半透明というとDIBで1ドットずつ計算くらいしか思いつかないのですが、
こんな方法ではろくなスピードがでません(実際作りました)

あのゲームたちはどのような方法を使っているのでしょうか
VRAMを直接いじる方法は存在しなかったと思いますが…。
DiBSectionは試した?
>>450
ええ、もちろんです
CreateDIBSectionで関連づけて

ついでに透明度を256段階と決めて、1バイトでの混ぜ合わせテーブルをつくりました
120と64を、透明度128でまぜあわせたら92 などのテーブルです
3バイトの混ぜ合わせテーブルはつくるの不可能ですから…。

それを使ってforループでまわして書き換え
でもこれではそんなにスピードでないんですよ…
>>449

GDI+ ライブラリをつかってアルファブレンドしてるとか
453442:02/10/12 02:12
レスありがとうございます。
>>445
>>447
Delphiに関してはまったく知識がないのですが、
どちらかというとコンポーネントを
「使う」のではなく「作る(再利用可能&汎用性あり)」方が主な目的です。
Delphiで作成したコンポーネントをVCに取り込むことは可能でしょうか?

>>448
>→VB、ATL、MFC、etc…汎用を目指す
目的としては汎用的なコンポーネントを目指したいなと考えています。
ActiveXが有力候補でしょうか?
ActiveXはやはりATLで作成するのが普通なのでしょうか?

>Borland開発環境に限定してOK
出来ればVC等MS系開発環境でも使用できる方がいいと考えています。

>→C#、VB.NET、etc…マネージド言語から使えればいい
現状マネージド言語(すいませんまだあまり理解していません)を使用している人が
自分の周りにいないので、普及度とかがよくわからないのですが・・・・
今後はその方向にむかっていくのでしょうか・・・

>→静的リンクできればそれでいい
一応動的なものを考えています。

>>Delphiで作成したコンポーネントをVCに取り込むことは可能でしょうか?

それはできません。ActiveX にすると良いのかも知れませんが面倒です。
Delphi のなかで使うのならラクチンですけど。

>> 出来ればVC等MS系開発環境でも使用できる方がいいと考えています。

こういう場合は、Delphi をおすすめいたしません。

しかし、言語や開発環境は道具です。良いものをなるべく容易に迅速に
つくれるのなら、道具にこだわるべきではないとも思うんですが。
>>453
> 今後はその方向にむかっていくのでしょうか・・・

これはいまのところ誰にもわからないのではないでしょうか。
もし、否定/肯定いずれでも断言する方がいたとしても
現状では信じない方が無難です。
>Delphiで作成したコンポーネントをVCに取り込むことは可能でしょうか?
一応DelphiでもActiveXは作れるので、その機能を用いて
ラッパーを一枚噛ませればできますけどね。
でも、素直にATLの方がいいかも(って僕はATL知りませんけれど)

作ったコンポーネントを、どういう風に活用するつもりですか?
それがわかれば絞れるかも。
>>451
単にお前がヘボなだけ
458名無し@沢村:02/10/12 06:50
皆様方、私はいまmidiシーケンサーに取り組んでいるところですが、
初歩的なところでつまずいているのでぜひ教えてください♪
それはmidiファイルに保存するとき、音色指定で、
32 の Guitar harmonics まではプレイヤーで聞いてみると音が出るのですが、
33 の Acoustic Bass 以降の音は出ないのですよ。
バイナリエディタで開いてみると、33 の Acoustic Bass 以降の音を指定した場合、
どうもファイルがこわれているようなのですよ…?
皆様方、これは一体どういうことなのでしょうか?
32 の Guitar harmonics までと33 の Acoustic Bass 以降とでは音色の指定の仕方が違うのでしょうか?
ちなみにMidiOutShortMessageでは同じように指定して同じように音が出るのですが…?
ぜひ教えてください!!

>>449
ゲームは画像ファイルにアルファデータくっついてることが多いので
>>449が言ってるゲームもアルファ合成じゃないかと思います。

んで、以前アルファデータについて検索かけたとき
intelのパフォーマンスライブラリ(Image Processing Library)が引っかかりました。
http://www.intel.co.jp/jp/developer/software/products/perflib/ipl/index.htm
intelがMMX以降のPentium系CPUの実力を発揮させるために作ったライブラリのようです。
これ使ってみてはどうでしょう?

現在、本家英語サイトはIPPβ3.0に吸収されたようでIPLのページがありませんでした。
>>457
へぼいのでこの程度の方法しか思いつかないのです。
よろしかったらご教授をお願いいたします。
ループ部分をアセンブラで書くことによって、1.5倍程度の処理速度UPはできましたが、
それでもゲームでリアルタイムに使うのはきつかったです。

>>459
αデータつきの画像というと、DDSなどのD3D用画像が思いつきます。
でもとりあえずWin32APIにはαブレンディング合成の関数は存在しませんよね。

おもしろいライブラリを教えていただきありがとうございます。
Intel系PCのみの動作となっていますが、研究する価値はありそうですね。
近くまとまった休みがとれたら使用して報告させていただきます。

<->
自前で高速αブレンディング合成を作成された方、アルゴリズムをご存知の方、解説サイトを
ご存知の方がいらっしゃいましたらご一報くださると幸いです。
>>452さんのおかげで気付かせていただきました

大変申し訳ありません。
GDIにAlphaBlend()という関数が存在するのですね。
Win98以降のみサポートだそうです。

抜き色転送もめんどうなBitBltくらいしかないので、そんなものはあるはずないと
決め付けておりました。

近く実験を行い報告させていただくことでおわびとさせていただこうと思います
スレ汚し失礼いたしました
使ったことないから知らんけどAlphaBlend()つっても
結局内部ではCPUでシコシコやってんじゃないの?

俺もDIBで32ビット処理とか一応やってるけどMMX使うくらいしか思いつかないな。
アセンブラで組んでるとこにMMXまだ使ってないのなら適用してみれ。

実験するんなら事後報告よろしく>>461
マルチスレッドで
メインスレッドからPostThreadMessageして
ワーカースレッドでGetMessageする場合
ワーカースレッドをコールバック関数にしたりする必要ありますか?

あとワーカースレッドにメッセージキューを実装しなければならない
というようなことがMSDNに書かれていたのですが
具体的にどういう事なんでしょうか?
>VCLとか言ってる話題
Delphi氏ランなら
BorlandC++Builder使ったら?
言語がC++だから
簡単に入れると思うよ。

>DIBで重い言ってる
バックバッファとしてDIB作って
普通にCでソフトウエアレンダリングして
それをBitBltしてるだけでも、結構な速度が出ますよ。
そりゃSIMD使うともっと速くなるけど。
普通に640x480 8bit で、
画面全体を塗りつぶすだけ
for(i=0;i<(640*480);i++)p[i]=255; // わざと遅く書いた。

余裕で60fps切るようだったら、DIB生成かBitBltあたりに何か問題があると思う。

>>464
8bitならかなり速いです。
あらかじめ合成用のテーブル持てるし。
問題は16や32なわけでして

早く家に帰ってためしたいです。はい…
>>462
> 使ったことないから知らんけどAlphaBlend()つっても
> 結局内部ではCPUでシコシコやってんじゃないの?

アクセラレーションが有効ならドライバが直に実行するんでない?
467名無し@沢村:02/10/12 19:51
皆様方、私はいまmidiシーケンサーに取り組んでいるところですが、
初歩的なところでつまずいているのでぜひ教えてください♪
それはmidiファイルに保存するとき、音色指定で、
32 の Guitar harmonics まではプレイヤーで聞いてみると音が出るのですが、
33 の Acoustic Bass 以降の音は出ないのですよ。
バイナリエディタで開いてみると、33 の Acoustic Bass 以降の音を指定した場合、
どうもファイルがこわれているようなのですよ…?
皆様方、これは一体どういうことなのでしょうか?
32 の Guitar harmonics までと33 の Acoustic Bass 以降とでは音色の指定の仕方が違うのでしょうか?
ちなみにMidiOutShortMessageでは同じように指定して同じように音が出るのですが…?
ぜひ教えてください!!
>>467
音源はなに?
つーか板違い
470名無し@沢村:02/10/12 20:05
>>469
板違い ではありませんぞ。
素で音色をならすときは、WinAPIのMidiOutShortMessageを使ってますし、
ファイルに書き込むときは、同じくWinAPIのWrightFileを使ってますから…。
>>468
それが私は音源にうとく、音源が何かはわからないのですよ…。
ただファイルが壊れることと、音源とはあまり関係なさそうに思うのですが…。
MIDIに詳しくないのにMIDIシーケンサ作るの?
472デフォルトの名無しさん:02/10/12 20:12
微妙にスレ違いかもしれませんがご容赦を。
CDの自動再生機能でhtmlを表示したいのですが、
「標準のブラウザ」で開くにはどうすればいいのでしょうか?
open=IEXPLORE.EXE ***
ではネスケ等に対応できません。

ShellExecute()させるだけの実行ファイルを作るといのが考えられますが。
ヨロシコ
>>466
試してみたいけど過去スレに実質WinMe/2000以降限定とか書いてあるから
俺の環境じゃ試せねー。
まあ実際問題としてOS限定するなら使いづらいAPIだな。少なくとも俺は使いたくない。
474名無し@沢村:02/10/12 20:12
>>471
そう、わかった部分だけでとりあえずつくって、新しいことがわかるたびに機能をつけたす。
>>473
俺は必要になったら使うだろうなあ。
家のPC、2000とXPだし。
476デフォルトの名無しさん:02/10/12 20:27
>>472
open=rundll32.exe url.dll,FileProtocolHandler index.html
477472:02/10/12 20:44
>>476
即レスありがとうございます。
478名無し@沢村:02/10/13 02:07
皆様方、私はいまmidiシーケンサーに取り組んでいるところですが、
初歩的なところでつまずいているのでぜひ教えてください♪
それはmidiファイルに保存するとき、音色指定で、
32 の Guitar harmonics まではプレイヤーで聞いてみると音が出るのですが、
33 の Acoustic Bass 以降の音は出ないのですよ。
バイナリエディタで開いてみると、33 の Acoustic Bass 以降の音を指定した場合、
どうもファイルがこわれているようなのですよ…?
皆様方、これは一体どういうことなのでしょうか?
32 の Guitar harmonics までと33 の Acoustic Bass 以降とでは音色の指定の仕方が違うのでしょうか?
ちなみにMidiOutShortMessageでは同じように指定して同じように音が出るのですが…?
ぜひ教えてください!!
>>478
> 皆様方、これは一体どういうことなのでしょうか?

ファイルが壊れているのなら、MIDIうんぬんではなく
ファイル(またはメモリ)操作にバグがあるということでしょ。
MIDIの知識を身につけるまで書き込むな馬鹿
>>465
素直にやねうらお氏のWebページか書籍を読むべし。
>>478
いいかげんにコピペやめれ
ディスクドライブのデバイス名を取得する方法はありませんか?
HDD,CD-ROM、リムーバブルなどです。
ボリューム名の取得ならわかるのですが。。。
デバイスタイプしか分からないんじゃない?
485デフォルトの名無しさん:02/10/13 15:34
プログラム上からモニタの自動電源オフ機能を無効にするにはどうすれば
いいのでしょうか?
長時間何も入力がなくても画像を提示し続けるプログラムを作りたいのですが。

SystemParametersInfo() の SPI_SETPOWEROFFACTIVE を試してみたら
正常終了したという返事が返ってくるにも拘わらず電源は切れてしまいます。
これはうちのマシンだけの現象なのでしょうか?

どなたか教えてください。環境はWindows98および2000です。
486デフォルトの名無しさん:02/10/13 16:19
SetThreadExecutionStateでどうよ
>>483
Win98ならレジストリのHKEY_LOCAL_MACHINE\Enum辺りに記録してある。
あとSCSIならInquiryコマンド使うとか。
>>483
エクスプローラで表示されてるものと同じものが得たいならSHGetFileInfo()
Microsoft WindowsのインクルードヘッダはC++で使いにくくて仕方がありません。
例えば、winuser.hの以下の部分。

WINUSERAPI HWND WINAPI CreateWindowExA(…);
WINUSERAPI HWND WINAPI CreateWindowExW(…);
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE

なぜ、#defineでやってしまうのでしょうか?こうすると

MyClass::CreateWindowEx(…);

などがまともにコンパイルされないではありませんか!
これをせめて

WINUSERAPI HWND WINAPI CreateWindowEx(…)
{
#ifdef UNICODE
 return CreateWindowExW(…);
#else
 return CreateWindowExA(…);
#endif // !UNICODE
}

等とやってくれればまだ使い物になると思うのですが、どうでしょう?
このようなヘッダがどこかに存在するということはないでしょうか?
>489
とりあえず引数も正確に書いてみろや。
>>490
ハア?
名前がぶつかる悲劇か・・・
>>491
> ハア?

とか言ってる暇合ったら、>>490 の言うように CreateWindowExW() と CreateWindowExA() の引数の型をちゃんと書いてみなよ。
あんたの書いてる CreateWindowEx() の引数をどうすればいいか悩むと思うから。
>>493
ハア?

WINUSERAPI HWND WINAPI CreateWindowEx(
#ifdef UNICODE
 …
#else
 …
#endif
)
{
 …
}
>>493
ハア?

WINUSERAPI HWND WINAPI CreateWindowEx(
  DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName,
  DWORD dwStyle, int X, int Y, int nWidth, int nHeight,
  HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam)
{
 …
}
>>494-495
lccやmingwのヘッダはそうなってるけど
それだと#define UNICODEして明示的にANSI版を呼び出したいとき
(あるいはその逆)ではまる罠
> それだと#define UNICODEして明示的にANSI版を呼び出したいとき
> (あるいはその逆)ではまる罠

CreateWindowExWかCreateWindowExAを呼べばいいだけ。
>>494
ププッ、やっとわかったか。
で、あんたの方法だとラップ関数を経由するから、それが嫌だったんだろ。
まあ実際のところは、関数定義をヘッダに入れるなんて嫌だな。
実体はLibファイルにでも入れて、それを切り換える方がいいかも。
>>498
> ププッ、やっとわかったか。

( ´,_ゝ`) プッ

自分の勘違いは素直に認めた方がいいよ。
>>500
> 自分の勘違いは素直に認めた方がいいよ。

それ >>494 に言ってんの ?

>>489 で引数書かなかったのは、不問にしても、>>490 に対して「ハァ?」って返した時点で、勝負決まったと思うけどね。

慌てて、>>494 書いたかと思ったら、逆切れですか ?
502494:02/10/13 23:25
>>501
省略した引数の部分を書いてみろと言われたので
書きましたが、それがどうかしました?

で、書いたはいいが、その後はどうなったんでしょう。
是非ともアドバイスを承りたいんですが。
503489 ◆CPP8mJMMbA :02/10/13 23:27
皆さん、早速のレスありがとうございます。(2回目のカキコです)

>>492
そうなんですよ。せめて#defineじゃなければ名前空間を分けて衝突は避けられるんですけど。

>>494-495
私も最初は全てそのように書き換えようと考えました。それこそ全てのヘッダまで。
定数の#defineも含めて。ただ、そこまでの労力が…
かと言ってその場で必要なものだけ宣言しなおすのも癪でして(^^;

>>496さんが仰っている状況に関しては、私も>>497さんのような解決方法でよいと思います。
lccやmingwからヘッダだけ抜き出して他の環境で、ってのはアリなんでしょうか?

>>499
確かにヘッダに定義を入れるのは気持ち悪いところですが…
>>502
> 省略した引数の部分を書いてみろと言われたので
> 書きましたが、それがどうかしました?
で、>>491 はどうなったん ? 都合の悪いところは、無視ですか ?

> で、書いたはいいが、その後はどうなったんでしょう。
> 是非ともアドバイスを承りたいんですが。

>>498 で、デメリット書いてますが必死すぎて見えてないのね。
おまえらがんばりすぎ
>>505
反論できなくなった時の、逃げ口上...
必死だな
>>507
ププッ、それしか書けないんならもうやめたら ? ちょっとカッコ悪いよ。

それとも、>>504 に対してなんか言うことある ?
509494:02/10/13 23:49
>>504
491って何の話ですか? 私は494ですが491ではありません。

> >>498 で、デメリット書いてますが必死すぎて見えてないのね

↓これのことですかね。
> で、あんたの方法だとラップ関数を経由するから、それが嫌だったんだろ。

必死以前に、これは
省略した引数をすべて書いてみることと
何のつながりがあるんでしょう?

引数を書けと言った意味がまずわからないのですが。

それと、「ラップ関数を経由するから嫌」なんて
質問者さんはそんな事書いてませんよね。
勝手に妄想されたのでしょうか?

納得のいくアドバイスをお願いします。
>>508
え?
508は自分に都合の悪い発言は全部494の仕業だと思ってるようだな
512494:02/10/14 00:07
>>504
あれ? 意味が伝わりにくかったでしょうか。
まずは「引数を省略せずに書いてみる」というアドバイスに
どういう狙いがあったのかを教えてください。お願いします。

ちなみに >>493では
> あんたの書いてる CreateWindowEx() の引数をどうすればいいか悩むと思うから。
とありますが、どの辺で悩んでいいのかわかりませんでした。
こんばんは。最近お世話になった半透明に挑む者です。
Pen3 850MHz Win2kによる実験ができましたので、報告させていただきます。
世の中に計測ページは沢山ありますけどね(^^;

・24bitBMP
・1〜3はCreateDIBSectionで領域を確保。全て640*480
・4はmallocで領域を確保
・5はCreateCompatibleBitmapで領域確保

<1>
BitBltで背景を描画
テーブルを参照して半透明画像を重ねあわせ
透明色指定に基づき、1ドットずつ色を調べて指定されたものなら転送しない
(今回は指定しておいたものの、画像内にその色は一度もでてきません)

<2>
1の透明色指定できないバージョン(if文がない分だけ速い)

<3>
BitBltで背景を描画
画像重ね合わせのところをアセンブラで
テーブル参照ではなく、素直に計算する

<4>
memcpyで背景転送
画像重ね合わせのところをアセンブラで
テーブル参照ではなく、素直に計算する

<5>
BitBltで背景を描画
画像重ね合わせのところをAlphaBlendで

<1>21.085ms
<2>20.187ms
<3>13.417ms
<4>13.691ms
<5>速すぎ

何度やっても4のほうが3より遅い。
純粋にメモリー書きかえしかしていない4の方が早そうなものなんですが…。
>>481さんのアドバイスのもと、やねうらお氏のページを覗いてみました。
かなり参考になりますね。

でもちょっと気になったことがひとつ。
やねうらお氏がさらりと

>16bpp(RGB555,565)の半透明(α3bit)でWORDテーブル持ってます。
>だもんで、半透明もバリバリ速いです。(16bppのときだけ^^;)

とおっしゃっているのですが、意図するところが読めないのです。
馬鹿な私は即座に
((1 + 65536) * 65536 / 2)通りのテーブルなんて持てるわけねぇ(;´Д`)
と思ってしまったのですが、やねうらお氏の言うテーブルとはどんなものなのでしょう。
目を通しても「テーブルを持っています」としか書かれていなかったので…。
思いつくものがあったら、教えていただけると嬉しいです。
>>509
> 491って何の話ですか? 私は494ですが491ではありません。

あっそ、まあどうとでも言えるから。違うって言うなら、一応そう思っとくよ。

> 引数を書けと言った意味がまずわからないのですが。

>>489 は、少なくとも CreateWindowExA() と CreateWindowExW() の引数の違いは考慮してないから、それを考慮しなよ。って言う意味だよ。

> それと、「ラップ関数を経由するから嫌」なんて
> 質問者さんはそんな事書いてませんよね。

だって気付いていさなそうだからね。

> 勝手に妄想されたのでしょうか?

妄想 ? 具体的なデメリットがわかってないの ?
>>497
いやだからLPTSTRとかがLPWSTRとかに展開されちゃっててはまるの
説明めんどくさいからどうでもいいや
518494:02/10/14 00:44
>>516
> >>489 は、少なくとも CreateWindowExA() と CreateWindowExW()
の引数の違いは考慮
> してないから、それを考慮しなよ。って言う意味だよ。

考慮していないのでなく、重要でないから
省略しただけとかもしれませんよね。

まあ仮に考慮してなかったとしましょう。
アドバイスの通りそれを考慮して書いてみました。

で、結局どんな進展があったのでしょうか?
ラップ関数を経由する話とどうつながっていくのでしょう?

> 妄想 ? 具体的なデメリットがわかってないの ?

妄想と書いたのはラップ関数のデメリットの話ではなく、
そのような意図の質問ではないということです。

同じことを書きますが、
> で、あんたの方法だとラップ関数を経由するから、それが嫌だったんだろ。

質問者は名前の衝突等を気にしているのであって
「ラップ関数を経由するから、それが嫌」なんてことは
書いていませんね。妄想でしょうか?
>>516
> だって気付いていさなそうだからね。

お前、言ってることがハチャメチャだぞ
>>518
> 考慮していないのでなく、重要でないから
> 省略しただけとかもしれませんよね。

それがダメだって言ってるの。まだわからない ?

> で、結局どんな進展があったのでしょうか?
> ラップ関数を経由する話とどうつながっていくのでしょう?

一つヒントをあげよう。
引数が違うと言うことは、別の関数が必要と言うことだよ。

> 質問者は名前の衝突等を気にしているのであって
> 「ラップ関数を経由するから、それが嫌」なんてことは
> 書いていませんね。妄想でしょうか?

あんた、ヴァカじゃないの ?
衝突を気にするからと言って、>>489 みたいなこと (=ラップ関数を作る) やると、余計面倒だ (=デメリットがある) 。って言ってんだよ。
>>489 が書いてないのは、気付いてないからだと思うよ。

で、デメリットはわかったの ? それとも、>>494 みたいに書けば全て解決と思ってるの ?
この見事な殺伐っぷり、たまらんねぇ。
522489 ◆CPP8mJMMbA :02/10/14 01:18
>>517
あっ、確かに…もっと手前の方で#ifdefとtypedefを山ほどかまして何とかなりませんかねぇ…

他にもラップ関数を使った場合には、

・ヘッダ内に関数定義が入る
・関数呼び出しオーバーヘッドがかかる(インラインじゃだめかなぁ)
・引数の違う場合、違いの吸収が面倒くさい

って感じになるんでしょうか。(他にも思いついたら列挙お願いします)
このくらいの範囲ではデメリットを考えましたが、後はそれと名前の衝突を
天秤にかけるしかないですかね…
523494:02/10/14 01:35
>>520
> 一つヒントをあげよう。
> 引数が違うと言うことは、別の関数が必要と言うことだよ。

実体が2つ必要になるが同じ関数名では実体を2つは
作れないということでしょうか?
が、それだと引数を書かせることとは関係がないので
外れですかね?

ちょっとわからないのでヒントでなく具体的に
教えていただけないでしょうか。

> で、デメリットはわかったの ?
> それとも、>>494 みたいに書けば全て解決と思ってるの ?

デメリットは承知しているつもりです。
が、何度も言ってるように、その話をしているわけではありません。

> >>489 が書いてないのは、気付いてないからだと思うよ。

そうですか。ということは、上で書かれた
> で、あんたの方法だとラップ関数を経由するから、それが嫌だったんだろ。

というのは妄想だったということでよろしいですね。
524493:02/10/14 01:40
>>522
> 他にもラップ関数を使った場合には、

と言うか、CreateWindowExA() と CreateWindowExW() の引数が違うと言うことは、ラップ関数の引数も必然的に変える必要があると言うこと。
つまり、ラップ関数も二種類持つしかない。で、

> ・ヘッダ内に関数定義が入る

と言うのが一番問題だと思う。
CreateWindowEx() をグローバルにすると当然複数ファイルにインクルードされたら二重定義になるし、static にすると、実体を複数個持つこととなる。
CreateWindowEx() だけならまだいいかもしれないけど、他にも色々あるしね。
まあ、メモリーも安いからそれでもいいやって言う人もいるかもしれないけど、あまり誉められた設計じゃないよね。

ちなみに、もし CreateWindowExA() と CreateWindowExW() の引数が同一なら、その関数はライブラリに入れて、実行時に CreateWindowExA() か CreateWindowExW() に振り分けることもできる。
だから、引数が同一かどうかはかなり重要。
525493:02/10/14 01:45
>>523
> 実体が2つ必要になるが同じ関数名では実体を2つは
> 作れないということでしょうか?
> が、それだと引数を書かせることとは関係がないので
> 外れですかね?

引数が一緒だったら、ラップ関数の実体は一つにする (=ライブラリに入れておく) ことができるよ。
そんなこともわからないの ?
526489 ◆CPP8mJMMbA :02/10/14 01:53
いっそのことMSに
「C++向けに#defineを極限まで減らしたヘッダ激しくキボンヌ( ゚ρ゚)」
とでも要望出してみるかなぁ…
無視されるだろうなぁ…MSだし…
>>526
自分で書くという発想は無いのですか ?
528494:02/10/14 02:08
>>525
> 引数が一緒だったら、ラップ関数の実体は一つにする (=ライブラリに入れておく) ことができるよ。

すみませんが、意味がよくわかりません。
名前も引数も同じ関数の実体を1つにできるんでしょうか?

(ちなみに、私が書いた実体というのはライブラリ単位の
 話ではありません)
529リバーコントロール?:02/10/14 02:33
レバーコントロール"ReBarWindow32" の質問です。
ツールバー"ToolbarWindow32"(hwnd_tool)、ボタン"BUTTON"(hwnd_ok)、それぞれの為の帯を2本用意しました。

ボタンは帯のサイズで自動的にサイズ変更されます。
(帯サイズに合わせられる用にコードしておいたからです)
これはこのままでイイのですが(変えたくなったら帯サイズを変えるつもりです)、
ツールバーのサイズは自動的にサイズ変更されることはありません。
ということで、帯をツールバーのサイズにあわせようと思います。

で、試したソースの一部です

REBARBANDINFO rebarbandinfo = { 0 };

memset( &rebarbandinfo, 0x00, sizeof( REBARBANDINFO ) );
rebarbandinfo.cbSize = sizeof( REBARBANDINFO );
rebarbandinfo.fMask = RBBIM_STYLE | RBBIM_CHILD;
rebarbandinfo.fStyle = RBBS_BREAK | RBBS_GRIPPERALWAYS;
rebarbandinfo.hwndChild = hwnd_tool;
RebarBandCreateIndirect( -1, &rebarbandinfo );
// ↑RB_INSERTBAND を SendMessage しているだけの自作関数です

memset( &rebarbandinfo, 0x00, sizeof( REBARBANDINFO ) );
rebarbandinfo.cbSize = sizeof( REBARBANDINFO );
rebarbandinfo.fMask = RBBIM_STYLE | RBBIM_CHILD;
rebarbandinfo.fStyle = RBBS_BREAK | RBBS_GRIPPERALWAYS;
rebarbandinfo.hwndChild = hwnd_ok;
RebarBandCreateIndirect( -1, &rebarbandinfo );
// ↑RB_INSERTBAND を SendMessage しているだけの自作関数です
530リバーコントロール?:02/10/14 02:33

これではレバー帯が2本ともまったく表示されません。

どちらか片方の帯に マスク RBBIM_CHILDSIZE と rebarbandinfo.cyMinChild = xx を足すと2本とも表示されました。
しかし、ツールバー帯のサイズが合わなくて困ってます。

同様に両方に足した場合、帯のサイズはどちらも最初に指定した帯の方のサイズになってしまいます。
こっちは更に問題で、ボタンが帯のサイズと合ってくれません。


そこで質問です。
@帯を2本用意したときに、サイズをそれぞれ別管理できますか?
Aツールバーのサイズに合わせて帯サイズを変更する方法はありますか?
Bツールバーボタンのサイズを得る方法はありますか?

>>528
>>524 は、見てくれてる ?

> 名前も引数も同じ関数の実体を1つにできるんでしょうか?

名前も引数も同じなら、実体は一つでいいでしょ ?
もちろん機能が違うから、内部で実行時に振り分ける必要があるけどね。

でも、実体が一つでいいということはライブラリに入れることができるから、>>524 に書いた「ヘッダ内に関数定義が入る弊害」を避けることができる。
また、lcc とかは、引数の型の定義変えることでヘッダファイル上は同一に見せてるけど、これも実体は一つにはできない。
更に、>>517 の問題もあるしね。

とにかく、>>526 もそうだけど、一度実装してみればいろいろわかっていいと思うよ。
マイクロソフトの技術者だってヴァカじゃないんだからさ。
532489 ◆CPP8mJMMbA :02/10/14 12:07
>>527>>531
一度自力で何とかしてみます。
座標x、yの色の値を取得するにはどうしたらいんでしょうか?
GetPixel
指定された座標のピクセルの RGB(赤、緑、青)値を取得します。

COLORREF GetPixel(
HDC hdc, // デバイスコンテキストのハンドル
int nXPos, // ピクセルの x 座標
int nYPos // ピクセルの y 座標
);
535533:02/10/14 18:24
できました。ありがとうございました。
536デフォルトの名無しさん:02/10/14 19:39
プロパティシートの特定のページのみ使用不可にするにはどうすればいいんでしょうか?
537デフォルトの名無しさん:02/10/14 22:50
_beginthreadexで起動したスレッドって
スレッドが実行している関数内部で一切メッセージにタッチしてなくても
WM_QUITが来ると勝手に閉じちゃったりするんですか?

ウィンドウプロシージャでESCが押されたか判断して終了するプログラムなんですが
ESCが押された時点でスレッドから応答が無くなるのか、ビジー状態でフリーズしてしまいます

コードの流れは以下のような感じ

_beginthreadex
CreateWindowEx
message loop
{
 //WM_QUITが来たらbreak
 do something
}
//ここでフリーズ(WaitForSingleObjectまで到達していないのに...)
いろいろ終了処理
WaitForSingleObject
CloseHandle
return 0;
>>537
> WM_QUITが来ると勝手に閉じちゃったりするんですか?

んなこたあない。

ところでこれは別スレッドでCreateWindowしてるの?
よくわからない。
>536
たぶん標準の機能では出来ない。
『Best of MSJ Vol.8 ワンポイントレッスン 最新プログラミングテクニック』の
1069p に解決策が載っている。
541デフォルトの名無しさん:02/10/14 23:58
Rebarで、あるBarのみ単独一行にしたら高さ(Height)を変えるって出来ますか?

・この時は一番高いBarにあわせる(例:20px)
| bar1 | bar2

・この時はbar2は高さを変える(bar1:20px、bar2:16px)
| bar1
| bar2
542デフォルトの名無しさん:02/10/15 00:30
>>538
別スレッドではメッセージキュー越しに文字列を受け取って
ファイルに書き出しているだけです

メインスレッド
 _beginthreadex;
 ウィンドウ作る;
 メッセージループ開始
 {
  WM_QUITでbreak;
 }
 メッセージループから抜けた事を別スレッドに知らせる(PostThreadMessage);
 ワーカースレッドへ終了メッセージを送る(PostThreadMessage);
 WaitForSingleObjectしてから、終了処理;
お終い

ワーカースレッド
 メッセージキューを作る;
 終了メッセージが来るまでループ
 {
  文字列を受け取ってファイルへ書き出す(GetMessage);
 }
 _endthreadex;
お終い

こんな流れなんですが、メインスレッドのメッセージループを抜けたところで
ビジー状態から抜け出せなくなります
ところが、原因究明の為にデバッガでループ終了からずんずんトレースしていったら
なんと完走してしまいした・・・まったくもって意味不明です
543542:02/10/15 01:12
怖ろしいのでデバッガでしか起動してなかったんですが
思い切って直接起動したら完走しました・・・

デバッガのバグなんですかね?
>>543
99%プログラムのバグ。
545542:02/10/15 01:42
>>544
つまり「デバッガで起動した場合ハングアップしてしまうバグ」を作り込んだということでしょうか・・・?
「実行に時間がかかりすぎるとハングアップしてしまうバグ」かな

初心者がマルチスレッド関係いじくると良くあるバグなんでしょうか?
なんとなくだけど、メインスレッドのメッセージループは
ほかのスレッドが終わるまで待ったほうがいいような
気がせんでもない。

なんとなくだけど。
>>542
関係ないけど_endthreadexは使わないほうがいいかも...
少なくともC++で使うとデストラクタが実行されないし
メインスレッドが終了するとほかのスレッドもすべて終了するけど
>547
なんのデストラクタ?
そして、何を代わりに使うんだ?
550542:02/10/15 02:27
>>547
ワーカースレッド内では何もnewしてない(何もインスタンス化してない)のですが
それでもマズいんでしょうか?

>>548
メインスレッドが終了するというのは
AとBどっちの事でしょうか・・・
ウィンドウはWinMainで作られた1つのみで、ワーカースレッドはどのウィンドウにも属さず
ウィンドウプロシージャでは、ESCを検出してWM_CLOSEをPOSTしています

int APIENTRY WinMain(略)
{
 _beginthreadex略;
 CreateWindow略
 while(GetMessage略) {

 } // A→ウィンドウが破棄されてWM_QUITがPOSTされ、メッセージループから抜けた
 return static_cast<int>(msg.wParam);
} // B→WinMainから抜けた
>>549
作成したオブジェクト。
例外を投げてmainでcatchする。
>>550
もちろんBのことだが
553542:02/10/15 02:34
>>552
自分のプログラムは「デバッガでStep実行すると」AのところでRUNNINGから復帰しなくなります・・・
AでBREAKして、そこからTraceでずんずん中に入っていくと無事完走します・・・
554名無し@沢村:02/10/15 06:43
皆様方、ひとつ教えてください。
APIのmidioutShortmessageで0x90C07Fを指定すると音が鳴り、
0x80C07Fかまたは0x90C000を指定すると音が止まるのはわかるのですが、
同時に二つの音を鳴らすときはどうするのですか?つまり和音ですね。
ぜひ教えてください!!
1つのチャンネルでいいから、違うノートナンバーのノートオンを出せばよろしかろ。
>>555
同意。ステップ入力できるMIDIシーケンスソフトでも使ってもうちょっとMIDIのこと勉強した方がいいと思われ。
>>514
VRAMと普通のRAMの違いとか?
ビデオカードの種類やVRAMの容量で結果変わるんじゃない?
558デフォルトの名無しさん:02/10/15 15:49
>>554
http://www.pluto.dti.ne.jp/~daiki/Midi/Midi.html
ここ読みゃぁじゅうぶんだべ
559デフォルトの名無しさん:02/10/15 17:30
IEの履歴をプログラムから操作できますか?
できるならそれは何というAPIでしょうか?
書いた直後に発見。
WinInetのほげほげCacheEntryがキャッシュだけでなくて
履歴やCookieも扱うんですね。
561駆け出しの名無し:02/10/16 06:22
検索エンジンGoogleを使っても("WNDCLASS", "インスタンス"で検索)見つけられ
なかったので、教えて下さい。

APIを使ってプログラムを作るとき、ウィンドウクラスを定義した後、
登録(RegisterClass(Ex)関数)して生成(CreateWindow(Ex)関数)しますよね。

そのとき、インスタンスハンドルをWNDCLASS(EX)構造体のメンバhInstanceと
CreateWindow(Ex)関数の引数で使用しますけど、なぜこの両方で指定しなければ
ならないのでしょうか。WNDCLASS(EX)構造体のメンバhInstanceとCreateWindow(Ex)関数
の引数で指定するインスタンスハンドルの違いは何?両方とも同じ目的で使われる
のであればどちらか一方で指定するだけで十分だと思うのですが…

インスタンスハンドルの意味は
  http://www.kab-studio.com/Programing/Dictionary/Words.html#Instance
が最も詳しかったです。

どうぞよろしくお願いします。モウ、オレヒトリデハ ゲンカイポ...
さあねぇ・・インスタンスハンドルはWin3.1時代の遺物っぽいが
WinNT では 0 で無視してるみたいだし よくわからんが・・
ちなみに、
 ・WNDCLASS(EX)構造体のメンバhInstanceにNULLを代入
    RegisterClass(Ex)関数実行時に失敗
 ・WNDCLASS(EX)構造体のメンバhInstanceに正しい値(WinMain()関数の最初の引数)
  を代入し、CreateWindow(Ex)関数でインスタンスハンドルにNULLを代入
    ShowWindow(Ex)で表示可能 (@_@)?!!!
という実験結果ですた…

# >>561でageたんで今度はsageで
ぐぉ、即レス!!どうもありがとうございます。

>>562
それはいわゆるhPrevInstanceのことでしょうか?あれはWin9Xでも常にNULLになる
って本に載ってました。
>>563
Win95ではそうなります WinNTは、ってことだから・・
もしかしてNTでもダメなんですかね
>>564
http://www.microsoft.com/JAPAN/developer/library/jpuipf/_win32_createwindowex.htm
ここの hInstance の解説で、「無視されます」ってあるでしょ
たぶん NT はプロセス管理をシステムで完全にコントロールしてるけど
9x は不完全というか、ごちゃまぜというかいっしょくたというか(w
そんなんで hInstance が必要なんじゃないのかなぁ・・ってことです

思っただけなので信憑性ない スマ
詳しい人がレスくれるといいね
567563:02/10/16 06:51
>>565
あ、>>563の実験結果はWin2000上でコンパイル・実行したときのものです。
実行環境書くの忘れたスミマセン...
>>566
あー、それ僕も読みました。他にRegisterClassEx関数
  http://www.microsoft.com/japan/developer/library/jpuipf/_win32_registerclassex.htm
の説明も…。しかしWNDCLASS(EX)に関する記述は結局見つけられなくてmicrosoft.comの
サイトから探すのはあきらめますた…。
>>568
英語版ならあるよ。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/WindowClasses/WindowClassReference/WindowClassStructures/WNDCLASSEX.asp

少なくともリソースIDを指定しないといけない時は
インスタンスハンドルも不可欠だね。
hInstanceに間違ってランダムな値が入ってたらどうなるんでしょうか
571デフォルトの名無しさん:02/10/16 12:58
COMを使ったプログラムで、定期的にポーリング処理を行いたいのですが、

SetTimer/KillTimerを使ったところ、精度が悪いのはまだしも、
COMオブジェクトのメソッドを呼び出している中でさらにタイマー処理が呼び出される
事が有り、困っています。

それではと、マルチスレッド化したところCOMオブジェクトが対応していないため(?)
クラッシュしてしまいます。

何か、良い解決方法は無いでしょうか?
おながいします。
COMオブジェクトのメソッド呼び出す前にタイマ止めとけば
あるいはちゃんと再入のチェックをするとか。
573571:02/10/16 15:58
なるほりょ。
COMよく知らん不束者ですが、
マルチスレッドで何とかするのは無理なもんでしょうか?
574 :02/10/16 17:57
>>573

別スレッドからインタフェイスを呼ぶのなら、
CoMarshalInterThreadInterfaceInStream と
CoGetInterfaceAndReleaseStream で
インタフェイスをマーシャルしてあげれば良いんだよ。

ex.

IStream* g_pStm;

// main thread
IYourInterface pYourInterface <- これにinterface取得済み;
CoMarshalInterThreadInterfaceInStream(IID_IYourInterface,
   pYourInterface, &g_pStm);

..

// worker thread
IYourInterface pYourInterface;
CoGetInterfaceAndReleaseStream(g_pStm,
  IID_IYourInterface,
  (LPVOID*)&pYourInterface);
pYourInterface->DoWhatEverYouLike();

worker thread でも CoInit するのを忘れずに。
575571:02/10/16 18:45
>574
あんがd。
試してみます。

>worker thread でも CoInit するのを忘れずに。
全然 頭に有りませんでした。
>>569
ありがとうございます!

該当個所は
   Handle to the instance that contains the window procedure for the class.
となっていますね。日本語訳するなら、
   ウィンドウクラスを制御するウィンドウプロシージャを含むインスタンス
   へのハンドル
ってところでしょうか。

一方、CreateWindow(Ex)関数については、>>566のURLにもありますように、
   ウィンドウに関連付けられたモジュールのインスタンスハンドル
となっています。この「ウィンドウに関連付けられた」ってどういう意味
でしょう?原文(英語版)では"... associated with ..."となってます…。

Win9Xと違い、WinNTでは無視されるようですが、その理由なども教えていただけ
ればと思います。

よろしくお願いします
577571:02/10/16 20:47
マーシャリングするのは面倒なので、とりあえずCoInitだけやってみたら、
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
をスレッドの最初でやったら動きました!
とりあえず、これでやってみます。

CoInitializeEx(NULL, COINIT_MULTITHREADED);
では、やっぱりクラッシュしますた。

因みに、SetTimer(NULLウィンドウハンドル指定)よりtimeSetEventの方が
パラメータを渡せるし、精度も良いのでつかってみたところ、timeSetEventは
別のスレッドを使用しており、やっぱりクラッシュしますた。
578デフォルトの名無しさん:02/10/16 20:49
サウンドカードがあるかは、waveOutGetNumDevsで再生デバイスの数>0で
判断できるけど、カメラがついているかどうか判断する方法って無いでしょうか?
579デフォルトの名無しさん:02/10/16 21:24
質問です。Exploer等でファイルをドラッグ中なのか、
そうでないのかを判別するにはどうしたら良いのでしょうか?
理想では、こんな感じのがあれば良いのですが…

if( IsDrag()) {
  ドラッグ中
} else {
  それ以外
}

よろしくお願いします。
>>578
カメラというデバイスについて特に言及したプロトコルが無いので無理
デジタルスチールカメラとか限定していけばどっかに規格があるかもしれんが
それでもUSB接続なのか独自なPCIカード経由なのかシリアルポート経由なのか(あるのか?w)
その辺が曖昧だったら無理

「○○社の○○というカメラが接続されているかどうか」は判断できる
581デフォルトの名無しさん:02/10/16 21:45
vbから現在ログオンしているユーザーのグループ名を
取得するにはどうしたらよいでしょうか?
582デフォルトの名無しさん:02/10/16 22:26
>>518
VB触ったことも無いけど
NetUserGetInfo()

WinMain()で、return に MSG.wParam を返せと書いてあるのですが、
warning C4244: 'return' : 'WPARAM' から 'int' に変換しました。データが失われているかもしれません。
と怒られてしまいます。
何が悪いのでしょうか...
>>582
WPARAM は unsigned だからでは?(見当違いだったらスマソ)
584582:02/10/16 22:29
誤 > WinMain()で、return に MSG.wParam を返せと書いてあるのですが、
正 > MSDNに、WinMain()ではreturn に MSG.wParam を返せと書いてあるのですが、
585582:02/10/16 22:32
>>583
そうなんですが、MSDNを見ると

> 関数が WM_QUIT メッセージを受け取って正常に終了する場合は、メッセージの wParam パラメータに格納されている終了コードを返してください。関数がメッセージループに入る前に終了する場合は、0 を返してください。
って書いてあるんですよ...
プログラミングWindowsでもそうなっていますし
586583:02/10/16 22:35
今定義を見たら、

__w64 unsigned int ですた。64ビットかな?

ちとかっこ悪いですが、return (__w64 unsigned int) 0 ってやってみては?
587583:02/10/16 22:41
書き込んでしばらくして気づいた…。
return (WPARAM) 0; ってやったらいいじゃん…。
588デフォルトの名無しさん:02/10/16 22:43
char file[256];
OPENFILENAME ofn;
memset(&ofn,0,sizeof(OPENFILENAME));
ofn.lStructSize=sizeof(OPENFILENAME);
ofn.lpstrFile=file;
ofn.hwndOwner=hWnd;
ofn.nMaxFile=MAX_PATH;
ofn.lpstrTitle="ファイルの保存";
ofn.lpstrFilter="files\0*.*\0\0";

if(GetSaveFileName(&ofn)!=0){
// ほげほげ
}
r=CommDlgExtendedError();

でr=0x02になってしまいます。
ちょっと探したところ時々ある現象のようなのですが
回避方法が見つからないです。
ご存じの方教えてください。
589583:02/10/16 22:44
ぎゃー! 間違いすぎー! 逆だった…。 return (int) MSG.wParam;
>>588
CDERR_INITIALIZATION = 0x0002
初期化の際にコモンダイアログボックス関数が失敗しました。たとえば、メモリ不足の場合に発生します。
>>588
  *file = '\0';
も入れなきゃ。
だな。
あと、MAX_PATHは260だったと思われ。
fileを大きくした方が・・・
>>589
それをキャストしてしまっても本当にいいのかって事です。
>>593
問題なし。
595593:02/10/16 23:04
>>594
その一言が聞きたかったんです。
どうもありがとうございます。
どこで聞けばいいのかよくわからんが。
Ruby で書いた壁紙変更スクリプトを
cygwin の cron で定期実行させたところ壁紙が変更されない。
cron がサービスとして動いているので、壁紙変更スクリプトが
LocalSystem のユーザコンテキストで実行されるのが問題っぽい。

平たく言えば、サービスとして動く壁紙チェンジャーは作成可能か、かな。
何か方法知っていたら教えてくれくれ。

壁紙変更は SystemParametersInfo を使ったよくある方法。
コマンドラインから実行した場合には問題なく変更される。
> LocalSystem のユーザコンテキスト

こいつはデスクトップにアクセスできるのか?
598588:02/10/17 00:28
うぉ、いろいろ勘違いしていたみたいだ。
char []のサイズとかnMaxFileとかいじって解決しマスタ。
>>542
私も>>546に同感。
ちなみにMFCアプリの場合はメインスレッドのメッセージループが
先に終わっちゃってるとASSERT出たと思います。
APIのレベルでもなにかあるんじゃないですかね。

メッセージループがWM_QUITを受け取った後で複雑な処理を
していることがなんかまずいのかも、かも、かも。
そんな俺の600に乾杯!
>>596
CreateProcessAsUser
LoadUserProfile
つーかCygwinのcronには特定ユーザーのアカウントで
プログラム実行する機能ないの?
タスクスケジューラにさえあるんだけど
602デフォルトの名無しさん:02/10/17 18:21
ビットマップを表示するクラスをつくるとき
メンバ変数はint x, yとビットマップとして
ビットマップのメンバ変数は型をどうしたらいいでしょうか?
ファイル名にしておいて描画のたびに
読み込むのはつらいとおもうのです
HBITMAP型にすればよいのでしょうか(コンストラクタでLoadBitmapで初期化)?あと このビットマップは複数のインスタンスから
使われると想定しています
YaneSDK(↓) が参考になるかも >>602
//
// Device Independent Bitmap
//
#ifndef __yaneDIBitmap_h__
#define __yaneDIBitmap_h__
// DIBitmapはGDIと同じく、下位からR,G,B,α
class CDIBitmap {
public:
LRESULT Load(string szFileName,int nBpp=24);
LRESULT Load(HDC hDC,LPRECT lpRect,int nBpp=24);
LRESULT Save(string szFileName,LPRECT lpRect=NULL);
LRESULT CreateSurface(int nSizeX,int nSizeY,int nBpp=24);
LRESULT Release();
// LoadBitmap/CreateSurface以降、いつでもDCの取得は可能
HDC GetDC() { return m_hDC; }
HBITMAP GetHBITMAP() { return m_hBitmap; }
LRESULT GetSize(LONG& x,LONG& y);
BYTE* GetPtr() { return (BYTE*)m_lpdwSrc; }
CDIBitmap();
virtual ~CDIBitmap();
protected:
DWORD m_lpdwSrc; // ソースバッファ
LONG m_nSizeX;
LONG m_nSizeY;
int m_nBpp;
HBITMAP m_hBitmap;
HDC m_hDC;
};
#endif
604602:02/10/17 20:11
>>603
ありがとうございます
参考になりそうです
ソースに当たってみます
605デフォルトの名無しさん:02/10/18 01:26
現在のユーザーがHKEY_CLASSES_ROOTに書き込み権限があるかどうかを
知るにはどうすれば良いでしょうか?
それ用のAPIがあるでしょうか?
>>605
俺、前に同じ質問したことあるけど、「実際に書き込みでOpenしてみれ」
って言われたんで、そうしてる。
どうしても解決できない問題があります
もし知ってる方がいらっしゃいましたらお教え願えませんでしょうか?

一度ビットマップをCreateFile() ReadFile()で読み込み
ファイルハンドルを閉じ
読み込んだデータに加工をして保存をしようとすると
なぜかCドライブ直下に保存されます。


そしてこれがまた変なところで
読み込んだビットマップの名前をプログラム内で直接書き込んで指定してやると
カレントディレクトリに新しいファイルが生成されるのですが
コマンドライン引数(アイコンにドラッグアンドドロップ)で
ファイル名を指定すると
Cドライブ直下に新しいファイルが生成されてしまいます。
指定しているのは読み込むファイル名であって、書き出すファイル名は
test32.bmpなど、固定です。

わかりやすく言うと
自作関数(といいますかクラスになっています)
LoadBMP("test.bmp")
で読み込むとカレントディレクトリにファイルが出力され
LoadBMP(lpCmdLine); //lpCmdLineはコマンドライン引数
だとCドライブ直下にファイルが出力されます。
このクラスでは、必ずファイルハンドルはCloseHandle()で破棄しています。

保存をするのはまた別クラスで、メモリに入ったデータだけを移動させています
クラス間にはなんの依存もありません

いったいなんなのでしょうか……
608607:02/10/18 05:00
↑に書いたものですが
さらに調べてみたところ、なんでかどこかでカレントディレクトリが
C:\になっていました。
GetCurrentDirectory()
を使って2箇所で見てみたのですが、最初に実行(プログラムが開始してからすぐ)
は正常なカレントディレクトリでしたが、2度目(ファイル保存寸前)
ではC:\でした。

カレントディレクトリが変わってしまうことというのはありえるのでしょうか?
609607:02/10/18 05:08
すいません 嘘すいてました(汗)
コマンドライン引数を指定するとc:\になるみたいです
謎です……
>>607
コモンダイアログとか使ってるんじゃないの?
> すいません 嘘すいてました(汗)
> コマンドライン引数を指定するとc:\になるみたいです

カレントディレクトリが途中で変わるというのが嘘?
だったら起動時からカレントが違ってるだけでは?
何が不思議なのかわからん。
612579:02/10/18 09:08
>>579 です。
ええっと、ドラッグ中なのか、そうでないかの判定は
難しいのでしょうか?それとも、超簡単なので
「そんな厨房の質問は無視だ( ´Д`)σ)Д`)」
って感じなのでしょうか?

ヒントでも教えて貰えるとありがたいのですが…。
なんのためにそういう判定がいるんだ?
IDropTargetを実装してRegisterDragDropするのでは不足か?
>>613
イベントドリブンという発想が出来ない素人なんだろ
>>612
システム全体の話?
それとも自分自身のプロセスの話?
616579:02/10/18 10:54
>>613
DragAcceptFilesやDragQueryFile等のAPIや
WM_DROPFILESみたいなメッセージがあると思って
OLEは全然思いつきませんでした。なるほど。OLEですね。
ありがとうございました。これで試してみます。

>>614
イベントドリブンは理解してますが…
何故、そういう発想に………煽り………ですか?
流石、2chですね。あ、レスは不要です。問題解決したので。

>>615
自分自身です。ウィンドウにドラッグした場合等に
自前でキャレット表示等をしているアプリケーションの
真似事をしたかったのです。
617デフォルトの名無しさん:02/10/18 13:11
ウィンドウを最大化したいんだけど、WM_SIZE送っても変わらない。。
どうすればいいのれすか?
ShowWindow
イベントドンブリー
620デフォルトの名無しさん:02/10/19 15:48
やさしいお兄さんに質問なんですが、ipconfigなどで見ることが出来る、
DNSサーバ、デフォルトゲートウェイなどの情報を取得したいです。
さくっと出来る関数なんぞを教えてください。
>>620
WSA系。
>>620
ShelExecuteでcommand.comを使って、
ipconfigの出力をファイルにリダイレクトとか言ってみるテスト
623 :02/10/19 21:31
>>620

どっかでも答えたような気がするけど、
素の Win95 サポートする必要があるなら SNMP API で MIB でオブジェクト指定して取り出せる。
iphelper.dll が使えるなら GetNetworkParams とかそのへんの IP Helper API でアレコレする。
624デフォルトの名無しさん:02/10/19 21:53
ShellExecute 香ばしい
625620:02/10/19 23:33
皆さん、レスありがとうございます
いろいろと調べてみましたが、簡単&綺麗な方法はないようですね…
さすがにShellExecuteはいかがなものかと…
ユーザに入力させることにします

>>623
vbスレの奴は私宛だったんでしょうか…
>SNMP API で MIB でオブジェクト指定して
その当たりの知識が全くないので、時間とかを考えて、今回は使わないことにしました
情報ありがとうございます
>>625
ShellExecute() はさすがにアレだが、それでも 「簡単」 に済ませるために
処理を外部コマンドに任せて、その出力を拾うのはよくある手法だぞ。
その場合は CreatePipe() + CreateProcess() を使う。
何を敬遠する?
UNIXではほとんど問題にならないけど
Windowsだとコマンド出力がローカライズされているという罠があったり
レジストリから取得じゃいかんの?
あほすぎる質問しますが・・・
APIってなんですか?
アプリケーションプログラムから、
システムの機能を呼び出すための方法のこと。
>>605です。
>>606の回答のようにRegOpenKeyExでKEY_ALL_ACCESSを指定して
HKEY_CLASSES_ROOTを開いたところ、書き込み権限が無いにも関わらず
RegOpenKeyExが失敗しませんでした。

書き込み権限が無いときはレジストリオープンに失敗して欲しいのですが、
どうすればよいでしょうか?
632デフォルトの名無しさん:02/10/20 13:49
http://pc.2ch.net/test/read.cgi/pcqa/1035087406/
スクリプト教えてあげて
633デフォルトの名無しさん:02/10/20 13:55
>620
PlatformSDKにIpConfigのサンプルコードがなかったけ?あったか自信はないけど探してみたら!
>>631
ごめん。俺も最初、素直に RegOpenKeyExで実装して、うまくいかなくて
下みたいにしたんだった。Openではなく、サブキー"*"(普通、すでに存在
している)を Createするという考え方。

HKEY hKey;
if(RegCreateKeyEx( HKEY_CLASSES_ROOT, "*", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKey, NULL ) == ERROR_SUCCESS )
 書きこみ権あり
else
 書きこみ権なし
>>634
あ、あと ERROR_SUCCESS になったら、RegCloseKey(hKey) を忘れずに。

過去スレ見たら
http://pc.2ch.net/tech/kako/1017/10170/1017072275.html
の 973,974,976 にあった。
>>634
HKEY_CURRENT_USER\Software\Classes\* が存在していたらどうしますか
というかRegOpenKeyExが失敗しないのも
HKEY_CURRENT_USER\Software\Classes が統合されてる関係のような気がする
だからOpenじゃなくてCreateだってばさ
OpenでもKEY_ALL_ACCESS指定では開けないはずでしょ。
それが開けちゃうという話ではないの
>>637
前スレ読ませてもらったけど俺はOpen(KEY_WRITE)でやってて、
うまくいってるよ。
640デフォルトの名無しさん:02/10/20 18:20
>>636
明示的にHKEY_CLASSES_ROOTを開いてもHKEY_CURRENT_USER\Software\Classes
を開いたことになる??マジで?

>>639
OSとどのユーザーグループで確認したのかと、実際の引数を求む。
>>634から読ませてもらってこんな関数にしたんですがどうでしょう?
// HKEY_CLASSES_ROOTに書き込み権限がある場合はTRUE、無ければFALSEを返す
BOOL IsWriteReg(void)
{
LONG lRes;
HKEY hKey;
TCHAR szKey[] = _T("*");
DWORD dwDisposition;

// レジストリオープン
lRes = RegCreateKeyEx(
HKEY_CLASSES_ROOT, szKey, 0, NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition
);

// レジストリオープン失敗
if(lRes != ERROR_SUCCESS)
return FALSE;

// HKEY_CLASSES_ROOT\* を新規作成した場合は削除
if(dwDisposition == REG_CREATED_NEW_KEY)
RegDeleteKey(HKEY_CLASSES_ROOT, szKey);

// レジストリクローズ
RegCloseKey(hKey);

return TRUE;
}
HKEY_CURRENT_USER\Software\Classes キー、9x にはない。
>>640
http://msdn.microsoft.com/library/en-us/sysinfo/base/merged_view_of_hkey_classes_root.asp
>>642
9xはそもそも書き込み権限がなくて失敗すること自体ないだろ
というわけで
HKEY_LOCAL_MACHINE\Software\Classes
をKEY_ALL_ACCESSで開いて判定すればいいのではないかと思うわけだが
誰か実験してちょ(他力本願
645639:02/10/20 18:46
>>640
> OSとどのユーザーグループで確認したのかと、実際の引数を求む。

今手元に環境が無いのだけれど、WinXP Professional。
それと確かWin2Kでも確認したと思う。

管理者権限では成功し、
制限ユーザー(今は詳細は確認できない)では失敗することを確認。

HKEY hKey;
RegOpenKeyEx(HKEY_CLASSES_ROOT, "CLSID", 0, KEY_WRITE, &hKey);

>>636
HKEY_LOCAL_MACHINE\Software\Classesの間違いでないの?

>>642
俺の手元のWin98には一応あるよ。
中身は特殊フォルダの(ユーザー毎の)アイコン文字列くらいだけど。
>>645
> HKEY_LOCAL_MACHINE\Software\Classesの間違いでないの?
だから>>643を見てよ
647639:02/10/20 19:05
>>646
ごめん。645を書いた時はまだ643を見てなかったので。

でも、そのリンク先によると、やはり
HKEY_LOCAL_MACHINE\Software\Classesのように思えますが。
HKEY_CURRENT_USERが有効になるのは、RegOpenUserClassesRoot
を使って開いた時だけじゃないの?
648639:02/10/20 19:22
いや、違うか。HKEY_CURRENT_USERも有効になるのかな?
また暇な時にじっくり読んでみます。
>>644
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Classes", 0, KEY_ALL_ACCESS, &hKey);
でできた。
スタートメニューのようなポップアップメニュー項目の並べ替えやラベルの編集ってどうやるんでしょう。
WM_MENURBUTTONUP 受信時に InsertMenu() 等をしても表示が乱れるだけで更新が反映されないのですが。
こうなりますた

BOOL IsWriteReg(void)
{
LONG lRes;
HKEY hKey;
OSVERSIONINFO vi;

// NT系以外の場合TRUEを返す
vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&vi);
if(vi.dwPlatformId != VER_PLATFORM_WIN32_NT)
return TRUE;

// レジストリオープン
lRes = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Classes", 0, KEY_ALL_ACCESS, &hKey);

// レジストリオープン失敗
if(lRes != ERROR_SUCCESS)
return FALSE;

// レジストリクローズ
RegCloseKey(hKey);

return TRUE;
}
>>651
9xでHKEY_LOCAL_MACHINE\Software\Classes開くと失敗するの?
失敗しないんならプラットフォームの判定は不要だと思うんだが
不要というか互換モードで起動されたりしたときに
判定を誤るからむしろ有害
>>642をHKEY_LOCAL_MACHINEと間違えますた・・・
関数名はCanWriteRegとかIsRegWritableでないと英語的におかしい気がする
果てしなくどうでもいいことだが
>>653
互換モードだとGetVersionExが違う値になるん?
>>656
というかGetVersionExを違う値にするための機能が互換モードですが
(ほかにもAPIの動作が微妙に変わるけど)
658デフォルトの名無しさん:02/10/21 07:01
リソーススクリプトの書き方のってるところ知りませんか?
英語でもいいので、しっていたらおしえてください。
>>658
>>1に載ってる
猫でも分かるプログラミング
ttp://www.kumei.ne.jp/c_lang/index.html
660デフォルトの名無しさん:02/10/21 21:52
::GetAsyncKeyState()と::GetKeyState()の違いってなんですか?
メッセージループのスレッド以外で使えるかどうかだけなのでしょうか?

あと、::GetKeyboardState()もメッセージループのスレッドでしか
使えないんですかね、やっぱり。
>>660
GetKeyState 今処理中のメッセージを受け取った時点で押されていたキー
GetAsyncKeyState 今まさに押されているキー
WM_KEYDOWNの処理の中で10秒くらいSleepを入れて試してみれば違いがわかる(非推奨)
662デフォルトの名無しさん:02/10/21 22:12
>>661
と、いうことは::GetKeyState()をメッセージ処理後に
呼び出した場合は、最後に処理されたメッセージ取得時の
キー状態を取得するってことですね。
663デフォルトの名無しさん:02/10/21 23:43
>>659
リソースエディタを使わないで
テキストデータで書きたいんですが
詳しくのってるところしりませんか?
>>663
MSDN
665デフォルトの名無しさん:02/10/22 00:20
>>663
もれは猫でも〜のソース見てたら大体分かったけど・・・。
667デフォルトの名無しさん:02/10/22 12:37
>>666
激同
>>663
プログラミングWindows第5版
http://www.ascii.co.jp/pb/msp/36001/36001.htm

には載ってないのかな?
# ごめん、オレはこの本読んだことないんで分からん…。
669 :02/10/22 22:00
>>668
それに構文の説明が載ってるけど、p540にはドキュメントを読むように書いてある。
670デフォルトの名無しさん:02/10/23 00:38
メモリDCを使用した処理をしています。

作成する CompatibleBitmap は、クライアントサイズに合わせて作っていて、
ウィンドウサイズが変更されたときに、Bitmap のサイズも変更しようと思っ
ています。。

CompatibleBitmap には、サイズ変更をするような関数は見当たらないので、
新しい CompatibleBitmap を作成して、それにサイズ変更前のデータを必要
なだけコピーしたいのですが、デバイスコンテキストから、デバイスコンテ
キストへコピーする BitBlt は、あっても、Bitmapから、Bitmapにデータを
コピーするAPIが見つかりません。

何とか、いい方法は、ございませんか?
>670
描画用の仮想ウィンドウ?

CreateCompatibleDC()でデバイスコンテキストをもう1つ作って、新しく作ったビットマップをSelectObject()すれば、デバイスコンテキストが2つできるので、BitBlt()が使える。
あと、最初からビットマップをスクリーンと同じ大きさでつくっておいて、使うときに必要な部分だけコピーする方法もある。
672デフォルトの名無しさん:02/10/23 01:44
>>671

とりあえず、スクリーンと同じ大きさで作る方法を試してみたいと思います。
ありがとうございました。
>>663
あとは、
リソースエディタの吐いたリソーススクリプトを読めば、
大体分かると思うけど・・・。
674579:02/10/23 13:17
>>670-672
便乗質問だけど、漏れもデスクトップサイズと同じビットマップを確保してるけど
それだと、1600x1200x2画面とかだと、やたらとメモリ食うし…。
可変サイズのウィンドウに描画用の仮想ビットマップを確保する場合、
もうちょっと、メモリを食わずに、そこそこのスピードの方法って無いんでしょうか?
WM_SIZEで仮想ビットマップを作り直すとか・・・
負荷が気になるならWM_PAINTでもいいかもネ
676デフォルトの名無しさん:02/10/23 18:37
>>675
WM_NCCALCSIZE
等をうまく使えば、変更前と変更後のクライアント領域のサイズから、
効率的に、再描画を指定できそうな気がするんだけど、このメッセージ
の処理を、どうやってやるのか、よくわからない(^^;
677デフォルトの名無しさん:02/10/23 20:20
Visual C++ でrs-232cのシリアル通信でどうやるんでしょう?
MSComm は Visual Basic のコマンドなんですか?
デジタルボルトメーターを制御したいんですが。
どなたか教えてください。 お願いします。m(__)m


>>677
CreatefileでCOM開けたと記憶。
679デフォルトの名無しさん:02/10/23 20:24
>>678
ありがとうございます。
ちょっと調べてみます。
>674
小さな仮想ウィンドウを作るとか。
ウィンドウの大きさが1600×1200だとしたら、仮想ウインドウは800×600を確保。
ウィンドウのマッピングモードを800×600に変更して仮想ウィンドウからコピー。
処理するデータが1/4で済むので、かなり早くなるよ。
ただし、画質が荒くなるので使える場所は限定されるね。
質問させていただきます。
オートクリックツールを作ろうと思っているのですが

SendMessage(Target_hWnd, WM_MOUSEMOVE, 0, cp.x + (cp.y<<16));
SendMessage(Target_hWnd, WM_SETCURSOR, (unsigned int)Target_hWnd, HTCLIENT + (WM_LBUTTONDOWN<<16));
SendMessage(Target_hWnd, WM_LBUTTONDOWN, MK_LBUTTON, cp.x + (cp.y<<16));
SendMessage(Target_hWnd, WM_SETCURSOR, (unsigned int)Target_hWnd, HTCLIENT + (WM_LBUTTONUP<<16));
SendMessage(Target_hWnd, WM_LBUTTONUP, 0, cp.x + (cp.y<<16));

これではうまくいかないようです。
他にどんなメッセージを送ればよろしいのでしょうか。
それじゃSendMessageが送られへんのかいな
mouse_event()
ターゲットによってはsendInput()

質問:

???.ilk (増分(インクリメント)リンクファイル?)
が生成される位置を指定するにはどうすれば?


/ilk:"????/" は通らない。

/incremental:"????/" は通らない。

>>684
Windows 95 を見捨てるのか
>>686
いまさら、95なんか気にするな。
688685:02/10/24 18:07

みなさん、どうか、>>685 をお願いします。

もしかして、既出放置ですか?
>>687
漏れの会社 PC が Windows 95 なんだYO!!!
とか言ってみる。

>>688
一体何がしたいの?
その前にコンパイラ/リンカオプションは調べた?
そこに無ければ諦めなさい。以上。
>>686
だから「ターゲットによっては」って言ってるじゃんよ
691686=689:02/10/24 23:25
>>690
だから、その 「ターゲットによっては」 ってのが既に Windows 95 を見捨てる
って事だろ。
マウスに関して、SendInput() だけにできて mouse_event() にできない事って
どんなこと?

まあ、SDK が新しくなって mouse_event() のドキュメントが無くなったという事
になったら仕方ないけど。
692デフォルトの名無しさん:02/10/24 23:32
ボタンクリックでウインドウを最大化できるようにWM_COMMANDで

SendMessage(hWnd,(WPARAM)2,(LPARAM)MAKELPARAM(now.w,now.h));

を送ったんですが、最大化されません。
まだ何かやることってあるんですか?
>>692 ShowWindows(SW_MAXIMIZE) じゃだめなの?
>>692
( `Д) <ShowWindow()
/(ヘ つ )ヘ   
↑ Σ(´Д`ズガーン
間違えた。ShowWindows って...
>>691
クライアントが最初からWin98以上を指定してきたとかそういう状況を想定してた。
> SendInput() だけにできて mouse_event() にできない事
途中で割り込まれずに連続したイベントの送信を保証すること
697692:02/10/24 23:48
>>693-695
ありがdございまつ!
できますた。
>>692
( `Д) <どうしてもSendMessageしたいなら、WM_SYSCOMMANDでできるかも。
/(ヘ つ )ヘ
いいからモノをしまえ
700691:02/10/25 00:03
>>696
ああ了解、特定業務にしか使わなければ OS 限定で問題無いな。
漏れが浅かった。
しかし、mouse_event() でイベント送信順に困ったこと無いぞ。
構造体用意するのも面倒だしな・・・。

ところで、683-684 が 681 へのレスだと言う事に質問者は気付いてるのだろーか。
701名無しさん:02/10/25 00:22
INITCOMMONCONTROLSEX icce;
icce.dwSize = sizeof(icce);
icce.dwICC = ICC_USEREX_CLASSES | ICC_WIN95_CLASSES | ICC_TREEVIEW_CLASSES;
::InitCommonControlsEx(&icce);

(略)

RECT rc;
GetClientRect(hWndParent, &rc);
HWND hCombo = CreateWindowEx(0, WC_COMBOBOXEX, NULL,
  WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST,
  rc.left, rc.top, rc.right - rc.left, rc.bottom - rc. top,
  m_hWnd, NULL, _Module.m_hInst, NULL);

このコードでコンボボックスを作ったんだけど、
ドロップダウンリストが表示されないんですよね。

通常は、「▼」を押すとリストが表示され、
リスト以外の部分をクリックすると、リストが非表示になる処理が行われ、
もう一度同じ場所をクリックしないと、その場所にフォーカスが移りませんよね。

ところが、「▼」を押してもリストが表示されず、さらに他の部分をクリックしても
一回目はそこにフォーカスが移らない。

VC++6.0 SP5 Windows 2000 SP3です。
>>701
了解。わざわざ報告どうもです。
>>699
ワロタ
704701:02/10/25 00:42
すまそ。追記。

701のようになるのはなぜでしょう?
>>702,704
ワロタ
>>701
( `Д) <rc.bottom - rc. topが小さすぎない?
/(ヘ つ )ヘ これはリストの高さになるよ。
702 グッジョブ
708名無しさん:02/10/25 01:13
>>706
ありがとうございます。
おかげさまで解決しました。
706 ところでモノはしまわんのか
    ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄
   ( ・∀・)< モノをしまう必要はない
   (    )  \_______
   |  ⊃| アヒャ
   (__)_)
711127:02/10/25 13:45
スミマセン。ちと質問なんですが

デスクトップ上のInterNet Exploerのアイコンを消去する時は、
インターネットのプロパティの詳細設定内の
「デスクトップにInterNet Exploerを表示する」のチェックを外すと
画面上から消え去ります。

で、上記と同じコトをプログラム上で行いたいのですが方法が判りません。
ご存知の方がいましたらよろしくお願いします。<(_ _)>

ちなみに...
チェックのあり/なしでレジストリのDiffを採って見ましたがBlank以外の差はありませんでした
窓の手でも作ってるのか?
単にショートカットを削除しているだけでは?
714711:02/10/25 14:34
いや、そんな凄いコトをしようなんて...
初回起動時にアイコンがデスクトップ上にあるのが嫌なんですと。

で、初回起動時の他のアイコンは消せたんですけど、
IE(だけだったかな?)が消せなくて...
お前が嫌ならお前が消せばすむことだろ
設定変更ツールでないものが勝手にユーザーの設定をいじるな
>>715
準ウイルスのようなモノを作りたいんだと思われ。
「嫌なんですと。」って言い方からするとユーザーからの依頼と思われ
718711:02/10/25 15:22
むぅ...誤解されてる...
自分で直接設定を変更出来るんなら、こんなモン作ろうとしないです。
> 自分で直接設定を変更出来るんなら、
自分でやり方書いてるだろ。↓これは違うのか?
> インターネットのプロパティの詳細設定内の
> 「デスクトップにInterNet Exploerを表示する」のチェックを外すと
どういうプログラム作ってるのかちゃんと書けよ。
ウィルスじゃないんなら
720711:02/10/25 16:02
...スマソ
>>715サソが言ってる「設定変更ツール」ですな。
ただ、「設定変更ツール」って名乗るのも躊躇う機能しか持ち合わせていませんが...

変更方法を知りませんか?知ってたら教えて下さい<(__)>
質問。
仮想画面(メモリDC) → 実画面 と
BitBlt()より高速にコピーする方法は無いでしょうか。
ない
>>721
createdibits
>>721
WinGつかう。
>>721
Direct3D
726デフォルトの名無しさん:02/10/25 19:14
質問です。
最近のWindows系マシンですと、
windows、winnt、program filesなどのフォルダが最初
不可視になっていて、ここをクリックして表示して下さい
みたいな風になっていると思うのですが、ああいうのって
他のフォルダでも同じような処理ができるAPIとかあるんでしょうか?

ただのsetattributeでhiddenやsystemにしてもああいった挙動は
実現できないですよね?
また、できないならできないでシステムフォルダだけでも実現している
APIの名前だけでも教えてください。お願いします。
>>726
JScriptとフォルダをWeb形式でって言うのとの合わせ技。

なんでVBScript使わないんだろうね?(藁
>>727
JScriptはMSのものですがなにか?
>>728
せっかく対抗馬のVBS作ったんだからわざわざJavaScriptもどき使うこともあるまいて。
730721:02/10/25 19:27
>>722-725
ありがd。
参考にします。
731726:02/10/25 19:29
マジっすか。全然API関係ないやん…スレ汚しスマソ。

>>727-729
大変参考になりました。ありがとうございました。
>>726
遅レスですまんが、↓のスレで聞けばいいと思うよ。
http://pc3.2ch.net/test/read.cgi/win/1011536679/
733デフォルトの名無しさん:02/10/26 18:47
メモ帳のフォントの設定などを見ると、フォントの種類によって使えるサイズが決まってますが、このサイズのリストはどうすれば取得できるんでしょうか?
たとえば、"Terminal"だったら 4,6,10,14,17 というリストです。

734デフォルトの名無しさん:02/10/27 15:52
ウィンドウを最終的に特定のDCに描画してやりたいのですが、方法がわかりません。
以下の方法を試してみましたがだめでした。

1. GetWindowDCやGetDCで取得したDCをsrcとしてBitBlt -> 前面にある矩形領域のビットマップがBitBltされる
2. WM_PRINT, WM_PRINTCLIENTを送る。 -> WM_PRINTをサポートしていないらしく何も得られない。
735734:02/10/27 15:56
補足です。
>WM_PRINTをサポートしていないらしく何も得られない。
メッセージハンドラが実装されていないらしい、ということです。

今起動しているアプリケーションのサムネイルを表示してみたいと思っています。
2000/XPならLayered Window化する
そうでなければWM_PAINTで描画するまで前面のウィンドウに隠された部分は
どこにも存在しないので不可能
733 の質問の答えは漏れも知りたいんだが誰か知らないか?
738デフォルトの名無しさん:02/10/27 16:38
デスクトップに3D環境を実現するTaskGalleryのようなものを作りたいのですが、
ウィンドウの描画を完全に横取りする方法ってどなたかご存じでしょうか?
http://research.microsoft.com/ui/TaskGallery/index.htm

ここを見ると
http://research.microsoft.com/ui/TaskGallery/pages/technology.htm
Windows Redirectorというものがあるのですけど、これってデバイスドライバレベル
で実現するものなのでしょうか。
>>738
ttp://www.ksky.ne.jp/~seahorse/
特別なドライバは使っていない模様です。
ソースもあるし,勉強になりますよ。まじで。
>>733 >>737
TClockのソース exe\pagecolor.c にそれっぽい処理が書いてあるので参考になるかと。
でも、一覧される数字が微妙に違いますね。丸め誤差か何か?
741740:02/10/27 18:33
質問です。他のプロセスのコマンドライン引数を取得する方法はありますか?
Win2000では、フックを使ってプロセスに忍び込ませた後、GetCommandLine()を
使って取得できたのですが、Win95ではうまくいきませんでした。
>>739
紹介ありがとうございます。
アニメーションまでして非常によくできていると思います。

ただ、やろうとしていることは立体化している時にも
ちゃんとウィンドウの内容が更新されるというものを実現したいのです。
WinXPのVisualStyle機能より下のレイヤーじゃないと駄目なのでしょうかね。
743740:02/10/27 18:36
>>741
補足です。うまくいかなかったというのは、GetCommandLine()で取得できた値が、
取得したいプロセスのものではなくて、自分自身のものが返ってきてしまいました。
>>743
フックはちゃんと DLL からやったよな?
あと、GetCommandLine() の値はどうやって自アプリに送ってる?
745741:02/10/27 19:16
>>744
レス感謝です。フックDLL内のフックプロシージャ内でGetCommandLine()を呼んでます。
値は #pragma data_seg() で作成した共有領域を介して実行ファイルに渡してます。
フックプロシージャ内のGetCommandLine()の値をファイルに書き出しましたら、
侵入先プロセスの値ではなく実行ファイルのものが返ってしまってました。
>>745
#pragma data_seg() は当然 DLL 内部だよね?
別プロセスと間違えて自分のプロセスを捕まえてるという事は無い?

あ、フックの種類は WH_CALLWNDPROC?
今 MSDN 見て気付いたんだけど、「WH_CALLWNDPROC フックを呼び出すのは、
メッセージを受け取ったスレッドではなく、SendMessage を呼び出したスレッド
のコンテキストです。」 だそうな。
747746:02/10/27 19:58
あ、746 の MSDN の説明は Windows 95/98/NT3 だそうな。
NT4 以降はメッセージを受け取ったスレッドのコンテキストみたいだ。
748746:02/10/27 20:00
相手のコンテキストが必要なら WH_CALLWNDPROC でなくて WH_GETMESSAGE?
749デフォルトの名無しさん:02/10/27 20:06
Win32APIをやるにはどうしたらいいですか?
何が必要ですか?
750デフォルトの名無しさん:02/10/27 20:09
Win32APIのソースを
コンパイルするにはどうするんですか?
>>749
Windows 対応の C/C++ コンパイラ
API そのものについては >>1 の参考リンクを見れ。
>>750
(゚Д゚)ハァ?
Win32 API のソースなんてものがどこにある?
それとも、Win32 API を呼び出してるプログラムの事か?
753751:02/10/27 20:12
Windows 対応の C/C++ コンパイラについてはこの辺
http://pc3.2ch.net/test/read.cgi/tech/1035623265/2
>>752
> Win32 API のソースなんてものがどこにある?

当然、MS には、あると思うよ。
>>750 のところにもあるのかなぁ...、飴玉あげるからおじさんにちょっと見せてくんない ?
755デフォルトの名無しさん:02/10/27 20:17
MS−DOSでなんて入力したらいいんでつか?
test.cとかいう名前で保存したら・・・
>>755
del test.c
757デフォルトの名無しさん:02/10/27 20:21
>>756
そんくらいわかってっから
最近知ったんでつか?
>>757
かれこれ8年前だな。覚えたのは。
最近はrmの方がよく使うわ。
760デフォルトの名無しさん:02/10/27 20:30
>>757
おまえだれよ?
いつものモー板にかえりなさい
しっし
761741:02/10/27 20:36
>>746
#pragma data_seg() はDLL内部で行ってます。捕まえてるプロセスはファイル名を
見てから行っているので、その点の問題無いです。
フックの種類なのですが WH_CALLWNDPROC を使ってまして、現状のプログラムが
Win2000では問題なく動いていて、Win95ではうまくいかないことから、まさに 746-747 が原因
そのもののように感じました。これからWH_GETMESSAGEで試してみて、改めて報告します。
>>755
copy nul test.c
copy con test.c
763734:02/10/27 22:08
>>736
ありがとうございます。

最終的にはまさに>>738のようなことをしたくて、
ビットマップ(をSelectObjectしたDC)にウィンドウを描画->
そいつをテクスチャとしてトライアングルに貼り付ける
と考えていたのですが、layered window を使えばそのようなことができるのでしょうか。
自分で調べた限りはできそうにありませんでした。
できるのであれば教えてください。

とりあえず>>739を参考にしてみたいと思います。
764741:02/10/27 23:24
>>746
WH_GETMESSAGE で試してみましたところ、無事他のプロセスのコマンドラインを取得できました。
Win9xとWinNT系が別物ということとMSDNの原書を読むことの重要性を改めて感じました。
ありがとうございました。
765746:02/10/27 23:32
漏れがすぐさま MSDN に走ったのは漏れが適度にアフォだからかも知れぬという罠
>>765
わからないことは調べる。素晴らしい姿勢だと思われ。
767765:02/10/28 00:01
いや、それなりにデキてたら MSDN いちいち見ないと思われ
>>767
要は結果よ。

MSDN丸暗記して文句だけ言ってるライブラリ厨とMSDNが素早く引けて良いものが作れる人。

どっちが死んだ方が良いかは明白。
>>767
いつのまにかupdateされてる場合もあるんで
どんなのがあるか、だけは覚えとく価値はあるけど
詳細までは覚える意味はあんまりないと思う
770741:02/10/28 00:10
デキないかつ日本語版しか調べなかったためにアフォから脱出できなかったという罠<自分
次回は原書を含めてあるものは隅々まで調べなければ。>>765氏に感謝。
771デフォルトの名無しさん:02/10/28 03:40
リソースメーターで表示される様な、CPU占有率がわかるAPIありませんか?
>>771
NT:NtQuerySystemInformation
9x:registry

(´-`).。oO(最近、代行googlerになってるな・・・)
うるせーはげ
> NT:NtQuerySystemInformation
特別な理由がない限りPDHのほうがいいのでは
>>772
Googleが自然言語処理できるようになるまでの我慢です!
>>775
あとは検索ワードの入力UIを掲示板風にして
あたかも親切な回答者が答えてくれているかのような
人工無能を実装すれば完璧
777デフォルトの名無しさん:02/10/28 20:47
>>560
IEのキャッシュ消せるようになりましたか?
winAPIを使ったキャッシュのクリアのようなのですか...

Delphiでは IEのキャッシュ消すのに以下のようなコンポーネントがあるのです。
http://www.euromind.com/iedelphi/iecache.htm

ところが、実際に組んで見るとキャッシュや履歴の情報を取得・消す操作などが一見
できているようなのですが、実際のIEの履歴を見ると反映されません。
ソースを調べると単にAPI呼び出しをカプセル化したものなので、原因があるとすれば
その先にあると推測されます。

当方、win2000 IE6です。

これも、推測ですがこのコンポーネントの最終バージョンが2001年10月なので単にIE6で動作しなくなったのでしょうか?

ヤフーの掲示板(英語)などでも他の方が触れられているのですが、私は満足な回答を掲示板の中に見つけることができませんでした。
何方かこのへんの経緯をご存知の方いませんでしょうか?
778771:02/10/28 20:50
>>772
すいません、意味がわかりません。
環境は98SEなんですが、
>NT:NtQuerySystemInformation
>9x:registry
これはレジストリ見ろ、ってことでしょうか?
TrackPopupMenuExで作ったメニューがメニューの外をクリックしても
消えないのですが、何のメッセージで何の関数使ったらよいでしょうか?
消えるけど?
781779:02/10/29 14:55
>>780
タスクトレイ常駐で使ってるのですが何か関係ありますか?
782デフォルトの名無しさん:02/10/29 15:12
関係無いけど、タスクトレイ常駐で TrackPopupMenuEx() 使ってる理由は?
TrackPopupMenu() じゃダメ?
WM_NULL
784779:02/10/29 15:17
たまたま参考にしたコード(DX8.1サンプル)がEx使ってたので・・・
>>779
メニューを表示した後に、PostMessage(hWnd, WM_NULL, 0L, 0L); これ。
理由は MSDNに書いてあったよーな気が。
786779:02/10/29 15:19
レスありがとうございます
やってみます
SetForegroundMessageモナー
788779:02/10/29 15:58
・・・
case WM_TRAYICONMESSAGE:
 switch(lp)
 {
 case WM_RBUTTONDOWN:
   POINT pnt;
   GetCursorPos(&pnt);
   TrackPopupMenuEx(
    GetSubMenu(LoadMenu(0,MAKEINTRESOURCE(IDR_POPUP)),0),
    TPM_VERTICAL,pnt.x,pnt.y,hWnd,NULL);
   PostMessage(hWnd,WM_NULL,0,0L);
   break;
・・・
うまくいきませんでした(つ_ ;)
MSDNが古いのか、>>785さんのは載ってなかったです
SetForegroundMessageもありませんでした
動作環境はwin2000+VC6.0です
ダメ元でPostMessageの後ろに
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
も追加してみて。
790779:02/10/29 16:22
>>789
だめですた

WM_NCHITTESTに入れたりもしてるのですが、これも関係ないみたいです
SetForegroundMessage => SetForegroundWindow
のことだろう、たぶん。
これは TrackPopupMenu の前。
>>790
TrackPopupmenu の前に SetForegroundWindow( hWnd )を入れるのだ。
http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q135788&
793779:02/10/29 17:31
>>791>>792
ありがとうございます
できますた
794デフォルトの名無しさん:02/10/29 18:11
HBITMAPからパレットって取れますか?
できるならどうやってやりますか?
>>794
GetDIBits
796デフォルトの名無しさん:02/10/29 18:26
XPの現在のデスクトップのパスを取得するAPIを教えて下さい。
SHGetSpecialFolderPath
>>797
うおおおおおおおおおおおおおおおおおおおおおおおおおおおっつつつt
激しくありがとおおおおおおおおおおおおおおお!!!
>>782
baka baka
800泣くよ?:02/10/29 21:30
GetDIBits(NULL,hBitmap,0,384,NULL,pbmi,DIB_RGB_COLORS);
あたりでpbmiのbmiColorsに入るかと思えば入りませんでした。
詳しい方法キボンヌです。
801デフォルトの名無しさん:02/10/29 21:46
・゚・(つД`)・゚・
802デフォルトの名無しさん:02/10/29 23:40
HTMLびゅわ作りたいんですけど、MFC使わずには無理なんですかね?
もしくはSDKからCHtmlViewを使用する方法って無いですかね?
ActiveXコンテナをOLE生で書く苦労をいとわないなら、あるといえる。
コンテナ!生!160円!
805デフォルトの名無しさん:02/10/29 23:49
>>803
どうしてそんなことしなくちゃいけないわけ?
HTML解析して自分で表示させるの作ればいいだけじゃないか。
それをすればプログラム技術もHTMLの仕様にも強くなれるぞ。
>>805
802はMFCを使わずにCHtmlViewを使う方法を探してると見た
>805
CSSわ〜?
Scriptわ〜?
808デフォルトの名無しさん:02/10/29 23:54
SDKからCHtmlViewを使いたいわけがわからん。
CHtmlView自体がすでにMFCなのでは?
CHtmlViewの部分だけうまく流用できないモンかと。。。
BC++5.5.1で作ってるんですが、mshtml.hというのもちょっと気になるけど
全然関係ないですかね?
>>809
例えば User32.dll 使わずに CreateWindow() を呼べないかっていうくらい
支離滅裂でないか?
http://jp.y42.briefcase.yahoo.co.jp/bc/nas6_2001/lst?&.dir=/Projects&.src=bc&.view=l

一発ネタ(TrayTest.lzh)


タスクトレイの黄色と紫のチェックのアイコンを
右クリック->exitで元に戻るから大丈夫
まぁ、抜け道は死ぬほどありますが・・・
812811:02/10/30 12:21
ビルドする前に一番上のコメント部を見てください
>>802
ダイアログにWebBrowserコントロール貼り付けるんじゃだめ?
>>800
マジレスするとDDBにパレットはありません。
DIBセクションならGetDIBColorTable()で取って
論理パレットに変換。
>>813
そのWebBrowserコントロールはMFCなしで動くんか?
つーかそもそも貼り付けられるのか?
>>811
「このブリーフケースやフォトアルバムへのアクセスはご利用できなくなっております。」
817811:02/10/30 12:29
>>816
右クリックでいけない場合は、アドレスにコピペしてくらはい
>>815
MFCなしでも当然動くよ。
が、SDKだったのか。それはよく判らん。。
漏れはATLで作ったWindowsに貼り付けてるんだが。
819818:02/10/30 12:35
これね。
CAxDialogImpl
>>817 ミタヨー
面白いけどでも、Ctrl + Esc or Win キーは逃げられない罠
それに、このスレで晒すのに何の意味があるの?
821811:02/10/30 12:42
>>820
API関係のスレここしか知らないので。。。
それに漏れはストリーキング(w
822デフォルトの名無しさん:02/10/30 14:41
マイクから入力を録音するように、ミキサーAPIをつかってマイクの入力選択をONにする事はできるのですが、
スピーカーから出る全ての音を録音できるデバイスの入力を選択するには、どうしたらよいのでしょう?

// 入力デスティネーションライン情報取得
MIXERTLINE mxl;
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
mixerGetLineInfo((HMIXEROBJ)hMix, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);

// コントロール取得
MIXERLINECONTROLS mxlc;
MIXERCONTROL mxc;

mixerGetLineControls((HMIXEROBJ)hMux, &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);

// 入力ソース情報取得
MIXERCONTROLDETAILS mxcd;

mixerGetControlDetails((HMIXEROBJ)hMux, &mxcd, MIXER_GETCONTROLDETAILSF_LISTTEXT);
mixerGetControlDetails((HMIXEROBJ)hMux, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE);

で、MIXER_GETCONTROLDETAILSF_LISTTEXTで取得した構造体の
dwParam1がラインID, dwParam2がコンポーネントタイプになっているようなので、
dwParam2がMIXERLINE_COMPONENTTYPE_SRC_MICROPHONEになっているインデックスを探し、
MIXER_GETCONTROLDETAILSF_VALUEで取得した配列の該当のインデックスの値を変更して
mixerSetControlDetailsという手順でマイクを録音デバイスとして選択できました。
要するに入力デバイスでコンポーネントタイプを頼りにマイクを判断しています。

ところが全ての音を録音するデバイスは、サウンドカードというかドライバーによってコンポーネントタイプが
「ANALOG」だったり「UNDEFINED」だったりするし、名前も「ステレオミキサー」、「 What U Hear」など様々です。

何か判断する基準というか、こんな方法で(ある程度にしろ)判断できるという方法はないでしょうか?
教えて君で申し訳ない。
>>802
何か、それっぽいことやってるサンプル付き
ttp://www.nitoyon.com/vc/tips/ie_component.htm
824802:02/10/30 23:59
>>823とその他の方
いろいろありがdございます他。
COMは全然わかんないけど、この機会に手出してみようと思います。
825デフォルトの名無しさん:02/10/31 00:14
エディットボックスとOKボタンだけのダイアログボックスを作りました。
それを起動するとOKボタンのほうにフォーカスが行っています。
起動して即座にエディットボックスから文字を入力したいので、
起動直後にカーソルをエディットボックスのほうに移動したいんですが、
そんなAPIあったら教えていただけないでしょうか?
>>825
SetFocus
826さんありがとうございます。SetFocusでいけました。
828卍曹操卍 ◆ruManjiTBY :02/10/31 00:23
これ、なんかいけないらしい。どこがいけないかお前ら教えろ。

while (GetMessage(&msg, NULL, 0, 0)) {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
828=GetMessageをMSDNで引かないアフォ
GetMessageは失敗時に -1を返す。
831卍曹操卍 ◆ruManjiTBY :02/10/31 00:37
するってーと、こうかな?

while (GetMessage(&msg, NULL, 0, 0)) {

  if (GetMessage(&msg, NULL, 0, 0) == -1)
  BEGIN
    ああん、抜けちゃう抜けちゃう処理;
  END

  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
832デフォルトの名無しさん:02/10/31 00:38
>>825
タブオーダーちゃんと設定してください、おながいします。
ダイアログの場合はOnInitとかで指定するんじゃなかったっけ?
>>834
単にリソースファイルで定義された順がタブオーダー
>>834
デフォルトのアイテムにキーボードフォーカスを与えるかどうかを
WM_INITDIALOGの戻り値で指定できるけど
アイテムの指定はできないね
>>836
デフォルト以外に与えたいときは
SetFocusしてFALSEを返すってことだから。
でもデフォルトがフォーカスを与えたいアイテムになるよう
タブオーダを設定してほしいね。
>>381
それは、ダメだろう。
GetMessage は、メッセージキューからメッセージを取り出す関数だぞ。
839デフォルトの名無しさん:02/10/31 09:40
>>831
こりゃまたバカ全開だな。
つーかMSDNにサンプルが出てるだろ
>>381
BEGIN、END ってあたりがそもそもおかしい。
擬似コードだろ。
それを言い出したら識別子に日本語を使ってるのがおかしい。
したら何故 while のくくりは { } のまま?
まあ何にしろ 831 は・・・
大変初歩の質問で申し訳ないですが教えて下さい。
枠もタイトルバ-も持たないウインドウを作成したいのですが
CreateWindowExでdwExStyleとdwStyleに0を指定しても
枠とタイトルバ-が付いてしまうんです。

hWnd_Mem = CreateWindowEx(0,Name_Mem,NULL,0,Left,Top,Width,Height,NULL,NULL,hInst,NULL);

Name_Memが指すウインドウクラスのStyleも0にしています。
どこか違っている所があるのでしょうか?
WS_POPUP
スタイルに何も指定しないと、デフォルトっぽいスタイルが適用されるんじゃないの?
WS_OVERLAPPED=0だからだよ。
だからWS_POPUPを指定しろ
>>845
出来ました。有難う御座います。
VBのFormに似せたclassを作ろう思っているのですが
ウィンドウスタイルだけで覚える所有りすぎです・・
次はSetWindowLongに挑戦してみます。
849アルファボンド:02/10/31 14:15
教えて下さい。プリンタの設定の初期値はどうやって変更するのですか?
OSはWindows2000です。

DocumentPropertiesはローカル変数のDEVMODEを設定してくれるだけですよね?
苦し紛れにレジストリ
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers\<プリンタ名>\Default DevMode
を、DEVMODEWと仮定して変更してみたんですが、Windowsを再起動しないと反映
されません。
SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PRINTER, "<プリンタ名>", NULL);
してみましたが関係ないみたいです。

誰かご存知ありませんか?
850デフォルトの名無しさん:02/10/31 15:26
ビットマップリソースからヘッダ情報を取得したい場合、
Find -> Load -> LockResourceの戻り値のポインタを使えばいいんですよね?
VCのリソースエディタでダイアログボックスを作りました。
最大化ボタンを無効化したのですが、
タスクバーを右クリックすると最大化が可能なのです。

無効化する方法知っていらっしゃる方いませんでしょうか
>>851
リソースエディタのスタイルでチェックを外せば、
最大化は出てこないはずだけど・・・
>>852
今やってみたら選べなくなってました。
学校でコンパイルしたときは確かに選べた(最大化したのも見た)のに…。
フォルダごとコピったものだから中身も変わってないはずなんですが

お騒がせしました
854デフォルトの名無しさん:02/10/31 22:53
ダイアログベースのプログラムでダイアログを常に手前に表示するように
SetWindowPos(hWndDlg, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
とプロシージャ関数内に書き込んでそのプログラムでメッセージボックスを開くと
開いたメッセージボックスが操作不能になってしまいます。
これは、ダイアログが常に手前に表示されているからなんでしょうか?
常に手前を解除してからメッセージボックスを表示させたらうまくいくのかと思ったんですが
解除の方法がわからなくて。どうしたらよいでしょう。
>>854
とプロシージャ関数内に書き込んでそのプログラムでメッセージボックスを開くと


856354:02/10/31 23:07
書き方まずかったでしょうか(汗、簡単に言うとSetWindowPosで常に手前に表示されるよう
に設定したダイアログベースのプログラムからメッセージボックスを表示させると
メッセージボックスが操作不能になる、ということなんですが。変?
857854:02/10/31 23:08
↑の354は854の間違いです。
>>854
試したことないけど、メッセージボックスも常に手前表示
にすればいいんじゃないの?
MessageBoxのパラメータで指定できたはず。

または、ダイアログ側を解除するなら
SetWindowPos(hWndDlg, NULL, 0, 0, 0, 0,
SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);
859858:02/10/31 23:41
ごめん、↑は間違いなので訂正。
SetWindowPos(hWndDlg, HWND_NOTOPMOST, 0, 0, 0, 0,
SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);
860デフォルトの名無しさん:02/10/31 23:44
フロッピーディスクをコピープロテクトをかけて、特殊フォーマット
かけるソフトをVC++で作ろうと思っているのですが、FATやらなんらや
で良くわかりません。大まかで良いのでアドバイスをいただきたいです。

環境はWin2000のVC++6.0です。

よろしくお願いします

C++相談室から勧められて来ました。マルチじゃありません。
>>860
まずファイルシステムの勉強。
それとそれをいじるプログラムをいくつか書いてみる。

話はそれからだ。
>>860
AbsoluteWrite
AbsoluteRead
>>860
Wizardで楽勝!
>>854
TopMostのウィンドウをオーナーに持つダイアログもTopMostに
なるんじゃないの? ちゃんとオーナー指定してる?
865854:02/11/01 00:44
自己解決しました。
SetWindowPosをプロシージャの真下に書いていたのが問題でした。
WM_INITDIALOG内に書いたら普通に動きました。
>>865
>プロシージャの真下
自分言語がお好きなお方で。
867デフォルトの名無しさん:02/11/01 01:00
Zオーダーが小さいウインドウ(アクティブなウインドウの後ろにあるウインドウ)に
クリップボードの「貼り付け」の指示を送りたいんだけど、
・後ろのウインドウのウインドウハンドルを取得
・そのウインドウハンドル宛にWM_PASTEをSendMessage
でいけるのかな?さっき適当にやってみたらダメだったんだけど・・・。
"Game Modeling Using Low Polygon Techniques"
http://www.charlesriver.com/titles/lowpolygon.html
>>867
HWND omancho;
omancho=FindWindow(NULL,"無題 - メモ帳");
omancho=FindWindowEx(hwndnp,NULL,"Edit",NULL);
PostMessage(omancho,WM_PASTE,NULL,NULL);
いったん表示したポップアップメニューのアイテムを
タイトルで並べ替えるにはどうしたらよいのでしょうか。
ご存じの方いらっしゃいましたらどうか御教授ください。
GetMenuItemInfo()

RemoveMenu()

並べ替え

InsertMenu()

DrawMenuBar()

(゚д゚)ウマ- ・・・かどうかは試してないから知らん
RealPlayerのウインドウのように
左上のアイコンを独自の巨大な物にして、
さらにメニューが隠れるのを防ぐために右にずらしたいのですが、、、
前者はWM_NCPAINTを乗っ取ることにしても、後者の実現方法が分かりません。
ちょっと上手く説明できなくて申し訳ないですが、どなたかお願いします。
>>872
想像だけど、あれはタイトル無しのウィンドウに根性で全部描画してるんじゃないの?
>>872
先頭にタイトルが空白のメニューを入れて、DISABLEDにしといたらどうか?
試してないけど。
>>873
その通り。なんちゃらhittestとか乗っ取って移動とかさせてる模様。
スタイルにWS_CAPTIONついてるが?
>>876

場所だけ確保してるのね。

NCPaint とかで独自に描画してる
Win95でも、タイトルバーがグラデーションになるし
うむ。
漏れは画面のデザインでグラデーションなしにしてるのに、
こいつだけグラデーションになってるな。
SystemParametersInfoでシステムの設定を見て動作を分けろって
MSは言ってるね
age
>871
ありがとうございます。残念ながら上手くいきませんでした。
メニューの表示がぐちゃぐちゃになってしまいました。
ウィンドウズのスタートメニューでできているのですから何らかの方法はあると思うのですが。
883871:02/11/03 05:11
>>882
実は漏れ、動的メニュー使ったこと無くて、適当言ってたよ。スマン。
でもあれくらいなら MSDN 検索ですぐ出てくるから。

スタートメニューはメニューポップアップじゃなくて、独自のウィンドウ
じゃないのか?
ファイルやショートカットのドラッグ&ドロップもできるし。
>>873-879
そうなんですか、どうもでした。
全部自前だとめんどくさいですね(汗

メニューの位置ですが、空白メニューだと
フォントのサイズに左右されると思うのですが
システムの設定でフォントのサイズを変更しても
綺麗な位置に描画されているみたいでした。

メニューも根性で描画しているのでしょうか
それだとさすがに諦める気になります。
885871:02/11/03 08:53
>>882 これで許してくれ。 ウィンドウメニューの最初のポップアップを昇順降順交互に並べ替える。
struct MenuItem { MENUITEMINFO mi; char name[256]; };
int CompareMenuItemA(const void *elem1, const void *elem2)
{
return strcmp((*(MenuItem**)elem1)->name, (*(MenuItem**)elem2)->name);
}
int CompareMenuItemD(const void *elem1, const void *elem2)
{
return strcmp((*(MenuItem**)elem2)->name, (*(MenuItem**)elem1)->name);
}
void ProcessMenu(HWND hWnd)
{
static BOOL ToAscend = false; int i;
HMENU hMenu = GetSubMenu(GetMenu(hWnd), 0); int MenuCnt = GetMenuItemCount(hMenu);
MenuItem *Items = (MenuItem*)malloc(MenuCnt * sizeof(MenuItem)), **ItemIdx = (MenuItem**)malloc(MenuCnt * sizeof(MenuItem*));
for(i = 0; i < MenuCnt; i++)
{
memset(&Items[i], 0x00, sizeof(Items[i]));
Items[i].mi.cbSize = sizeof(Items[i].mi);
Items[i].mi.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE;
Items[i].mi.dwTypeData = Items[i].name;
GetMenuItemInfo(hMenu, i, TRUE, &Items[i].mi);
GetMenuString(hMenu, i, Items[i].name, sizeof(Items[i].name), MF_BYPOSITION);
ItemIdx[i] = &Items[i];
}
if(ToAscend = !ToAscend) qsort(ItemIdx, MenuCnt, sizeof(*ItemIdx), CompareMenuItemD);
else qsort(ItemIdx, MenuCnt, sizeof(*ItemIdx), CompareMenuItemA);
for(i = MenuCnt; i > 0; i--) RemoveMenu(hMenu, i - 1, MF_BYPOSITION);
for(i = 0; i < MenuCnt; i++) InsertMenuItem(hMenu, i, TRUE, &ItemIdx[i]->mi);
DrawMenuBar(hWnd);
free(Items); free(ItemIdx);
}
>>884
オーナー描画にして、WM_MEASUREITEMで適切な幅を返してやるってのは?
887デフォルトの名無しさん:02/11/03 12:14
リソースエディタからSysListView32を挿入するにはどうしたらよいのですか?
ListBoxや、ActiveXコントロールのMicrosoft ListViewというものなら挿入
できるみたいなのですが。SysListView32の挿入の仕方がわかりません。
あと、ActiveXコントロールのListViewというのはSysListView32に比べて
どういう利点があるのですか?
>>887
スレ違い。
>>888
すみませんでした。別のスレで質問します。
>>888
確かに微妙に違うが、他に適切なスレは無いだろ・・・

>>887
普通にリストビュー挿入出来ないか?
つか、開発環境とバージョンを書きなさい
891デフォルトの名無しさん:02/11/03 17:24
%windir%hogeを渡せばc:\windows\hoehogeを返してくれるようなAPIはありますか?
自分で%windir%を置き換えるしかないでしょうか。

× c:\windows\hogehoge
○ c:\windows\hoge
>>890
> 確かに微妙に違うが、他に適切なスレは無いだろ・・・
アホですか?リソースエディタの使い方の質問だぞ?
その開発環境のスレで訊けばいい話。
仮に開発環境スレを探して見つからなかったというなら
質問にその旨を明記してるはず。というか明記すべき。

>>891
ExpandEnvironmentStrings
894888:02/11/03 20:22
>>890
おっしゃる通り普通に出来ました。
大きいアイコンの表示になっていたので気付かなかっただけでした。
どうもありがとうございます。
>>893
単にスレ違いだと気付いてなかっただけです。すみません。
895デフォルトの名無しさん:02/11/04 22:24
GetForegroundWindow
GetCursorPos
ScreenToClient
ChildWindowFromPointEx
を使ってカーソル位置のハンドルを取得することはできたのですが
もっとシンプルな方法ありませんか?
>>895
GetCursorPos()
WindowFromPoint()
897895:02/11/04 23:04
探していたものはまさにこれです。
ありがとうございました
898895:02/11/04 23:14
探していたものはまさにこれです。
ありがとうございました。
ファイルを開くダイアログの初期サイズをアプリケーション毎に記憶させたいのですが
どのタイミングでサイズの取得・復元を行えばよいのでしょう?
フック関数には WM_DESTROY が送られてこないようだし、
CDN_INITDONE 受信時にダイアログのサイズを変更すると
プレースバーの表示がおかしくなってしまいます。
どなたか良きアドバイスをお願いします。
>>885
ありがとうございます。あいかわらず苦戦中です。
最初のポップアップメニューの WM_MENURBUTTONUP 内で2つ目のポップアップメニューを表示し
2つ目のポップアップメニューで [並び替え] を選択したときに
1つ目のポップアップメニューを表示状態のまま整列して再描画させたかったのですが
表示中のポップアップメニューにはどうも DrawMenuBar() が通用しないようです。
ウィンドウズのスタートメニューをもう少しとよく調べてみます。
どうもありがとうございました。

そこで追加質問なのですが
ウィンドウズのスタートメニューのように非アクティブになると消えてしまうウィンドウは
どうやって spy しいたらよいのでしょうか?
二つの子ウィンドウがあります。
リストビューウィンドウにファイルリストを表示してあり、ファイル名をクリックで
WM_NOTIFYを処理し、エディットウィンドウに内容表示しています。(これはできた)

  case WM_NOTIFY:
     lpnmhdr = (LPNMHDR)lp;
     if (lpnmhdr->code == NM_CLICK )...

さてリストをカーソルで移動しただけで(選択状態で)エディットウィンドウに
表示したいんだけど、選択項目が変わった時のメッセージ?などがわからず進めません。
よろしくおねがいします。
LVN_ITEMCHANGED
Microsoft Control Spyを持っておくと便利
質問お願いします。当方、他アプリのキー入力を監視して、
特定のキー入力を無効にする様なツールを作っています。

しかし、WH_GETMESSAGEでフックした場合はキー入力を無効に
出来ませんし、WH_KEYBOARDでフックした場合は、無効にはできたのですが、
今度はどのアプリでキーが入力されたのかを知る手段がありません。

WH_MOUSEの、MOUSEHOOKSTRUCTのメンバhwndの様に、
キーボードフックで、入力先のHWNDを取得する方法は無いのでしょうか?
904デフォルトの名無しさん:02/11/05 10:18
age忘れすいません
>>903
GetForegroundWindow()
GetWindowLong()
906903:02/11/05 11:09
>>905
な、なるほど…。別の方法で取得すれば…。
おかげでようやく進めそうです。ありがとうございました。
質問させていただきます。
通信ゲーを作っていて、プレイヤーではなく、PCを識別する方法を探しています。
同じPCからのアクセスは弾きたいということです。
そこで例えばHDDのIDや、OSWindowsのIDなどを取得する方法はありますでしょうか。
(ID自体あるのか知りませんが…)

一番最初にネットワークカードのマックアドレスを思いついたのですが、
複数枚刺しているのも珍しくないですし

・関連質問(ちょっとスレ違い?)
Winsockで繋いだとき、相手のマックアドレスを取得できますが、
ルーターをかましている場合ルーターのマックアドレスですよね…?

クキー使え。
>>907
否定だらけだから最初に謝る。すまん。

HDD は、RAID なんかされてると ID なんていくらでも偽造可能。
Windows はプロダクト No. があるけど、これはいくらでもピーコ可能。
PentiumIII では CPU ごとにシリアル番号振られてるけど、通常は BIOS で
使用不可に設定されてる。
ネットワークカードの MAC アドレスは、複数挿しのでも最初の番号を取ればいいだけ
だけど、大抵のカードで任意の MAC アドレスが設定可能。
ルータをはさんでれば当然その MAC アドレス。

単に、同じ PC で 2つ以上同じプログラムを起動されたくない、という話なら、
そのプログラムに CreateMutex() 仕込んで重複起動を防止すればいい。
>>908
907 は、HTTP とは一言も言っていないと思うぞ。
IPアドレスで認識しとけば?
>>911
ルーター通してる場合はどうするよ? サポート対象外?
>>909
>だけど、大抵のカードで任意の MAC アドレスが設定可能。

メーカーでもないのにそんなん手軽にできんの?
>>913
ドライバの設定で簡単に変更できるのが結構あるよ。
ルータもね。
色々な方ご検討ありがとうございます。
やはり識別は難しいですね。マックアドレスまで偽造可能とは参りました

CreateMutexなどの多重起動防止は、意外とさっくり回避できる上、
たしかXPで別ユーザーで起動するのは防げないとか聞いたことがあります。

>Windows はプロダクト No. があるけど、これはいくらでもピーコ可能。
これがちょっと気になります。
つまりピーコしたWindowsをインストしてる同士だとNo.が重なるということでしょうか。
OSをピーコしてる人なんぞ無視したいところですが
>915
別に書き換え可能でも問題ないんじゃないか?
起動時だけでなく時々取得し直せば?

917デフォルトの名無しさん:02/11/06 08:47
const修飾子?について質問させてください(スレ違いぽいかも。すみません)。
初歩的質問ですが、よろしくお願いします。

スレッドBからスレッドA(WinMain・プロシージャ含む)に文字列を渡す、
といった状況なのですが、
const char *型は、ポインタではなくポインタの指す対象が定数になるという?
記述をMSDNで読み、最近知りました(初歩だとは思うのですが)。

ただ、不思議に思ったのですが、スレッドBの関数hogeがLPCTSTR型で受け取った
文字列ポインタlpctstr_Hoge(hoge()を呼んだ関数が、char型配列(const宣言でもstatic宣言でも
ない)で宣言した文字列をLPCTSTR型にキャストしてhoge()に渡したもの)を
PostMessage(hwnd, WM_HOGE, (WPARAM)lpcstr, 0)でスレッドAのウインドウプロシージャに
渡すと、対象の文字列の内容が破棄されておらず、内容が保持されていました。

私としては、PostMessageした側(hoge())が終了しているだろうから文字列の内容は
破棄されていると思っていたのですが、これは一体どういうことなのでしょうか??
hoge()を呼んだ関数のchar配列が定数になっているのなら、次に同じ処理を行ったとき
どうなるのでしょうか。かなりバカな質問だと思うのですが、理解するヒントが頂ければ
幸いに思います。よろしくお願いします
918917:02/11/06 08:50
×PostMessage(hwnd, WM_HOGE, (WPARAM)lpcstr, 0)
○PostMessage(hwnd, WM_HOGE, (WPARAM)lpctstr_Hoge, 0)
>>915
 CreateMutexでの多重起動防止の回避ってどうやるんでしょうか。
 興味があります。
 XPなどで別ユーザーでの多重起動防止は、CreateMutexに使う文字列に Global\
を前置すれば、可能なはず。
920901:02/11/06 09:44
>>902
助かりました。Spyしてみます
>>917
説明が要領を得ないからよくわからんが、問題はちゃんと切り分けろ。
型が const か否かと、その実体が破棄されるか否かは全く別の話だ。

で、メッセージループを持つスレッド A が PostMessage() のメッセージを
受けた時点で、「hoge() を呼んだ関数」 はまだ生きてるの?
焦点はそこ。
hoge() そのものが終了しているかどうかは全く関係無い。

void foo()
{
 char str[] = "abcde";
 DoSomething1();
 hoge((LPCTSTR)str);
 DoSomething2();
}

str がいつ破棄されるのか考えてみたら?

ちなみに、スレッド A がメッセージを受理してる時点で foo() までも終了
しているなら、間違い無く破棄されている。
スタックに残骸が残っていて、破棄されてないように見えてるだけかも知れない。
922デフォルトの名無しさん:02/11/06 14:34
>>hoge()を呼んだ関数
すみません、そうでした。

タイミング的には確実に、hoge()を呼んだ関数は終了しているはずで、
プロシージャを1秒Sleep()させても、同じく内容が残っていました。
>>922
だったら、コレじゃないの?

> ちなみに、スレッド A がメッセージを受理してる時点で foo() までも終了
> しているなら、間違い無く破棄されている。
> スタックに残骸が残っていて、破棄されてないように見えてるだけかも知れない。

SendMessage() じゃダメなの?
924917:02/11/06 15:06
>>SendMessage()じゃ
その方がよさげなのですが、どうなるか試すつもりでPostにしてみました。

すみません、言われる通り説明不足でしたので追記させて下さい、
>>921さんが書いてくださった例のように、strはconstとかでないchar配列で、
foo()からhoge()にLPCTSTR型にキャストして渡したのですが、
LPCTSTR型にキャストしたことによって残った、というのは有り得ない話でしょうか、
LPCTSTR型はconst char *型に近いようなものだと覚えていますが、
const修飾子のことがよくわかっていないもので・・・
他にも色々試してみることにします。
>>924
あり得ないって。
912 にちゃんと書いてあるでしょ。

> 型が const か否かと、その実体が破棄されるか否かは全く別の話だ。

const は、プログラムの上から値を変更できないっていう制限の話。
実体が破棄されるか否かは、変数のスコープの話。
926917:02/11/06 15:21
>プログラムの上から値を変更できない
なるほど、やっと理解できました。
長々とお付き合い頂いてありがとうございます。
スタックに残っているというだけなら、念のため、
SendMessage()に書き換えておこうと思います。
ありがとうございました。
927デフォルトの名無しさん:02/11/06 17:28
ウィンドウのリサイズ開始
 ↓
MINMAXINFO設定(A)
 ↓
ユーザによるウィンドウサイズの変更
 ↓
MINMAXINFO更新(B)

サイズ変更中は(A)の設定が使われるようですが、こういう仕様ですか?
またトラッキング中に(B)の設定を逐一反映させたいのですが、できませんか?
928デフォルトの名無しさん:02/11/06 17:56
Win32APIで線を描画するときに、
アンチエイリアスをかけてくれるようなAPI、
あるいはペンの設定などがあれば教えてください。
>>927
WM_SIZING
930デフォルトの名無しさん:02/11/06 18:14
>>927
MSDN
MSNメッセンジャーみたいに
ポップアップで通知するのってどうやってやるの?
シリアルで半2重通信を行いたいのですがうまくいきません。
私がやろうとしていることは、送信時にRTSをLowにて送信し
送信が完了するとRTSをHighにするといったものです。
DWORD rcnt;
EscapeCommFunction( RsHandle, CLRRTS );
WriteFile( RsHandle, Buffer.c_str( ), (DWORD)Buffer.Length( ), &rcnt, NULL );
EscapeCommFunction( RsHandle, SETRTS );
これだとデータが全て送信される前にRTSがHighになってしまって
WriteFileは送信バッファーに入れるだけで、実際にデータを
吐き出していない感じです。
これをデータが全て吐き出されてからRTSをHighにするには
どうしたらいいのでしょうか?よろしくお願いします。
933927:02/11/06 20:06
>>929 ども。これで何とかなりそうです。
>>932
シリアル通信の送信バッファって、
デフォルトは0だった気がするのだが・・・。
とりあえず、WriteFileの戻り値と、
書き込んだバイト数をチェックしてみたら?
936932:02/11/06 20:23
>>934
ありがとうございます。
早速みてみます!
>>935
そうなんですよ(;´Д`)
全て0で返ってきてます・・
>>936
それって、単に何かミスって関数失敗してるんでないの?
GetLastError()してみた?
938932:02/11/06 20:39
>>937
いえ、送信する関数は>>932の通りで実際にデータは送信されています。
しかしながらWriteFile後にEscapeCommFunction( RsHandle, SETRTS ); を行ったら
実際にデータが吐き出される前にRTSがHighになってる感じがします。

因みにボーレート9600で6バイト送信していますが、これだと最低6msはRTSが
Lowにならなければいけないはずなのに、なってくれないんですよ・・
>>938
漏れは使ったことないが、
WaitCommEventのEV_TXEMPTYでどうよ
940932:02/11/06 20:59
>>938
激しくそれっぽいです!
これって非同期で使うんですよねー?
さっそく試してみますー
941932:02/11/06 21:00
おっと失礼!
>>940>>938って>>939ですから(;´Д`)
>919
多重起動防止は実によくあるトピックなのでMSDNでもWebでも
多くの情報があります。検索してみてください。
「複数起動の防止」とか「二重起動防止」とか微妙に表現を変えると吉。

要注意なのは、OpenMutexの結果をチェックしてCreateMutexする
コードは間違ってるってこと。
#なんであんなコードが出回ってるんだろ。
>>942
漏れはCreateMutexしてGetLastErrorで見てるけど、
OpenMutexはどうダメなの?
944919:02/11/07 02:00
>>942

 多重起動防止の方法については知っていますが、
これを回避する方法というのに興味があったのです。
 多重起動防止にMutexを使った場合、回避は相当に
大変だと思うんですが。
>>943
可能性としては低いけど、OpenMutex() と CreateMutex() の間で他の
コンテキストが CreateMutex() しちゃう可能性があるから、チェックとして
成り立たないって事だろ。
同じルーチンを複数のスレッドが通る時なんか特に。

>>944
一体何が大変だと思うの?
CreateMutex() 実行して、すでにミューテックスが作られているなら即終了
で何か問題あるの?
946945:02/11/07 02:24
ごめん、よく読んでなかった。
「回避の方法」 ね。
それは漏れも知りたい。
947デフォルトの名無しさん:02/11/07 08:36
C++板からきました
timeGetTime() ってどのくらいはかれるんでしょうか?一時間とかいけるのでしょうか?
計ってる間に49.7日をこえたりしなけりゃだいじょうぶでねーの。
>>942
一部のWin95環境で問題があるらしい
http://clearbrain.khsoft.gr.jp/any/history2001.htm
の2001/07/11
でもほとんどの人はそんな深い考えなんてなくて
競合条件という言葉すら知らないに1000Mutex
950943:02/11/07 09:32
>>945
なるほどね。ありがd
>>949
という事は、CreageMutex(FALSE) でミューテックス作成したのち、
WaitForSingleObject(0) が WAIT_TIMEOUT になるかどうかを調べ
たほうがいいのか?
952デフォルトの名無しさん:02/11/07 15:18
GetWindowLong(hWnd,GWL_STYLE)で得られるLONG値はどのように
計算された物なんでしょうか?
dwStyleをキャストしてSetWindowLongで渡すと暴走に近い予期せぬ動きを
してしまいます。
DWORD hoge=(DWORD)(GetWindowLong(hWnd,GWL_STYLE))|WS_CAPTION;
等とするとhogeはSetWindowLongで使える有効値になるようなのですが
dwStyleそのものを渡す事は出来ないのでしょうか?
>>951
なるほど。それなら完璧だ。
最初に作成したプロセスがそのまま所有権を持つ必要はないから
作成と所有権の取得はatomicでなくても問題ないな。
>>952
何が問題になってるのかわからないけど、SetWindowLong() ではちゃんと
GWL_STYLE を指定してる?
>>954
GWL_STYLE指定しています。
具体的には
SetWindowLong(hWnd,GWL_STYLE,(LONG)dwStyle);
が上手くいかないのです。
>>955
「hWnd パラメータで指定したウィンドウが呼び出し側のスレッドと同じプロセスに
属していない場合、SetWindowLong 関数は失敗します。」ってのは?
>>956
そのへんは問題無いと思います。
DWORD hoge=(DWORD)(GetWindowLong(hWnd,GWL_STYLE))|WS_CAPTION;
SetWindowLong(hWnd,GWL_STYLE,hoge);
このようにすれば反映されるんで・・・
これdwStyleの各定数を有効に変更された物と無効に変更された物とで
いちいち論理演算してやらないとだめって事ですよね?
それは面倒なのでdwStyleの値そのものが使えないかと思いましで
>>957
「dwStyleの値そのもの」ってdwStyleに何もセットしないでSetWindowLongに渡すってこと?
959957:02/11/07 16:14
された物 ×
したい物 ○
です。
あれ?これってもしかして激しくスレ違いの予感??
APIの問題じゃなくて論理演算の問題かな?
960gn355my0:02/11/07 16:14
>>957
> DWORD hoge=(DWORD)(GetWindowLong(hWnd,GWL_STYLE))|WS_CAPTION;
> SetWindowLong(hWnd,GWL_STYLE,hoge);
> このようにすれば反映されるんで・・・

今はどーやってんの?
今は
DWORD dwStyle;
SetWindowLong(hWnd, GWL_STYLE, (LONG)dwStyle);
ってやってるように聞こえる。
962957:02/11/07 16:17
>>958
説明下手ですみません。
dwStyleでCreateWidowしたウインドウに新たに計算した
NewdwStyleをSetWindowLongで渡すと言う事です
963957:02/11/07 16:21
DWORD dwStyle=WS_CAPTION|WS_SYSMENU;
SetWindowLong(hWnd,GWL_STYLE,(LONG)dwStyle);
ていうふうにやりたいんですけど・・
>>963
それだとCreateWindowに渡したスタイルが入ってないんじゃないの?
>>963
CreateWindowにはどんなスタイルの組み合わせを渡してるのさ?
966957:02/11/07 16:25
CreateWindowにはWS_POPUPが入っています
CreateWindowとCreateWindowEX...
>>963
じゃあ
DWORD dwStyle = WS_POPUP | WS_CAPTION | WS_SYSMENU;
SetWindowLong(hWnd, GWL_STYLE, (LONG)dwStyle);
では?

というか、いちいちCreateWindowに何スタイルを渡しているか調べなくてもいいように
GetWindowLong(hWnd, GWL_STYLE)で既存のスタイルを取得するんだけど・・・
969デフォルトの名無しさん:02/11/07 16:38
だれかそろそろ次スレ立ててくれ。
漏れのホストでは無理だ。
ほい、新スレ
Win32API 質問箱 Build7
http://pc3.2ch.net/test/read.cgi/tech/1036654893/
>>970
乙アリ
972957:02/11/07 16:50
すみません。MFCのソ−ス見て解決しました。
CreateWindowのdwStyleとGetWindowLongの戻り値とでは
スタイル=0の場合の初期値が違うようなのでこの戻り値は
使わなくてはいけないようです。
DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
DWORD dwNewStyle = (dwStyle & ~dwRemove) | dwAdd;
SetWindowLong(hWnd, GWL_STYLE, dwNewStyle);
ていう感じにするしかないようです。
レスくれた方有難う御座いました。
973942:02/11/07 22:39
だああ!919ちゃんと読まずにえらっっっっそうなこと書いてしまった。
激しく鬱。

…逝ってくる。
974945:02/11/07 22:51
>>973
漏れも同罪だ。
>>919
多重起動防止の回避?多重起動防止をしなけりゃいいんじゃねぇ?
それとも、多重起動防止策が施されたアプリを多重起動したいってことか?
→そんなことしてどうなる?
976デフォルトの名無しさん:02/11/08 16:41
DLLのCランタイムを使っている時の、CreateThreadと_beginthreadexの違いって、なあに?
そんなの、CRTのソース嫁よ。一目瞭然だろうが。
978デフォルトの名無しさん:02/11/08 17:05
つーと?
ランタイムDLLのエントリー関数で初期化されるから_beginthreadexつかう
必要性を感じないんだが。
あー確かに、beginthread*を使う必要はない。
ただその理由は、「ランタイムDLLのエントリー関数で初期化されるから」
ではない。

というか、何がエントリー関数で初期化されるといいたんだ?
このコードはリンクするライブラリをマルチスレッド対応版にするだけで動くんだが何故だ?
DWORD WINAPI TestFunc(LPVOID ThreadData)
{
ThreadInfo &Info = *(ThreadInfo *)ThreadData;
std::string RetStr("result: "); const char *sep = ",";
char IDBuf[64]; sprintf(IDBuf, "Thread 0x%08X Info", GetCurrentThreadId());

WaitForSingleObject(Info.hMutex, INFINITE); Sleep(100); char *s = strtok(Info.TestStr, sep); ReleaseMutex(Info.hMutex);
while(s) {
RetStr += s; RetStr += " - ";
WaitForSingleObject(Info.hMutex, INFINITE); Sleep(100); s = strtok(NULL, sep); ReleaseMutex(Info.hMutex);
}
MessageBox(NULL, RetStr.c_str(), IDBuf, MB_OK);
return 0;
}
int main()
{
DWORD Thread1ID, Thread2ID; HANDLE hMutex = CreateMutex(NULL, TRUE, NULL);
ThreadInfo Info1 = { hMutex, "ab,cd,ef,gh" }, Info2 = { hMutex, "12,34,56,78" };
HANDLE hThread1 = CreateThread(NULL, 0, TestFunc, &Info1, 0, &Thread1ID);
HANDLE hThread2 = CreateThread(NULL, 0, TestFunc, &Info2, 0, &Thread2ID);
ReleaseMutex(hMutex);
WaitForSingleObject(hThread1, INFINITE); WaitForSingleObject(hThread2, INFINITE);
return 0;
}
981980:02/11/08 18:31
書き忘れ。
struct ThreadInfo { HANDLE hMutex; char TestStr[12]; };

_beginthreadex() って要らないの?
>>919
ニュアンスがよく分からんが、プロセス注入→ReseaseMutexなんてどうっすか?
>>982
「プロセス注入」 って何?
ゲームの二重起動を回避するのに、そのゲームをAPI SPYでAPIの流れを見てMutexの文字列を取得し、バイナリエディタでMutexの文字列を検索、変更したものを作って二重起動できるように改造した。
多分そーゆー問題じゃないと思うけど、とりあえず。
(´-`).。oO(書くなよそういう事・・・誰が見てるかわからないんだから。。。)
986デフォルトの名無しさん:02/11/08 19:49
>>979
> というか、何がエントリー関数で初期化されるといいたんだ?

CRT_INITとか呼ばれてるんだが…
以前、_beginthreadexつかってたら、CRT_INITがスレッド作るたびに2回呼ばれてて、
それ以来、CreateThread使ってる。
987デフォルトの名無しさん:02/11/08 19:50
>>980

名前を指定してCreateMutexしなきゃ
>>987
名前付きミューテックスと名前無しミューテックスとで、何か動作が変わるの?
>986
その先のはなし。
CRT_INITは、DLL_THREAD_ATTACH時には、
ホトンド何もしないで帰るはずだが。
WaitCommEvent
EscapeCommFunction
を使っているアプリを作ったのですが、どうもWin2000では
動作していないように思えます。
Win2000でこれらのAPIを動かすにはどうすればいいのでしょうか?
>>983
すまん、一般用語だと思い込んでたが、ググッても全然引っかからなかった。
SetWindowsHookEx等使って、他のプロセス上で独自の実行コードを走らすテクのことを言いたかった。
>>984
忠告ありがとう。これからは気をつけるよ。
>>990
もう寿命ないから次スレ逝ってね。
http://pc3.2ch.net/test/read.cgi/tech/1036654893/l50

>>991
「フックでコンテキスト取る」 みたいな言いまわしがわすりやすいと思う。
っていうか 「注入」 という言葉で表現するような処理内容じゃないぞ。
「侵入」 のがまだいいと思う。
994
じゃ、995
じゃあここらで俺が体験したちょっとHな話でもするか。
高校生のときの話なんだけど、25歳の女の先生がいたわけ。
俺のクラスの副担任で、
その先生の担当する(俺のクラスではない)教室があるんだけど、そこの掃除も
俺のクラスがやんなきゃならないのさ。
んで、いつものようにその教室の掃除当番だったので行った。
でも他の奴はみんなさぼって行ったのは俺だけだったのよ。
当時の俺は、
真面目ってわけでもなかったけど、そういう当番は割とちゃんと行ってた。
で、そうなるとその教室には俺とその25歳の先生しかいなくなるわけだ。
人があまりいない放課後によ。
その先生、特別美人てわけじゃないんだけど、小柄でかわいい系の人だった。
んで、掃除も終わりかけてさぁ帰ろうかってところで、
999!!!!!
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。