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を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。