1 :
デフォルトの名無しさん :
02/09/21 04:03
2 :
デフォルトの名無しさん :02/09/21 04:18
2ゲットし放題!
3 :
デフォルトの名無しさん :02/09/21 04:25
4 :
デフォルトの名無しさん :02/09/21 04:30
>>前スレ973 それが出来ないから困ってるんですよ たとえばMSゴシック11ptだと全角の幅=半角*2にならないので、 GetTextExtentPoint32等を含む通常のAPIでは描画結果がずれるのです。 なので、手動で補正もしくはExtTextOutで強制的に幅を指定しないといけないのですが、 自前で調整するには文字が半角か全角かを判別しなければなりません。 で、SJISだけなら問題なかったのですが、UNICODE(UCS2)だと、 すべての文字が2byteで表されるわけで、困っちゃったな、ということです。 プロポーショナルだと楽なんですが、そういうわけにも行かないので。
取得したいのは論理単位でです。 おなじ12ptでもフォントによってTEXTMETRICのtm.tmHeightは異なるので 上限があるのかなと思ったのですが… 高さの上限は決められていないのでしょうか。 わかる方お願いします。
>>5 Unicode文字をANSIに変換してバイト数を得るのはまずいのか?
でもあんただったらそのくらい分かりそうから、ボツなんだろうな。
9 :
デフォルトの名無しさん :02/09/21 04:45
10 :
デフォルトの名無しさん :02/09/21 04:46
>>7 どうもありがとうございます
早速DLさせてもらいます
>>6 フォント作成時にサイズを-xとかにしたら?
>>8 UNICODE化の目的は似非I18nなので、
UNICODE->ANSI(SJIS)にマッピング出来ない文字もあるわけでして…
スクロールバーをつまんでで移動したとき 漏れのアプリだとボタンを話すまで再描画されないのだが 他のアプリは バーが動くとすぐ描画されてる気がする なんか指定しないといかんの?
SetScrollInfoでSIF_TRACKPOSを指定してないとか
>>5 固定ピッチなら、明らかに半角であると分かっている文字の幅より
広ければ全角とみなして構わないのではないか?
16 :
デフォルトの名無しさん :02/09/21 08:47
ListViewで、特定の行だけ色を変えたいんですが どうすればいいでしょうか。 ListView_SetTextColorとかだと全体が色変わっちゃうし。
>>15 なんかしょぼ〜んだけど、以外とそれが正解クサイかも
全角半角の整合が取れなくても、それぞれ半角同士全角同士は整合取れてるはずだから。
サンクス!
>>前976
>>18 どうもです。
しかし、これを見ると文字幅は一意に決定することが出来ないようですね。
emacsのように独自の多言語コードに変換するのがスッキリしているみたいです。
FIXED PITCHという文化とWin(覗くXP)のフォントが憎くなってきました。
>>6 LOGFONTの説明を見れ。フォントマッパは指定されたサイズを越えない
最大のフォントを探すとある。だから、12ptと指定したなら最大のサイズは
12ptなんじゃないの? 論理単位で。
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の書籍でお勧めなのってありませんか?
>>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のようなメニューバーはなくて画面表示のみ、 それで、画面をクリックしながら動かせば移動が可能、とやりたいのです。
メニューバー?タイトルバー?
すみません。 タイトルバーのことです。 タイトルバーもメニューもない、内容だけのWindowを作って、 なおかつそれをドラッグで移動させたいのです。
>>33 case WM_NCHITTEST: return HTCAPTION;
WM_NCHITTESTでHTCAPTIONを返す FAQだな
かぶった
37 :
デフォルトの名無しさん :02/09/21 16:49
>>16 NM_CUSTOMDRAWを調べよう。
>>33 WM_NCHITTESTに対して常にHTCAPTIONを返すとか。
>>34 さん、
>>35 さん、
できました!
2時間悩んでいたので感激です!!!
どうもありがとうございました。
さらにかぶった。鬱。
>>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 レスどうもです。
文字の大きさを基準にスペースを決定したい場合は負数で、
スペースを基準に文字を収めようとする場合には正の数ということですね。
>>49 えっと、混乱してきました。
文字の高さ = otmMacAscent + otmMacDescent
セルの高さ = otmMacAscent + otmMacDescent + otmMacLineGap = tmHeight + tmExternalLeading
ですよね?
# 記号のスペースがtmInternalLeadingって事ですよね。
tmHeightにはtmInternalLeadingが含まれますが、
tmHeightを基準にするか(セル)、tmHeight - tmInternalLeading(文字)を基準にするかと言うことでしょうか?
そうだとすると、US ASCIIとかSJISの文字を表示するときはスペースの利用効率で負数を使って、
ウムラウト文字を含むような西欧文字を表示するときには正の数を使う、ってことですか。
最後の2行はなんか違う気がしてきました、 読み捨てて下さい
>>43 君がッ
LOGFONTのヘルプを見るまでッ
僕はッ
LOGFONTのヘルプを見ろと言うのをやめないッ!!
>>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 で、切れてもいいのか?
お前が何をやりたいのかさっぱりわからんのだが。
たしかに、具体的にやりたいことがあってそのやり方が分からない という時なら、それで事足ります。 でも、たまに暇な時に何となく説明を読んでたら 「おお、このコントロールにはこんな機能があったのか!」 みたいな便利機能発見して嬉しくなることができないなぁと。
>>61 MFCのドキュメント。
SDKとの対応がだいたい想像付く。その逆も。
>>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
>>72 そこまでバカではない。
>>71 エディットコントロールをですか?
それじゃ意味が無いような。
意味無いならやめろ。
>>70 ダイアログに置いてあるなら WM_GETDLGCODE をヘルプで見てみるとよいよ
自作のウィンドウクラスの中に置いてあるなら何もしないでも来るはず
ありがとう御座います。見てみますね。
>>70 WM_GETDLGCODEあたりの問題ですか?
げふぉ。
>>69 そしたらワードパッドと大きさが違ってくるんだろ。
ようするに要求が矛盾してるんだよ。
奴がやりたいことを整理して出直してくるまで放置だな。
80 :
デフォルトの名無しさん :02/09/23 02:31
>>79 やりたいこと。
・固定高の矩形内におさめる
・表示はワードパッドやIEで表示したものと同じ大きさで
これだけです。
この条件で「(矩形の高さの)上限は求められますか?」ということと、
「可能ならその方法を教えてください」というのが元の質問の意味です。
固定高にワードパッドやIEと同じ大きさというが、 固定高の高さによって表示が切れるのは当然だと思うが
上限があるかって質問なんだから「ありません。」で終わるやんか。 何をぐだぐだ言っとんねん。
まあ、アレだ。 その部分のソースを出せば解決するんじゃないのか?
84 :
デフォルトの名無しさん :02/09/24 03:07
理論的には、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
104 :
デフォルトの名無しさん :02/09/25 16:41
教えて君ですみませんが アプリケーションから(「に」ではありません)エクスプローラ,デスクトップ orETCにドラッグ・アンド・ドロップしてファイルコピーをしたいのですが・・・ SimpDNDサンプルだとコピー先のファイル名がスクラップになってしまいます どうしたらいいのでしょうか? 参考のURLがありましたら教えてください
105 :
デフォルトの名無しさん :02/09/25 21:42
ageます だれかおながいします
>>95 ありがとうございます。
今日さらに突っ込んで調べてみたら、確かにlStructSizeは拡張前76、拡張後88でした。
でも76じゃ、CommDlgErrorExの値が構造体サイズ不正だったんです。
おっしゃる通りlongで定義(←他でヒント見つけました)したら、構造体サイズエラーは回避できました。
が、今度は初期化失敗のエラーが。
原因がわかりそうになかったら、また質問させて下さい。
× CommDlgErrorEx ○ CommDlgExtendedError
>99 単に受信待ちしてて、受信後にメッセージ送るだけです。 通信せずに終わると比較的早く、何度か通信してからだと大抵遅くなります。
>>104 DoDragDrop()に渡すIDataObjectで、CF_HDROPフォーマット
に対応しろ。DROPFILES構造体あたりを調べてみろ。
あとは必要に応じてCF_IDLISTにも対応(コピーだけなら不要)。
コピーだけなら CF_FILECONTENTSというのもあるが
これはあまりおすすめできんぞ、ボケナス。
111 :
デフォルトの名無しさん :02/09/26 02:19
104ではないですが。 DragFinish() って内部では何をやっているんでしょうか? GlobalFree()? GlobalUnLock()?
自己レス。GlogalFlags() で調べたら GlobalFree() のようでした。ども。
113 :
デフォルトの名無しさん :02/09/26 10:19
windowsのコンソールアプリでパイプ使いたいんですけど どうすればいいんですか?
あ、これだけじゃわかりませんね。 アプリからコプロセスを起動して、その標準出力を取りこみたいのです。
あ、popenってwindowsにもあるみたいですね。 お騒がせしました。
でもMSDNのpopenのサンプルがフリーズしてうまく動かない。 これはどうしたことか。
PerlやPHPをやってるとWindowsプログラムをやりたくなくなる・・ 一度甘い汁を吸うと駄目ですね・・
ログファイルに書き込むときに、排他的に開くと起動中にログファイルが読めなくなるので FILE_SHARE_READで開こうかと思うんですが、これって書き込み中に他のアプリが ログファイルを読み込んだりしてもファイルが壊れたりはしないですよね?
>>119 壊れないとは思うけど、LockFileを使うとイイ!
121 :
デフォルトの名無しさん :02/09/26 13:42
疲れたので寝ます。。。。。。。。。。
よく読んだら、外してる
>>116 Win98 と NTでは、パイブの挙動が違う。
>>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 とかかなぁ
レスどーもです。 >ImmSetConversionStatus とかかなぁ ↑は半角/全角とかの入力モードの変更関数です。 知りたいのはIME2000プロパティ上の 「入力設定」-「ローマ字入力/かな入力」の変更方法と取得方法なんです... よろしくお願いします。m(_ _)m
解決したので、一応ご報告しときます。 全然違う所で引っかかってたようです、すみません。 Win95で開発当時、OPENFILENAME構造体を次のように定義していたのですが… Type … lpstrFilter As String … End Type 2000では、こうするとまともになりました。 Type … lpstrFilter As Long … End Type 95でも、これで大丈夫みたいです。 ここはVBではStringにするようになってたはずだと思うんですが、なぜLongに変える必要があったんでしょうか? 結果オーライでは今一つ不安なので、どなたか理由を教えて下さいです。
>>132 は間違い、
lpstrCustomFilter As String
↓
lpstrCustomFilter As Long
です。
lpstrCustomFilterに自分で値をセットしない限りは、 どっちでもまったく同じ。
つまり、このメンバを使わないのなら という意味ね。
ODBCが簡単そうなので、これでいってみます ありがとうございました。
138 :
名無しさん@Emacs :02/09/26 23:11
>>90 レスがつかないようなので。
HPは、なくなっているようだけど
ImeReconvでぐぐってみそ。
>>134 いかにも、lpstrCustomFilterに0だのNullだの入れるとおかしくなったけど、無視したらまともでした。
でも、なんでLongだと問題が解決したのか知りたいです。
>>139 Long型の初期値(宣言後に何も入れてない状態)は 0。
これにコード内で明示的に0を入れても元の値のまま。
String型の初期値はvbNullString。(他の言語で言えばNULLポインタ)
これをAPIに渡すのと、Long型の 0を渡すのはまったく同じ。
しかしコード内で "" を入れてしまうと、この値は変化し、
長さゼロの文字列へのポインタとなる。
明示的に初期化したいのであれば vbNullString を入れろ。
API呼び出し以外の場面では、(普通は)両者の違いを意識する必要はない。
>>94 ナラネーヨ
なにげに存在してるぞ。コンソールに反映されないだけで
>>137 レスどーもです。
そです。「Alt+ローマ字」キーで切替えるトコです。
入力モード/変換モードは変更出来るんですが、
ローマ字入力/かな入力の切替えが出来なくて...
よろしくお願いしますm(_ _)m
>>143 関係ないよ
コンソールが存在してないんだから
145 :
デフォルトの名無しさん :02/09/27 10:55
質問させていただきます。 マルチスレッドを勉強しているのですが、 クリティカルセクションとミューテクスの違いがわからなくて困っています。 両方、フラグがOFF(他のスレッドで排他処理を行っていない)状態になるまで 待機するものと思うのですが、なにか使い分けはあるでしょうか。
Mutexはプロセスを超える
>>143-144 コンソールアプリでなくてもリダイレクトすると
ちゃんと標準出力の内容をファイルに落とせる。
つまりコンソールがないから見えないだけで
標準出力はちゃんと存在するんだな。
>>147 キーボードイベントでも変更出来るんですけど、
ON/OFFの状態が判らないと、必要が無いのにイベントを投げちゃいそうで...
モードがローマ字入力の時に「Alt+ローマ字」のイベントを投げたら、 モードはかな入力になりますよね? それだと、困るんですよ...色々と 諦めるって訳にも逝かないし...脳味噌から煙が...
151 :
デフォルトの名無しさん :02/09/27 11:55
今さら?? というような問題で悩んでおります。 MessageBox("テスト",NULLL,MB_YESNO|MB_ICONQUESTION); 見てのとおりのメッセージボックスなのですが、 MB OKなら「ポン♪」って音がなりますよね? ↑のコードじゃならなくて困ってます。 直前にMessageBeep入れてもできるとは思いますが、 どうも根本的な解決じゃないような。。 ご指導よろしくおねがいします。
>>151 キミの環境ではサウンドのプロパティのメッセージ(問い合わせ)が
設定されてないだけだと思ふ。
>>152 98と2000とXP
9xだと常駐ソフトの絡みか何かでファイルに落ちないことは
あるけどそういうときはコンソールアプリも落ちない(リダイレ
クトしてるのにコンソールに吐かれる)から単なるバグだと思う。
あと処理系によってはGUIアプリのとき標準出力の準備を
省略することがあるかも(
>>148 を確認したのはVC++ 6.0)
>>154 変だね。当然、標準出力をわざわざ作ってはないよな?
GUIアプリのprintfデバッグによく使ってる手なんで 幻を見てるって事はないはずなんだけど…
>>155 スタートアップコードが標準出力を作ってるかもしれないけど
プログラム内で明示的に作ったりはしてないです
>>157 は、リダイレクトを指定しないとき、ハンドルが存在するか確認はしてないわけだな?
リダイレクトすると、自動作成されるってのが結論なのかねぇ。
>>159 DOS窓から実行させればリダイレクトしなくても表示されますが?
>>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プログラムになっています。
>>163 何のDLL使おうとしてるんだか知らんが、そのDLLがリンクしてるDLLがNT系固有なんじゃないか?
Dependency Walkerでも見ろ。
>>161 合ってるよ。
それで取得できるはずだけど。
>>161 あ、IME2000固有のカナモード切換のこと?
だったら多分無理だよ。
(ごめん、キーボードのカナロックかと思った)
以前にMSのサポート技術情報ページで、
IME97かIME98あたりからAPIでの変更が不可能に
なったというのを読んだことがある。
>>167 むぅ...「Alt+ローマ字」で切替えるヤシは
APIで変更が出来ないのか...
(゚д゚)マズーだな...こりゃ...
さて、どーしよ
>>140 ありがとうございます。
Stringで宣言していた時は、Chr(0)だのvbNullCharだので初期化してたのですが、
あちこちコードをいじり倒したので、今となってはよくわからなくなってしまいました。
今後の参考にさせて頂きます。
170 :
名無し@沢村 :02/09/27 21:04
皆様方、ボタンなのですが、ボタンは子ウインドウなのでマウスでクリックしたとき、そのウインドウのハンドルを取得したいのですが、どうすればできますか? いろいろなボタンをクリックしたときに、そのボタンに応じたハンドルを取得できますか?
>>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)' に変換できません。(新しい機能 ; ヘルプを参照)とエラーが出たよ。
本に書いてあるようにしたのにどうして?
どうやって解決するの?
>118 ありがとうございました。 サンプルを参考にWaitCommEventの最後の引数をNULLにしたら直りました。 理由は不明ですが・・
>>176 CallWindowProcのヘルプ嫁
STRICTを定義するのはデフォルトと思ってたがなあ・・・
しもうた176じゃなくて175だ
K&R本によるとfgetcは内部でgetcを使って一文字ずつ読んでいるようですが、 Win32APIには一行ずつを読むAPIは無いので同じような関数を作るとすれば、 ReadFileで一文字ずつ読み込んでいくのが妥当ですよね? それとも他に便利なAPIありますか?
同じような関数を作るくらいなら、fgets使ったほうがいいんじゃない?
>138 ありがとうございます。参考にします。
>>179 おいおい、ReadFileで1文字ずつ読んだら
めちゃくちゃ時間かかると思うよ。
何のためにストリームがあると思ってんの?
fgetsだと行末がバッファからはみ出てたら、やばくね?
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は存在するため、一見出力できるように思えるが、
バッファがフラッシュされたタイミングでエラーになる。
ただしリダイレクトされている場合は別だ。親プロセスが標準出力に
正しいハンドルを割り当てた状態をリダイレクトと呼ぶのだから、
出力できるのがあたりまえだ。
>153 さんの言う通りでした。 いつの間に設定がなくなったんでしょう。 XPでは始めは設定されてないのかな。 とにかく無事解決しました。 ありがとうございました。
>>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系ではどうなんでしょうか?
>>202 FindWindowでハンドルを得て、CaptionやIconの変更は出来たのですが,,
申し訳ありませんが、もう少しご助言いただけませんでしょうか?
>>208 FindWindowで得られるのは親ウィンドウのハンドル。
そのハンドルを元にGetDlgItemやFindWindowExや
GetWindow等を使って、対象のコントロールの
ウィンドウハンドルを取得。
そしてそれをShowWindowかSetWindowPosで非表示にする。
210 :
名無し@沢村 :02/09/29 12:20
皆様方、私はボタンが押されたときと、離されたときで違う処理をしたいと思ってここで聞いたら、 サブクラス化したらいいと教わったので、サブクラス化したところ、ちょっとうまういったんです^^; 違う処理についてはちょっとうまういったんですが、ボタンが押されたときも離されたときもじっとして動かない(見た目が)のです。 またボタンの上のフォントも作ったフォントではなく、普通のフォントが表示されるのですが、どうしたらいい?
>>210 意味がワカラン
ボタンを持つ主体は自分なのか他人なのか、
フック内でどんな処理を行っているのか
フォントを作った後にどうしているのか
これくらい書け
>>209 試行錯誤しながらやってみたのですがうまくいきません。
具体的にはMSOffice上のボタンを非表示にしたいのですが、もう少し
ご助言いただけないでしょうか。
現在
HWND thehwnd = FindWindow( "XLMAIN", NULL );
thehwnd = FindWindowEx( thehwnd, NULL, "Button", "ヘルプ(&H)" );
とやっていますが、thehwndにはNULLが入ってしまいます。
>>212 その前に、そのコントロールは間違いなくウィンドウなの?
Office系では単に親ウィンドウ内にコントロールの絵を
描画しているだけのことが多いよ。
具体的にはExcelのどの部分のボタンですか?
215 :
デフォルトの名無しさん :02/09/29 19:58
教えてほしいっす。 ウインドウズプログラムではスレッドごとにカーネルとユーザーモードの スタックを持っていますが、これはスレッドごとにメモリ上に実際に確保される スタックの位置が違うと解釈していいのでしょうか?
>>214 Excel2000で確認してみたところ、
子ウィンドウの子ウィンドウ(孫)だから
HWND thehwnd = FindWindow( "XLMAIN", NULL );
thehwnd = FindWindowEx( thehwnd, NULL, "EXCELC", "" );
thehwnd = FindWindowEx( thehwnd, NULL, "Button", "ヘルプ(&H)" );
のような感じで取得できると思う。
>>215 > ウインドウズプログラムではスレッドごとにカーネルとユーザーモードの
> スタックを持っていますが、
こっちの真偽は、よく知らんが...
> これはスレッドごとにメモリ上に実際に確保される
> スタックの位置が違うと解釈していいのでしょうか?
これは、正しい。
>>209 ありがとうございました!期待通りの操作ができました。
わかりやすい説明に確認までしていただきまして感謝しています。
あと、図々しいかと思いますが、もうひとつ。
EXCEL2000で確認とありましたが、それはどのように調べるものな
のでしょうか?
>>218 Excel2000の印刷プレビューの画面を確認したという意味です。
俺はVC++に付属している SPY++というツールで確認しました。
ただ、EnumChildWindows等を使えばツールがなくても
比較的簡単に調べられます。
220 :
名無し@沢村 :02/09/29 22:11
皆様方、私はボタンが押されたときと、離されたときで違う処理をしたいと思ってここで聞いたら、 サブクラス化したらいいと教わったので、サブクラス化したところ、ちょっとうまういったんです^^; 違う処理についてはちょっとうまういったんですが、ボタンが押されたときも離されたときもじっとして動かない(見た目が)のです。 またボタンの上のフォントも作ったフォントではなく、デフォルトのフォントが表示されるのですが、どうしたらいい? フック内ではボタンが押されたときと、離されたときで違う処理だけ行なっています。 フォントはメインウインドウ内でつくった後なにもしていません。
>フォントはメインウインドウ内でつくった後なにもしていません。 オモロイ
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
皆様方、コンボボックスですが、解決しました。 コンボボックスをつくるとき高さを充分にとってやればよかったのね…。 でも矢印をクリックしないと字が出てこないのですが…。 つまり一番上のスペースに字が最初から出ていないのですが…。 よくソフトなんかでは一番上のスペースに字もが最初から字が出ていますが、あれはどうするの?
228 :
デフォルトの名無しさん :02/09/30 16:47
Windows のマクロで 9x 系か NT 系かを判定する方法ってありませんかね? 具体的には、プリプロセッサーの処理の時点で NT 系だけに存在する関数を #ifdef で条件コンパイルしたいんです。 関数でなら GetVersionEx() というものを使えばいいらしいんですが、 これだと条件コンパイルできませんし。よろしくお願いします。
>228 コンパイルしている環境のOSと、 動かすべき環境のOSは違うかもしれないんだが。
>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として書いたほうが
後の人のためだと思う。
>>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)してるが。 つか、何がどう違うんだよ。釣れた、とかいうのは勘弁な。
>>255 >自前でって書いてるからアプリケーションモーダルの
>ふるまいをエミュレートしたいって解釈したんだけど
書き込んでから248を読み直してきがついた。249が正解とオモタ
でも、どうやってダイアログを表示してるか書いてないんで
一応252の書き込みしててもいいかとオモタ
258 :
デフォルトの名無しさん :02/10/02 17:11
ポップアップメニューって、位置とアラインを指定(TPM_XXALIGN)してやると、 領域が画面内に収まるように位置が自動調整されるじゃないですか。 これを普通のウィンドウでやりたいんですが、位置を計算してくれる APIなど ありますか?やっぱ、自分でしこしこ計算するしかないんですかね?
ウィンドウを2つCreateWindow()で作成して
それを
>>254 のような関係にしたいんです。
言葉足らずですみません…
ところで、EnableWindow()やけどOLEオートメーションの動作に関係する? Visio2002をオートメーションで制御使用として、オートメーションで取得したHWNDを EnableWindow(FALSE)したら、それ以降オートメーションでの操作ができなくなったけど ちなみにVisio2000までのバージョンなら正常に動作します。 オートメーションの仕様に変更か何かありました? スレ違いかもしれませんし、別に困ってもいないんでほんとはどうでもいいです。 もし知ってる人が答えてくれたら夜ぐっすり眠れます(いまでもぐっすりですが)。
>>255 それです。。。
ウィンドウを自前で作成して
アプリケーションモーダルの動作をエミュレートしたいです
>>261 249,256でいいと思うが253でもできる
というか、アプリケーションモーダルで意識のずれがある?
NT系のOSではwaveOutOpenの引数にコールバック関数ではなく スレッドを使用すべきという事を聞いたことがあるんですが 本当なんでしょうか?
264 :
名無し@沢村 :02/10/02 22:15
皆様方、私はボタンが押されたときと、離されたときで違う処理をしたいと思ってここで聞いたら、 サブクラス化したらいいと教わったので、サブクラス化したところ、ちょっとうまういったんです^^; 違う処理については処理のようになったんですが、ボタンが押されたときにへこまないのです。 ボタンのプロシージャ内では、その処理についてだけ書いていますが、ボタンがへこむようにするには何か別なことも書かなくちゃいけないの? ボタンが押されたときにへこむようにするにはどうすればいいのでしょう?
恥をしのんで聞くけど、うまういったってどういう意味?
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) ネタと思われないよう、ちゃんとした日本語を書く
ごめんなさい
>>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"という文字が送信されてしまいます。 試行錯誤しながらやってみましたが、原因が私にはわかりません。 どなたか解決のためのヒントやアドバイスをいただけないでしょうか?
プレビューするのにフォーカス関係あるのか? フォーカス設定したいなら 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 のラッパークラスってないの?
WM_USERは危険…
>>282 NT系では特別に設計されたメッセージ以外は
プロセス境界をまたいでポインタを渡せない。
WM_COPYDATA使え。
>>287 はずだが
>>282 では何の偶然か渡せてるみたいだな
まあ何の保証もないからどちらにせよWM_COPYDATAを
使うように書き換えたほうがいいな
>どちらにせよWM_COPYDATAを >使うように書き換えたほうがいいな どちらもプログラム可能なら苦労しないはず いっそ一つにまとめれば そうじゃないんでしょ?
>>289 自作のミュージックプレイヤー同士での通信だろ、これ。
ここで皆さんが教えてくださった
"WM_COPYDATA"
を使ってさっそく書き換えてみたところ
2000と98で両方確かめましたがどっちもうまく行きました。
>>283-289 さん
どうもありがとうございました、ほんとに助かりました。
298 だが取り消し。アフォだった。すまん。 > もともと起動していたほうのプログラムに渡し、 これだね。288 さんに賛成
>>291 ちなみに 98 では何のメッセージを送って成功してたの?
WM_SETTEXT なら NT 系でも 9X 系でも必ず成功するよ。
最初はメッセージ uint wm_id = RegisterWindowMessage("アプリケーション固有の文字列"); って感じで取得したウィンドウメッセージIDを使ってました。 98でうまくいったのは偶然かもしれないですけどね。
>>295 回答ありがとう。
>98でうまくいったのは偶然かもしれないですけどね。
あり得ない、と思うけどねぇ。アドレス空間が別なんだから。
テキスト渡すだけなら、Width と Height がゼロの EDIT かスタティック
に WM_SETTEXT を送るのが簡単。親で通知メッセージを受け取って、その
変化を認識できる。WM_COPYDATA は、テキストに限らずどんなバイトブロック
でも送れるので、一度覚えてしまうと便利だね。
297 :
デフォルトの名無しさん :02/10/03 19:12
ほかのアプリのウィンドウに貼りつくアプリを作っています。 対象アプリの移動やサイズ変更時追従することは出来るようになりま した。 そこで、使用者に外部アプリによる貼り付けとわからないように、対 象アプリのタイトルバーの真下に表示させたいのですが、ウィンドウ のタイトルバーの高さはどのようにして得るのでしょうか?
すいません、 GetSystemMetrics( SM_CYCAPTION ) でできました。
299 :
名無し@沢村 :02/10/03 20:34
>>269 ありがとうございました。
(1) WM_LBUTTONDOWNの処理をした後にも元のウィンドウ関数を呼ぶ
これでやってみたら、ちゃんとなりました。
もうひとつ質問ですが、オーナードローボタンに付けたビットマップの絵柄をボタンが押されたときに描きかえるにはどうしたらいいのですか?
またそのようなことは可能ですか?
>>299 元のウィンドウ関数を処理の<前に>呼んで実行しておく。そしてその後
WM_LBUTTONDOWN でビットマップをボタン表面に描く
>>299 普通にWM_DRAWITEMの処理の中でビットマップを切り替えればいいのでは。
ボタンが押されている状態かどうかは、BM_GETSTATEを送ればわかる。
亀レスすいません。 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"のデストラクターでアクセス違反が 起きてしまうんですが、このような場合はどうすればいいのでしょうか?
関連するコードを全て書け
>>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
>>330 このまま無視されて沈んでゆくのかと思ったよ(ワラ
こちらもMSDNで確認しました。
どうもありがとう。
335 :
本物の331 :02/10/06 17:20
336 :
デフォルトの名無しさん :02/10/06 17:26
337 :
本物の331 :02/10/06 17:31
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使わないんだよ。
>>356 ありがとうございます。
Win標準のエディットコントロールはこれでいけるのですが、
独自に実装しているエディタの場合はどうすればいいでしょうか?
359 :
John ◆Re0z.4Is5E :02/10/08 01:50
今でもAPIいじらなきゃならんのは、かわいそうだな。 アプリケーションが作りたいのに、 アセンブラの環境しかないのと似てる。
>>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
>>364 EM_SETSELの方が簡単だと思うが。
>>365 どうもありがとうございました!
なんか違う方向逝ってたみたいですね・・・
こんなシンプルにできたのかぁ
>>368 どうも。
それは試しましたが、スクロールされなかったです。
皆様、情報ありがとうございます。 >366さん、367さん 書き忘れていたのですが、これはWindows2000でもつかえますか? >371さん 以前、勉強に確認したのですが、 中でつかわれているBIOSをいじる関数が たしかTurbo-Cのだったので、構成だけ参考にしたのです。 どうもありがとうございます。
>>373 ばかかおめーら、おれはVBでって言ってるだろうが。
殺伐の予感
>>372 > 書き忘れていたのですが、これはWindows2000でもつかえますか?
使える。Win9xでは使えないけど。
374さん、かってに私のまねをしないでください。 373さんには非常に感謝しております。 いろんなOSで参考になります。 VBでもAPIはつかえます。 今はVBしかもってないので、VBからAPIをつかうしかないのです。 376さんも情報ありがとうございました。 ちかごろ機械に近いところの勉強の必要性を痛感しておりまして、 いろいろとWebでさがしているのですが、FATの説明は海外の方がくわしかったですね。 私も集めた情報をもとにWebページをたちあげたいです。 この課題がおわったら、Formatとpartitionの設定プログラムを作ろうと かんがえていますが、そのときも、もちろん自分でもしらべますが、 どうしてもわからないときはおしえてください。 それでは、ありがとうございました。
378 :
名無し@沢村 :02/10/09 02:33
>>357 >なぜSetParent使わないんだよ。
小ウインドウと親ウインドウの関係だけでもややこしいのに、
そのまた子ウインドウをつくったら、ややこしすぎてフック関数をどう書けばいいか、
混乱してしまって、私の手に負えないからです…^^;
>フック関数 って何さ。
フック船長ですた。
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
でも、鍵盤だと押した時に鳴るんじゃないの? 標準のボタンコントロールだと離した時に鳴る事になるのでは? そこまで求めていないのかな?
> 標準のボタンコントロールだと離した時に鳴る事になるのでは? そりゃ実装によるだろ。
>>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としています。 よろしくお願いします。
書き忘れましたOSはWindows2000です。 今思ったのですが、ライトキャッシュされているのかも。 でも解決策がわからない・・・
>>395-396 さすがにファイルの存在・内容についてはキャッシュされていようと
一貫性は保たれてるはずだぞ。
ところで395の二行目の「直後」って、いったいどの時点なんだ?
4行目で関数を抜けた後とあるが、ということは抜ける前なのか?
どうもです int test(〜) { int result = ShFileOperation( 〜; →私の言った直後はここです } CopyFile API でもだめでした・・・
fopenもできない?
>>398 ……ありゃ、ほんとだ。
うちの環境でも再現できますた。
ちと驚き。
402 :
デフォルトの名無しさん :02/10/09 22:41
>>394 はスレ違いですか?
マルチスレッド相談室ではWin環境依存な話題はWin32APIスレに書けとあったのですが・・・
>>398 俺のWin98SEでは再現できなかった。
404 :
デフォルトの名無しさん :02/10/10 00:37
この事象は、処理がatomicだから
この不景気の中、財布がホクホクです♪
先月は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 とか、リングバッファって知ってるか ?
>>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 を実現する手段の一つ。
>>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
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で逝けました。ありがとうございます。
434=427です
436 :
デフォルトの名無しさん :02/10/11 02:35
他のマシン(Win2000等)にメッセージボックスを 表示させるAPIってなんでしたっけ。 リモートデバッグとして使うように紹介されてた記憶があるのですが。 記憶違いですかね。
>>436 APIは知らんけど、
NT系にはMessengerサービスが走ってるから、
net send でメッセージを送れる。
>>436 NetMessageBufferSendのこと?
む、 かなり早いレスにびっくりです。 まだ、はっきりとわからないけど NetMessageBufferSend だと思います。 net send も遊んでみました。 どうも ありがとうございました。
む〜、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違いすぎでいまいちわからんです(^^;)
つづき とりあえず考えているのはMDIアプリ風で外側のフレームだけ通常のWinMainのexeにして 実装等はすべてコンポーネント化したいのです。 イメージ的にはMicrosoftWebBrowser(IWebBrowserとか持ってこれるやつ) みたいにある程度コンポーネント単体でほぼ実装が完結されているような ものを作成していきたいのです。 そこでこれからのどの道に進んでいけばよいのかわからなくなっています。 今考えているのは 1:ActiveXを自力で作成する勉強をはじめる。 既存のインターフェイス(IOleXXですかね?)から派生してC++でゴリゴリ書く。 2:ATLを勉強してActiveXを作成する。 3:.NETを勉強する。 4:その他?
つづき 上記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+ ライブラリをつかってアルファブレンドしてるとか
レスありがとうございます。
>>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知りませんけれど) 作ったコンポーネントを、どういう風に活用するつもりですか? それがわかれば絞れるかも。
458 :
名無し@沢村 :02/10/12 06:50
皆様方、私はいまmidiシーケンサーに取り組んでいるところですが、 初歩的なところでつまずいているのでぜひ教えてください♪ それはmidiファイルに保存するとき、音色指定で、 32 の Guitar harmonics まではプレイヤーで聞いてみると音が出るのですが、 33 の Acoustic Bass 以降の音は出ないのですよ。 バイナリエディタで開いてみると、33 の Acoustic Bass 以降の音を指定した場合、 どうもファイルがこわれているようなのですよ…? 皆様方、これは一体どういうことなのでしょうか? 32 の Guitar harmonics までと33 の Acoustic Bass 以降とでは音色の指定の仕方が違うのでしょうか? ちなみにMidiOutShortMessageでは同じように指定して同じように音が出るのですが…? ぜひ教えてください!!
>>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では同じように指定して同じように音が出るのですが…? ぜひ教えてください!!
つーか板違い
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
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ページか書籍を読むべし。
ディスクドライブのデバイス名を取得する方法はありませんか? 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 とりあえず引数も正確に書いてみろや。
名前がぶつかる悲劇か・・・
>>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 書いたかと思ったら、逆切れですか ?
>>501 省略した引数の部分を書いてみろと言われたので
書きましたが、それがどうかしました?
で、書いたはいいが、その後はどうなったんでしょう。
是非ともアドバイスを承りたいんですが。
皆さん、早速のレスありがとうございます。(2回目のカキコです)
>>492 そうなんですよ。せめて#defineじゃなければ名前空間を分けて衝突は避けられるんですけど。
>>494-495 私も最初は全てそのように書き換えようと考えました。それこそ全てのヘッダまで。
定数の#defineも含めて。ただ、そこまでの労力が…
かと言ってその場で必要なものだけ宣言しなおすのも癪でして(^^;
>>496 さんが仰っている状況に関しては、私も
>>497 さんのような解決方法でよいと思います。
lccやmingwからヘッダだけ抜き出して他の環境で、ってのはアリなんでしょうか?
>>499 確かにヘッダに定義を入れるのは気持ち悪いところですが…
>>502 > 省略した引数の部分を書いてみろと言われたので
> 書きましたが、それがどうかしました?
で、
>>491 はどうなったん ? 都合の悪いところは、無視ですか ?
> で、書いたはいいが、その後はどうなったんでしょう。
> 是非ともアドバイスを承りたいんですが。
>>498 で、デメリット書いてますが必死すぎて見えてないのね。
おまえらがんばりすぎ
>>505 反論できなくなった時の、逃げ口上...
必死だな
>>507 ププッ、それしか書けないんならもうやめたら ? ちょっとカッコ悪いよ。
それとも、
>>504 に対してなんか言うことある ?
>>504 491って何の話ですか? 私は494ですが491ではありません。
>
>>498 で、デメリット書いてますが必死すぎて見えてないのね
↓これのことですかね。
> で、あんたの方法だとラップ関数を経由するから、それが嫌だったんだろ。
必死以前に、これは
省略した引数をすべて書いてみることと
何のつながりがあるんでしょう?
引数を書けと言った意味がまずわからないのですが。
それと、「ラップ関数を経由するから嫌」なんて
質問者さんはそんな事書いてませんよね。
勝手に妄想されたのでしょうか?
納得のいくアドバイスをお願いします。
508は自分に都合の悪い発言は全部494の仕業だと思ってるようだな
>>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とかに展開されちゃっててはまるの
説明めんどくさいからどうでもいいや
>>516 >
>>489 は、少なくとも CreateWindowExA() と CreateWindowExW()
の引数の違いは考慮
> してないから、それを考慮しなよ。って言う意味だよ。
考慮していないのでなく、重要でないから
省略しただけとかもしれませんよね。
まあ仮に考慮してなかったとしましょう。
アドバイスの通りそれを考慮して書いてみました。
で、結局どんな進展があったのでしょうか?
ラップ関数を経由する話とどうつながっていくのでしょう?
> 妄想 ? 具体的なデメリットがわかってないの ?
妄想と書いたのはラップ関数のデメリットの話ではなく、
そのような意図の質問ではないということです。
同じことを書きますが、
> で、あんたの方法だとラップ関数を経由するから、それが嫌だったんだろ。
質問者は名前の衝突等を気にしているのであって
「ラップ関数を経由するから、それが嫌」なんてことは
書いていませんね。妄想でしょうか?
>>516 > だって気付いていさなそうだからね。
お前、言ってることがハチャメチャだぞ
>>518 > 考慮していないのでなく、重要でないから
> 省略しただけとかもしれませんよね。
それがダメだって言ってるの。まだわからない ?
> で、結局どんな進展があったのでしょうか?
> ラップ関数を経由する話とどうつながっていくのでしょう?
一つヒントをあげよう。
引数が違うと言うことは、別の関数が必要と言うことだよ。
> 質問者は名前の衝突等を気にしているのであって
> 「ラップ関数を経由するから、それが嫌」なんてことは
> 書いていませんね。妄想でしょうか?
あんた、ヴァカじゃないの ?
衝突を気にするからと言って、
>>489 みたいなこと (=ラップ関数を作る) やると、余計面倒だ (=デメリットがある) 。って言ってんだよ。
>>489 が書いてないのは、気付いてないからだと思うよ。
で、デメリットはわかったの ? それとも、
>>494 みたいに書けば全て解決と思ってるの ?
この見事な殺伐っぷり、たまらんねぇ。
>>517 あっ、確かに…もっと手前の方で#ifdefとtypedefを山ほどかまして何とかなりませんかねぇ…
他にもラップ関数を使った場合には、
・ヘッダ内に関数定義が入る
・関数呼び出しオーバーヘッドがかかる(インラインじゃだめかなぁ)
・引数の違う場合、違いの吸収が面倒くさい
って感じになるんでしょうか。(他にも思いついたら列挙お願いします)
このくらいの範囲ではデメリットを考えましたが、後はそれと名前の衝突を
天秤にかけるしかないですかね…
>>520 > 一つヒントをあげよう。
> 引数が違うと言うことは、別の関数が必要と言うことだよ。
実体が2つ必要になるが同じ関数名では実体を2つは
作れないということでしょうか?
が、それだと引数を書かせることとは関係がないので
外れですかね?
ちょっとわからないのでヒントでなく具体的に
教えていただけないでしょうか。
> で、デメリットはわかったの ?
> それとも、
>>494 みたいに書けば全て解決と思ってるの ?
デメリットは承知しているつもりです。
が、何度も言ってるように、その話をしているわけではありません。
>
>>489 が書いてないのは、気付いてないからだと思うよ。
そうですか。ということは、上で書かれた
> で、あんたの方法だとラップ関数を経由するから、それが嫌だったんだろ。
というのは妄想だったということでよろしいですね。
>>522 > 他にもラップ関数を使った場合には、
と言うか、CreateWindowExA() と CreateWindowExW() の引数が違うと言うことは、ラップ関数の引数も必然的に変える必要があると言うこと。
つまり、ラップ関数も二種類持つしかない。で、
> ・ヘッダ内に関数定義が入る
と言うのが一番問題だと思う。
CreateWindowEx() をグローバルにすると当然複数ファイルにインクルードされたら二重定義になるし、static にすると、実体を複数個持つこととなる。
CreateWindowEx() だけならまだいいかもしれないけど、他にも色々あるしね。
まあ、メモリーも安いからそれでもいいやって言う人もいるかもしれないけど、あまり誉められた設計じゃないよね。
ちなみに、もし CreateWindowExA() と CreateWindowExW() の引数が同一なら、その関数はライブラリに入れて、実行時に CreateWindowExA() か CreateWindowExW() に振り分けることもできる。
だから、引数が同一かどうかはかなり重要。
>>523 > 実体が2つ必要になるが同じ関数名では実体を2つは
> 作れないということでしょうか?
> が、それだと引数を書かせることとは関係がないので
> 外れですかね?
引数が一緒だったら、ラップ関数の実体は一つにする (=ライブラリに入れておく) ことができるよ。
そんなこともわからないの ?
いっそのことMSに 「C++向けに#defineを極限まで減らしたヘッダ激しくキボンヌ( ゚ρ゚)」 とでも要望出してみるかなぁ… 無視されるだろうなぁ…MSだし…
>>526 自分で書くという発想は無いのですか ?
>>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 もそうだけど、一度実装してみればいろいろわかっていいと思うよ。
マイクロソフトの技術者だってヴァカじゃないんだからさ。
座標x、yの色の値を取得するにはどうしたらいんでしょうか?
GetPixel 指定された座標のピクセルの RGB(赤、緑、青)値を取得します。 COLORREF GetPixel( HDC hdc, // デバイスコンテキストのハンドル int nXPos, // ピクセルの x 座標 int nYPos // ピクセルの y 座標 );
できました。ありがとうございました。
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;
お終い
こんな流れなんですが、メインスレッドのメッセージループを抜けたところで
ビジー状態から抜け出せなくなります
ところが、原因究明の為にデバッガでループ終了からずんずんトレースしていったら
なんと完走してしまいした・・・まったくもって意味不明です
怖ろしいのでデバッガでしか起動してなかったんですが 思い切って直接起動したら完走しました・・・ デバッガのバグなんですかね?
>>544 つまり「デバッガで起動した場合ハングアップしてしまうバグ」を作り込んだということでしょうか・・・?
「実行に時間がかかりすぎるとハングアップしてしまうバグ」かな
初心者がマルチスレッド関係いじくると良くあるバグなんでしょうか?
なんとなくだけど、メインスレッドのメッセージループは ほかのスレッドが終わるまで待ったほうがいいような 気がせんでもない。 なんとなくだけど。
>>542 関係ないけど_endthreadexは使わないほうがいいかも...
少なくともC++で使うとデストラクタが実行されないし
メインスレッドが終了するとほかのスレッドもすべて終了するけど
>547 なんのデストラクタ? そして、何を代わりに使うんだ?
>>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する。
>>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
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でもダメなんですかね
>>565 あ、
>>563 の実験結果はWin2000上でコンパイル・実行したときのものです。
実行環境書くの忘れたスミマセン...
hInstanceに間違ってランダムな値が入ってたらどうなるんでしょうか
571 :
デフォルトの名無しさん :02/10/16 12:58
COMを使ったプログラムで、定期的にポーリング処理を行いたいのですが、 SetTimer/KillTimerを使ったところ、精度が悪いのはまだしも、 COMオブジェクトのメソッドを呼び出している中でさらにタイマー処理が呼び出される 事が有り、困っています。 それではと、マルチスレッド化したところCOMオブジェクトが対応していないため(?) クラッシュしてしまいます。 何か、良い解決方法は無いでしょうか? おながいします。
COMオブジェクトのメソッド呼び出す前にタイマ止めとけば あるいはちゃんと再入のチェックをするとか。
なるほりょ。 COMよく知らん不束者ですが、 マルチスレッドで何とかするのは無理なもんでしょうか?
>>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 するのを忘れずに。
>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では無視されるようですが、その理由なども教えていただけ
ればと思います。
よろしくお願いします
マーシャリングするのは面倒なので、とりあえず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 だからでは?(見当違いだったらスマソ)
誤 > WinMain()で、return に MSG.wParam を返せと書いてあるのですが、 正 > MSDNに、WinMain()ではreturn に MSG.wParam を返せと書いてあるのですが、
>>583 そうなんですが、MSDNを見ると
> 関数が WM_QUIT メッセージを受け取って正常に終了する場合は、メッセージの wParam パラメータに格納されている終了コードを返してください。関数がメッセージループに入る前に終了する場合は、0 を返してください。
って書いてあるんですよ...
プログラミングWindowsでもそうなっていますし
今定義を見たら、 __w64 unsigned int ですた。64ビットかな? ちとかっこ悪いですが、return (__w64 unsigned int) 0 ってやってみては?
書き込んでしばらくして気づいた…。 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になってしまいます。 ちょっと探したところ時々ある現象のようなのですが 回避方法が見つからないです。 ご存じの方教えてください。
ぎゃー! 間違いすぎー! 逆だった…。 return (int) MSG.wParam;
>>588 CDERR_INITIALIZATION = 0x0002
初期化の際にコモンダイアログボックス関数が失敗しました。たとえば、メモリ不足の場合に発生します。
>>588 *file = '\0';
も入れなきゃ。
だな。 あと、MAX_PATHは260だったと思われ。 fileを大きくした方が・・・
>>589 それをキャストしてしまっても本当にいいのかって事です。
>>594 その一言が聞きたかったんです。
どうもありがとうございます。
どこで聞けばいいのかよくわからんが。 Ruby で書いた壁紙変更スクリプトを cygwin の cron で定期実行させたところ壁紙が変更されない。 cron がサービスとして動いているので、壁紙変更スクリプトが LocalSystem のユーザコンテキストで実行されるのが問題っぽい。 平たく言えば、サービスとして動く壁紙チェンジャーは作成可能か、かな。 何か方法知っていたら教えてくれくれ。 壁紙変更は SystemParametersInfo を使ったよくある方法。 コマンドラインから実行した場合には問題なく変更される。
> LocalSystem のユーザコンテキスト こいつはデスクトップにアクセスできるのか?
うぉ、いろいろ勘違いしていたみたいだ。 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
>>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()で破棄しています。 保存をするのはまた別クラスで、メモリに入ったデータだけを移動させています クラス間にはなんの依存もありません いったいなんなのでしょうか……
↑に書いたものですが さらに調べてみたところ、なんでかどこかでカレントディレクトリが C:\になっていました。 GetCurrentDirectory() を使って2箇所で見てみたのですが、最初に実行(プログラムが開始してからすぐ) は正常なカレントディレクトリでしたが、2度目(ファイル保存寸前) ではC:\でした。 カレントディレクトリが変わってしまうことというのはありえるのでしょうか?
すいません 嘘すいてました(汗) コマンドライン引数を指定するとc:\になるみたいです 謎です……
>>607 コモンダイアログとか使ってるんじゃないの?
> すいません 嘘すいてました(汗) > コマンドライン引数を指定するとc:\になるみたいです カレントディレクトリが途中で変わるというのが嘘? だったら起動時からカレントが違ってるだけでは? 何が不思議なのかわからん。
>>579 です。
ええっと、ドラッグ中なのか、そうでないかの判定は
難しいのでしょうか?それとも、超簡単なので
「そんな厨房の質問は無視だ( ´Д`)σ)Д`)」
って感じなのでしょうか?
ヒントでも教えて貰えるとありがたいのですが…。
なんのためにそういう判定がいるんだ? IDropTargetを実装してRegisterDragDropするのでは不足か?
>>613 イベントドリブンという発想が出来ない素人なんだろ
>>612 システム全体の話?
それとも自分自身のプロセスの話?
>>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 ShelExecuteでcommand.comを使って、
ipconfigの出力をファイルにリダイレクトとか言ってみるテスト
>>620 どっかでも答えたような気がするけど、
素の Win95 サポートする必要があるなら SNMP API で MIB でオブジェクト指定して取り出せる。
iphelper.dll が使えるなら GetNetworkParams とかそのへんの IP Helper API でアレコレする。
624 :
デフォルトの名無しさん :02/10/19 21:53
ShellExecute 香ばしい
皆さん、レスありがとうございます
いろいろと調べてみましたが、簡単&綺麗な方法はないようですね…
さすがに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
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 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 にはない。
というわけで HKEY_LOCAL_MACHINE\Software\Classes をKEY_ALL_ACCESSで開いて判定すればいいのではないかと思うわけだが 誰か実験してちょ(他力本願
>>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 を見てよ
>>646 ごめん。645を書いた時はまだ643を見てなかったので。
でも、そのリンク先によると、やはり
HKEY_LOCAL_MACHINE\Software\Classesのように思えますが。
HKEY_CURRENT_USERが有効になるのは、RegOpenUserClassesRoot
を使って開いた時だけじゃないの?
いや、違うか。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
リソーススクリプトの書き方のってるところ知りませんか? 英語でもいいので、しっていたらおしえてください。
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 リソースエディタを使わないで
テキストデータで書きたいんですが
詳しくのってるところしりませんか?
665 :
デフォルトの名無しさん :02/10/22 00:20
>>663 もれは猫でも〜のソース見てたら大体分かったけど・・・。
667 :
デフォルトの名無しさん :02/10/22 12:37
>>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 あとは、
リソースエディタの吐いたリソーススクリプトを読めば、
大体分かると思うけど・・・。
>>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:"????/" は通らない。
みなさん、どうか、
>>685 をお願いします。
もしかして、既出放置ですか?
>>687 漏れの会社 PC が Windows 95 なんだYO!!!
とか言ってみる。
>>688 一体何がしたいの?
その前にコンパイラ/リンカオプションは調べた?
そこに無ければ諦めなさい。以上。
>>686 だから「ターゲットによっては」って言ってるじゃんよ
>>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() にできない事
途中で割り込まれずに連続したイベントの送信を保証すること
>>692 ( `Д) <どうしてもSendMessageしたいなら、WM_SYSCOMMANDでできるかも。
/(ヘ つ )ヘ
いいからモノをしまえ
>>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のようになるのはなぜでしょう?
>>701 ( `Д) <rc.bottom - rc. topが小さすぎない?
/(ヘ つ )ヘ これはリストの高さになるよ。
702 グッジョブ
>>706 ありがとうございます。
おかげさまで解決しました。
706 ところでモノはしまわんのか
∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ・∀・)< モノをしまう必要はない ( ) \_______ | ⊃| アヒャ (__)_)
スミマセン。ちと質問なんですが デスクトップ上のInterNet Exploerのアイコンを消去する時は、 インターネットのプロパティの詳細設定内の 「デスクトップにInterNet Exploerを表示する」のチェックを外すと 画面上から消え去ります。 で、上記と同じコトをプログラム上で行いたいのですが方法が判りません。 ご存知の方がいましたらよろしくお願いします。<(_ _)> ちなみに... チェックのあり/なしでレジストリのDiffを採って見ましたがBlank以外の差はありませんでした
窓の手でも作ってるのか?
単にショートカットを削除しているだけでは?
いや、そんな凄いコトをしようなんて... 初回起動時にアイコンがデスクトップ上にあるのが嫌なんですと。 で、初回起動時の他のアイコンは消せたんですけど、 IE(だけだったかな?)が消せなくて...
お前が嫌ならお前が消せばすむことだろ 設定変更ツールでないものが勝手にユーザーの設定をいじるな
>>715 準ウイルスのようなモノを作りたいんだと思われ。
「嫌なんですと。」って言い方からするとユーザーからの依頼と思われ
むぅ...誤解されてる... 自分で直接設定を変更出来るんなら、こんなモン作ろうとしないです。
> 自分で直接設定を変更出来るんなら、 自分でやり方書いてるだろ。↓これは違うのか? > インターネットのプロパティの詳細設定内の > 「デスクトップにInterNet Exploerを表示する」のチェックを外すと どういうプログラム作ってるのかちゃんと書けよ。 ウィルスじゃないんなら
...スマソ
>>715 サソが言ってる「設定変更ツール」ですな。
ただ、「設定変更ツール」って名乗るのも躊躇う機能しか持ち合わせていませんが...
変更方法を知りませんか?知ってたら教えて下さい<(__)>
質問。 仮想画面(メモリDC) → 実画面 と BitBlt()より高速にコピーする方法は無いでしょうか。
ない
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もどき使うこともあるまいて。
マジっすか。全然API関係ないやん…スレ汚しスマソ。
>>727-729 大変参考になりました。ありがとうございました。
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をサポートしていないらしく何も得られない。
補足です。 >WM_PRINTをサポートしていないらしく何も得られない。 メッセージハンドラが実装されていないらしい、ということです。 今起動しているアプリケーションのサムネイルを表示してみたいと思っています。
2000/XPならLayered Window化する そうでなければWM_PAINTで描画するまで前面のウィンドウに隠された部分は どこにも存在しないので不可能
733 の質問の答えは漏れも知りたいんだが誰か知らないか?
738 :
デフォルトの名無しさん :02/10/27 16:38
>>733 >>737 TClockのソース exe\pagecolor.c にそれっぽい処理が書いてあるので参考になるかと。
でも、一覧される数字が微妙に違いますね。丸め誤差か何か?
質問です。他のプロセスのコマンドライン引数を取得する方法はありますか? Win2000では、フックを使ってプロセスに忍び込ませた後、GetCommandLine()を 使って取得できたのですが、Win95ではうまくいきませんでした。
>>739 紹介ありがとうございます。
アニメーションまでして非常によくできていると思います。
ただ、やろうとしていることは立体化している時にも
ちゃんとウィンドウの内容が更新されるというものを実現したいのです。
WinXPのVisualStyle機能より下のレイヤーじゃないと駄目なのでしょうかね。
>>741 補足です。うまくいかなかったというのは、GetCommandLine()で取得できた値が、
取得したいプロセスのものではなくて、自分自身のものが返ってきてしまいました。
>>743 フックはちゃんと DLL からやったよな?
あと、GetCommandLine() の値はどうやって自アプリに送ってる?
>>744 レス感謝です。フックDLL内のフックプロシージャ内でGetCommandLine()を呼んでます。
値は #pragma data_seg() で作成した共有領域を介して実行ファイルに渡してます。
フックプロシージャ内のGetCommandLine()の値をファイルに書き出しましたら、
侵入先プロセスの値ではなく実行ファイルのものが返ってしまってました。
>>745 #pragma data_seg() は当然 DLL 内部だよね?
別プロセスと間違えて自分のプロセスを捕まえてるという事は無い?
あ、フックの種類は WH_CALLWNDPROC?
今 MSDN 見て気付いたんだけど、「WH_CALLWNDPROC フックを呼び出すのは、
メッセージを受け取ったスレッドではなく、SendMessage を呼び出したスレッド
のコンテキストです。」 だそうな。
あ、746 の MSDN の説明は Windows 95/98/NT3 だそうな。 NT4 以降はメッセージを受け取ったスレッドのコンテキストみたいだ。
相手のコンテキストが必要なら 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 を呼び出してるプログラムの事か?
>>752 > Win32 API のソースなんてものがどこにある?
当然、MS には、あると思うよ。
>>750 のところにもあるのかなぁ...、飴玉あげるからおじさんにちょっと見せてくんない ?
755 :
デフォルトの名無しさん :02/10/27 20:17
MS−DOSでなんて入力したらいいんでつか? test.cとかいう名前で保存したら・・・
757 :
デフォルトの名無しさん :02/10/27 20:21
>>756 そんくらいわかってっから
最近知ったんでつか?
>>757 かれこれ8年前だな。覚えたのは。
最近はrmの方がよく使うわ。
760 :
デフォルトの名無しさん :02/10/27 20:30
>>757 おまえだれよ?
いつものモー板にかえりなさい
しっし
>>746 #pragma data_seg() はDLL内部で行ってます。捕まえてるプロセスはファイル名を
見てから行っているので、その点の問題無いです。
フックの種類なのですが WH_CALLWNDPROC を使ってまして、現状のプログラムが
Win2000では問題なく動いていて、Win95ではうまくいかないことから、まさに 746-747 が原因
そのもののように感じました。これからWH_GETMESSAGEで試してみて、改めて報告します。
>>755 copy nul test.c
copy con test.c
>>736 ありがとうございます。
最終的にはまさに
>>738 のようなことをしたくて、
ビットマップ(をSelectObjectしたDC)にウィンドウを描画->
そいつをテクスチャとしてトライアングルに貼り付ける
と考えていたのですが、layered window を使えばそのようなことができるのでしょうか。
自分で調べた限りはできそうにありませんでした。
できるのであれば教えてください。
とりあえず
>>739 を参考にしてみたいと思います。
>>746 WH_GETMESSAGE で試してみましたところ、無事他のプロセスのコマンドラインを取得できました。
Win9xとWinNT系が別物ということとMSDNの原書を読むことの重要性を改めて感じました。
ありがとうございました。
漏れがすぐさま MSDN に走ったのは漏れが適度にアフォだからかも知れぬという罠
>>765 わからないことは調べる。素晴らしい姿勢だと思われ。
いや、それなりにデキてたら MSDN いちいち見ないと思われ
>>767 要は結果よ。
MSDN丸暗記して文句だけ言ってるライブラリ厨とMSDNが素早く引けて良いものが作れる人。
どっちが死んだ方が良いかは明白。
>>767 いつのまにかupdateされてる場合もあるんで
どんなのがあるか、だけは覚えとく価値はあるけど
詳細までは覚える意味はあんまりないと思う
デキないかつ日本語版しか調べなかったためにアフォから脱出できなかったという罠<自分
次回は原書を含めてあるものは隅々まで調べなければ。
>>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で動作しなくなったのでしょうか?
ヤフーの掲示板(英語)などでも他の方が触れられているのですが、私は満足な回答を掲示板の中に見つけることができませんでした。
何方かこのへんの経緯をご存知の方いませんでしょうか?
>>772 すいません、意味がわかりません。
環境は98SEなんですが、
>NT:NtQuerySystemInformation
>9x:registry
これはレジストリ見ろ、ってことでしょうか?
TrackPopupMenuExで作ったメニューがメニューの外をクリックしても 消えないのですが、何のメッセージで何の関数使ったらよいでしょうか?
消えるけど?
>>780 タスクトレイ常駐で使ってるのですが何か関係ありますか?
782 :
デフォルトの名無しさん :02/10/29 15:12
関係無いけど、タスクトレイ常駐で TrackPopupMenuEx() 使ってる理由は? TrackPopupMenu() じゃダメ?
WM_NULL
たまたま参考にしたコード(DX8.1サンプル)がEx使ってたので・・・
>>779 メニューを表示した後に、PostMessage(hWnd, WM_NULL, 0L, 0L); これ。
理由は MSDNに書いてあったよーな気が。
レスありがとうございます やってみます
SetForegroundMessageモナー
・・・
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); も追加してみて。
>>789 だめですた
WM_NCHITTESTに入れたりもしてるのですが、これも関係ないみたいです
SetForegroundMessage => SetForegroundWindow のことだろう、たぶん。 これは TrackPopupMenu の前。
794 :
デフォルトの名無しさん :02/10/29 18:11
HBITMAPからパレットって取れますか? できるならどうやってやりますか?
796 :
デフォルトの名無しさん :02/10/29 18:26
XPの現在のデスクトップのパスを取得するAPIを教えて下さい。
SHGetSpecialFolderPath
>>797 うおおおおおおおおおおおおおおおおおおおおおおおおおおおっつつつt
激しくありがとおおおおおおおおおおおおおおお!!!
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() を呼べないかっていうくらい
支離滅裂でないか?
ビルドする前に一番上のコメント部を見てください
>>802 ダイアログにWebBrowserコントロール貼り付けるんじゃだめ?
>>800 マジレスするとDDBにパレットはありません。
DIBセクションならGetDIBColorTable()で取って
論理パレットに変換。
>>813 そのWebBrowserコントロールはMFCなしで動くんか?
つーかそもそも貼り付けられるのか?
>>811 「このブリーフケースやフォトアルバムへのアクセスはご利用できなくなっております。」
>>816 右クリックでいけない場合は、アドレスにコピペしてくらはい
>>815 MFCなしでも当然動くよ。
が、SDKだったのか。それはよく判らん。。
漏れはATLで作ったWindowsに貼り付けてるんだが。
これね。 CAxDialogImpl
>>817 ミタヨー
面白いけどでも、Ctrl + Esc or Win キーは逃げられない罠
それに、このスレで晒すのに何の意味があるの?
>>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」など様々です。 何か判断する基準というか、こんな方法で(ある程度にしろ)判断できるという方法はないでしょうか? 教えて君で申し訳ない。
>>823 とその他の方
いろいろありがdございます他。
COMは全然わかんないけど、この機会に手出してみようと思います。
825 :
デフォルトの名無しさん :02/10/31 00:14
エディットボックスとOKボタンだけのダイアログボックスを作りました。 それを起動するとOKボタンのほうにフォーカスが行っています。 起動して即座にエディットボックスから文字を入力したいので、 起動直後にカーソルをエディットボックスのほうに移動したいんですが、 そんなAPIあったら教えていただけないでしょうか?
826さんありがとうございます。SetFocusでいけました。
これ、なんかいけないらしい。どこがいけないかお前ら教えろ。 while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
828=GetMessageをMSDNで引かないアフォ
GetMessageは失敗時に -1を返す。
するってーと、こうかな? 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
つーか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 とプロシージャ関数内に書き込んでそのプログラムでメッセージボックスを開くと
?
書き方まずかったでしょうか(汗、簡単に言うとSetWindowPosで常に手前に表示されるよう に設定したダイアログベースのプログラムからメッセージボックスを表示させると メッセージボックスが操作不能になる、ということなんですが。変?
↑の354は854の間違いです。
>>854 試したことないけど、メッセージボックスも常に手前表示
にすればいいんじゃないの?
MessageBoxのパラメータで指定できたはず。
または、ダイアログ側を解除するなら
SetWindowPos(hWndDlg, NULL, 0, 0, 0, 0,
SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);
ごめん、↑は間違いなので訂正。 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
>>854 TopMostのウィンドウをオーナーに持つダイアログもTopMostに
なるんじゃないの? ちゃんとオーナー指定してる?
自己解決しました。 SetWindowPosをプロシージャの真下に書いていたのが問題でした。 WM_INITDIALOG内に書いたら普通に動きました。
>>865 >プロシージャの真下
自分言語がお好きなお方で。
867 :
デフォルトの名無しさん :02/11/01 01:00
Zオーダーが小さいウインドウ(アクティブなウインドウの後ろにあるウインドウ)に クリップボードの「貼り付け」の指示を送りたいんだけど、 ・後ろのウインドウのウインドウハンドルを取得 ・そのウインドウハンドル宛にWM_PASTEをSendMessage でいけるのかな?さっき適当にやってみたらダメだったんだけど・・・。
>>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 ありがとうございます。残念ながら上手くいきませんでした。 メニューの表示がぐちゃぐちゃになってしまいました。 ウィンドウズのスタートメニューでできているのですから何らかの方法はあると思うのですが。
>>882 実は漏れ、動的メニュー使ったこと無くて、適当言ってたよ。スマン。
でもあれくらいなら MSDN 検索ですぐ出てくるから。
スタートメニューはメニューポップアップじゃなくて、独自のウィンドウ
じゃないのか?
ファイルやショートカットのドラッグ&ドロップもできるし。
>>873-879 そうなんですか、どうもでした。
全部自前だとめんどくさいですね(汗
メニューの位置ですが、空白メニューだと
フォントのサイズに左右されると思うのですが
システムの設定でフォントのサイズを変更しても
綺麗な位置に描画されているみたいでした。
メニューも根性で描画しているのでしょうか
それだとさすがに諦める気になります。
>>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に比べて どういう利点があるのですか?
>>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
>>890 おっしゃる通り普通に出来ました。
大きいアイコンの表示になっていたので気付かなかっただけでした。
どうもありがとうございます。
>>893 単にスレ違いだと気付いてなかっただけです。すみません。
895 :
デフォルトの名無しさん :02/11/04 22:24
GetForegroundWindow GetCursorPos ScreenToClient ChildWindowFromPointEx を使ってカーソル位置のハンドルを取得することはできたのですが もっとシンプルな方法ありませんか?
>>895 GetCursorPos()
WindowFromPoint()
探していたものはまさにこれです。 ありがとうございました
探していたものはまさにこれです。 ありがとうございました。
ファイルを開くダイアログの初期サイズをアプリケーション毎に記憶させたいのですが どのタイミングでサイズの取得・復元を行えばよいのでしょう? フック関数には 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()
>>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配列が定数になっているのなら、次に同じ処理を行ったとき どうなるのでしょうか。かなりバカな質問だと思うのですが、理解するヒントが頂ければ 幸いに思います。よろしくお願いします
×PostMessage(hwnd, WM_HOGE, (WPARAM)lpcstr, 0) ○PostMessage(hwnd, WM_HOGE, (WPARAM)lpctstr_Hoge, 0)
>>915 CreateMutexでの多重起動防止の回避ってどうやるんでしょうか。
興味があります。
XPなどで別ユーザーでの多重起動防止は、CreateMutexに使う文字列に Global\
を前置すれば、可能なはず。
>>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() じゃダメなの?
>>SendMessage()じゃ
その方がよさげなのですが、どうなるか試すつもりでPostにしてみました。
すみません、言われる通り説明不足でしたので追記させて下さい、
>>921 さんが書いてくださった例のように、strはconstとかでないchar配列で、
foo()からhoge()にLPCTSTR型にキャストして渡したのですが、
LPCTSTR型にキャストしたことによって残った、というのは有り得ない話でしょうか、
LPCTSTR型はconst char *型に近いようなものだと覚えていますが、
const修飾子のことがよくわかっていないもので・・・
他にも色々試してみることにします。
>>924 あり得ないって。
912 にちゃんと書いてあるでしょ。
> 型が const か否かと、その実体が破棄されるか否かは全く別の話だ。
const は、プログラムの上から値を変更できないっていう制限の話。
実体が破棄されるか否かは、変数のスコープの話。
>プログラムの上から値を変更できない なるほど、やっと理解できました。 長々とお付き合い頂いてありがとうございます。 スタックに残っているというだけなら、念のため、 SendMessage()に書き換えておこうと思います。 ありがとうございました。
927 :
デフォルトの名無しさん :02/11/06 17:28
ウィンドウのリサイズ開始 ↓ MINMAXINFO設定(A) ↓ ユーザによるウィンドウサイズの変更 ↓ MINMAXINFO更新(B) サイズ変更中は(A)の設定が使われるようですが、こういう仕様ですか? またトラッキング中に(B)の設定を逐一反映させたいのですが、できませんか?
928 :
デフォルトの名無しさん :02/11/06 17:56
Win32APIで線を描画するときに、 アンチエイリアスをかけてくれるようなAPI、 あるいはペンの設定などがあれば教えてください。
930 :
デフォルトの名無しさん :02/11/06 18:14
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にするには どうしたらいいのでしょうか?よろしくお願いします。
>>932 シリアル通信の送信バッファって、
デフォルトは0だった気がするのだが・・・。
とりあえず、WriteFileの戻り値と、
書き込んだバイト数をチェックしてみたら?
>>934 ありがとうございます。
早速みてみます!
>>935 そうなんですよ(;´Д`)
全て0で返ってきてます・・
>>936 それって、単に何かミスって関数失敗してるんでないの?
GetLastError()してみた?
>>937 いえ、送信する関数は
>>932 の通りで実際にデータは送信されています。
しかしながらWriteFile後にEscapeCommFunction( RsHandle, SETRTS ); を行ったら
実際にデータが吐き出される前にRTSがHighになってる感じがします。
因みにボーレート9600で6バイト送信していますが、これだと最低6msはRTSが
Lowにならなければいけないはずなのに、なってくれないんですよ・・
>>938 漏れは使ったことないが、
WaitCommEventのEV_TXEMPTYでどうよ
>>938 激しくそれっぽいです!
これって非同期で使うんですよねー?
さっそく試してみますー
>919 多重起動防止は実によくあるトピックなのでMSDNでもWebでも 多くの情報があります。検索してみてください。 「複数起動の防止」とか「二重起動防止」とか微妙に表現を変えると吉。 要注意なのは、OpenMutexの結果をチェックしてCreateMutexする コードは間違ってるってこと。 #なんであんなコードが出回ってるんだろ。
>>942 漏れはCreateMutexしてGetLastErrorで見てるけど、
OpenMutexはどうダメなの?
>>942 多重起動防止の方法については知っていますが、
これを回避する方法というのに興味があったのです。
多重起動防止にMutexを使った場合、回避は相当に
大変だと思うんですが。
>>943 可能性としては低いけど、OpenMutex() と CreateMutex() の間で他の
コンテキストが CreateMutex() しちゃう可能性があるから、チェックとして
成り立たないって事だろ。
同じルーチンを複数のスレッドが通る時なんか特に。
>>944 一体何が大変だと思うの?
CreateMutex() 実行して、すでにミューテックスが作られているなら即終了
で何か問題あるの?
ごめん、よく読んでなかった。 「回避の方法」 ね。 それは漏れも知りたい。
947 :
デフォルトの名無しさん :02/11/07 08:36
C++板からきました timeGetTime() ってどのくらいはかれるんでしょうか?一時間とかいけるのでしょうか?
計ってる間に49.7日をこえたりしなけりゃだいじょうぶでねーの。
>>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に渡すってこと?
された物 × したい物 ○ です。 あれ?これってもしかして激しくスレ違いの予感?? APIの問題じゃなくて論理演算の問題かな?
>>957 > DWORD hoge=(DWORD)(GetWindowLong(hWnd,GWL_STYLE))|WS_CAPTION;
> SetWindowLong(hWnd,GWL_STYLE,hoge);
> このようにすれば反映されるんで・・・
今はどーやってんの?
今は DWORD dwStyle; SetWindowLong(hWnd, GWL_STYLE, (LONG)dwStyle); ってやってるように聞こえる。
>>958 説明下手ですみません。
dwStyleでCreateWidowしたウインドウに新たに計算した
NewdwStyleをSetWindowLongで渡すと言う事です
DWORD dwStyle=WS_CAPTION|WS_SYSMENU; SetWindowLong(hWnd,GWL_STYLE,(LONG)dwStyle); ていうふうにやりたいんですけど・・
>>963 それだとCreateWindowに渡したスタイルが入ってないんじゃないの?
>>963 CreateWindowにはどんなスタイルの組み合わせを渡してるのさ?
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
だれかそろそろ次スレ立ててくれ。 漏れのホストでは無理だ。
すみません。MFCのソ−ス見て解決しました。 CreateWindowのdwStyleとGetWindowLongの戻り値とでは スタイル=0の場合の初期値が違うようなのでこの戻り値は 使わなくてはいけないようです。 DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE); DWORD dwNewStyle = (dwStyle & ~dwRemove) | dwAdd; SetWindowLong(hWnd, GWL_STYLE, dwNewStyle); ていう感じにするしかないようです。 レスくれた方有難う御座いました。
だああ!919ちゃんと読まずにえらっっっっそうなこと書いてしまった。 激しく鬱。 …逝ってくる。
>>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; }
書き忘れ。 struct ThreadInfo { HANDLE hMutex; char TestStr[12]; }; _beginthreadex() って要らないの?
>>919 ニュアンスがよく分からんが、プロセス注入→ReseaseMutexなんてどうっすか?
ゲームの二重起動を回避するのに、そのゲームを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 忠告ありがとう。これからは気をつけるよ。
994
じゃ、995
じゃあここらで俺が体験したちょっとHな話でもするか。 高校生のときの話なんだけど、25歳の女の先生がいたわけ。 俺のクラスの副担任で、
その先生の担当する(俺のクラスではない)教室があるんだけど、そこの掃除も 俺のクラスがやんなきゃならないのさ。 んで、いつものようにその教室の掃除当番だったので行った。 でも他の奴はみんなさぼって行ったのは俺だけだったのよ。 当時の俺は、
真面目ってわけでもなかったけど、そういう当番は割とちゃんと行ってた。 で、そうなるとその教室には俺とその25歳の先生しかいなくなるわけだ。 人があまりいない放課後によ。 その先生、特別美人てわけじゃないんだけど、小柄でかわいい系の人だった。 んで、掃除も終わりかけてさぁ帰ろうかってところで、
999!!!!!
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。