Win32API 質問箱 Build4

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

前スレ
Win32API 質問箱
http://pc.2ch.net/tech/kako/991/991576947.html

Win32API【2】
http://pc.2ch.net/test/read.cgi/tech/1006783012/ (dat落ち)

Win32API 質問箱 Build3
http://pc.2ch.net/test/read.cgi/tech/1017072275/l50

参考
MSDN Online
http://www.asia.microsoft.com/japan/developer/

猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang
2デフォルトの名無しさん:02/06/06 20:06
ポケコンのAPIは何個ぐらいあるんでしょうか?
>>1

>>2
氏ね
乙〜
5デフォルトの名無しさん:02/06/06 20:35
>>1
乙カレー
6デフォルトの名無しさん:02/06/07 10:25
APIのRegDeleteKeyなんですけど、書籍を見てもWebで調べても
「そのキーにサブキーがある場合は失敗します」って書いてあったんですけど、
何度やってもどうもサブキーごと消してくれちゃうんですよね。
いや、実はその方がありがたいんですけど。

こういう動作をするものだと思ってていいのでしょうか?
これ出来上がったら配布しなきゃならないものでちょっと心配です。

あ、私の環境はWin98です。
SHDeleteKey使った方が良くないかな
8デフォルトの名無しさん:02/06/07 11:27
>>6
9xでは成功するけどNTでは失敗します。
>>6
RegDeleteKey
Windows 95: 指定されたレジストリキーとそのサブキーを、すべて削除します。
Windows NT: 指定されたレジストリキーを削除します。サブキーを持つキーを削除することはできません。

ちゃんとMSDNに書いてある…
106:02/06/07 15:15
>>7
今調べてみたんですけど、双方の違いがよくわかりませんでした。
どう違ってなぜそちらの方が良いのか教えてもらえると助かります。

>>8-9
どうやらそのようですね。(今MSDN見てきました)
調べ方が甘かったようです…。

おかげで助かりました。
みなさんありがとうございました。
11デフォルトの名無しさん:02/06/07 16:40
プログレスバーを使うときに、上限値が不明の場合は、どのようにするのがもっともらしくみえるでしょうか。

あるツールで、指定したディレクトリ以下のすべてのファイルとディレクトリをスキャンするような部分があります。
従来は単純にスキャンしたファイルの数を表示していたのですが、
上司から「次のバージョンからプログレスバーを付けて、処理状況をグラフィカルに表示するように」と言われました。

ファイルの数は少ないときでは数個、多いときでは数千個になると思います。

こういう場合は、どのようにするのが一般的なのでしょうか?
1 最初にファイルリストを得る
2 エクスプローラのように、ゲージいっぱいで作業を続けてお茶を濁す
>10
> 今調べてみたんですけど、双方の違いがよくわかりませんでした。

NTでもサブキーがあっても削除できるじゃん
14どはまり:02/06/07 17:47
BitBltについて確認させてください。
MSDNに「コピー先のデバイスコンテキストに対して、伸張、圧縮、回転のいずれかが実施されます」
とあるのですが、BitBlt(dcDst, 0, 0, 100, -100, dcSrc, 0, 0)
とやっても、Y軸に対して反転しませんよね?

君はStretchBltと勘違いしている。
16どはまり:02/06/07 18:00
>15
srcDCとdstDCの座標を重ねて考えたとき、
BitBltは平行移動で、
StretchBltは座標変換という理解であってますか?
>>16
両者の違いは「転送先のビットマップの幅と高さ」を指定するかしないか。
StretchBltでは転送先の幅と高さに負数を与えるとビットマップが反転する。
まあ色々と実験してみてくれ。
18またもや:02/06/07 20:25
GetDIBitsが動きません。
戻り値として指定したスキャンライン数が返ってくるのですが、バッファー内には0しかない…
ZeroMemoryせずにデバッグしてみたら、GetDIBitsで0で埋められているようです。
だれか、同じ事経験した方いませんか?
MSDN調べまくったのですが、わからない。
>>11
じゃあ、探すディレクトリの直下のディレクトリ数を調べて、それで進行状況を出す。
直下に5個のディレクトリがあったら、それぞれ調べるごとに 20% ずつ進むことにする。
>>18
GetDIBits使ったことがないんでアレなんだが、考えられそうなのはこれくらいか。

・GetDIBitsの引数を正しく指定しているか?
・ビットマップをデバイスコンテキストに選択していないか?

GetDIBitsって拡張エラー情報返さねぇのかな・・一応見てみてくれ。
>20
レスありがとうございます。
エラーだと0が返るんですが、エラーにはなっていないようです。

ただ、どうも渡しているビットマップがおかしいようです。
ウィンドウに表示されている内容をファイルに落としたいのですが、
hDC = GetDC(..)
hMemDC = CreateCompatibeDC(hDC)
bitmap = CreateCompatibleBitmap(..)
BitBlt(hMemDC, ..., hDC)
GetDIBits(hMemDC, bitmap...)
とやっているのですがSelectObjectでbitmapを選択していないと0だけだし、
SelectObjectしているとちょっとだけゴミがはいります。
>>21
正しく、真っ黒い画像が得られたとか。
>>21
> BitBlt(hMemDC, ..., hDC)
何これ
>>21
メモリDCにちゃんと描画されてないとか。

hDC = GetDC(..)
hMemDC = CreateCompatibeDC(hDC)
bitmap = CreateCompatibleBitmap(..)
// ここでSelectObject(hMemDC, bitmap)してるか?
BitBlt(hMemDC, ..., hDC)
// ここでSelectObjectで選択を解除し、以前のビットマップに戻す
GetDIBits(hMemDC, bitmap...)
>24
MSDNによると選択中のビットマップではいけないとあるのですが…
SelectObjectで作ったビットマップを指定しないと何も返らないので、SelectObjectしていて、
元のオブジェクトをSelectObjectして、指定解除するのが無かったためですた。

どうもありがとうございました。

ついでといっては何ですが、もう一つ教えてください。
BITMAPINFOHEADERのbiCompressionなどにBI_JPEGやBI_PNGというのがありますよね。
このビットマップ形式でも表示できるということかと思うのですが。
さて、逆にJPEGやPNG形式で取得というのは可能なのでしょうか?
>>25
結局GetDIBitsはダメだったのか?報告キボン

BI_JPEGとかBI_PNGは新しいOS(98, 2000以降)でしか
使えないみたいだから俺は知らない。あとは自分で調べるか
知ってるやつが来るまで待つか。
>26
> 結局GetDIBitsはダメだったのか?報告キボン
おかげさまで、イメージの取得に成功しました。
親切な皆さんのおかげです。ありがとうございました。
BitsPerPixelが16bitや32bitでも取得できましたし、BI_BITFIELDSで
5:6:5マッピングも正常に動きました。

> BI_JPEGとかBI_PNGは新しいOS(98, 2000以降)でしか
> 使えないみたいだから俺は知らない。あとは自分で調べるか

やってみた限りでは、「パラメータが間違っています。」というエラーになるのですが…
私が指定しているパラメータの性もあるので、

> 知ってるやつが来るまで待つか。
です。
BI_JPEGとかBI_PNGは、プリンタDCにしか使えないような
感じでMSDNに書いてあるけど、どうなんだろ。

前ここで質問したけど、誰も知らなかったですねぇ(´・ω・`)
29デフォルトの名無しさん:02/06/09 11:54
WAN側のLAN接続を取得する方法を教えてください。
以下のように取得すると、ダイヤルアップの設定は取れるのですが、LANの設定が取れません。
PCにLANカードが3枚指してあるので、RasEnumEntriesだとインターネットにつながっている
ルーター/PCとのコネクションを取得したいのですが。


RASCONN *rasconn = new RASCONN[1];
DWORD cb = sizeof(RASCONN);
DWORD connections;

rasconn[0].dwSize = sizeof(RASCONN);
DWORD code = ::RasEnumConnections(rasconn, &cb, &connections);

if (code == ERROR_BUFFER_TOO_SMALL) {
 delete [] rasconn;
 rasconn = new RASCONN[cb / sizeof(RASCONN)];
 rasconn[0].dwSize = sizeof(RASCONN);
 ::RasEnumConnections(rasconn, &cb, &connections);
}
30デフォルトの名無しさん:02/06/09 16:42
C言語なら俺に聞けスレから流れてきました
444で質問していたのですがこちらで質問です

猫でも分かるプログラミングという有名ページがありますが
あそこには超初心者用と書いてあります。
あれが理解できても初心者ですか?
Windows(Win32か)プログラミングに関してはかなりのものになると思うのですが
実際はまだまだなのでしょうか…
確かにあそこだけでは自分でオリジナルなものを作るのには
厳しいと思いますけどWindowsの仕組みを理解するには十分すぎる気もします。
>>30
だから初心者ってのは意識の問題だっての。
今31がいいこと言った!
3330:02/06/09 18:03
あそこのことが理解できていればWindowsプログラムの仕組みはOKということですね。
重複までしてご迷惑をおかけいたしました。
少しだけですが自信が出ました。
理解することと使いこなすことは別物(ボソ
35デフォルトの名無しさん:02/06/11 05:22
ダイアログのリソースで、LTEXTの内容に(&R)を含めておいて、
ALT+Rを押すとComboBoxなどにフォーカスを移す処理をしたいのですが、
どのようにすればいいのでしょうか?
2chには、初心者だといって、甘い対応をしてもらおうとする人間と、
初心者なのに有能なつもりの勘違い君の、2通りのタイプしかいない。
37デフォルトの名無しさん:02/06/11 06:01
>>35
タブオーダを確認する。
モードレスダイアログならIsDialogMessage()つける。
でいいとおもいます。
ウィンドウクラスを列挙するAPIってありますか?
RegisterClassで片っ端から検索。
40デフォルトの名無しさん:02/06/11 16:26
以下のコード(省略してありますが...)でHDDからFDDにファイルをコピーしています。
CloseHandleを行う前(<==ココで示したタイミング)にディスケットを取り出してしまう
とエラーのダイアログが表示されてしまいます。回避する方法をご存知の方、
ご教授いただけますでしょうか?

oldMode = SetErrorMode(SEM_FAILCRITICALERRORS);
srcHandle = CreateFile(); //HDD上のファイル
destHandle = CreateFile(); //FDD上のファイル
while(1)
{
ReadFile(srcHandle,...);
WriteFile(destHandle,...);
}

CloseHandle(srcHdl);
      <==ココ
CloseHandle(destHdl);
SetErrorMode(oldMode);
>>40
そこで取り出さないといけない理由ってのが気になる。なんで?
>40
WriteFileの後に、FlushFileBuffers汁
もしくは、srcHandleのCreateFileでFILE_FLAG_WRITE_THROUGHを指定汁
結果キボンヌ
早速の返答ありがとうございます。

>>41
ユーザーの方が誤って取り出した際にエラーメッセージが出てしまった状況です。
(ディスクアクセスしている最中なので、本来は触ってほしくないのですが...)

>>42
FlushFileBuffers、FILE_FLAG_WRITE_THROUGHの指定ともに確認してみましたが、
結果はやはり「ドライブにディスクがありません。・・・」とのダイアログが
表示されてしまいました。
システムでドライブの情報を保持でもしているのでしょうか?
もう少し、調べてみます。
4441:02/06/11 19:01
>>43
そういう状況でちゃんとエラーメッセージが出たんだから、
立派な製品じゃないか。胸を張れ(w
4541:02/06/11 19:05
>>43
ま、まさか、そういう状況でもエラーなしに書き込めっていう要求もらった?
ガクガクブルブル
>>43
むしろエラーダイアログ出ない方がまずいだろ。
ユーザーも書き込めたと思うだろうし。
エラーダイアログをカスタマイズしたいとか。
いや、
 SetErrorMode(SEM_FAILCRITICALERRORS)
をしてるのになんで、エラーダイアログが出るのか、ということでないの?
4940:02/06/12 01:24
すみません。状況説明が不足していますね。

対象がマウス、PCキーボードが接続していないPCで、エラーダイアログが出るとそれに対して操作を行う事が難しいのです。
KIOSK端末みたいなもので、特殊なインターフェイスで専用のキーパッドを接続しています。
キー入力が矢印と数値しかできない(とお考えください)ので、エラーダイアログが出るとそれに対して操作を行う事が難しいのです。

そこでエラーをアプリケーションでハンドリングしようと、SetErrorMode(SEM_FAILCRITICALERRORS)としたにもかかわらず、
40で示したタイミングでダイアログが表示されてしまった...。ということです。

48さんがおっしゃるように
 >SetErrorMode(SEM_FAILCRITICALERRORS)
 >をしてるのになんで、エラーダイアログが出るのか、ということでないの?
というのが、疑問点です。

長文失礼しました。
>>49
コードでコピーするんじゃなくてCopyFile()使うってのはどう?

あと、どうしてもダメな場合はダイアログでたらボタン押す
監視アプリを常駐させとくとか。
#確かローソンのロッピーとかもそうしてたような…
そもそも、ディスクを引き抜いた事によるデータの矛盾はブルーバック物のエラーだけど、
さすがに簡単にブルーバックをだすのはユーザビリティに優れているとはいえないから、
ダイアログが出る程度にとどめただけだとおもわれ。
WM_LBUTTONDOWNでコンテキストメニュー出すアプリケーション多すぎ。
何とかしてくだちい。
何の話だ?
タスクトレイ?
WM_CONTEXTMENUを使うべきところで、
WM_LBUTTONDOWNを使っている、て事だろ。
55初心者:02/06/12 17:17
通常、描画ルーチンではメモリーDCを作成して描画し、BitBltなどでスクリーンDCに転送
しますが、描画ルーチンでスクリーンDCに直接描画すると何が問題になるのでしょう?

複数の描画処理(線を引くなど)を行ったり、アニメーションする場合にちらつかないように?
という事は、単にビットマップを描画しているだけだと直接描画しても問題ないのかな。

オフスクリーンのイメージとして取っておくならともかく、毎回描画ルーチンでCreateCompatibleDC
でメモリーDCを作るサンプルばかりなので納得でけへん。
>>54
つまりWM_CONTEXTMENUで処理していないから、
メニューキー押してもコンテキストメニューが出ないってことか。
>>52
アプリケーションキーを押してもコンテキストメニューが出ないぞゴルァって事?
ちなみに俺はちゃんとWM_CONTEXTMENUで拾ってる。
>>57被ってんな・・鬱

>>55
ディスプレイDCに何回も描画していると描画の過程が見えるのでちらつく。それだけ。
オフスクリーン使うにしても絶対に一回はディスプレイDCに描かないといけないんだから
GDI関数で線とか円を直接描いても別に問題なかろう。
>WM_LBUTTONDOWNでコンテキストメニュー出すアプリケーション多すぎ。
左クリックで出ることになるから右クリックで出るようにすれってことじゃないのか。
もちろんWM_CONTEXTMENUで。
>>59
わお!ミスった
WM_RBUTTONDOWNですた。
タスクトレイのほうも、XPで不具合でてるのわかってるはずなのにその後のアップグレードでも直されてなかったり。
あるウィンドウの可視な部分のRECTなりRGNを取得するには、どうしたらよいのでしょう?
関係有りそうな、GetClipRgn, GetWindowRgn, GetUpdateRgnなどやりましたが、
どうもうまく取れません。
>>61
取得できません。以上。
ウィンドウの最大化ボタンを押したときに発行されるメッセージなどは有りますか?
>>63
WM_SIZEで、wParam == SIZE_MAXIMIZEDが最大化ボタンのメッセージ。
>64
即レスありがとうございました。
>61
GetRandomRgn(hDC, rgn, SYSRGN);
ClientToScreen(m_hWnd, &org);
rgn.OffsetRgn(-org.x, -org.y);
でできますた。
>>60
>タスクトレイのほうも、XPで不具合でてるのわかってる
詳細きぼんぬ
68デフォルトの名無しさん:02/06/12 22:29
>>67
右ボタンを押し下げたときにアプリケーションのコンテキストメニューが表示されて、
右ボタンを離したときにWinが出すタスクトレイ本来のコンテキストメニューが重ねて表示される。
6967:02/06/12 23:13
>>68
なるほど。自分のタスクトレイアプリでも WM_RBUTTONDOWN使ってたので(;´Д`)
今チェックしてみたんだけど再現しなかった。状況によるのかな?
っていうか、WM_CONTEXTMENUが飛んでこないっぽい...?
70デフォルトの名無しさん:02/06/12 23:17
ローカルなHTMLファイルをタグ?つきで表示したくて
ShellExecute(..."c:\\unkou.html#unkou"...);
ってやっても起動してくれないです。
いい方法あるのでしょうか?
>>70 あ、それ、俺もちょうど知りたいと思ってた
・WM_CONTEXTMENUはAPPキーが押されたときとクライアント領域で右クリックされたときに飛んでくる
・タスクトレイで飛んでくるメッセージはWM_*BUTTONDOWN/UP等。
で、タスクトレイとWM_CONTEXTMENUごっちゃにして考えてないか?
file:///c:/unkou.html#unkou

と汁
74デフォルトの名無しさん:02/06/12 23:26
7552:02/06/12 23:27
>72
漏れは一度もWM_CONTEXTMENUとは言ってない、
とにかくWM_RBUTTONDOWN(当初間違ってLBUTTONと書いた)でメニュー出すのは止めてくれと
>74
ネタが古い
>>75
あんた出てこなくて良いって。
あんたの言ってることはたぶんわかってるから。
WM_CONTEXTMENUの話題に移っただけだk
78デフォルトの名無しさん:02/06/12 23:49
file:///
にしたらページは開いてくれたんですけど、
#unkouに移動してくれない希ガスるんですが。。
僕タンだけ?
要するにコンテキストメニュー(ショートカットメニュー、右クリックメニューとも言うのかな?)
は、WM_COMTEXTMENUで表示しなさいって事ですか?
M$製以外のソフトのトレイアイコン6個中5個がWM_RBUTTONDOWN・・・
えーとつまりクライアント領域でメニュー出すときは、
WM_RBUTTONDOWNでなくてWM_CONTEXTMENUを使うべし、
タスクトレイでメニューを出すときは、
WM_RBUTTONDOWNでなくてWM_RBUTTONUPで開けってことでいいんすか?
8269:02/06/13 14:15
>>81 それなら激しく納得
APIのみでMFCのビットマップボタンのような機能を実装する方法はありますか?
BS_OWNERDRAWスタイルを指定してオーナードロー
>>83
MFCを使え。
MFCもAPIのみで実現されてる
>84
おかげさまでサンプルプログラムも見つかりましたので何とかなりそうです。
どうもでした。
87木村 キタキタマシーン:02/06/13 16:16
>>86
ヨカッタネ
>>87=木村 キタキタマシーン
内容のないただの相槌を書き込むのはやめといたほうがいい。
反感をもたれるから。
おまけにどこでもage
9062:02/06/13 17:18
>>66
ガーン取得できたのか
VS6.0のMSDNライブラリには載ってなくて
MSDN Onlineにはいつのまにかしれっと
> Windows NT/2000/XP: Included in Windows NT 3.1 and later.
> Windows 95/98/Me: Included in Windows 95 and later.
とか載ってるんですが非公開だったってことですか。
> Windows NT/2000/XP: The region returned is in screen coordinates.
> Windows 95/98/Me: The region returned is in window coordinates.
9xとNTで動作が違うのもいかにも非公開っぽいし
91デフォルトの名無しさん:02/06/13 18:16
すいません。MSDNサーフに疲れました。
WIN2000でLANの接続状態をひろえるAPIはありませんか。
またはそれに代わる良い方法があれば教えてください。
VBで接続状態の監視ができるようにしたいのです。
その、「LANの接続状態」なる語はいったい何を示しているのか
まずはっきり教えてくれ。
まあとりあえず、定期的に鯖にpingでも撃っとけ。
93デフォルトの名無しさん:02/06/13 18:52
>>92
うーん、WIN2000のローカルエリアネットワークのプロパティで出てくる
ダイヤログに接俗の『状態:有効(または無効)』ってあるでしょ。
OSでLANの接続状態を監視しているのだろうけど、そいつを利用できないもの
かしらって思ったのです。
今作ってるのはMSDEを使う鯖蔵型のプログラムなんですが、LANが切断されると、
たとえすぐにLANが回復してもDBとのコネクトは回復しないでしょ。
だからLANが切れたときに即、エラー出してプログラムを強制終了させて、つまり
プログラムを再起動させるようにしてしまえば良いカナーっと思ったのです。
94デフォルトの名無しさん:02/06/13 18:55
>>93
あ、つまりその、接続状態が「有効」か「無効」かってのを知りたいのです。
9592:02/06/13 18:56
ああ、それなら、
GetIfEntry
を使ったらどうかな?
96デフォルトの名無しさん:02/06/13 19:03
>>95
即レス感謝です。しかしながらすいません。初耳APIです。
どこかに良いTipsなんて出てたらURL教えて下さい。
ぐぐるってなぁに
googleのこと
9997:02/06/13 22:44
>>96
googleだってよ。
100デフォルトの名無しさん:02/06/13 23:36
文字列を描画するときに文字にグラデーションを掛けたいのですが
使う文字だけ画像データとして持って BitBlt() とかで
描画するのが一般的なのでしょうか?

ttp://www.watch.impress.co.jp/game/docs/20010618/ys20.jpg
↑みたいな感じ
こういうのは使う文字だけ画像データで持っているのでしょうか?
>100
"ROPコード"って言葉は知ってる?
文字を描いたビットマップとグラデーションのかかったビットマップを用意して、ROPコードを使って2枚を重ねるとできるよ。
>>100
アルファベットと数字だけとかなら画像で持っててもいいが日本語は現実的じゃない(と思う)。
やるんならDIBSection作ってそこにTextOutして、そのビットイメージに対して加工するとか
するのがいいんじゃなかろうか?
>>102
・・・・さっきどっかに誤爆したかも・・・?
俺は日本語も画像で持ってる。
画像つっても格納してるのは8bitの輝度情報だけで、実際の色は描画時に計算するんだけど。
JIS第1水準くらいなら画像サイズもそれほど大きくはならないよ
104102:02/06/14 00:06
>>103
考え方の違いなんだろうな。俺はチマチマしたゲームばっか作ってるから
そういう発想が全然なかった。うん、参考になったyo。
105100:02/06/14 00:07
>>101
知りませんでした。

簡単に言うと、グラデの掛かった画像を、フォントの画像を型として
抜くという感じでしょうか?

>>102, 103
どうしてもわからなかったらその方向にします…。
106100:02/06/14 00:27
そうです。
模様を書いた紙の上に文字を白抜きしたもう1枚の紙を置く感じです。
「ラスタオペレーションコード」ともいいます。
具体的には、文字と背景の画像を作って、
PatBlt(),BitBlt(),StretchBlt(),MaskBlt(),PlgBlt()
などで画像を加工します。
詳しくは、Charles Petzoldの「プログラミングWindows」やAPIヘルプに解説があります。
>>103
たとえばゲームに使うとして、
必要なグリフをビットマップにして配布するのは、
ライセンス違反となることもあるので気をつけないとダメだぞ
>>107
それはあり得るね、気をつけないとね。
109100:02/06/14 00:46
>>101-108
うまく行きました!
ありがとうございました。

またひとつ勉強になりました m(_ _)m
110デフォルトの名無しさん:02/06/14 03:22
ゲームプログラムで、メッセージの無いときの処理を書きたいのですが、
while(1){
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)){
if (!GetMessage(&msg, NULL, 0, 0)) return msg.wParam ;
TranslateMessage(&msg) ;
DispatchMessage(&msg) ;
}else{
Mainloop(hWnd);
}
}
の様にすると、
1.9xでCPU占拠率が上がる(ノートのバッテリーの持ちが悪くなる)
2.エレガントではない
と言う問題が出てしまいます。
何か良い方法は無いでしょうか?
111デフォルトの名無しさん:02/06/14 03:24
インデントが崩れてしまったので再投稿です。
ゲームプログラムで、メッセージの無いときの処理を書きたいのですが、
while(1){
  if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)){
    if (!GetMessage(&msg, NULL, 0, 0)) return msg.wParam ;
    TranslateMessage(&msg) ;
    DispatchMessage(&msg) ;
  }else{
    Mainloop(hWnd);
  }
}
の様にすると、
1.9xでCPU占拠率が上がる(ノートのバッテリーの持ちが悪くなる)
2.エレガントではない
と言う問題が出てしまいます。
何か良い方法は無いでしょうか?
>>110
全部メッセージ経由で処理する。

1. timeSetEvent() を用い、一定時間毎に WM_USER + n をポストするように。
2. WM_USER + n に対するメッセージハンドラから Mainloop() を呼び出す。
113110:02/06/14 03:45
>>112
うわー、それ恐ろしく頭良い方法ですねぇ(笑)
ちょっと調べてみたら詳しい情報がわんさか出てきました。
やっぱこれってかなり初心者質問だったみたいですね...
こういうゲームプログラミングの基礎みたいなのって、どんな本に載ってるんですか?
やっぱGame Programming Gems ですか(高くて手を出しにくいんですが...)
Mainloop(hWnd);
Sleep(1);
gemsにこんな程度の低いことは乗ってません
116112:02/06/14 03:56
>>113
> こういうゲームプログラミングの基礎みたいなのって、どんな本に載ってるん
> ですか?
timeSetEvent() やメッセージを使って処理を進める方法は、ゲームとは無関係に
Win32 のバイブル「プログラミング Windows」を読んで知りました。

ゲームプログラミングの基礎を解説した書籍で「これは」というモノは見かけませ
んね……。Game Programming Gems は、むしろ既にゲームを 2, 3 本書いた人
間がさらなる情報を探す手がかりとして使うもので、論文の abstract 集のような
感じです。いきなり読んでも、あまり役に立たないかと。
>>115
略すなよ。コの界隈で gems 本というと Graphics Gems もあるし。
118110:02/06/14 03:59
>>114
それは知っていましたが、あまりエレガントでは無いので...
>>115
そうなんですか...書評に初級者から上級者までって書いてあったので...
そういう低レベルな事って調べにくいんですがみなさんはどうやって調べたんですか?
119デフォルトの名無しさん:02/06/14 04:02
int WinMain(...)
{
try {
mymain(...);
} catch(...) {
// ここでエラーを起こした状態のレジスタ情報や
// スタック情報を取りたいんですがどうしたらいい
// のでしょうか?
}
}
>>118
エレガントじゃないってどういうことだ?

だったらこう汁!
必要以上のCPU時間を取らないエレガントな実装だ(ワラ

DWORD frame_time = 1000 / 60;
while(1){
  if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
    if (msg.message == WM_QUIT) return msg.wParam ;
    TranslateMessage(&msg) ;
    DispatchMessage(&msg) ;
  }else{
    DWORD tick = timeGetTime();
    Mainloop(hWnd);
    int interval = timeGetTime() - tick;
    if (interval > 0) ※
      Sleep(interval);
  }
}

※ もしくは
> while (timeGetTime() < tick + frame_time)
> Sleep(0);
このように。
>>119
すでにスタックが巻き戻っているので手はない。
例外クラスに状態を保存させるしかない。
>>120
> エレガントじゃないってどういうことだ?
感性が微妙に鈍いな…

あと「もしくは」の方法だと、バッテリー消耗激しい問題は解決しないと思うぞ。
Sleep(0) って、呼び出し側のプロセスよりも実行優先度が高いプロセスが存在
しなければ、すぐに戻って来ちゃうでしょ?
>>122
>感性が微妙に鈍いな…
どういう意味だ?
正直、すでに定番となっている形式のIdleLoopなのに、
それをエレガントじゃないと切り捨てる意味がわからないって事だが。

>バッテリー
問題ない。
基本的にhltでループ回しているのと変わらないから。
それでかつ精度もそれなりに高いやり方。
124デフォルトの名無しさん:02/06/14 04:15
>>121
ありがとうございます。
ということは、catch(...)でしか取れないような
エラーを起こした場合、その原因を知る方法って
ナイのでしょうか?
125110:02/06/14 04:23
>>116
しまった!!(^^;
たしかにプログラミングWindows(下)に載ってました。
下は恐れ多くも流し読みしてました(^^;
流し読みしちゃぁいけない本なんですね...
穴があくほど読んで出直します。
Game Programming Gems は、ゲーム2.3本作ってから買うことにします。
>>120
>エレガントじゃないってどういうことだ?
分かりません(^^; なんとなく(1)とかです。
>エレガントな実装だ
ぉお、それも良いですね。
たしかにかなりエレガントですね。
どっちが良いんでしょう。ちょっと自分でも調べてきます。
126110:02/06/14 04:39
>>120
if (interval > 0)
 Sleep(interval);
って
if (interval > 0)
 Sleep(frame_time - interval)
ですよね...?
>>123
> 基本的にhltでループ回しているのと変わらないから。
いや、
> while (timeGetTime() < tick + frame_time)
> Sleep(0);
これは、どう見ても hlt でループ回すのとは別だろ。timeGetTime() も while の
条件分岐も CPU 働くよ。(これが Sleep(1) なら話は分かる)
>>120ダサ杉
Sleep()中に来たイベントはどうすんだよ。
129デフォルトの名無しさん:02/06/14 17:41
質問です。
IEのプラグインツールバーを作ろうと思ってサイトを検索していると、
http://www.codeproject.com/atl/ietoolbartutorial.asp
というサイト見つけたんだけども、commctrl.h が古いらしくコンパイルがとおらない…。
(TBSTYLE_EX_MIXEDBUTTONSが定義されてないとエラーが出てくる)
これって最新のヘッダーファイルはどこに?
(ちなみにVC++6.0で開発しています)
>>127
Sleep(0)でもSystem Idle Processに1tick処理が回るよ。
129
VC++.net "commctrl.h"抜粋

#if (_WIN32_IE >= 0x0501)
#define TBSTYLE_EX_MIXEDBUTTONS 0x00000008
#define TBSTYLE_EX_HIDECLIPPEDBUTTONS 0x00000010 // don't show partially obscured buttons
#endif // 0x0501
132129:02/06/14 17:59
>>131
ありがとう!

…これって、最新のcommctrl.h が欲しいなら、.net 買うしかないってことなんですかね、
やっぱし。
>>132
PlatformSDK落とせ
134デフォルトの名無しさん:02/06/14 18:02
つーかメッセージループにSleepを置くのはどうかと思うけど。
別スレッド作ってMsgWaitForMultipleObjects。
俺が模作したなかじゃこれが一番エレガント。
精度はパフォーマンスタイマーで補う。
ゲームループ自体を別スレッドにするというのはどーよ。
Windowsのイベント処理は全部忘れられるぞ
>>134-135
それは誰でもやること。
あくまでシングルスレッドでがんばりたいって事じゃないのか?
シングルならなおさら MsgWaitForMultipleObjects じゃないかなあ
タスクトレイに常駐させるプログラムを作りたいんですが
ウインドウを生成しないプログラムってどうやって作るんでしょう?
ウインドウクラスやcreatewindowは使わないんですよね?
139138:02/06/15 14:59
書き忘れましたがVisualCとSDKで作っています。
>>138
WS_VISIBLE付けずにCreateWindow
141デフォルトの名無しさん:02/06/15 17:17
クラスタを直読みする方法を教えてください。
>>140

HWNDがNULLでGetThreadMessage()でウインドウなしが実現できる
>>138
普通非表示のウィンドウを作るんでないの
>>138
て優香、ウィンドウを作らないとタスクトレイアイコンをクリックしたときなどの
通知メッセージを受け取れまへん。
145138:02/06/16 01:29
>>144
そうですね、HWNDが無ければダメですね。
非表示のウインドウを作るのが一般的な方法かな。
146デフォルトの名無しさん:02/06/16 01:35
マウスの座標(x,y)=(100,200)みたいなデータがchar型の変数に
char grid[128]="100,200"
のように入っているときxとyの値を個別に取り出して別の変数に入れたい時は
どんな感じでプログラミングすればよい?できればintやPOINT型で入れたいんですが。
>>146
x=atoi(grid);
y=atoi(strstr(grid,',')+1);
ってな処か?
#これはAPIの質問なのか?
>>146
どうせstdio.hをincludeするなら、
int x,y;
sscanf(grid,"%d,%d",&x,&y);
がスマートかも。
すれ違いなのでSEGA。
sageてないでSEGAれよ。
150146:02/06/16 02:03
えっと、一応Windowsプログラミングをしていているのですが
Cのお話だと思うのですがこのスレで質問してしまいました。
Cだと思ったらCスレいけよ
152146:02/06/16 03:13
APIで出来る範囲はやりたいと思って・・・。
>>152
無意味
winプログラムでscanfやsscanfってあまり使わないような・・・。
stdinがなければscanf()はもちろん使えないけど、sscanf()なら使えるだろ。
実際に使うかどうかはまた別の問題だが、windowプログラムだからかどうかと
は無関係。
ランタイムライブラリを使いたくない場合は?
>>156
そういう場合は使わなきゃ良いじゃん
>>157
スタートアップできないっす。
>>158 は?
void Startup()
{
 ExitProcess(0);
}

cl -link -entry:Startup
161デフォルトの名無しさん:02/06/16 18:32
プログラミングWindows第5版って上下で1万円以上するんだけど
買う価値あるかな?
162デフォルトの名無しさん:02/06/16 18:37
>>161
本気でWindowsプログラムをC言語で学びたければ買う価値あるよ。
SDKでやるんだよ。

でも
AdvancedWindowsと何が違うのでしょうか?
AdvancedWidnows買ってないのであちらはよく分かりません。
あちら、C++で書かれているようですけど。
C++分かれば今ならAdancedWindowsで良いのでしょうか?
164デフォルトの名無しさん:02/06/16 18:59
>>162
それでAPI勉強してからC++のMFC勉強しようと思ってるのですが
わざわざAPIを勉強する必要もないですか?
ProgrammingWindowsはWindowsの仕組みがC言語で書かれている書籍。

MFC使っていてもWin32APIは出てくるよ。
.netになったらWin32APIは邪魔になりそうですけど同なのでしょうか?
APIやMFCって勉強するものですか?
C(の場合API)やC++(の場合MFC)が分かれば使えると思います。
>>164
知ってた方が世界は広がる。
いまさらC言語でWindowsアプリ作るためにAPIを学ぶってことに意味があるか?
>>167
ないと思う。
って言うよりプログラミングWindowsはいまどきいるか?
>>167
Win32 native なコードを書く人間にとっては、意味がある。MFC やら ATL を使う
にせよ、背後にあるメッセージの仕組みやら Win32 API 知らんと、実際にはマト
モにプログラミングできんし。

ただ、今更 Win32 native なコードを書く勉強をすることに意味があるかは、何と
も言えんな。現時点では仕事は結構あるけど、これから増えるとは思えんし。

(まぁ、まだ 1 年ぐらいは食えるよ。その先は世の中 .net になるのか、それとも
しぶとく Win32 native が残るのかに依る)
.net逝けよ!
ヽ(`Д´)ノ ウワァァァン
漏れは貧しい学生なのに高い金出してプログラミングwindows買ったのに。
こんな漏れは逝ってよしですか?
>>170
本買う前にやりたい分野のこと少しくらい調べろよ。
>>170
正解!
話の流れからすると.netではWin32APIを使わないっぽいけど、どゆこと?
.netでは、MFCとは異なるラッピングのライブラリがあるの?
>>173
き、きみねぇ・・・
.netがMFCの代わりだYO!
176173:02/06/16 22:13
>>174
な、なにその反応。俺、もしかして、「すごくくだらない質問スレ」級の
質問をしてしまったの? 逝くべき?
でも、その前に解説してくれー。

>>175
.net「が」!? わけわからーん。

自分で晒しageしとくか。
.NETスレに行ってください。
APIスレであなたは「邪魔」です
178デフォルトの名無しさん:02/06/17 06:58
わかんねぇよ!何がなんだかさっぱりだよ!3時間悩んでます。VC++でさぁ、簡単なプログラムくんでみたんだけど、バグってるよ!
なんで?どこがいけないの?

メッセージキューを理解するってやつでマウスの左ボタンを押しながらマウスを動かすと(要はドラッグ)
小さい円を描くってやつで、マウスを早く動かすとWM_MOUSEMOVEの中身が入れ替わるから円がまばらになるってだけなんだけどどうしてもエラー(TωT)ブヒー
SPY++で見てみると、際限なくWM_PAINTがはっせいするんだよねぇ。ハマったよ。誰か教えて下さい。

注:そのままコピペしてビルドするとビジー状態になるから、強制終了してネ

*************************************こっから*************************************************************

#include "windows.h"

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevinstance,
LPSTR lpCmdLine,
int nCmdShow)
{

WNDCLASSEX wcl;
HWND hWnd;
MSG msg;

wcl.cbSize = sizeof(WNDCLASSEX);
wcl.style = CS_HREDRAW | CS_VREDRAW;
wcl.lpfnWndProc = (WNDPROC)WndProc;
wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;
wcl.hInstance = hInstance;
wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
wcl.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcl.lpszMenuName = NULL;
wcl.lpszClassName = "ModelApp";
wcl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

RegisterClassEx(&wcl);

179デフォルトの名無しさん:02/06/17 07:00
178のつづき*************************************************************************************

hWnd = CreateWindow(wcl.lpszClassName,
"SetCursor3",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

while(GetMessage(&msg, NULL, 0, 0));
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

HDC hdc;
int x, y;

switch(message)
{
case WM_MOUSEMOVE:

if(wParam & MK_LBUTTON)
{
hdc = GetDC(hWnd);
x = LOWORD(lParam);
y = HIWORD(lParam);

Ellipse(hdc, x - 5, y - 5, x + 5, y + 5);
ReleaseDC(hWnd, hdc);
}
return 0;

case WM_DESTROY:

PostQuitMessage(0);
return 0;

default:

return DefWindowProc(hWnd, message, wParam, lParam);
}
}
WM_PAINT は処理しない限り延々と発生し続けます。

PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);

これだけでいいから WM_PAINT の処理入れてみそ?
>>179
while(GetMessage(&msg, NULL, 0, 0)); ←セミコロン
{
182デフォルトの名無しさん:02/06/17 08:10
だぁあああぁぁぁ
なんとセミコロンだぁ(〃∇〃) てれっ☆
こんな単純な、ミスをするなんて・・・・・俺もまだまだひよっこだな・・・・ふっ
間違えなくてもひよっこだけどね・・・ぼそっ

セミコロン消したら一発オーケーでした。
181さんありがとうございました。
180さんもありがとう。

VC++。警告ぐらい出してくれ!わからんじゃないか!

おそまつでした。(@^_^)ゞ ポリポリ
>>182
ゴミ人間。
>>183
大山鳴動してなんとやらだな、と滅多に
使えないことわざをここぞとばかりに使ってみる。

まぁ礼を言えるだけ真人間じゃないかな。最近はそれすら
言えないヤツが多いからね。このスレにもいっぱいだ。
>while(GetMessage(&msg, NULL, 0, 0)); ←セミコロン

VC#では確か指摘してくれたはず。
>>182
警告されたら困る。while中に式書いて空ループ廻すのは良くやる手法。
>>186
でも、その直後にただのブロック置くことってかなり少ない罠。
whileの空ループの効用は何?
無限ループならwhile(1)とかでしょうけど。
>>188
前回の状態を保持する関数、もしくは同期用の待ち関数で、

while(hoge(1) != 0);
while(WaitThread(THR_ALL) != 0);

とか。
とりあえずcontinue;だけでも置いとけ。
while (1) {
}
がよろしいかと
192デフォルトの名無しさん:02/06/17 18:58
>>186
よくやるなよ〜。
ビジーループは俺的にタブーって感じだ。
while (1){}もそう。
検索するコンテナなりなんなり
そういうリソースってのは、必ず有限な訳で
()の中に条件式を入れられないケースなんて滅多にないはずだぞ。
何で使う?
>>192
無限ループは常套手段だろう。Win32 API がらみだと、たとえばこんなコードとか。

  for (;;) {
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
      if (msg.message == WM_QUIT)
        break;
      if (TranslateAccelerator(hWnd, hAccel, &msg) == 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
    } else if (app.IsActive()) {
      app.ExecOneStep();
      Sleep(0);
    } else {
      WaitMessage();
    }
  }
while (*dst++ = *src++);
こういうのだってあるだろ
こんなのもアリだな。

for (List *p = phead->next; p != NULL; p = p->next)
  ;
それじゃ意味ないだろ。
for (List *p = phead; p->next != NULL; p = p->next)
  ;
>>196
リストの末尾探し?
ObjectPascalなら使えないけどいい!
>192
> ビジーループは俺的にタブーって感じだ。

while (1)だけで回すってことじゃなくて、言いたかったのは、
空文";"じゃなくて中に何も無くても{}の方が、よろしかないかと
いふこと
while(getchar() != -1)でもfor(;;)でもなんでもいいんだけどね
199デフォルトの名無しさん:02/06/18 18:13
Windows2000 以上の環境の Fax Service を使った経験のある方、
情報が得られそうなサイトや書籍があれば教えていただけないでしょうか。

USのMSDNサイトと ASCIIのMSDN magazin No.18に記事があるのはGoogle等で
Hitしたのですが、他の出来れば日本語のドキュメントか、具体的なサンプルが
掲載されているサイト等を探しています。
200デフォルトの名無しさん:02/06/18 19:00
0x11001000関数電卓でのいんちきゲッチュ
記念age
201デフォルトの名無しさん:02/06/18 21:15
ウインドウの外にあるときも、もう画面の端に来てしまったときも
マウスの動き(中の歯車の動き。ちなみにX座標≪水平方向≫のみ)
を取りたいのですが、どうしたらよいでしょう。

とりあえず今は「猫でも出来る〜101章」にあったように
WM_LBUTTONDOWN:メッセージを受け取ると
SetCapture(hWnd)関数を呼ぶようにして、左クリックしたままなら
画面上の座標は取れるようになりました。

case WM_LBUTTONDOWN:
SetCapture(hwnd);
break;

しかしこれだと、左クリックし続けなければならないし
画面の端に来たときに止まってしまいます。

誰か分かる方いらっしゃいましたら、どうかよろしくお願い致します。
フック
203デフォルトの名無しさん:02/06/18 21:18
追加
WM_MOUSEMOVEメッセージが来たときにSetCapture関数を呼んでも
ウインドウを外れると動かなくなってしまいます。

本当に初心者な質問ですみません。
SetWindowsHookExだっけか
フック船長!
206デフォルトの名無しさん:02/06/18 21:36
なるほど、フックというのを使って
メッセージの横取り?みたいなことが出来るんですね。
知りませんでした。
難しそうですが・・・何とか色々検索してやってみます。
ありがとうございました。
>201
右クリックし続けないといけないのは、それなりに正常な動作
だったはず。画面の端にきたら止まるのがこまるなら、
それを検出してもう一方の端にマウスを設定すればいいのでは。
208デフォルトの名無しさん:02/06/18 23:04
なるほど、クリックし続けなきゃいけないって言うのは
避けようがないんですか。
>それを検出してもう一方の端にマウスを設定すればいいのでは。
もう一方の端に設定する仕方(マウスポインタの強制移動?)の仕方がわかりません。
本当に素人ですみません。検索してきます。
レス本当にありがとうございます。
209デフォルトの名無しさん:02/06/18 23:11
あ、SetCursorPos関数でできそうですね。
何度もすみません。
210デフォルトの名無しさん:02/06/18 23:17
実現したい処理が思いつかない場合どうしますか?
ライブラリ探しまくりますか?
そこで見つからなかったらどうしますか?
その時点ではあきらめて、無駄が多くてもいいからとりあえず動くようにしとく。
全体が動いて落ち着くか、その部分がネックになるようだったらもう一度しらべなおす。
>>210
> そこで見つからなかったらどうしますか?
どうしても必要なら、作るしかないだろ。

ただ、ライブラリを使うのに比べてコストがかかるから、まずは見積もりを
出して許容範囲にあるか、あるいは別の方法で安く逃げられないかを考え
るけど。
213デフォルトの名無しさん:02/06/19 00:21
2つのウインドウ(ウインドウ1とウインドウ2)を作成し,ウインドウ1のプロシジャで
ビットマップの読み込と表示を,ウインドウ2のプロシジャではウインドウ1
のプロシジャで読み込んだ画像の加工と表示をさせたいのですが,肝心の
ウインドウ1のプロシジャ内のデータ(ビットマップ情報などをまとめた構造体)を
ウインドウ2のプロシジャに受け渡す方法が分かりません.

googleで検索して見様見真似で以下のようなコードを書いてみたのですが,
矢印のところで「error C2115: '=' : 互換性のない型が含まれています。」と
エラーが表示されうまくいきませんでした.一応,参考にした所では
reinterpret_castでキャストしていたのですが,Cで使おうとしたらエラーがでて
使えませんでした.受け渡しの方法が間違っているのか,それとも構造体を
送るには別の方法があるのか分からなくて困っています.
どうかご教授をお願いします.

/*ウインドウ1のプロシジャ (IMAGEは構造体)*/
static IMAGE im01;
SendMessage(hWnd, WM_USER+100, 0, (LPARAM)(&im01));

/*ウインドウ2のプロシジャ*/
static IMAGE *im02;
switch(message){
 case WM_USER+100:
  * im02 = (IMAGE*)(lParam);   <===
  break;
214デフォルトの名無しさん :02/06/19 00:21
Win2000でメモリ書きかえるときってGetWindowThreadProcessIdと
OpenProcessとWrite/ReadProcessMemoryだけで可能ですか?
>>213
im02 = (IMAGE*)(lParam);
または
* im02 = *(IMAGE*)(lParam);
では?

WM_COPYDATAってメッセージもあったと思うけど使えない?
ウインドウから開いたダイアログの状態(開いているか、閉じたか)
を判定する方法ありませんか?
モーダルダイアログなら、帰ってきた時には閉じている。
モードレスダイアログだとしたら……
a. ダイアログが閉じた時にオーナーウィンドウに通知する
b. IsWindowでハンドルが有効かどうか検査
c. FindWindowでダイアログを探してみる
あたりかな。
>>217
ありがとうございます、やってみます。
219デフォルトの名無しさん:02/06/19 02:06
>>215
typedef struct {
BITMAPFILEHEADER * pbmfh ;
BITMAPINFO * pbmi ;
BYTE * pBits ;
int sx;
int sy;
int ex;
int ey;
} IMAGE;
上記のような構造体を渡したいので,WM_USERでやるのは(googleで見て回ると)
大変らしいので,WM_COPYDATAを使うことにしてみます.
まだ試してはいませんが,以下のような感じになるのでしょうか.
ただ,googleで見て回ったところ,構造体にポインタがあるとうまくいかないとかいう
記述があったので,ちょっと心配ですが...

/*ウインドウ1のプロシジャ (IMAGEは構造体)*/
static IMAGE im01;
COPYDATASTRUCT cds;
cds.dwData = 1;
cds.cbData = sizeof(IMAGE);
cds.lpData = &im01;
SendMessage (hWnd, WM_COPYDATA, (WPARAM)0, (LPARAM)(&cds));

/*ウインドウ2のプロシジャ*/
static IMAGE im02;
PCOPYDATASTRUCT pcds;
switch(message){
 case WM_COPYDATA:
pcds = (PCOPYDATASTRUCT)lParam;
MemoryCopy (&im02, pcds->lpData, pcds->cbData);
break;
220デフォルトの名無しさん:02/06/19 03:39
以下のようにしたらエラーはでなくなったのですが,データがうまく渡せない...

/*ウインドウ1のプロシジャ (IMAGEは構造体)*/
static IMAGE im01;
COPYDATASTRUCT cds;
cds.dwData = 1;
cds.cbData = sizeof(IMAGE);
cds.lpData = &im01;
SendMessage (hWnd, WM_COPYDATA, (WPARAM)0, (LPARAM)(&cds));

/*ウインドウ2のプロシジャ*/
static IMAGE im02;
PCOPYDATASTRUCT pcds;

case WM_COPYDATA:
pcds = (PCOPYDATASTRUCT)lParam;
memcpy(&im02,(PCOPYDATASTRUCT)lParam, sizeof(IMAGE));
ういんどう1とういんどう2が同一プロセスなのか
同一スレッドなのかが重要
>>220
>memcpy(&im02,(PCOPYDATASTRUCT)lParam, sizeof(IMAGE));

何をコピーしてるんだ、何を。
223デフォルトの名無しさん:02/06/19 11:57
>>221
同一プロセスです(ウインドウ1はWinMainで最初に作成し,ウインドウ2は
ウインドウ1のプロシジャ内でメニューからコピーを選んだときに作成されます).
あと,同一スレッドかというのは,どのような意味でしょうか?
CreatThredとか使ったことが無いので,スレッドの定義というか意味が
よくわからないのですが...

>>222
MSDNに,
void *memcpy( void *dest, const void *src, size_t count );
dest コピー先のバッファ
src コピー元のバッファ
count コピーする文字数
とあったので,,,てよく見たら「バッファ間で文字をコピーします。」と
書いてある.単純にmemcpy(送り先,送り元,大きさ)だと思ってました.
それでは,どのようにしたら構造体をコピーできるのでしょうか...
memcpy (&im02, pcds->lpData, pcds->cbData);
とかでは駄目でしょうか? それとも他に関数とかあるのでしょうか?
memcpyすると何が起こるのですか?
memcpyはデータをメモリでコピーするものと言うことでよいのですか?
memory同士でコピーして何になるのでしょうか?
>>224
いろいろあるぞ。
あるデータをちょっと弄って処理するときに、元データを保護する目的とか、
テンプレをconstで持ってて、それ弄る時とか…
226222:02/06/19 18:32
>memcpyすると何が起こるのですか?
memcpy (&im02, pcds->lpData, pcds->cbData);
lpDataをcdData分im02にコピーする.
#ということを期待している > 私

>memcpyはデータをメモリでコピーするものと言うことでよいのですか?
はい...
#違うんでしょうか...

>memory同士でコピーして何になるのでしょうか?
...上記のがそういう状態ということでしょうか...

うーん...
2つのウインドウが同じスレッドならWM_COPYDATAは必要ない。
これは普通プロセス間でデータを渡すもの。最初の方法でいい
とおもう。

その2つのウインドウでそれぞれIMAGEを持ちたいのか
IMAGEは一つで、それをみんなで使いたいのか?
仕様が良く分からない。
228213:02/06/19 19:10
>>227
>2つのウインドウが同じスレッドならWM_COPYDATAは必要ない。
>これは普通プロセス間でデータを渡すもの。最初の方法でいい
>とおもう。

>215 での修正を加えたのですが,うまくいかなかったので,別の道に走った
のですが,ちょっと違う方向に走っていっていたようです...(−−;

>その2つのウインドウでそれぞれIMAGEを持ちたいのか
>IMAGEは一つで、それをみんなで使いたいのか?
>仕様が良く分からない。

各ウインドウで*違う*IMAGEを持たせたいのです.
感じとしては,ウインドウ1に原画像を表示し,加工した結果を,他のウインドウ
(ここではウインドウ2)に表示するということをしようとしています.
229デフォルトの名無しさん:02/06/19 20:06
ReadProcessMemory関数で
0x00000000〜0x003FFFFF
の情報は取得できるのですが
0x00400000
以降のメモリが
CD CD CD CD ・・・・
となってしまいます

どうすればきちんと取得できるでしょうか?
IMAGE構造体はポインタを含んでいるのでコピーを作るなら
代入やmemcpyではだめで
>  * im02 = (IMAGE*)(lParam);   <===

たとえばCopyImageとか作って
CopyImage(IMAGE* pTo, const IMAGE* pFrom)
{
if(pFrom->pbmfh != NULL)
{
pTo->pbmfh = new BITMAPFILEHEADER ;
memcpy(pTo->pbmfh, pFrom->pbmfh, sizeof(BITMAPFILEHEADER));
}
else
pTo->pbmfh = NULL;
・・・
としないとコピーは作れない
IMAGE構造体をクラスにしてシングルトンで実装。とかじゃだめなの?
最悪、グローバル変数にするとか。
>>231
Javaの謎と落とし穴を奨める。
他のオブジェクト指向ユーザにも有益。
233デフォルトの名無しさん:02/06/19 20:59
仮想キーコードをアスキーコードに変換するにはどのように
すればいいでしょうか。
WM_CHARで処理すればいいんですが、CTRL+keyとしたときには
keyはWM_CHARで取れないので困ってます。
特にVK_OEMとかのキーボード固有のやつを処理したいのです。
>>233
決まった方法はない。
変換テーブルを持ってやるのが一般的だが、
キーボード(正確にはドライバ)によって違ってくる。
235あぼーん:あぼーん
あぼーん
>>235
マルチしまくりだな。お前、出会い系サイトかなんかにはまってんの?
237デフォルトの名無しさん:02/06/19 22:41
拡張子は.cと.cppのどちらでプログラムしてますか?
私はエラー(メモリ?)チェックが厳しいと聞いた.cppでプログラムしてますが。
みなさんはどうですか?
>>237
取りあえず基礎からやり直せ。
239213:02/06/20 01:00
IMAGE構造体をコピーするための関数を以下のように作成し,

void CopyImage2(IMAGE* pTo, const IMAGE* pFrom){
if(pFrom->pbmfh != NULL){
pTo->pbmfh = (BITMAPFILEHEADER *)malloc(sizeof(BITMAPFILEHEADER)) ;
memcpy(pTo->pbmfh, pFrom->pbmfh, sizeof(BITMAPFILEHEADER));
pTo->pbmi = (BITMAPINFO *)malloc(sizeof(BITMAPINFO));
memcpy(pTo->pbmi, pFrom->pbmi, sizeof(BITMAPINFO));
pTo->pBits = (BYTE *)malloc(sizeof(BYTE)*(pFrom->pbmi->bmiHeader.biSizeImage));
memcpy(pTo->pBits, pFrom->pBits,
sizeof(BYTE) * (pFrom->pbmi->bmiHeader.biSizeImage));
}
else{
pTo->pbmfh = NULL;
pTo->pbmi = NULL;
pTo->pBits = NULL;
}
}

/*ウインドウ1のプロシジャ (IMAGEは構造体)*/
static IMAGE im01;
static HWND hCwnd;

case IDM_IMAGE_COPY:
SendMessage(hCwnd, WM_USER+100, 0, (LPARAM)(&im01));

/*ウインドウ2のプロシジャ*/
static IMAGE im02;
static int cxDib, cyDib;

case WM_USER+100:
CopyImage2(&im02, (IMAGE *)(lParam));
if (im02.pbmi->bmiHeader.biSize == sizeof (BITMAPCOREHEADER)) {
cxDib = ((BITMAPCOREHEADER *) im02.pbmi)->bcWidth ;
cyDib = ((BITMAPCOREHEADER *) im02.pbmi)->bcHeight ;
}
else {
cxDib = im02.pbmi->bmiHeader.biWidth ;
cyDib = abs (im02.pbmi->bmiHeader.biHeight) ;
}
return 0;

case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;

if (im02.pbmfh)
SetDIBitsToDevice ( hdc, 0, 0, cxDib, cyDib, 0, 0, 0, cyDib,
im02.pBits, im02.pbmi, DIB_RGB_COLORS) ;
EndPaint (hwnd, &ps) ;
return 0 ;


と変更することでエラーもなくコンパイル+実行できるのですが,ウインドウ2に
なにも表示されません.
デバックモードで値を見てみたのですが,ちゃんと入っているようでした.
もう少しでちゃんと表示できそうなのですが...うーむ.
あとどこがおかしいのでしょうか?
>>239
窓1からイメージが送られてきても、WM_PAINTメッセージが来ないとイメージ描かれない
よん。WM_USER+100の処理が終わったらUpdateWindow辺りでWM_PAINT送って…
じゃないかな?
241213:02/06/20 02:39
>240
WM_USER+100の処理の最後にUpdateWindow(hwnd);を入れて,WM_PAINTまで
処理がいっているのを確認したのですが,それでもウインドウ2には何も表示され
ません(正確にはウインドウクラスで定義した背景色の白が表示されています).
うーん...
242デフォルトの名無しさん:02/06/20 07:55
InvalidateRect
243デフォルトの名無しさん:02/06/20 10:09
CreateWindow()の第三引数、ウインドウのスタイルの種類ってどんなのがあるの?http://www.microsoft.com/JAPAN/developer/library/jpuipf/_win32_createwindow.htm
で調べたけど、要領得なくてさぁ。
例えば、子ウインドウのエディットボックスで、
CreateWindow("EDIT", "", ここの部分, ・・・・・・・・・);
なんかで指定できる一覧なんか見たいんだけど、サクッと見られるサイトとかないかなー。
え、MSDNのCD2持ってないの?
246デフォルトの名無しさん:02/06/20 10:21
>>244
実を言うと俺が買ったんじゃなくってさぁ
VC++6.0の実物見たことなくて、あれってVC++とMSDNの2枚組なの?実は3枚あるとか?
漏れ2枚しかもって無くてフツーにインストールしたけど、なぜかヘルプがみれないんだよねー
しょうがないから、オンラインで検索しまくってんだけど、やっぱ正規に買った方がいいかなー?
VS.NET安く買えるよ。
248デフォルトの名無しさん:02/06/20 10:26
>>245
ありがとう!
載ってるじゃん!、漏れの検索不足かよー。
できれば、どうやって検索したのかも教えてほちいなぁ。
249デフォルトの名無しさん:02/06/20 12:00
もう一つ質問です。
CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE | ES_RIGHT, ・・・・);
こんな感じで、指定したんだけどどうしてもES_RIGHTが反映されなくて、左詰めになっちゃいます。

これって機種依存とかあるのかな。本に書いてあるとおりやっても出来ないんだよね。
付録のCD-ROMにサンプルとしてオリジナルがあるんだけど、それも試したけどやっぱり左詰になっててどう考えても俺のパソのせいなんだよね。誰か、うまく右詰にする方法知ってる人居ますか。
ちなみに俺の環境は
Win95OSR2
VC++6.0
>>249
サンプルが絶対正しいという保証はないと思うが。
>>249
Win2kは右詰になったりするが、本来は複数行エディットでないとES_RIGHTは効かない
ことになっとる。ES_MULTILINE付けてみそ。
252デフォルトの名無しさん:02/06/20 17:48
>>251
できました!ES_MULTILINEでばっちりです。
ありがとうございました。
>>250
指摘通りサンプルにはES_MULTILINEはついていませんが、Win2kで右詰になるならあながち間違いとも言えないようですね。ただ単にWin95で、動作確認をしていないだけでしょうか。

いまどきいねーもんな・・・・95
253213:02/06/21 00:09
ウインドウ1からウインドウ2に,下記の画像用の構造体をおくりたくて,

typedef struct {
BITMAPFILEHEADER * pbmfh ;
BITMAPINFO * pbmi ;
BYTE * pBits ;
} IMAGE;

>>239 のようにしたのですが,>>240 >>242 のアドバイスもあったのですが,
ビットマップの縦横の大きさはとれるのですが,肝心のデータ部がうまく表示できません.
構造体のコピーの仕方が悪いのか,それとも表示方法がまずいのか分かりません.
どこがおかしいのかご教授お願いします.
もしくは,似たようなことを解説しているページがありましたら教えてもらえないでしょうか.
よろしくお願いします.

/* ウインドウ2のプロシジャ(>>239 からの変更部) */
case WM_USER+100:
CopyImage2(&im02, (IMAGE *)(lParam));
if (im02.pbmi->bmiHeader.biSize == sizeof (BITMAPCOREHEADER)) {
cxDib = ((BITMAPCOREHEADER *) im02.pbmi)->bcWidth ;
cyDib = ((BITMAPCOREHEADER *) im02.pbmi)->bcHeight ;
}
else {
cxDib = im02.pbmi->bmiHeader.biWidth ;
cyDib = abs (im02.pbmi->bmiHeader.biHeight) ;
}
rc.top = 0;
rc.left = 0;
rc.bottom = cyDib;
rc.right = cxDib;

AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);
SetWindowPos(hwnd,HWND_TOP,0,0,rc.right-rc.left,rc.bottom - rc.top,SWP_NOMOVE);

InvalidateRect (hwnd, NULL, FALSE) ;
UpdateWindow(hwnd);
return 0;
254213:02/06/21 00:10
あと,きになるとすれば,ウインドウ2をウインドウ1のプロシジャ内で以下のように作成
していることぐらいです...

/*ウインドウ1のプロシジャ*/
HWND Chwnd;

case WM_CREATE:
 // ウインドウ2 用
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc2 ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = (HINSTANCE)GetWindowLong(HWND_DESKTOP,GWL_HINSTANCE);
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = TEXT("Image2");

RegisterClass (&wndclass);

// ウインドウ2を作成
hCwnd = CreateWindow (TEXT("Image2"),
TEXT ("Image Processing Result"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hCInstance, NULL) ;
ShowWindow (hCwnd, SW_SHOWNORMAL) ;
UpdateWindow (hCwnd) ;
return 0 ;
213
おまえウザイよ。
いちいちインデント崩れまくりのソースを貼るのはよせ。
現象を再現できる最小限の完全なコードをどこかにUPして、
施した変更や処理の要点だけをここに書け。
http://lounge.dip.jp/~yoshinoya_off/up/upb.cgi
とりあえず、あぷろだ見つけてきたからソースはここにUPれ
im01にセットする部分が無いんだが、それはちゃんと出来てるのか?
im01がちゃんと出来てないとどうしようもないぞ。
258213:02/06/21 01:25
>>255 >>256
申し訳ありません.まわりでWindowsでCでプログラムをしている人がいないもので,こちらに
何度も聞いてしまいました.

>>256 のところに,タイトル「1047/ Win32APIスレより」,投稿者「213」でアップしました.
>>258
bmiHeader.biSizeImageからサイズを取ってはダメ。MSDNにも、「BI_RGBの時は多分
0が入ってる」と書いてある。BITMAPFILEHEADERのbfSizeから計算するか、biWidthと
biHeightから計算するかどっちかにして。
問題は>>259だな。

それから、もう一つ。
BITMAPINFO構造体をコピーするのもあのままじゃダメ。
パレットをキッチリコピーしてやらないと。
261213:02/06/21 04:31
>>259>>260
ご指摘ありがとうございます.
BITMAPINFO構造体のコピーを下記のよう直したら,ちゃんと表示されるようになりました.

pTo->pbmi = (BITMAPINFO *)malloc(sizeof(BITMAPINFO) + pFrom->pbmi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
memcpy(pTo->pbmi, pFrom->pbmi, sizeof(BITMAPINFO) + pFrom->pbmi->bmiHeader.biClrUsed * sizeof(RGBQUAD));

#2箇所直すのに2時間もかかってしまった...
#pgm形式とppm形式しか扱ったことがなかったので,よい勉強になりました.
SetLayeredWindowAttributesを使おうと思ったのですが、定義されていないという
エラーでビルドできませんでした。
下記の環境ですがDLLから明示的に呼び出さないと使えないのでしょうか?

環境:Windows2000Pro+SP2, VC++6.0Pro+SP5
   Platform SDK November 2001 インストール済み
>>261
>>259が言うように絵本体のコピーも変更しないと駄目なケースが多いぞ
>>262
VC++.NETの話だけど、Wizardが吐いたデフォルトのstdafx.hだと
やっぱ同じようなエラーになったあるよ。
#define _WIN32_WINNT 0x500
に変えないとSetLayeredAttributesのプロトタイプを読み込まなかったよ。
デフォルトはこの値が0x400だったよ。
>>264
#define _WIN32_WINNT 0x500
でビルド/実行できました。
266デフォルトの名無しさん:02/06/21 16:47
Windowsでプログラムを作るとき,C標準のmallocとWindows APIでGlobalAllocではどっちを
使った方がよいのでしょうか?
私の見た範囲では,クリップボードにコピーする必要がなかったらGlobalAllocは使わずに
mallocを使ったほうがよいように思うのだが.
それともGlobalAllocはmallocより便利/お得な機能(例えば,早いとか)でもあるのでしょうか?
>>266
mallocは結局APIでアロケートしてます。
268762:02/06/21 16:56
>>266
そりゃ API の方が速いだろうけど、素直に malloc() 使っときなさい。
>>266
mallocの方がお手軽。
でも、ランタイムのメモリ機能使ってると、DLLだらけの時にたまにはまるんだよなあ。
270デフォルトの名無しさん:02/06/21 17:12
教えてください。
現在Windows2000で常駐してスクリーンセーバが起動中とか、
コンピュータがロック中とかを監視するアプリケーションを
作っています。
スクリーンセーバの方は何とかできたのですが、ロック中は
どうにもわかりません。
コンピュータがロック中かどうかを取得する事は可能でしょうか?
ご存知の方、お教えください。
よろしくお願いいたします。
271デフォルトの名無しさん:02/06/21 17:14
>>266
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_globalalloc.htm
によると、

GlobalAlloc
指定されたバイト数のメモリをヒープから割り当てます。Win32 のメモリ管理機能は、グローバルヒープとローカルヒープを区別していません。

注意 グローバル関数は他のメモリ管理関数より低速で、提供する機能も多くありません。そのため、新しいアプリケーションは「heap functions」(ヒープ関数)を使うべきです。しかし、DDE 関数とクリップボード関数では、依然としてグローバル関数が使われています。

だそうだ。
「他のメモリ管理関数」が何をさしているか分からん+ヒープ関数ってなんだってのが
あるので、誰か解説してくれ。俺も知りたい。
>>271
HeapCreate(), HeapAlloc(), HeapFree(), HeapDestory()
あたりでしょ。
273266:02/06/21 17:40
>>267 >>268
mallocよりGlobalAllocの方が,早くてよさそうですが,>>271 にある「他のメモリ関数より
低速」とあるのですが,「他の関数」は他のAPI関数を指しているということでしょうか?

早さ比較: malloc() -> GlobalAlloc() -> HeapAlloc() の順で早くなるという理解で
よいのでしょうか.
>>273
得に問題が起こってない限りはmalloc使っといたほうがお得だと思うよ
ライブラリ実装者はmallocに何らかの機能を加えて高速化してるかもしれないでしょ。
だいたい、どれが速いかなんて自分で調べればわかるもの。
>>273
速さの差は誤差の範囲と言っていいと思うよ。順序はあってるけどさ。

むしろ、それが気になるほど頻繁に割り当て・解放を行なっているのなら
別の問題が起きそう。ヒープの断片化とか。
>>270
OpenInputDesktop→GetUserObjectInformationでOK、
と思って試してみたら、ロックされているときはエラーになるなあ。
はっ、そうか、エラーが帰ってきたらロックされていると思えばいいんだ。(いいのか?)
277デフォルトの名無しさん:02/06/21 18:57
GlobalAlloc() や HeapAlloc() より malloc() のほうが速いだろうと
思ってたんだけどな。malloc() が遅いというデータってある?
malloc()の方が早いと思うよ。API呼び出しはオーバーヘッドがでかいって聞いた事あるし。
279275:02/06/21 19:04
>>277
「順序はあってる」って書いたんだけど、実はReleaseモードで試したら
mallocの方が速かった。面倒くさいからそう書いちゃったけど。
mallocやGlobalAllocは、内部でHeapAllocを呼び出している。
よって、最初の1度の確保に限れば、HeapAllocがもっとも高速と思われ。
但し、細切れを何個も確保するのであれば、愚直なHeapAllocより
それなりの管理をしてくれるmallocの方が、よりbetterな選択と思われ。
計測した。

block size = 1024 bytes, 1000000 times
malloc: 595msec.
GlobalAlloc(GMEM_FIXED): 743msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 1158msec.
HeapAlloc(0): 629msec.
HeapAlloc(HEAP_NO_SERIALIZE): 603msec.
HeapAlloc(HEAP_ZERO_MEMORY): 1089msec.

block size = 10240 bytes, 1000000 times
malloc: 630msec.
GlobalAlloc(GMEM_FIXED): 735msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 3441msec.
HeapAlloc(0): 665msec.
HeapAlloc(HEAP_NO_SERIALIZE): 626msec.
HeapAlloc(HEAP_ZERO_MEMORY): 3346msec.

block size = 102400 bytes, 1000000 times
malloc: 1020msec.
GlobalAlloc(GMEM_FIXED): 1118msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 55862msec.
HeapAlloc(0): 1036msec.
HeapAlloc(HEAP_NO_SERIALIZE): 1011msec.
HeapAlloc(HEAP_ZERO_MEMORY): 55839msec.

block size = 1048576 bytes, 1000000 times
malloc: 25076msec.
GlobalAlloc(GMEM_FIXED): 25633msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 25267msec.
HeapAlloc(0): 25631msec.
HeapAlloc(HEAP_NO_SERIALIZE): 25630msec.
HeapAlloc(HEAP_ZERO_MEMORY): 25269msec.
>>280
最初の1度に限るのってあんまり意味無くない?
mallocって何か閾値を境に動作が変わるんだったっけ。
>>278
>malloc()の方が早いと思うよ。API呼び出しはオーバーヘッドがでかいって聞いた事あるし。
あふぉか。
>>281はVC6
今度はbcc32

block size = 1024 bytes, 1000000 times
malloc: 227msec.
GlobalAlloc(GMEM_FIXED): 705msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 1189msec.
HeapAlloc(0): 655msec.
HeapAlloc(HEAP_NO_SERIALIZE): 609msec.
HeapAlloc(HEAP_ZERO_MEMORY): 1144msec.

block size = 10240 bytes, 1000000 times
malloc: 227msec.
GlobalAlloc(GMEM_FIXED): 735msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 3344msec.
HeapAlloc(0): 685msec.
HeapAlloc(HEAP_NO_SERIALIZE): 612msec.
HeapAlloc(HEAP_ZERO_MEMORY): 3304msec.

block size = 102400 bytes, 1000000 times
malloc: 71526msec.
GlobalAlloc(GMEM_FIXED): 1068msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 56017msec.
HeapAlloc(0): 1015msec.
HeapAlloc(HEAP_NO_SERIALIZE): 1008msec.
HeapAlloc(HEAP_ZERO_MEMORY): 55774msec.

block size = 1048576 bytes, 1000000 times
malloc: 51318msec.
GlobalAlloc(GMEM_FIXED): 53775msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 53803msec.
HeapAlloc(0): 53058msec.
HeapAlloc(HEAP_NO_SERIALIZE): 52757msec.
HeapAlloc(HEAP_ZERO_MEMORY): 53770msec.
>283
......
bcc32で来たか...

VCとの差はヒープ管理にかける時間の差かな。
単純パターンじゃなくて複雑な使い方すると、また違った比率になるかも。
g++ 2.95.3-4

malloc: 672msec.
GlobalAlloc(GMEM_FIXED): 697msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 1173msec.
HeapAlloc(0): 642msec.
HeapAlloc(HEAP_NO_SERIALIZE): 582msec.
HeapAlloc(HEAP_ZERO_MEMORY): 1126msec.

malloc: 671msec.
GlobalAlloc(GMEM_FIXED): 718msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 3350msec.
HeapAlloc(0): 660msec.
HeapAlloc(HEAP_NO_SERIALIZE): 602msec.
HeapAlloc(HEAP_ZERO_MEMORY): 3321msec.

block size = 102400 bytes, 1000000 times
malloc: 677msec.
GlobalAlloc(GMEM_FIXED): 1080msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 55596msec.
HeapAlloc(0): 1032msec.
HeapAlloc(HEAP_NO_SERIALIZE): 951msec.
HeapAlloc(HEAP_ZERO_MEMORY): 55542msec.

malloc: 35152msec.
GlobalAlloc(GMEM_FIXED): 25284msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 25550msec.
HeapAlloc(0): 25143msec.
HeapAlloc(HEAP_NO_SERIALIZE): 25544msec.
HeapAlloc(HEAP_ZERO_MEMORY): 25554msec.
bccは10kb以下の小さなブロックでは高速な結果になっている。
謎なのが、100kbの時のmallocの異常な遅さと、
1MBの時の遅さ(他のコンパイラのおよそ2倍)
API呼び出しも遅くなってるのが謎。
VCのソース見ると、

if (割り当てサイズ <= __sbh_threshold) 独自のメモリ割り当て
else HeapAlloc()

みたいなのが書いてある。大きなブロックではAPIと同じぐらいの時間ということか。
謎は解けんが・・・0クリアごときでなぜそんなに違いが出る?
>>288
>1MBの時の遅さ(他のコンパイラのおよそ2倍)
>API呼び出しも遅くなってるのが謎。
アフォか。
>>290

[VC6]
block size = 1048576 bytes, 1000000 times
malloc: 25076msec.
GlobalAlloc(GMEM_FIXED): 25633msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 25267msec.
HeapAlloc(0): 25631msec.
HeapAlloc(HEAP_NO_SERIALIZE): 25630msec.
HeapAlloc(HEAP_ZERO_MEMORY): 25269msec.

[BCC]
block size = 1048576 bytes, 1000000 times
malloc: 51318msec.
GlobalAlloc(GMEM_FIXED): 53775msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 53803msec.
HeapAlloc(0): 53058msec.
HeapAlloc(HEAP_NO_SERIALIZE): 52757msec.
HeapAlloc(HEAP_ZERO_MEMORY): 53770msec.

[g++]
malloc: 35152msec.
GlobalAlloc(GMEM_FIXED): 25284msec.
GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT): 25550msec.
HeapAlloc(0): 25143msec.
HeapAlloc(HEAP_NO_SERIALIZE): 25544msec.
HeapAlloc(HEAP_ZERO_MEMORY): 25554msec.
>>290 >>283 は何が言いたいのだ.
OpenWatcomのCRTも測ってホスィ..
>>292
単にアフォかといいたいだけちゃうんか。
APIで大きなメモリを確保するとヒープの拡張に時間とられるかもな。

>>292
283は確かに俺も「オーバーヘッドって何のことだ?」と思った。
watcomは自分で計ってくれ
VMwareでインストールしたけど、PSDKを入れないといけないんで面倒
DMCも面倒だ
297201:02/06/21 20:41
WIN32APIで
「手元でマウスが何センチ動いたか」知る方法は無いでしょうか?

今は、例えば400CPIのマウスだと、ウインドウズ側のマウスの速度の設定を
最大にすれば手元で一インチ動かすあたり400カウント取れるので
そこからセンチを逆算しているのですが、
できればウインドウズ側の設定によらず取りたいのです。

つまり、マウスを距離を測るセンサのように使うことはできないかということです。

昔の98だと、マウスはただ単にロータリーエンコーダとしてしか
見ていなかったと思うので、出来ると思うのですが・・・
よろしかったら、どなたかよろしくお願い致します。
パソコン自体初心者なので、間違いがあったら申し訳ありません。
298デフォルトの名無しさん:02/06/21 20:52
>>297
定規で測る。
>>298
鬼だね。
でも、mousemoveで始点から終点の座標とれば動いた分は分かると思うのですが。
って、思いついただけなのでコード書いてないけど。
>>297
マウスの分解能はマウスの機種によりさまざま。
インターフェイスもPS/2マウスでなくUSBでより自由になっている。
また、ドライバにより普通に「加速」が行われるため、マウスが元の位置に戻ってきても
マウスカーソルは元の位置に戻らないことも多い。

さらに、ポインティングデバイスがマウスでない環境もノートには多い。
3Dモデリングで使う、奇妙なアームのついたペンなら実際の移動距離取れそうだ。
マウスドライバから作った方が早い。でOK?
用途は?
>>301のように、デバイスの座標がそのままディスプレイ上の座標になるような物を使えば測れそうだけど
(俺の使ってるマウスも測れる)
304デフォルトの名無しさん:02/06/21 21:21
用途なのですが、光学式マウスを
位置の変化量を検出するセンサとして使いたいのです。

詳しく言うと、光学式マウスの発光部というかマウスパッドを見ている部分に
焦点をあわせて細長い紙かなんかを付け
それを上下させて何センチ動いたかどうかを知りたいのです。

だから一般的なソフトとしてすべての環境で動かすことを考えるのではなく
今の自分の環境(光学式マウス、400CPI)で動けばよいのですが・・・
説明下手ですみません。
マウスじゃなくて専用のデバイスをシリアルなりGP-IBなりで接続すれば?
>>304
光学式マウスの精度ってそんなに信頼できるものなの?
307デフォルトの名無しさん:02/06/21 21:28
なんで光学式にしたかといいますと、紙に触れずに測定がしたいからです。
またシリアルにああいったセンサを取り付けても良いのですが
予算の問題で・・・
>>307
紙を動かすことは可能ですか?
タブレットを使えば1万円程度で出来そうですけど
309デフォルトの名無しさん:02/06/21 21:32
>光学式マウスの精度
そこは問題ですね。
とりあえずは1ミリ単位(できれば0.1ミリ単位)で測定できればいいと
思っていたので
まあこのくらいなら誤差も無く測定できるかと決め付けていたのですが・・
310デフォルトの名無しさん:02/06/21 21:33
>>308
紙を上下してその動きを見るつもりです。
タブレットで出来るのでしょうか。
タブレットの仕組みがいまいちよく分からないので
今から検索してきます。
311デフォルトの名無しさん:02/06/21 21:48
なんだか説明がわけわからなくなってしまいすみません。

やりたいことは単純にいうと、
「上下動する細い針金の変位の推移を見たい」っていうことです。

ただ上下動する力が大変弱い(だろう)ので、針金に紙を張って
紙の上下動を固定した光学式マウスのセンサ部で見たいっていうことです。
(それなら紙に触らなくてすむだろうってことです)

なんだか板&スレの趣旨とかけ離れてきてしまって
申し訳ありません。
やっぱりマウスドライバを自作
(マウスの中でシリアルとして変換されている信号を直に取る)
しかないのでしょうか・・・でもそんなの出来なさそう・・・
光学マウスって光の反射を見てるんで、
接触させないと最大限の精度は出ないでしょ
313能無しさん:02/06/21 21:55
レンズの焦点はセンサから結構離れたところにあるようなので
そこを上手く常に通るようにすれば接触無しでも大丈夫かと思ったのですが・・・
周りを覆って暗くしないと駄目っていうことでしょうか。
314デフォルトの名無しさん:02/06/21 22:49
超初心者なのですが、質問です。

簡単なタイマーを作ろうと思ってます。<時間が来たらなるやつです
まず、WM_CREATEメッセージが来たときにCREATEWINDOW関数で
ウインドウの中のクライアント領域に
タイマーの開始、終了というボタンを作ります。

そして裏画面のビットマップに「残り時間9:54」みたいな感じで
TEXTOUT関数で表示し、そのビットマップを表画面に転送します。

これを一秒ごとにやると
クライアント領域のボタンがチラチラします。
なぜでしょうか?また解決法などございましたらご教授ください。
よろしくお願いします。
>>314
書き換えにも時間がかかるからです。
ダブルバッファとか調べてみればいいかと。
316デフォルトの名無しさん:02/06/21 22:53
>>315
即レスありがとうございます。
ダブルバッファですね。調べてみます。
普通それくらいじゃダブルバッファ使わないし、
ちらつかない。
WM_ERASEBKGNDでreturn NULL;するといいと思われ
318デフォルトの名無しさん:02/06/21 22:58
>>317さん
ありがとうございます。
早速試してみます。
裏画面のビットマップから表画面に転送してるって書いてあるべさ。
>314 クラススタイルにCS_CLIPCHILDRENとか付けてみたら?
320デフォルトの名無しさん:02/06/21 23:08
CS_CLIPCHILDRENっていうのは定義されてないって出るのですが・・
WNDCLASSEX wcl;
wcl.style = CS_CLIPCHILDREN;
でいいんですよね・・?
WS_だろ
>>320
WS_CLIPCHILDREN?
>>319-320
WS_では?
つか、裏のビットマップなんぞ使わずInvalidateRect(残り時間表示部分)しれ。
325デフォルトの名無しさん:02/06/21 23:17
wcl.style = 0から
wcl.style = WS_VISIBLE|WS_CLIPCHILDREN;に変更すると
なぜか全くウインドウが表示されなくなりました・・・
WSはCreateWindow(Ex)で
327314:02/06/21 23:23
ほんとに何も分からずすみません。

ようやくちらつかないで描画が出来ました。
WS_CLIPCHILDRENっていうのは子ウインドウ以外のところを
描画するようにするっていう命令なんですね。
皆さん、本当にありがとうございました。
328デフォルトの名無しさん:02/06/22 14:38
WinXPでCreateDIBSectionとCreateCompatibleDCのDCに
BitBltすると異常に遅くなるんだけど理由知ってる人いる?

Celeron850Mhz,MX400で320x240x16bitの転送に
200msecぐらいかかった。鬱。
サイズは1対1であってて、フラグもSRCCOPYのみ?
330328:02/06/22 16:30
>>329
その通り。

Celeron500のNTでは8msecぐらいなんだけど。
俺なんか間違ってるかなあ?
再現コードを作って、どこかにアプして試してもらうのがいいんじゃないかなあ
画面の色数の設定や、ドライバのバージョンでも変わりそうな気がするよ
特にXPはいろいろ変わってそうだし
332328:02/06/23 13:01
結局どうやっても無理ですた。

DirectX使ってビデオメモリアクセスまでやったけど
なんかビデオメモリやDDBにアクセスする時点でOSが介入して
なんかしてるみたいなんだよね。
(DDB→DIB変換は仕方ないとして。)

で、どうやったかというと、GetBitmapBits使った。
大丈夫かどうかは分からんけどとりあえず解決。
333デフォルトの名無しさん:02/06/23 17:08
スクリーンセーバーの起動がわかるAPIってありますか?
チャットプログラムなんですがスクリーンセーバーが起動すると
自動的にニックネームを変えたいので、監視したいんですが。
>>328
GetDIBitsも駄目でしたか
>>333
SPI_GETSCREENSAVERRUNNING
ただしWin98/2000以降
336328:02/06/23 18:56
>>334
うん。GetDIBitsは80msecぐらいだった。
GetBitmapBitsは6msecぐらい。

XPは色々変わってるからいや〜よ。
337デフォルトの名無しさん:02/06/24 14:35
Windowのタイトルバーを変える時に手を抜く関数をつくろうと思っています

void title(HWND, const char*, ...);
として、
title(hWnd, "ゲームを開始して%dミリ経過", tim);

つまり内部でsprintfすることによって、関数を呼ぶ側での手を抜きたいのですが、
自作関数title内部でうまーくsprintfにもっていく方法がわかりません
何か妙案はございませんでしょうか?
>>337
マクロとかは?
339デフォルトの名無しさん:02/06/24 14:58
>>338
早速の解答ありがとうございます
マクロですか。ですが「不特定の数の引数を考慮したマクロ」の記述方法がわからないのです
#define TEST(x) if (x)〜〜〜〜
などは今も色々なHPで確認できたのですが、不特定の数の〜〜マクロはさすがに扱っているところが見つかりません

よろしければ組み方の例など教えていただけるとうれしいです
もしくはマクロに詳しいサイトなど教えていただけると
341デフォルトの名無しさん:02/06/24 15:21
おお、良いページをありがとうございます
そこによるとどうやら「使わないほうがいい」という結論のようですが、他のFAQもかなり参考になるものばかりでした
感謝いたします

うーん。やはり素直にtitle(const char*)にして、アプリ側で文字列用意させるしかないですかね
vsprintfだな。
343デフォルトの名無しさん:02/06/24 15:33
>>342
お、新情報ありがとうございます
ぱっと見たところうまくいきそうな予感がします
今から作成してみますのでまた詰まったら相談しに来させていただきたいと思います。では
344デフォルトの名無しさん:02/06/24 15:51
ありがとうございました。完成です
一応同じ質問がきたときのために私のサンプルを張っておきますね


#include <stdio.h>
#include <stdarg.h>

void title(const char *Format, ...){
char str[256];
va_list argp;

va_start(argp, Format);
vsprintf(str, Format, argp);
va_end(argp);

printf(str);
}


int main(){
title("%d秒%s", 150, "でやんす");
return 0;
}
バッファオーバーランを防ぐために
vsprintfではなく、vsnprintfを使えという声が近頃は大きい。

しかしWindowsのLIBCにはvsnprintfがない罠
>>344
サンプルとは言え、printf(str) はまずいだろう。str に '%' が含まれてた
ら、こけるぞ。printf("%s", str) か puts(str) にした方が無難だよ。

>>345
_vsnprintf() じゃダメなの ?
347デフォルトの名無しさん:02/06/24 19:04
Win98SEでUNICODEを表示する方法をご存知の方いませんか?
"Microsoft Layer for Unicode"使って、プログラム内部でUNICODEを扱えるようにはなってます。

しかし、エディットコントロール上だとUNICODEフォントを指定していても全角文字は化けてしまう…。
ちなみに、半角英数はなぜか大丈夫です。
>>347
MSLU入れてもコントロールの実態は影響受けない(→今まで通り使えない)のでは。
リッチエディット使うとか…MSLU入れなくてもWin9x系でUNICODEが扱えます。
349 ◆tYf6yb3Y :02/06/24 21:09
Win32APIはいつ頃使われなくなるんですか?
>>349
Win64API が流行るまでじゃないの ?
>>350
それはいつくらいになりそう?
>>351
5年後ぐらいかなあ...
>394
つーか、主語を明確にしろよ・・
354デフォルトの名無しさん:02/06/24 23:52
>>353
何に対するレスなのか明確にしろって
>>354
そりゃ、>>394 に対するレスだろ。充分明確だよ。
このスレには存在しないのが問題だけどさ...。
356394:02/06/25 01:21
アホやなあ。
394コウリ━━━━━━(゚∀゚)━━━━━━ン!!!!
358デフォルトの名無しさん:02/06/25 01:40
int main(int argc, char* argv[])
{
  ::CreateFile(argv[0],GENERIC_READ,0,0,OPEN_EXISTING,0,0); // 2重起動防止
〜〜〜〜〜〜〜
.exe の拡張子を .ini にしただけのINIファイルを守るために、
↑のようなコードを思いつきました。
小手先技くさいので、ちゃんと守れてるか心配です。
main開始からCreateFileの間の時間以外に、抜け道ありますかね?
Mutex使え
360358:02/06/25 01:49
>>359
ほかのパスや名前の実行ファイルなら、同時に起動できてもいいんです。
>>360
Mutex の名前をパス名から生成すれば良いやん。
362デフォルトの名無しさん:02/06/25 11:12
グローバルフックが効かなくなる事があるのですが。
アクティブウィンドウが無い場合に起こりやすいです。
回避方法はあります?
>>360
関係ないけど、VBのApp.PrevInstanceってまさに360+361の動作するんだよねえ。Semaphoreみたいだけど。
ヘタレVBめ。
364347:02/06/25 13:59
>>348
レスありがとう。
その指摘を受けてさっそくRichedit2.0を使ってみたんだけど、上手くいきませんでした。

結果、入力はどれもダメ。
文字入力したときの表示は問題ないけど、GetWindowTextで文字列取得するとUNICODEでも
S-JISでもない、バイナリ(既に文字でない)が返ってくる。

で、正しいコードを入れて表示させると各言語によって対応は大違い。
日本語は、日本語のみOK、簡体、繁体は一部文字化け。ハングルは全部ダメ
英語は、半角英数のみOK、他言語表示はまるでダメ。
韓国語は、ハングルのみOK。日本語、簡体、繁体は一部文字化け。
中国語は、OS入れるスペースがないので試してません…。

…と、自分の国以外は完全対応してないようです。
やっぱり、Win98でUNICODEは無謀なのか…。(;´д⊂
>>364
オラオラ もっとキッチリ試せ (#゚Д゚)ゴルァ!

各文字コードセットの値の端っこ付近とか、
1コずつブッ込んで試してみれ。
入力した値に対して、表示だけではなく、
各桁位置から取得できるコード(1バイトずつ桁をずらしてみる)を
元のコードと比べて評価しよう DEATH!

丹念に小一時間調べれば、
誰も知らない、新事実をお前様があきらかにすることに
なりましょうぞ ・・・・・(;´Д⊂
>>364
M$からzh-chとzh-twのフォントDLさせてもだめ?
(すれ違いだけど)WebBrawserコントロールかCHtmlViewなら簡単に表示できそう
だけど。
>>364
SendMessage(…,EM_GETTEXTEX,…);
で取ってみそ。
368367:02/06/25 16:56
1つ忘れてた。リッチエディットはRichEdit20Wで作ってね。
369347:02/06/25 17:23
>>365
励ましありがと〜。どうも、最近になって諦め癖がついてたようです。

まだ調査継続中ですが調査の中間結果を…
GetWindowText()が変更するバイト数は、[S-JISでの入力バイト数*2+2](最後の+2はNULLかも)
どうも、リッチエディット(以下Riched)のフォントはUNICODEでも、実際にRichedが保持している
文字情報はS-JISっぽい?

で、私見ですがWin98SEにMSLUを使用した場合のGetWindowText()内部は、
Richedに入力されたS-JISのデータを(制御コード含め)「そのまま」にUNICODEに読み替える。
 ↓
読もうとして読めたやつはその文字コードで固定。読めなかったやつは、"?"[0x003F]に変換。
S-JISで換算して奇数Byteの入力の場合、1Byte余るので[0x00]をくっ付けてそのままUNICODEに。
 ↓
そうすると、変更予定バイト数に明らかに足りないのでそこは[0x0000]で埋める。

こんな感じかな。そうなると大半の出力が"?"だけになるのとも合致する。
それと実験して見つけた実証パターンとして"0テf"[36-83-65-66]を入力すると
"茶ユ"[36-83-65-66]とでるので、部分的に違うところがあっても完全に間違いではないと思う。

逆にこれが本当だとすると、使い物にならないと言う結論が出そうで怖い…(;´д⊂

-------------
…と、ここまで書いて>>367さんの書き込みを発見。
で、それを使ったら入力は一発で出来ました。ヽ( ̄▽ ̄)ノ
ありがとうございます。

結論:
 MSLUの実装するGetTextWindowW()など、ウィンドウからテキストを取得する関数は
 UNICODEに対応してない!

さて、次は多言語表示だな…。とりあえず、>>366さんの発言を見てフォントを
DLしましたがダメでした。コントロール系はまだ試してません。

長々と書いてしまって、すみません…
>>369
マズUNICODEフォントを拾ってくるべし。
http://www.microsoft.com/downloads/searchdl.asp?
で、keyword searchにしてunicodeで検索すると、
Arial Unicode MS Font for Publisher 2000
ってのがある。フォントの中身を全部確認した訳ではないが、漢字・ハングル・簡体
は少なくとも同時に表示できる。
あとは実際の表示だが、MSLUがどこまで出来るかワカランからあれだが、漏れが
Win9xで作ったソフト(MSLU無し)では、TextOutWを使った。これはWin9xにもある
APIだす。がんがれ!
>>362
アクティブウインドウが存在しない状態は有り得ない。
たとえばデスクトップやタスクバー、
もしくは不可視のウインドウにかならずアクティブ属性が設定されている
372362:02/06/26 00:15
>>371
でも、GetForegraundWindow()の結果が0になる場合があります。
その時は、フックに通知がいかないみたいです。
0=デスクトップです
デスクトップに表示されているリストビューとかとは別の。
374362:02/06/26 07:47
>>373
GetDesktopWindow()は0じゃないですよね。
別物なんですか?
>>374
それもデスクトップ。
しかし、Windowsにおける(本来の)デスクトップはもっと
上の階層で、Winlogonデスクトップ(だっけ?)とか、
スクリーンセーバーのデスクトップなる物が存在し、
特定のウインドウをデスクトップと呼ぶ物ではなく
0をデスクトップを表す物として扱っている。
デスクトップとデスクトップウィンドウ混同してるだろ。
デスクトップはHDESK型のハンドルで識別されるまったく別の概念のオブジェクトなので、
GetForegroundWindowの返却値にはなりえない。

MSDNで見つけた0を返すケースとして、
・他のデスクトップがアクティブのとき
・アクティブなウィンドウが変わる瞬間
みたいな記述見つけたけど、もっとベタなケースあったような気がするんだけどなー。NT3.51の時だったかなあ。
377362:02/06/26 12:18
>>375-376 返事ありがとうです。
タスクトレイをいじっていると、0を返す場合があるみたいです。
Win98/2000で確認しました。

こうなったらフックは駄目みたいなので、諦めます。
いろいろありがとうございますた。
378347:02/06/26 14:36
>>370
"Arial Unicode MS"は既に入ってます。それとこっちの事情でしかないんですが、現在
作ってる物はいろいろ制限がありまして、GDI関連やMFCは使えないのです…。(;´д⊂

で、昨日の続き。
WebBrowserコントロールを使ってみました。なにも入れなくてもすんなり表示してくれました。
でも、やっぱりこれって文字列そのまま入力は出来ないですよね…。
やるとすれば表示する文字列を逐次ファイルに書き込んで、そのURIを参照すると言う方法かな。
ついでに装飾も出来て面白そうかも。(必要ないけど)
でも、IEに関する余計な(表示以外の)機能を封じないといろいろ問題が出そうな気がする。

とりあえず、リッチエディットとWebBrowserの両方をもう少し探ってみます。
> でも、やっぱりこれって文字列そのまま入力は出来ないですよね…。
TEXTAREAを全面に貼ったらどうよ

>>350
.NETが流行るまでだと思う
Win64 APIは今までのように直接使われることはあまりないと予想
380:02/06/27 11:43
デスクトップがアクティブになっている状態でプログラムでマウスの座標を
取得する方法ありませんか?
>>380
自分のプログラムがアクティブのときは
マウスの座標の取得できるんだよねぇ。
グローバルフックでいろいろ検索してみそ。
GetCursorPos()でどう?
380がどんなアプリをつくるかによるな。
384デフォルトの名無しさん:02/06/27 14:48
インターネット電話関連で簡単なフリーウェアを作っているのですが、
Windows の ミキサー制御低レベル API を使って録音ソースの選択を
プログラムから切り替えようとしたところうまくいかず行き詰まっています。

以下のような手順で録音ソース選択のコントロールを取得できると思った
のですがうまくいきませんでした。

mixerGetNumDevs()
mixerGetDevCaps()
mixerOpen()
mxl.dwDestination = 1; // 録音ライン
mxl.dwSource = 1; // 録音ソースとして選択したいコネクション(マイク)
mixerGetLineInfo((HMIXEROBJ)hMixerHandle,&mxl, MIXER_GETLINEINFOF_SOURCE )

この時点で mxl.cControls が1となっていて、Volume Control のみが
関連付けられています。

試しに mxl.dwDestination を再生ラインに変えて各コネクションの
コントロールを調べるとVolume Control 以外に Mute Control もあったので、
てっきり録音ラインのコネクションにも Select Control ? のようなものが
関連付けられていると思っていたのですが・・・

ミキサー制御に詳しい方、ご教授をよろしくお願いいたします。
この辺詳しく勉強したいので参考になる本なども合わせて
教えていただけると助かります。
385:02/06/27 15:44
>>381-382
グローバルフックでいけそうです。
感謝感激です。
386347:02/06/27 18:43
>>379
あ、いや入力とは言ってもユーザーからの入力ではなくプログラム内部からの入力でして…。

結局、RichEdit3.0でなら表示含め可能でした。ちなみに、EM_GETTEXTEXとEM_SETTEXTEXを使って実現してます。
WebBrowserの方はIEのバージョンによって微妙なところがありそうなのと
「RichEditが使えるならいいや」という事で放置しました。(^^;

ただ、Win95/98/98SEにRichEdit3.0対応のDLLが入ってないんで、
Riched20.dll(5.30.23.1200以降?)をアプリに付けて再配布しなきゃいけませんが。
その前に再配布可なバージョンはどれだろう…。
387デフォルトの名無しさん:02/06/27 18:50
ラインじゃなくて、mixerOpenしたミキサーハンドル自体に
mixerGetControlDetailsしてみるとどう?

あとは提示のコードでMIXER_GETLINEINFOF_DESTINATIONとか。
388デフォルトの名無しさん:02/06/27 21:49
はじめまして。
VC++でAPIプログラミングしてます。
ダイアログボックスをリソースエディタで作成し、閉じるの×ボタンを表示しないようにして、
ダイアログを終了されないようにしています。
ところが、Alt+F4で閉じてしまいます。
WM_DESTROYなどでも、検出できなくて困っています。
ご教授お願いします。
終了しないダイアログを作って何がしたいんだ?
嫌がらせか?
とりあえずここでも読んどけ。
readme.txtにアンインストール情報を!
http://pc.2ch.net/test/read.cgi/prog/997370579/l50
>>388
WM_COMMAND の LOWORD(wParam) == IDCANCEL で検出できますね。
ただ、この場合、タスクマネージャーから強制的に終了してやらないといけなくなるので注意
391389:02/06/27 22:07
>>388
補足。return TRUE ; とすると、終了できなくなるよん。
return FALSE ; だと、デフォルトのダイアログプロシージャ
に処理がわたってしまうのでの

>>389
まぁ、スプラッシュウインドウとかもあるしね。
B's Gold の焼いてる途中のダイアログも終了できないし(w
392デフォルトの名無しさん:02/06/27 22:56
>390
まったく、効かないです。
強制的にどころか、デバッグでブレークポイントを作ったのですが、
とまりません。
ダイアログの表示自体は、DialogBox()で、作っているのですが…。
なにか、解りませんでしょうか?
IDCANCELに相当するボタンを除去すれば良いんじゃないの?
394デフォルトの名無しさん:02/06/27 23:00
ボタンなんて最初からないですよ…。
消してます!
395デフォルトの名無しさん:02/06/27 23:08
>>387
ありがとうございました。

教えていただいたとおり
mxl.dwDestination = 1; // 録音ライン
に対して
mixerGetLineInfo(
    (HMIXEROBJ)hMixerHandle, &mxl,
    MIXER_GETLINEINFOF_DESTINATION )
すると "Record Select Switch" というコントロールが見つかりました。

あとは
mixerGetControlDetails(
    (HMIXEROBJ)m_hMixerHandle, &mxcd,
    MIXER_GETCONTROLDETAILSF_VALUE )
で MIXERCONTROLDETAILS_BOOLEAN の配列を取得して録音ソースの選択状態を
正しく調べることが出来ました。

こんなところにあったのですね。ありがとうございました。
alt+f4はWM_CLOSEが飛んできたような・・
WM_SYSCOMMAND/SC_CLOSEだろ
398デフォルトの名無しさん:02/06/28 02:47
モニタ一台しかないんですけどマルチモニタ環境での動作を
確認する方法はありませんか?
なんかマルチモニタ環境でしか起きない不具合を報告されて
かなり悩んでます。
マルチモニタ未サポート
できれば対応したい
他に方法がなければ安い外付けディスプレイを調達して来ようかと
本気で考え中だけど金掛けずに済む方法があれば
それにこしたことはないので
シングルじゃテストのしようがない。

プライマリディスプレイとセカンダリディスプレイのDCに
互換があると思ってはいけない。
互換性がないと思いながらコーディングをしていくしか無いんじゃないかと。
402デフォルトの名無しさん:02/06/29 00:15
いきなりな質問なのですが、SetTimer関数が100ミリ秒に1回って
設定しても、きちんとメッセージを送っていないようなのですが
こんなに速くは動かせないってことなのでしょうか?

時間の測り方
・左クリックをしたらSetTimer関数を使ってタイマーをかけ、
GetTickCount()でそのときの時間をとります。
・WM_TIMERの中では変数をインクリメントします。
・もう一度左クリックをしたらタイマーを殺し
GetTickCount()でまた時間をとります。

で、GetTickCount()で得られた値を引き算して
タイマーの動いた時間を得ているのですが、2000ミリ秒くらい
動かしても16回くらいしかWM_TIMERが呼ばれていないのです。

将来的にはマウスカーソルの動きを10ミリ秒に一回くらい取りたいのですが
そんなのは不可能なのでしょうか?
長文失礼致しました。
誰か、よろしかったら教えてください。
単に計測方法が間違ってるんじゃないかと言ってみるテスト
404デフォルトの名無しさん:02/06/29 00:25
>>403
そうなんでしょうか。
どうやったら正しい計測が出来るでしょうか?
>>404
測定時間を2秒なんつー短い時間にしないでせめて20秒見てみるとか
406デフォルトの名無しさん:02/06/29 00:30
約20秒見てみた結果です。
計測時間:22237ミリ秒
計測回数:199回    でした。
本来なら222回呼ばれてないとおかしいと思うのですが・・・
>>404
どうやったら、以前に
おまえのプログラムにバグがあるか確認しろよ
408デフォルトの名無しさん:02/06/29 00:40
>>407
バグは無いと思います。
思いますってなんだよ
410デフォルトの名無しさん:02/06/29 00:44
日本語も分からないのですか?
思いますは思いますでしょう?
可哀想な方ですね(ププ
大人しくマルチメディアタイマ使えよ
412402:02/06/29 00:48
410は僕じゃ有りません。
思いますっていうのは・・・たぶん無いだろうってことなんですが・・
なんせ素人なんで良く分かりません。
どうやったらいいのかって聞いたのは>>403さんが
僕の書いた計測方法を読んで
間違いがあるのに気付いたのかと思ったからです。
413402:02/06/29 00:50
マルチメディアタイマっていうのがあるんですね。
本当にありがとうございます。
早速検索してみます。
WM_TIMERに精度を求めてはいけません。。
分解能も今市だしね。
標準タイマに10msの分解能を期待するなんて無茶もいいとこ
NT系ではいちおう10msの精度があることになってるらしいが
timeBeginPeriodも忘れないでね…ボソ
418402:02/06/29 02:13
とりあえずマルチメディアタイマを使って
マウスの変位を文字列に入れて描画して
その変位を配列に次々に保存していっても
きちんと10ミリ秒で動くようになりました。

アドバイスくださった皆様、本当にありがとうございました。
そのうち恩返しが出来るよう頑張ります。
>>418
2ちゃんにはめずらいしい、まじめなレスだのう
しかし、あと半年も2ちゃんにいれば、
「氏ねやゴルァ」とか言ってるんだろうなぁ シミジミ <- テナニガ?
420デフォルトの名無しさん:02/06/29 04:41
WM_LBUTTONDOWN がマウスのボタンを押しっぱなしにしても
クリックした時の一回しか来ないんですけど
マウスのボタンが押されている間中届いている
メッセージってあるんですか
>>420
普通、WM_LBUTTONDOWN来たらSetCaptureしてWM_LBUTTONUP監視じゃねぇの?
もしかして、もっと簡単な方法あるのか…
ない。
押してる間中届いてたらマシンがとんでもなく重くなる罠
423デフォルトの名無しさん:02/06/29 05:45
やっぱりないんですか。
case WM_CHAR:
switch (wParam) {
case 'i':
i++;
break;
}
これだとキーボードが押されているあいだくりかえされるのですが
これをウインドウの一点がクリックされてる間にも
くりかえされるようにしたかったんです。
これを実現する何か簡単な方法があったら教えてください。
自分でメッセージ出せ
それはTranslateMessageでWM_KEYDOWNとWM_KEYUPをハンドリングしているだけ。
>>425
それは関係ない。キーリピートが原因。
>>426
おいおい、マジで言ってるの?
TranslateMessageでWM_KEYDOWN/UP WM_SYSKEYDOWN/UPから
キーボードドライバを通してWM_CHAR/WM_SYSCHARを生成してるんだよ。
>>427
あんたこそマジ?
WM_KEYDOWN が実際にたくさん来てるんだよ。
ちなみに、WM_KEYUP は最後だけね。
CreateProcessとかShellExecuteで起動した
アプリケーションのメッセージキューが作成されるまで待機する方法ありませんか?
起動直後に処理が戻るのではなく、準備が出来るまで待機したいのですが。
>>429
使ったこと無いから実は実際の動作は知らんのだけど、WaitForInputIdle() は?
>>430
thx!
期待通りの動作でした。
432デフォルトの名無しさん:02/06/29 23:27
自分自身のThreadはGetCurrentThereadIDで取得出来るけど
他のアプリのThreadを取得出来るAPIはない?
OpenProcess
434デフォルトの名無しさん:02/06/29 23:45
>>433
それはハンドル
>>432
DLLにでも入れとけ。
>>432
GetWindowThreadProcessIdとか?
437デフォルトの名無しさん:02/06/30 15:02
>>436
Thanks!
ウィンドウのないアプリだったらToolhelp32
ビットマップを読み込む際に、今までのようにリソースでいちいち管理するのは非効率なので
LoadImageを使ってビットマップをそのまま読み込むようにしました。
ただ、この場合必ずビットマップの全域を読み込んでしまってビットマップのある一部分だけを
読み込むことができないんですが、これをする方法ってあるのでしょうか?
自力でBMPヘッダ解析しる
441デフォルトの名無しさん:02/07/01 18:51
Windows で、ProgramFilesフォルダや、Windows・WinntフォルダそれからSystem・System32フォルダなどの
パスを取得するにはどうすればいいでしょうか?
がんばれ
443デフォルトの名無しさん:02/07/01 19:54
不思議なことが起こるのです。
ポインタうんぬんで、char型を返したときに、
半角カナの「へ」がたくさん並ぶことがあるじゃないですか。
NULLあたり(?)でしょうか。
これは、検出する方法はあるのでしょうか?
教えてください。
デバッグビルドでは、身初期化メモリが0xcdに初期化されるはず
有難うございます。
>>441
GetWindowsDirectoryやらGetSystemDirectoryやら環境変数やら
有難うございました。
448デフォルトの名無しさん:02/07/01 21:13
>>446
環境変数やらとありますが、ProgramFilesディレクトリは
どのようにして環境変数から取り出せばいいでしょうか?
449デフォルトの名無しさん:02/07/01 22:06
>>448
環境変数?
SHGetFolderPathではダメなのかいの?
SH系ってバージョンに気を使うんだよね。
後はSHRegGetPathやらGetEnvironmentVariableやら色々
>>450
SHRegGetPathはマチガイデシ
つ〜か、>>446調べた時点で、ExpandEnvironmentStrings()まで気が付かなきゃ…
>>446
SHGetSpecialFolderLocation()とSHGetPathFromIDList()を組み合わせて使え。
454446:02/07/02 11:00
>>452
それは文字列中に%ABC%みたいな形で書いてある環境変数を展開するやつだから、
使っても良いけどGetEnvironmentVariableで十分でしょ。

>>453
あー俺だったらそれ使うけど、初心者向きじゃないかなと思って薦めなかった。
>>453
なんでそれはあんなにめんどくさいインターフェースになってるんだ?
ファイルシステムを抽象化した「シェル名前空間」というものがあって、
その世界ではフォルダを識別するのにitem id listというのを使ったり、
COMベースでインターフェースが提供されていたりするわけだ。
面倒くさいけど、「コントロールパネル」みたいな仮想フォルダを実現できるのは
このおかげ。

…そもそも環境変数の内容取得するのにわざわざAPIを使う必要わない。
HWNDを受け取ってその対象のDCにグラフを描画するクラスを作成しているのですが
更新時にちらついてしまい、更新頻度を50ms等にするとかなり見にくい状況です。
一応hWndを受けた時にメモリDCを作成してそこに描画し、
メインフレームで OnPaint が発生した時には
グラフ描画クラス内で GetDC して ウィンドウにBitBlt したあと ReleaseDC しています。

なんとかしてちらつきを低減したいのですが
DirectX以外の方法で実現する方法を教えてください。おながいします。
>>457
WM_ERASEBKGNDを処理汁
459デフォルトの名無しさん:02/07/02 15:26
460457:02/07/02 15:55
>>458
メインフレームで OnEraseBkgnd をオーバーライドして
return 1; としたところ、ウィンドウサイズ変更時に全体がちらつく現象はなくなりました。
しかしスクロールするグラフ部分のちらつきは解消されませんでした。
こちらについてなにかご存知でしたら教えてください。
>>460
お前のスクロール処理がまずいんだろ
>>456
> 面倒くさいけど、「コントロールパネル」みたいな仮想フォルダを実現できるのは
> このおかげ。

GetWindowsDirectory()みたいのがあってもいいじゃん、と思ったんだが。
なんつーか、SHGetSpecialFolderLocation()の後始末がめんどくさ杉。

> …そもそも環境変数の内容取得するのにわざわざAPIを使う必要わない。

逆にCSIDL_PERSONALをsetenv("HOME")したかったんだけどね。
>>460
もしかして、OnPaint以外で画面の更新かけてる?
その場合ちらつきを防ぐのはかなり面倒だったような気が…
画面内容の更新は全てメモリDCにやって、OnPaintで実際のウィンドウに反映とか。

で、50ms間隔で更新したければそのタイミングでInvalidateRect()呼ぶとかでダメ?
464457:02/07/02 18:48
>>461
その通りですた。
>>463
OnTimer でInvalidateRect(FALSE) と書いています。

どうやら本当にスクロール処理に問題があるようでした。
ためしにスクロール関数内でスクロールの代わりに
ランダムに線を描画させてみたところちらつきは発生しませんでした。

void CGraph::Scroll(int Pixcel, int direction)
{
  POINT pnt;
  MoveToEx(m_memdc, 0, 0, &pnt);// 以前のカーソルの位置を取得
  BitBlt(m_memdc, rcPoint.left + 1, rcPoint.top + 1,
      rcPoint.right - 1, rcPoint.bottom - 1,
      m_memdc, rcPoint.left + Pixcel + 1,
      rcPoint.top + 1, SRCCOPY);// 指定範囲をスクロール
  MoveToEx(m_memdc, pnt.x - Pixcel, pnt.y, NULL);// スクロールした分カーソル位置を補正
}

まだバグバグですがとりあえずちらつきを直したかったので質問させていただきました。
描画自体は OnPaint() から、

void CGraph::Draw(int x1, int y1, int x2, int y2)
{
  if(x2 == 0) x2 = ptGrid.x;// 全体の幅
  if(y2 == 0) y2 = ptGrid.y;// 全体の高さ
  HDC hdc;
  hdc = GetDC(m_hWnd);
  BitBlt(hdc, x1, y1, x2, y2, m_memdc, x1, y1, SRCCOPY);
  ReleaseDC(m_hWnd, hdc);
}

こんな感じです。
スクロール処理の改善方法について何かご存知でしたらご教授いただけると助かります。
465デフォルトの名無しさん:02/07/02 18:49
Windows で raw socket を扱うにはどうすればいいのでしょうか?
あ、ファイアーウォールのテストに使いたいだけです。
>>462
ああそういうことか。
でもまさしくそういう用途のためにSHGetSpecialFolderPath()があるんじゃん?
動作環境の制限がうざいけどさ。

…最近はShGetFolderPath()なんていうのもあるのか、いじってないとすぐ知識が廃れるな。
468462:02/07/02 20:10
>>467
> でもまさしくそういう用途のためにSHGetSpecialFolderPath()があるんじゃん?
それを知らなかった。逝ってきます。
>>464
ScrollWindow使ってみろんぬ。
どうでもいいが、OnPaintに渡されたDCを使わずに勝手にGetDCするのは
最近の流行りなのか?
>>468
Win95にはなかったところを見るとMicrosoftもさすがに不便だと
思い直したんだろうな
471457:02/07/03 11:39
>>469
ScrollWindowEx と ScrollDC を使用することで
ちらつきの無いスクロールが実現できました。
ありがとうございました。本当に助かりました。

あと、勝手に GetDC しているのは OnPaint 以外の箇所から呼ばれた場合を考慮したからです。
472デフォルトの名無しさん:02/07/04 00:13
エディットコントロールに
äöüß <-ドイツ語のウムラウト
を表示させたいのですが、どうすればよいのでしょうか?
UNICODEアプリではないです。
>>472
欧文フォントを指定してはいかが?
474デフォルトの名無しさん:02/07/04 00:35
たとえばメモ帳で欧文フォントを指定して、
上のドイツ語を貼り付けても aous としか表示してくれないです。

IEのテクストエリアだとちゃんと表示してくれます。
なぜなの。鬱
>>474
メモ帳なら表示するけど・・・。
欧文フォントでなくてもFixedSysで。
476デフォルトの名無しさん:02/07/04 00:56
>>474
Unicodeアプリじゃないと不可能
でもUnicodeアプリはWin9xで動かない罠
ちなみにNT/2000/XPのメモ帳ならまったく問題なし
どうしても9xで使いたきゃActiveXでIEのエディット使え
477デフォルトの名無しさん:02/07/04 01:12
ありがとうございます。
絵ディとコントロールは無理ということであきらめます。

ところで、IEのエディットっていうのはHTMLEditのことで
しょうか?これもちょっと大掛かりになりそうなので、
自作する方向で考えてみます。
>>477
RichEdit 3.0とか
479デフォルトの名無しさん:02/07/04 01:21
>>477
VBだったらフォームに置くだけだけどな
>>478 にあるRichEditも検討に値する
>>478
Delphiで使えるRichEdit 3.0のコンポーネントってあります?
481デフォルトの名無しさん:02/07/04 01:32
ありがとうございます。
RichEdit調べてみます。
482デフォルトの名無しさん:02/07/04 01:56
>>477
どう考えても自作する方が大掛かりだろ……
エディットコントロールが自作できる人間は、
こんなとこで質問しません。
HTMLEditをつかうとなれば、IhogeSiteとかIDispatchとかコネクションポイント
とかを用意しなければならないので大変かなと。重くなりそうだし
エディットコントロールの変わりに使ってるのはみたことないしで、

それに比べれば、エディットの自作なんて、DrawText系で書くくらいかな
と思った次第です。
485デフォルトの名無しさん:02/07/04 03:32
あるクラス(CWin)にstaticなWndProcを定義したときに、
WndProc内でそのクラスのメンバ変数にアクセスできるようないい方法ないでしょうか?

考えたのはCreateWindowEx(・・・,this)
としておいて、そのクラスにstaticじゃないウィンドウプロシージャ(MsgProc)
ようなものを用意する。それで、

static LRESULT CALLBACK CWin::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
CWin *pWin;

switch(message)
{
case WM_CREATE:
pWin = (CWin *)lParam;
SetWindowLong(hWnd, GWL_USERDATA, (LONG)lParam);
break;
default:
pWin = (CWin *)GetWindowLong(hWnd, GWL_USERDATA);
}

return pWin->MsgProc(hWnd, message, wParam, lParam);
}

として実際の処理はMsgProcでするようにしてたんですけど、
他に何かいい方法がありませんか?

他に
・MFC方式(テーブルからHWNDつかってルックアップ)
・ATL方式(「hWndをCWindow*にすり替え、本当のWndProcに
 jmpするコード片」を自動生成して、WndProcとして登録する)
・グローバル変数を用いる方法(あんまし考えてないね)
などがあるようです。
> それに比べれば、エディットの自作なんて、DrawText系で書くくらいかな
> と思った次第です。

その程度の知識じゃ、プロポーショナルフォントで
カーソル制御するだけでも、苦労しそうだな。
とりあえず、マウスクリックされた位置が、
文字列のどの位置当たるか、判定する関数書いてみなさい。
488デフォルトの名無しさん:02/07/04 03:48
シャットダウン(?)ってどーやるんですか?
HTMLEditを使ったことが無いんでどの程度大変なのかは知らんが、
エディットくらいは自作も簡単だろ、色分けやフォント変え(サイズ含む)出来るエディットコントロール作ったことがあるが、EM_系メッセージに対応させるのが量的に面倒だった事意外は別段普通だと思うが。
>.486
hwndをCWindow*にすり替えるってどういう事?
492デフォルトの名無しさん:02/07/04 04:03
正直、エディットコントロールを自作できるような奴が、ここにいるとは思えない・・・
正直、テキストエディタを自作できない奴は初心者だけだろ
>>490
自作とカスタマイズを、混同してる気がするが?
>>491
VC6 持ってるなら、ATL のソース読むのが確実。

class CWndProcThunk;
CWindowImplBaseT<CWindow, CControlWinTraits>::Create()
CWindowImplBaseT<CWindow, CControlWinTraits>::StartWindowProc()

このあたりね。検索すると、いくつか解説のページが見つかるよ。
>>493
エディタからエディットコントロールまでには、
まだいくつかハードルがある。
まあ、エディットコントロールを
自作したほうが楽なんてキティな意見を、
無理矢理通そうとする奴に、何言っても無駄だろうが。
>>496
アンタの言うテキストエディタって、
RichEditやEDITを貼り付けるだけの物を言ってる?
コントロール自作出来ない奴は初心者だって言ってるんだが。
IMEの入力受けるだけでも一苦労
>>498
おぃおぃ
>>476
> でもUnicodeアプリはWin9xで動かない罠
これ微妙。MSLUを使えば9x系でもプログラム内部でUNICODE使えます。
で、Richedit2.0以降を使えばUNICODE対応してるし。
ただし、Richedit3.0でないとEM_SETTEXTEXが使えないのでRichedit上に
UNICODEを表示したい場合は、5.30系のriched20.dllを用意するべし

さらに、9x系での入力はAciveIMM(GlobalIME)を使わないとコピペする以外に方法ない。(たぶん)
ちなみに、ActiveIMMはActiveXなんでIEコンポーネント使わなくても単独で使えるはず。

もう一つ言うと、NT系でもXP以外はデフォルトでUnicodeフォントが入ってないので、
Unicodeフォントを入れるか、各言語ごとにフォントを指定してやらないと多言語混在表示は出来ません。
Win2kでもMS(P)ゴシック、MS(P)明朝はUNICODEフォントだよ。
Arial Unicode MS とかも入ってるんでない?
503デフォルトの名無しさん:02/07/04 12:20
>>484
何か勘違いしてないか?
誰もHTMLEditだなんて言ってないだろ。
FM20.DLLを知らないの?
504デフォルトの名無しさん:02/07/04 12:21
>>500
#define UNICODE
してコンパイルしてみそ
CreateWindowEx()すら落ちるようになるから
>>504
明示的にTextOutWとか呼べばいいだけじゃん。
506デフォルトの名無しさん:02/07/04 12:34
>>505
今回の話はEDITをUnicode対応にするって話だから、
単に表示できるかどうかって話じゃないのよ。
EDITをUnicode対応にするには、
CreateWindowExW()を使わないと駄目ってこと。
507デフォルトの名無しさん:02/07/04 12:35
TextOutW()とかを使ってEDIT相当のものを自作するのは話が別
ExtTextOutWはWin95でも使えるね。
コレなら9x対応のUNICODEテキストエディタ簡単に作れるよ。
509デフォルトの名無しさん:02/07/04 12:36
そんなもの作らなくてもFM20.DLLに入ってる。
いくらCOMが面倒でも、コードの量的に考えて、
全部自作する方が10倍以上コード量多いだろ、という話。
510デフォルトの名無しさん:02/07/04 12:37
自作できるかどうかを問題にしてない
512デフォルトの名無しさん:02/07/04 13:01
>>511
VBのランタイム入れれば済む話
どうせ今回は内輪で使うためで
一般配布が目的じゃないんだろうし
513デフォルトの名無しさん:02/07/04 13:12
>>512
VBのランタイムに入ってないだろ
Officeの一部だろ
ま、内輪で使うんなら関係ないのは確かだけど
514デフォルトの名無しさん:02/07/04 13:14
自作自作っつってる奴が多いけど、
そんなに簡単に作れるんだったら、
誰か再配布自由なの作って配ってないの?
TEditorがあるやん
>>501
あら、そうだったのね。と言う事は「Unicodeフォントが入ってない」ではなく
「自国語以外の部分が無い」と言う方が正しいのか?

>>502
XP以外のOSでは、"Arial Unicode MS"はOffice2Kを入れるか、別途ダウンロードしないと
入ってないようです。XPは無くても上手くできるようになってるみたいだけど。

>>504
9x系で普通に"UNICODE"定義しただけでは、落ちるのは当たり前。OSがUnicode対応してないからね。
だから、"Microsoft Layer for Unicode(MSLU)"と言うライブラリがあるんだけど…。
>>516
Win2k使ったことあるか?
MSゴシックも明朝もハングル・ウムラウト表示できるし。

MSLUは使わなくても基本的なWideCharToMultiByteとか
TextOutとかGetTextExtentPoint32とかはW版もついてくるから
Unicodeアプリは動かなくても内部でUnicodeを使うことが出来る。
518デフォルトの名無しさん:02/07/04 14:24
>>515
なるほど、こちらですね。
http://member.nifty.ne.jp/~katsuhiko/hedit.html
今回はWin32APIまたはMFCのアプリ作成が目的みたいですが、
Delphiコンポーネントって簡単に使えるのでしょうか?

>>516
こちらですね。
http://www.microsoft.com/globaldev/articles/mslu_announce.asp
つまり、MSLUを使うと、
OS組み込みのEDITコントロールも
XP相当のUnicode対応にできるということですね。
それでしたら一発解決ですね。
519デフォルトの名無しさん:02/07/04 14:27
ちなみに元のやりとりはこれ
>>472-476
520500=516:02/07/04 15:54
>>517
> MSゴシックも明朝もハングル・ウムラウト表示できるし。
IMEパッドで見たところ、ラテン系は"MS Pゴシック"がほぼ全域をカバーしてる。
他のはラテン拡張Bがほとんど無いですが、基本的なところはあるのである程度の表示は出来そう。
ハングルに関しては"MS(P)ゴシック","MS(P)明朝"には無かったけど、これってうちの
フォントがおかしい?
なので、"MS(P)ゴシック","MS(P)明朝"は「Unicodeでも表示できる」というだけな気が…
"MS UI Gothic"ならハングルからタイやアラビアまで、かなり広範囲をカバーしてました。

> Unicodeアプリは動かなくても内部でUnicodeを使うことが出来る。
もちろんそれは可能。でもAPIにUnicodeを渡せないと面倒じゃない?
いちいち変換かける必要が出てくるし。それが面倒じゃなければそれでも良いけど…。

>>518
あ〜、それがすんなり行かないのです。MSLUはあくまでAPIのラッパー的な役割しかなくて
コントロールまでは影響しません。ここらへんの解決策は >>347-378 にポツポツとありました。
>>520
CreateWindowWしたウインドウじゃなくても
TextOutWで描画出来るから、普通はあんまり問題にならないでしょ。

XP版msgothic.ttcと2k版msgothic.ttcは同一バイナリだった。
コンペア結果も一致。
msmincho.ttcは違ったけども。
522デフォルトの名無しさん:02/07/04 19:49
メニューのサブクラス化をしたいのですが
GetWindowLong, SetWindowLongを失敗してしまいます

OrgMenuProc = (WNDPROC)GetWindowLong((HWND)GetMenu(hwnd), GWL_WNDPROC)
SetWindowLong((HWND)GetMenu(hwnd), GWL_WNDPROC, (LONG)MyMenuProc)

というような感じでやっているのですが
どこがいけないんでしょう?
523デフォルトの名無しさん:02/07/04 20:50
VC++ 6.0でMFCを使わずに(使えずに)APIを使ってCでプログラムを組んでいます.
それで質問なのですが,ファイルを指定して開くときに GetOpenFileName を
使いますが,フォルダの場所だけを指定したいときには,どのような処理を
行えばよいのでしょうか?

やりたいことは,フォルダの参照ダイアログ ボックスを表示して,そこで検索したい
フォルダの場所(ディレクトリ)を指定するということをしたいです.
SHBrowseForFolder
525デフォルトの名無しさん:02/07/04 21:13
ビットマップを読み込んで表示するときに、AdjustWindowRectを使って読み込んだ画像の
大きさになるように調整しているのですが、メニューの折り返しがあった場合(読み込んだ
画像の横幅が小さいとき)、その折り返しがあった分だけ、ビットマップを表示するスペース
が小さくなってしまい正しく表示されません。
なんかよい方法がないでしょうか。。。
分かりにくいので図に描くと以下のような感じです。

ある程度横幅があると正しく表示されるが、

     タイトルバー
メニュー1 メニュー2 メニュー3
○○○○○○○○○○○○○○○○
△△△△△△△△△△△△△△△△
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇

横幅が小さいときは、

メニュー1 メニュー2 
メニュー3         <--- メニューの折り返し
○○○○○○○○○
△△△△△△△△△
◇◇◇◇◇◇◇◇◇  <--- この部分が切れて表示されない
                  枠をマウスで広げないと表示されない

となる
CW_USEDEFAULTで作った後に差分を取ってリサイズ
>>524
おぉ!出来た!!
ありがとうございます.
>>522
HMENUはHWNDじゃないってことだよ。

>>525
アジャくんはあくまでメニューが1行としてしか計算してくれないからね。
サイズ変更した後にクライアント領域のサイズを調べて、
希望どおりになっていなかったらその分引き伸ばして
もう一回リサイズかけるくらいしか思いつかん。
529522:02/07/05 05:52
>>528
ありがとうございます。
でもHWNDにキャストしてやらないとコンパイル出来ないのですが・・・
もしかしてメニューハンドルを使う事自体間違ってるのでしょうか?
なんでもキャストすりゃ済むってもんじゃない。
>>525
WM_NCCALCSIZEを投げれば
実際にサイズ変更しないでサイズ計算できる
532デフォルトの名無しさん:02/07/05 17:32
開いたファイルを任意のサイズに変更したい(後半部分を切り捨てたい)
のですが何か良いAPIはありませんか?
今は ReadFile() WriteFile() を繰り返して実現してるのですが…
SetEndOfFile

The SetEndOfFile function moves the end-of-file (EOF) position for the
specified file to the current position of the file pointer.

This function can be used to truncate or extend a file.
534デフォルトの名無しさん:02/07/05 18:56
VC++6.0でPOP3, SMTPクライアントを実装したいのですが、
便利なライブラリってないでしょうか?
535デフォルトの名無しさん:02/07/05 19:07
536デフォルトの名無しさん:02/07/05 19:11
>>535
その他にありませんかね?ライセンス気にせず自由に使用できるもので。
>>536
拙作の作りかけpop3ライブラリ。
plain/APOP/AUTH(CRAM-MD5)対応
http://lounge.dip.jp/~yoshinoya_off/up/img/pop3.zip
538デフォルトの名無しさん:02/07/05 19:54
ありがとうございます。参考にさせて頂きます。
539デフォルトの名無しさん:02/07/05 21:48
>>531

case WM_NCCALCSIZE:
rc.top = 0;
rc.left = 0;
rc.bottom = 240;
rc.right = 320;

AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, TRUE);
SetWindowPos(hwnd,HWND_TOP,0,0,rc.right-rc.left,rc.bottom - rc.top,SWP_NOMOVE);
return 0;

なことをしたら,タイトルバーも全部真っ白なクライアント領域だけが表示されました.
なんか激しく勘違いをしているようなので,どうやればよいのかご教授願えないでしょうか.
#MFCとか使っている人だと楽勝なのだらろうか...
SendMessage(hwnd, WM_NCCALCSIZE,〜)だよ
リファレンス読め
>>540
すんません.MSDNみてもいまいちピントこなかったのです.
で,googleで WM_NCCALCSIZE を調べても SendMessage(hwnd, WM_NCCALCSIZE, 〜
なのがひっかかからなくて,うーむという状態です.

どのタイミング+引数でSendMessage(hwnd, WM_NCCALCSIZE, 〜 すればよいのでしょうか.
542デフォルトの名無しさん:02/07/06 00:04
VCで使える、ウインドウに文字をいろんな方法で動かしたりして表示する
ライブラリっていうのは無いものでしょうか?
ゲーム内で使いたいんですが、
いちいち自分でフォントを作って動かし方の指定をするのは
めんどくさいなって思って・・・
>>542
自分で作って以後それを利用する。
544デフォルトの名無しさん:02/07/06 00:09
>>543
やはりそれしかないのかな〜
頑張るか・・
>>533 ありがとー
画面上にテキスト出力するだけのスクロールバー付きの
サンプルプログラムってないかな?
ログ出力に使いたいんだけど。
>>546
さすがにそのくらい自分で作れよ・・・
>>546
標準出力に吐く
>>539
AdjustWindowRectで求まった矩形をr1とすると、
r2 = r1;
SendMessage(hwnd, WM_NCCALCSIZE, FALSE, (LPARAM)&r2);
でr2にクライアント領域のサイズが入って戻ってくる。
これを見てr1を調整してからSetWindowPosかけれ。
>546
エディットウインドウつくって、AppendTextすれば〜?
551デフォルトの名無しさん:02/07/06 07:18
2つのプロセスが交互にファイルを30秒おきに読み書きする。
ファイルの同時アクセスは許さない、時々ファイルは削除される、という場合に、

・一方がファイルを読み書き中にはエラーを返す。
・ファイルが存在しない場合にはファイルを作る。

という処理がしたいのですが、
ファイルが存在しない場合を知るにはどうすればいいのでしょうか?

hFile = CreateFile( "hoge.txt", GENERIC_READ , 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

これで調べているのですが、ファイルの共有エラーの場合と、
ファイルが存在しない場合の区別の仕方がよく分かりません。
よろしくご教授お願いします。
>>551
GetLastError()とか。
OLEを利用するのに
OleInitialize()を呼び出しますが、
CoInitializeEx()は呼び出さなくても良いのでしょうか?

CoInitializeEx( NULL, COINIT_MULTITHREADED );
OleInitialize( NULL ); -> 失敗

OleInitialize( NULL );
CoInitializeEx( NULL, COINIT_MULTITHREADED ); -> 失敗

となるのですが。
OleInitializeが内部でCoInitializeを呼び出しているのなら良いのですが、
そうでないならOLE以外のコンポーネントを同時に使えないのかなと思いまして。
>551
OPEN_ALWAYS使えばいいんでわ?
>553

なぜMSDNを調べないか。
>OleInitialize calls CoInitializeEx internally to initialize the
>COM library on the current apartment.
>Because OLE operations are not thread-safe,
> OleInitialize specifies the concurrency model as
>single-thread apartment.
と明記されているではないか。
556デフォルトの名無しさん:02/07/06 11:55
>>542
そんなのあるなら俺も欲しいな〜
出来たらサンプル公開・・・してくれると嬉しいでやんす。
557sage:02/07/06 12:52
>>522
よく分からないまま、流れていってしまったのですが・・・
もしかしてメニューのサブクラス化というのは
割と初歩的な事で、本かなんか読めば書いてある事
なのでしょうか?
それとも逆にあまり一般的ではないのでしょうか?
いろいろ試しているのですが相変わらず出来ません
トホホ・・・
>>557
一般的でないどころか世界中でそんなことしてるやつ一人もいないかも
どうしてもメニューをサブクラスかしたかったら
メニューのウィンドウハンドルを何とかしてゲットしてください
ポップアップ中なら座標から何とかなるでしょう
メニューはウィンドウじゃないからサブクラス化なんてできないよ
なんて子供の純真な夢を打ち砕くような台詞をどうしても言わせたいのかキミは

オーナードローとかで我慢しる。
メニューもウインドウなんだが?
誰からそんなウソ教わった?
>>560
実際システムメニューとかって乗っ取れるしね。
>>560-561
んじゃ、教えてやれよ
つーかWindowsで画面に表示される
ユーザーの入力を受け取る事が可能な物は例外なくウインドウなんだが。
564デフォルトの名無しさん:02/07/06 18:26
burorororo
あ、クラス名は"#32768"ね
>>563
ステータスバーはウインドウではないと。
567デフォルトの名無しさん:02/07/06 18:52
流れ的にfj臭いな
・基本

変に何かを定義付けしようとする奴は基本的に叩かれる。
よって多分俺も叩かれる。
>>566 はぁ?
入力を受け取るオブジェクト⊂ウインドウ
入力を受け取る物だけがウインドウとは書いてない
>>569
>ユーザーの入力を受け取る事が可能な物は例外なく

書いてある。
ユーザーの入力を受け取る事が可能な物は例外なくウィンドウである
と、
ウィンドウとは例外なくユーザーの入力を受け取ることが可能である
は等価じゃないんだが。
つか、これ中学生レベルの数学で習わなんだか?
>>570 おい、どう読んだらそうなるんだ?
「〜物のみ〜」とは書いてないだろ。
日本語読める?
まだ小学生ですた
>563
コマンドプロンプトのウインドウハンドル(゚∀゚)クレクレ
>>574
Spy++じゃ取れないがWinSightとか自力なら普通に取れるが、何か?
あ、コマンドプロンプトってNTか?それじゃ死らん
ウインドウのように見えるが、ウインドウじゃないのか?
NT系のコマンドプロンプトはCSRSSが管理してるから
セキュリティの関係でいじれないようになってるんだよ。
パスワードとか入力される場合もあるしな。
NTのコマンドプロンプトでもハンドル取れたぞ

002C0810
"コマンドプロンプト"
ConsoleWindowClass
14EF0000
2000でコマンドプロンプトがフォアグランドだと
どうあがいてもSetForegroundWindowが効かないのは
どうしてですか。
>>549
出来ました.ありがとうございます.
581デフォルトの名無しさん:02/07/06 23:54
LineToで線を書いた画面の上にTextOutで文字を出力すると
文字と被ってない部分の線も消えてしまうんですがそれを消えないようにする
方法ってありますか?
MSDNでSetBkModeを検索するよろし。>>581
583581:02/07/07 00:05
>>582
うまくいきましたー、ありがとうございます。
>>551
fopen("file_path","a");
すりゃ、勝手にファイル作ってくれると思うが・・・・・
んで、mutexでプロセス間の排他はOK
585デフォルトの名無しさん:02/07/07 13:51
buroburoburo
586デフォルトの名無しさん:02/07/07 20:59
マルチモニタ対応のため、ダイアログをセンタリングするときは
スクリーンではなくアプリケーションウィンドウに対して
センタリングせよという意味のガイドラインがどこかに書かれていた
と思うのですが探し出せません。
どこに書いてるか知ってる人いませんか?
587551:02/07/07 21:07
>>552,554,584
情報さんくすです。
結局、
GetFileAttributes(FILENAME) == 0xFFFFFFFF
でファイルの存在を調べて
hFile = CreateFile( FILENAME, GENERIC_READ , 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)
で排他処理することにしました。
ファイルの存在チェックとオープンの間に
ファイルが作られたり削除されたりという可能性は考慮しなくていいの?

(´-`).。oO(なんで素直にアドバイスどおりに作らないんだろ?)
589偽551:02/07/07 21:50
>>588
大丈夫ですよ、チェックしたらすぐに作成しますから。最近のマシンなら
1/1000 もかからないでしょ。

まあ、俺が担当にいる間ぐらいはちゃんと動くだろうしね...。
590さらに偽551:02/07/07 21:57
>>588
作らないじゃなくて作れないんです!
>>590
なぜ OPEN_ALWAYS 使わないのか小一時間
592本物かもしれない551:02/07/07 22:10
>>591
OPEN_ALWAYS はなかったら作る、あったらそのまま、なので
存在したかどうかの判断ができないと思われ。
OPEN_EXISTSでいいじゃん
>>592
551は

> ・ファイルが存在しない場合にはファイルを作る。

と言っているのでそれでもいいかと思われた
つくってから、ファイルサイズとってくればいいやん。
書き込み権利は排他的にとれるでしょうに、
その書き込み部分の処理にファイルとは別に排他処理するんでもいいと思われ
排他権は、ファイルの書き込み権とおなじなので、
別のオブジェクトで排他処理すると、二重管理に
なるとおもうけれど、どうなんだろ。
598デフォルトの名無しさん:02/07/07 22:42
くだらない質問だと思うのですが

hFile = CreateFile("test.txt",GENERIC_WRITE,0,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
wsprintf(str, "%d\n", i);
WriteFile(hFile,(LPVOID)(&str),(lstrlen(str))*sizeof(char),&dwWrittenByte,NULL);

iはint型の変数で、中には100が入っています
strはchar型の配列の先頭へのポインタです
dwWrittenByteはDWORD型です

上のようにして、できたファイルをメモ帳で開くと
改行されずに100■となってしまいます。
なぜでしょうか?
>>598
CreateFileだと全部バイナリ形式の読み書き?だったから
\nが\r\nに変換されないせいじゃねーの?
600デフォルトの名無しさん:02/07/07 22:48
プログラムはそのままで、改行部分だけ\nから\r\nに直したところ
きちんと改行されるようになりました。

こんなにあっさり直るなんて、ここで相談してよかったです。
早いレス本当にありがとうございました。
601デフォルトの名無しさん:02/07/08 15:29
質問ですが、
EnumWindowsとかで取得したHANDLEからそのアプリケーションが
あるパスを取得する方法を教えて下さい。
>>601
GetWindowThreadProcessID
OpenProcess
EnumProcessModules
GetModuleFileNameEx

かな?
603デフォルトの名無しさん:02/07/08 16:08
>>602
おおおおっ!!!
感謝です、ちょっとその辺りを調べてみます、
604デフォルトの名無しさん:02/07/08 22:54
質問です。
メッセージボックスを画面の中央に表示する方法はありませんか?
親を指定すると無理なのかなあ。
SetWindowPos
606名無しさん:02/07/08 23:24
>>598
WriteFileの第2引数は本当に&strなのか?
と問い詰めたい…。
607デフォルトの名無しさん:02/07/08 23:56
>>605
SetWindowPosするにはhwndが必要なんですけど、
MessageBoxでもらえるんでしょうか?
それとも別のAPIがあるのかな?
608598:02/07/09 00:49
>>606
あれ?
&strでもstrでもどっちでも同じ意味のはずですよね?
なんか見た目的に&strのが「アドレスだな!!」ってわかる気がしてw
いやまあ(LPVOID)で分かるんだけど。
やっぱり変ですか・・?
>>608
……もう一度最初からCなりC++の勉強をやり直すことを強く推奨する。
>>608
strが配列ならセーフだが、ポインタだと君のコンピュータが光の速さで吹っ飛んでいくぞ。
>>607
自作ダイアログで代用するのが定番。
611デフォルトの名無しさん:02/07/09 01:07
('〇';)
(゚ロ゚)
(゜〇゜;)
(゜o゜)
612デフォルトの名無しさん:02/07/09 01:09

んっと、いやだから
配列だから良いんですよね?
よくない
>>610が微妙
615デフォルトの名無しさん:02/07/09 01:14
良くないんですか・・・
>>612
たまたま配列だから助かっていただけ
わざわざ危険側に振るなってこと。
617デフォルトの名無しさん:02/07/09 01:25
>>610
やっぱりダイアログで代用ですか。残念。
でも、REGEDITでキーを削除するときに出てくる確認は、
普通のMessageBoxっぽいのに中央に表示されるんですが...
あれもREGEDITが頑張ってるのかな。
618偽者604:02/07/09 01:26
>>610
やっぱり方法ないんですね。
MFCのAfxMessageBoxではちゃんとhWndの中央にでますが
あれのソースってどうやったら見れますか?厨房+便乗質問でスマソ
619デフォルトの名無しさん:02/07/09 01:33
>>618
いや、hwndの中央じゃなく、画面の中央に出したいのです。
hwndには自分のウィンドウいれてね。

hwndにNULL入れると中央にでるけど親さわれちゃうし。
NULL入れてTASKMODALにすると親さわれなくなるけど、
タスクバーに表示される...

MFCのソースはステップ実行すれば簡単に見られるよ。
ソース漁るより楽。
「画面」なんて曖昧な書き方するのが悪い。
自分で作成したウィンドウのことだろ?どうせ
MessageBoxを好きな位置に移動させる方法はある。

http://pc.2ch.net/test/read.cgi/tech/1024380249/159
621偽者604:02/07/09 01:44
>>619
あれ?
MessageBoxは常にデスクトップの中央に表示されない?
OSで違ったっけ?Win2000ではそうなるけどな。

> MFCのソースはステップ実行すれば

ほんとだ。Thx!
どーしてもMessageBoxにこだわるのなら、メッセージボックスもウインドウなのだから、
SetWindowsHookしてWM_CREATEなりWM_SIZEなりを捕まえてやれば出来るんじゃないかと思うが、
Spy++で見ると、メッセージボックスはごくふつうのダイアログであったりするから、常時フックしておく訳にもいかず、
出す直前にフックして直後に解除しなければならないと思われ。
そんなことするなら、ダイアログを自作する方がはやいと思われ。
623デフォルトの名無しさん:02/07/09 01:51
>>620
CBTフックですね。試してみます。
Thanks!
>>622
ダイアログを作るなら、非表示のダイアログを作って
その中でMessageBoxすると可能でした。
でもなんかスマートじゃないなぁと思って。
フックがスマートなのかどうかはよくわかんないけど。
色々試してみます。
625偽者604:02/07/09 02:19
AfxMessageBoxも最終的にはMessageBoxを呼んでいるのだけど
MFCの
int CWinApp::DoMessageBox(LPCTSTR lpszPrompt, UINT nType, UINT nIDPrompt)
これを見ても何でhWndの中央に出るのかよく分りません・・・。
>>625
CWinApp::DoMessageBoxの中も追わないと。
なんで中央に出るか、お前らほんとに知らんのか?
それともわざと言わないのか? ぼけてるのか?
>>627
説明する気もない奴は来なくていい
>>628
説明するのは簡単だが、場の空気ってもんがあるだろ。
本人のために、あえて言わないのかもしれんからな。
>>629
そういうヤシは黙っとけ
631おねがいします:02/07/09 08:48
Windows xp では、netstat に -o オプションが追加になりプロセスIDも見れる
ようになりましたが、これと同じことを Windows 2000 でもやりたいのですが、
プロトコル(TCP/UDP)とポート番号の組み合わせからプロセスIDを取得する方法
ってわかりますでしょうか?
パーソナルファイアーウォールなどでは、取得できているようなのですが。
お願いします。
糞壁は黙ってろ
633デフォルトの名無しさん:02/07/09 11:10
C++Builder5を使ってますが、
GetWindowThreadProcessIdを使うと
[リンカ エラー] 外部シンボル 'GetModuleFileNameExA' が未解決
ってリンクでエラーになります、何が足りないのでしょうか?
>>627-630
なんだこの無駄な漫才は。
>>633
GetModuleFileNameExは使ってないの?
636デフォルトの名無しさん:02/07/09 11:39
>>635
激しく間違いました。
×GetWindowThreadProcessId
○GetModuleFileNameEx
ですね、はい。
>>633
psapi.libが足りないんじゃない?
>>633,636
implibでpsapi.dllから.lib作ればリンク出来るだろうけど
psapi.dllが入ってない環境だとアプリの起動も出来なくなるだろうから、
↓のようにdllを動的にロードしたほうがいいと思う。
http://techtips.belution.com/ja/vc/0022/
ツリービューを使っていて、質問があります。
TVM_EXPAND/TVE_TOGGLEでプログラムから
ツリーを開いたり閉じたりしているのですが、
アイテムを閉じたときにTVN_ITEMEXPANDEDが送られてきません。
勿論、TOGGLEの後にTVIS_EXPANDEDONCEをリセットしているのですが。

どうすればいいのでしょうか?
640デフォルトの名無しさん:02/07/09 15:12
ageます
検索してみましたが、
http://n76cd-01p05.ppp11.odn.ad.jp/old/a8575.html
ここのA8564に同様の質問があり、答えが出ていません。
なにかうまい方法無いでしょうか?
ツリービューのオーナードローってどうやるんですか?
TVS_OWNERDRAWFIXEDみたいなの無いんですが。
timeGetTimeは1/10ですよね。
QueryPerformanceCounter
って何分の何の単位の精度なんですか?
timeGetTime()はちゃんと設定すれば1/1000 (sec)の精度があるはず。

QueryPerformanceCounterの精度は、
QueryPerformanceFrequency(&freq), 1/freq (sec)
645デフォルトの名無しさん:02/07/10 10:16
>>637-638
なるほど、やっぱそういうことですか、
ありがとうございますた。
646デフォルトの名無しさん:02/07/10 10:31
MAPIの関数の説明が書いてあるHPがあったら教えて下さい。
できれば、日本語で書いてるといいですね。
647デフォルトの名無しさん:02/07/10 10:32
自前のタスクバーを作っているのですが、タスクバー関連のAPIがわからず困っています。

ツールバーに登録されている(ツールバーにアイコンとして表示されている)アプリケーション(かウィンドウ)へのハンドル一覧を得たいのですが、どの関数を使えばよいのでしょうか。

また、タスクトレイをエミュレートするために、
(1)タスクトレイに登録されているアプリケーションのハンドル
(2)実際にタスクトレイに表示されているアイコンのハンドル
(3)そのアイコンがクリックされた際に適切なメッセージを生成してアプリケーションに送信したい場合に、そのメッセージの種類
を知りたいのです。
>>646
MSDNで十分じゃない?
649クリップボードの使い方:02/07/11 00:45
「猫でもわかるプログラミング」 http://www.kumei.ne.jp/c_lang/sdk/sdk_94.htm
など、多くのサイトでは、SetClipboardData を呼び出した後は、
メモリは Windows の管理下に置かれるので GlobalFree しては
いけない、と書かれています。

確かに実際に動かしてみた限りでは GlobalFree してしまうと、
動作がおかしくなります。(2回目の SetClipboardData が失敗する )
では、メモリが Windows の管理下になるとすると、解放はいつ
行われるのでしょうか?

一方、 MSDN では、
http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_setclipboarddata.htm
「CloseClipboard 関数を呼び出すまでは、そのハンドルを解放
することや、ロックし続けることを避けなければなりません。」
と書かれていて、 CloseClipboard を呼び出した後であれば
解放しても良さそうにも思えます。

また、MSDN では
「CloseClipboard を呼び出した後も、アプリケーションはそのデータに
アクセスできます。」とも書かれていますが、いつ解放されるか分から
ないのでは怖くてアクセスできないと思うのですが・・・
>>649
だから使うなってことだと思うんだけど。
651デフォルトの名無しさん:02/07/11 01:32
TextOutで画面上に出力した文字を消す方法って
画面全体を消去する以外にありますか?
>>649
ふつうはコピーして使う
SetClipboardData したメモリのことは忘れたほうが無難

>>651
背景と同じ色で上書きしたら
>>647

タスクバーのツールバー?
あれはタブコントロールだよ。ボタンスタイルの。

(1)(2)(3) はできた、という話を聞いたことない。
>>647
出来るかどうか知らんが、ITaskbarListでも調べてみれば?
>>647
トップレベルウィンドウでかつSW_HIDEじゃない奴を表示してると思う。
ウインドウスタイルの条件があるかも。

トレイはどうだろう。
Shell_No〜をフックすればいけるかも。
657デフォルトの名無しさん:02/07/11 11:08
文字入力のカーソルの点滅速度を取得するにはどうすれば良いんでしょう?
>>657
GetCaretBlinkTime
659657:02/07/11 11:26
こりゃまたそのままの名前。
ありがとう。>>658
660デフォルトの名無しさん:02/07/12 22:11
ウィンドウ全体を背景色で塗りつぶすのに、もっとも手っ取り早い
方法って何?
WM_ERASEBKGNDを送る
>>661
おお、ありがとう。手っ取り早そう
663デフォルトの名無しさん:02/07/13 16:15
「メニュープロパティ」の「一般」-「ID(I): IDR_MENU1」として,

WNDCLASS wndclass ;

wndclass.lpszMenuName = IDR_MENU ;

てな感じで書くと,
--------------------------------------------------------------------
warning C4047: '=' : 間接参照のレベルが 'const char *' と 'const int '
で異なっています。
warning C4047: '=' : 間接参照のレベルが 'const char *' と 'const int '
で異なっています。
-------------------------------------------------------------------
とwarningがでるが,ちゃんとメニューは表示されるが,
wndclass.lpszMenuName = "IDR_MENU" ;
とかするとwarningはでないけど,今度はメニューが表示されません.
なんででしょうか?
MAKEINTRESOURCE(IDR_MENU)
とゆうマクロがあるよん。
ウィザードでは(LPCSTR)IDR_MENU
ってキャストしてるけどね。
665デフォルトの名無しさん:02/07/14 20:45
buro
666デフォルトの名無しさん:02/07/15 05:19
タスクトレイを右クリックした時に表示されるポップアップメニューのハンドルから、
オーナーのハンドルを取得するにはどうすればいいのでしょうか?

ポップアップメニューのハンドルは取得できるのですが、
GetWindow(hWnd, GW_OWNER);
GetAncestor(hWnd, GA_ROOTOWNER);
では、0が返ってきます。
GetWindowProcessIdとかEnumChildWindowsを串
668デフォルトの名無しさん:02/07/15 18:03
buroburo
669デフォルトの名無しさん:02/07/15 18:37
iniファイルの一つのセクションにあるキーの数がいくつかを
調べる方法はありますか?
>669
GetPrivateProfileSectionを調べよ
671デフォルトの名無しさん:02/07/15 22:57
お絵かきプログラムでLineToで描いた一本の線を消すために
画面全体を消去してN-1本の線を復元しています。
あまり良い方法ではないと思うのですが、最後の線だけ消すと
その線と交わっている別の線も消えてしまうので仕方なくこうしてるんですが
いい方法ないですか?
線引く前のイメージを保存しといたら?
差分を取るようにすれば相当圧縮が効くし。
ベタ絵ベースのお絵かきプログラム?
ベクトルベースのお絵かきプログラム?
674デフォルトの名無しさん:02/07/15 23:11
>>672
私のプログラムでは好きな回数だけ前に戻れるようにしたいので
その方法ですとN個の線を描いた場合N個のイメージが必要になりますよね。
工夫すればイメージの量も小さくなるかもしれませんが、どうなんでしょう。
675671:02/07/15 23:14
>>674
あ、671でした。

>>673
あまり詳しくないのでどっちと聞かれると困ってしまいますが
マウスの座標(x,y)を取得し、それを画面上に線として描画するだけの
プログラムです。答えになってるでしょうか・・・。
>>675
BMPとかJPEGとかで保存するの?
677671:02/07/15 23:20
>>676
いえ、今のところそのような保存は行わないです。
最初にお絵かきツールと書きましたが、主な使用目的は
簡単に線を書いたり消したりすることがメインです。
少し話が難しくなってしまいそうな表現でした、すいません。
表示するのが線だけだったら、画像イメージ保存するよりは
線分の頂点を記録して再描画(つまり今やっている手段)が
むいているんじゃないかな?
679671:02/07/15 23:26
>>678
そうですか、現在はおっしゃるように頂点を記録しているので
それを元に最初から復元するのは比較的容易です。
ただ、効率が悪いなぁと思いまして^^;。
>>679
時間効率と空間効率は、しばしば相反する。トレードオフを探せ。
>>679
両方組み合わせれば?
俺が今書いてるのは、基本はUndoの度に線を再描画して、
再描画にかかる時間が0.5秒を超えたらその状態を保持して
次からはそこから再描画するようにしてる
682679:02/07/15 23:47
>>680
確かにトレードオフは重要ですね。妥協点を探します。

>>681
ある程度の処理時間がかかるところまで保存しておく方法ですね。
なかなか良さそうな方法なので簡単に実装できたらやってみます。
683デフォルトの名無しさん:02/07/15 23:51
burororororo
684666:02/07/16 02:02
>>667
GetWindowProcessIdでいけました。ありがとう。
685デフォルトの名無しさん:02/07/16 04:37
エディットコントロールの最後尾に文字列を挿入すると
テキストの最初の方を見ていても、最後尾に移動してしまいます。
テキストを挿入しても、その場所に移動しないようにするには
どうしたらいいでしょうか?
>>685
ハァ?
687デフォルトの名無しさん:02/07/16 04:56
>>685
自動スクロールオフ
688685:02/07/16 05:01
>>687
自動スクロールオフとは?
ES_AUTOVSCROLなどは設定してません。
689カンで書いてみる人:02/07/16 06:28
EM_SETCARET
690カンで書いてみる人:02/07/16 06:30
はずした・・・

EM_SETSEL 0 0 とか
置き換える前にEDITの先頭位置(S1)と、現在のセル(S2)の位置を記憶しておいて、
置き換え後に、S1にSETSELしてから、S2にSETSELでなんとかできん?
http://www.nifty.ne.jp/forum/fdelphi/faq/00137.htm
などで、
SC_MOVE or 2
という指定になっていますが、なぜ2との論理和なのですか?
APIヘルプや、MSDNを見ても載っていなかったのですが・・・。

あと、出来ればReleaseCaptureについての詳しい解説もお願いします。
>>692
2 は HTCAPTION です。

ReleaseCapture は SetCapture でキャプチャしたマウス捕捉を解除します。捕捉したままだと上手くいかないので、解除します。
>>693
 あ!つまり、タイトルバーをつかんでいる様にしているわけですね!
だけどヘルプには論理和〜とか書いてないし・・・。しかも何故WM_NCHITTESTが?
何か、WinAPIの常識のようなものなんでしょうか・・・?
>ReleaseCapture
 なぜうまくいかないのですか?
695693:02/07/16 23:56
>>694
SC_MOVE ... えーと。勘違い。適当なこと言ってました。
よく考えたらヒットテストコードなわけ無いですね(ヒットテストコードは21まであるし・・・ぐーぐると SC_MOVE|HTCAPTION とか出てくるのですが)。
これはなぜか2のようです。実際にタイトルバーをドラッグしたときに、Windowsから2が送られて来ます。よくわかりません。

ReleaseCapture ... なぜかキャプチャしてると実際に上手くいきません。キャプチャを解除してやると、なぜか実際に上手くいきます。そういうもんだと私は考えてますけれども、なぜかと言われると・・・なぜでしょう。
696694:02/07/17 00:21
>>695
 そもそも何で論理和を取るのかが・・・。ヘルプに載ってないのに・・・。
一体どこに2を送る仕様とかについて書いてあるんでしょう?

 ・・・APIは謎の仕様が多いですね・・・。
697デフォルトの名無しさん:02/07/17 04:29
>>696
WM_SYSCOMMAND の WParam の SC_XXXX の定数定義はどうしてとびとび
の値になっているか、よーく考える。MS が公開してないメッセージが
たくさん飛び交っているのよ。

論理和ではなく、SC_MOVE+2 の数値が意味ある。
FindWindow, FindWindowExで、
条件に一致するウィンドウが複数会った場合、どうなりますか?
ハハーン。
In WM_SYSCOMMAND messages, the four low-order bits of the wParam
parameter are used internally by the system. To obtain the correct
result when testing the value of wParam, an application must
combine the value 0xFFF0 with the wParam value by using the
bitwise AND operator.
>>698
その中から適当にどれか1個でしょう。
701デフォルトの名無しさん:02/07/17 21:39
LVS_OWNERDRAWFIXED | LVS_OWNERDATA で LVS_REPORT なリストビューを描画するとき、
WM_DRAWITEM の rcItem が微妙にオフセットずれるのって僕だけですか?
(0,0)から描画したいのに(0,2)とかになっちゃうんだけど。
702694:02/07/17 21:56
>>699
 あ〜、つまり、タイトルバーをつかんでいると、
wParamの下位4ビットが、2になっていると言う事ですか・・・?
703697:02/07/17 22:39
元質問の >>692 は Delphi ユーザだね。新規で以下のコードを試してごらん。
Form1 のタイトルバーをクリックしたり、ドラグすると SC_MOVE+2 が
WM_SYSCOMMAND の wParam として送られてくるのが分かるだろう。これを
コードで送って、枠なしフォームをドラグするわけね。

type
 TForm1 = class(TForm)
  ListBox1: TListBox;
 private
  { Private 宣言 }
 public
  procedure WMSysCommand(var Msg:TWMSysCommand);message WM_SYSCOMMAND;
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

{ TForm1 }

procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
 ListBox1.Items.Add(IntToStr(Msg.CmdType-SC_MOVE));
 inherited;
end;
C言語の基本的なことを理解しただけの者デス。
Windowsアプリケーション作成しようと思ってAPIが必要という事が分かりました。
MFCは使わない方向です。
貴方の使用しているorお勧めする参考書籍おねがいします。。。
>>704
検索すればその辺にコード転がってるだろ。
706デフォルトの名無しさん:02/07/17 23:06
MFC使え。
>>702
たまたま2だけど2だと決め付けたコーディングは行儀が悪いと書いてるの。
読解力のない奴にいくら言っても無駄だが
708デフォルトの名無しさん:02/07/18 00:39
QueryServiceConfig2 と ChangeServiceConfig2 を使って、既存のサービス内容を
表示したり変更したりするアプリケーションを作成しています。

QueryServiceConfig2 に SERVICE_FAILURE_ACTIONS オプションをつけて、
サービスの回復設定情報を取得すると、
LPTSTR lpRebootMsg;
LPTSTR lpCommand;
の2つのデータだけ異常なデータが入ってきます。
ms-help://MS.MSDNQTR.2002APR.1041/dnw2k/html/shc.htm のサンプルを
コピペしたものでも同じく期待した文字列のアドレスじゃないデータが入ります。

もうひとつ。。。
ChangeServiceConfig2 に SERVICE_FAILURE_ACTIONS オプションをつけて、
サービスの回復設定情報を設定すると、SC_ACTION の SC_ACTION_TYPE が
SC_ACTION_REBOOTのときだけアクセスが出来ないエラーがLastErrorに入ります。
たとえば、SC_ACTOINを配列で複数設定した場合、タイプにリブートが1つでも
入っているとエラーになります。リブートが入ってない場合は正常に書き込まれます。
OpenSCManagerはSC_MANAGER_ALL_ACCESSで開いています。

どなたか、上記APIで正常に取得出来ている人はいませんでしょうか?
子ウィンドウを作ってボタンをいくつか配置し、簡単なツールバーを作ろうとしています。
ところが、メインのウィンドウは生成できるのですが、
子ウィンドウを生成するときにCreateWindowEx()に失敗します。
問題のソースは大体下のような感じなのですが、
なぜCreateWindowEx()は失敗してしまうのでしょうか?
どなたかわかる方がいましたら、よろしくお願いします。

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp){

case WM_CREATE: // メインのウィンドウのWM_CREATEメッセージ
 // RegistClassは内部でRegisterClassExを呼び出す関数
 if(!RegistClass(hInst, ToolWndProc, "ToolWnd", NULL)){ // hInstはWinMainの第1引数のコピー
  MessageBox(hwnd, "RegisterClass関数失敗", "ツールウィンドウ", MB_OK);
  break;
 }
 htool = CreateWindowEx(WS_EX_TOOLWINDOW, "ToolWnd", "ツールボックス",
  WS_CAPTION, 10, 10, 128, 64, hwnd, (HMENU)1000, hInst, NULL);
 if(!htool){
  MessageBox(hwnd, "CreateWindowEx関数失敗", "ツールウィンドウ", MB_OK);
  break;
 }

ごめんなさい、ごめんなさい、ごめんなさい!
711どおすればいいんだ:02/07/18 04:18
http://www.gamecreators.net/
げげ!!!!!
>>709
RegistClassの中身をみせろ。
>>709
(1) InitCommonControls()は?
(2) ツールバーの作成にはCreateToolbarEx()を使うのでは?
(3) CreateWindowEx()を使うのなら
CreateWindowEx(0,TOOLBARCLASSNAME,NULL,WS_CHILD,0,0,0,0,hwnd,ID_TOOLBAR,hInst,NULL);
かな?
参考→ttp://www.kumei.ne.jp/c_lang/index_sdk.html
>>709
(MENU)1000 ← これってツールバーにメニューがあるって事?
WM_NOTIFYのときに送られてくるIDじゃなかったっけ?
シンボルブラウザからつくるかせめて
#define MyToolBar 1000
とかしてほしいけどな。
>>695
WINEのソースみるとヒットテストコードとして扱ってるみたい。
>712
すみませんです。
RegistClass()は下のようになっています。

int RegistClass(HINSTANCE hinst, WNDPROC proc, const char *classname, const char *menuname)
{
 WNDCLASS wc;
 wc.style     = CS_HREDRAW | CS_VREDRAW;
 wc.lpfnWndProc  = proc;
 wc.cbClsExtra   = 0;
 wc.cbWndExtra   = 0;
 wc.hInstance   = hinst;
 wc.hIcon     = LoadIcon(NULL, IDI_APPLICATION);
 wc.hCursor    = LoadCursor(NULL, IDC_ARROW);
 wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
 wc.lpszMenuName  = menuname;
 wc.lpszClassName = classname;
 if(!RegisterClass(&wc)) return 0;
 return 1;
}
718709:02/07/18 11:41
たびたびすみません。
過去に作った同様の方法で子ウィンドウを生成するプログラムのソースと比較してみました。
そして、1行1行切り詰めていって、普通のウィンドウと子ウィンドウを表示するだけの
プログラムにまでした結果、以下のようにすると子ウィンドウがきちんと生成できました。

これを・・・
htool = CreateWindowEx(WS_EX_TOOLWINDOW, "ToolWnd", "ツールボックス",
 WS_CAPTION, 10, 10, 128, 64, hwnd, (HMENU)1000, hInst, NULL);
こうする。
 htool = CreateWindowEx(WS_EX_TOOLWINDOW, "ToolWnd", "ツールボックス",
  WS_CAPTION, 10, 10, 128, 64, hwnd, NULL, hInst, NULL);

第10引数をNULLにしました。
子ウィンドウの生成ではここにはIDを指定しろというのに、なんか腑に落ちません。
さらに、これで原因がわかったと思って、切り詰める前のプログラムに同様の処置をしたところ、
依然として子ウィンドウの生成に失敗してしまいます。
この第10引数を使うには他に手続きとかいるのでしょうか?
子ウインドウの生成というなら、WS_CHILDの指定はどうした?
720709:02/07/18 12:24
>719
WS_CHILDってつけたら、
確か親ウィンドウの枠の外に出られないウィンドウになりますよね?
それだとツールウィンドウとしては不便なのではずしています。
たしかNTのSP3あたりでパラメータチェックがいきなり
厳しくなってメニューハンドルが有効じゃないと
ウィンドウが作成されなくなったりしたんだよな
>>720
WS_CHILDがついてなかったら子ウィンドウじゃないだろうがボケ

もしかして「所有されてるウィンドウ」と「子ウィンドウ」の
区別がついてないのかな。これをごっちゃにしてる人は
驚くほど多い。
723701:02/07/18 12:47
つーか >701 ですが、どなたかおわかりになりませんでしょうか?
ウインドウ作る部分正確に書いときますね。

hwndListView = CreateWindow(WC_LISTVIEW, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSCROLL |
LVS_OWNERDATA | LVS_OWNERDRAWFIXED | LVS_NOCOLUMNHEADER,
0, 0, 0, 0, hWnd, (HMENU)IDC_LIST, hInstance, NULL);

こう作って WM_DRAWITEM を受けて DRAWITEMSTRUCT を参照しつつ描画
しようとすると、rcItem のY座標が 2 ピクセルずつ下にずれているんです。。。
724709:02/07/18 13:16
>722
>WS_CHILDがついてなかったら子ウィンドウじゃないだろうがボケ
>もしかして「所有されてるウィンドウ」と「子ウィンドウ」の
>区別がついてないのかな。
どうも区別ついてなかったようです。

CreateWindow()に親ウィンドウハンドルをつけてウィンドウを作るときに、
・さらにWS_CHILDをつけると「子ウィンドウ」になる。
・WS_CHILDなしで呼び出すと「所有されてるウィンドウ」になる。
ということですね?
ひとつ、物知りになれました。ありがとう。
725708:02/07/18 13:26
>>708の自己レスです。
ChangeServiceConfig2 のエラーは解決しました。
シャットダウン特権を与えていなかったのが原因でした。

QueryServiceConfig2 のほうは、まだ解決してません。
引き続き調査を続けています。
現在は、レジストリから直接取得といった方法でお茶を濁しています。
どなたか、うまく取得できているかたは、いらっしゃいませんでしょうか?
726デフォルトの名無しさん:02/07/18 14:16
とんでもない質問するよ?
nani?
Tabブラウザみたいな物を作っているのですが、
Tabコントロールの子ウインドウとしてウインドウを作ると、
ウインドウのリサイズ時にどうしてもちらついてしまいます。

CS_HREDRAWとCS_VREDRAWをスタイルから除去すると
ちらつきも消えるのですが、今度はTabコントロールの描画がおかしくなります。
何かイイ対処方法無いでしょうか?
子供にするのやめたら?
WS_CLIPCHILDRENを付けれ
>>730
勿論付けてます。
732デフォルトの名無しさん:02/07/18 20:43
APIというかMFCというかなのですが…。
ローカルファイルを検索する関数、CFileFindのFindfile関数を使うと、そのフォルダ内
のファイルは検索できるのですが、ドライブ全体のファイルを検索したい時は
どうすればいいのでしょうか?なにか関数があるのですか?
なにかよい方法を教えていただけたらうれしいです。
MFCは専用スレがあるからそっちで聞け。
マルチポストだったら頃す

■ VisualC++(MFC限定)相談室 4■
http://pc3.2ch.net/test/read.cgi/tech/1021620974/l50
734732:02/07/18 22:06
すいません。気づきませんでした。そちらで聞いてみます。
>>723
何と比べて2ピクセルずれてるの?
先頭の項目でrcItem.topが0でないってことだったら、
単純にリストビューがその分余白をとってるだけでしょ。
細かいこと気にせず、「ここに描いてね」と言われた所に
素直に描画しる!
736701:02/07/19 02:18
>>735
レスTHX.

何と比べてって、リストビューのクライアント領域の上の端。
まさに先頭の項目で rcItem.top = 2 になっちゃうのです。

確かに単純に余白取ってるっぽいんですけど、
俺様が描くのだモードなのに何で勝手に余白取るのよ〜
ぴっちりと詰めて描きたいこともあるだろうに。。。
余白は取りたい奴が取ってくれよ〜
おかげで上は隙間ができるし、下は2ピクセル分切れちゃうんだよ〜

んで、やっぱこれって余白なんでしょうか?
0 にできないもんなんでしょうか?>識者の方

できないのならサブクラス化して隙間に描画するようにせんとしゃーないかな、やっぱ。

素直じゃない僕ちゃんでした。
オーナードローというのは各アイテムの描画をクライアント(オーナー)に任せる物だから、
リストビューすべてをカスタマイズするという用途に使う物ではない。
>>736
隙間ができて困るリストビューって……何か間違った使い方をしてそうな予感。
まあ、ダメモトでLVM_SCROLL送りつけてみれ。それでダメだったら、
別のウィンドウの子ウィンドウにしてしまって、上にちょこっとずらして収納するとか。
すいません!ちょっと質問いいですか?
コントロールパネルの「サウンドとマルチメディア」ってやつで、オーディオ→優先するデバイスってあるじゃないですか。
あれを変更するプログラムを作りたいんですが、技術的に可能なんでしょうか・・・
教えてください!お願いします。
740デフォルトの名無しさん:02/07/19 10:34
ビデオからの入力画面をcapFileSaveDIB使ってBMPに保存したところ、
インターレース(奇数ラインと偶数ラインがずれている)になっているのですが、
ノンインターレースで保存する方法はありますか?
無い。
自分で処理汁
電信八号のログ表示みたいに計算過程をリアルタイムで表示する機能をつけたいのですが、
どのようにすればいいでしょうか?

ダイアログボックスにエディットボックスを貼り付けてそこに表示させることをかんがえたのですが、
次々と表示するようにはできません。表示する文字列を毎回更新してそれを一度に
表示させるしかないのでしょうか?追記できれば楽なんですが…
>>742
超Fuck
EM_SETSEL->EM_REPLACESEL
>>743

超FAQでしたか…すみませんでした。
それでもレスしてくださってありがとうございました。
早速やってみます。
745デフォルトの名無しさん:02/07/19 14:03
拡張コンボボックス(CBS_DROPDOWN)なんですが、
CB_LIMITTEXT や、CB_GETEDITSEL したときの挙動が
どうも二バイト文字も一文字と勘定してくれてるみたいなんですが、
これって漏れだけ?

例えば SendDlgItemMessage(hDlg, IDC_COMBO, CB_LIMITTEXT, 10, 0) とすると
半角でも全角でも10文字入ってしまいます。
また、エディットボックス内に「あいうえお」と入力し、「う」だけを選択した状態で
SendDlgItemMessage(hDlg, IDC_COMBO, CB_GETEDITSEL, &start, &end)
とやると、start = 2、end = 3 となってしまいます。

どうすりゃいいんだYO!
_UNICODEを定義しているとか?
747745:02/07/19 15:07
>>746
してないけど、ちなみに 2000 だから?
確かに spyxx で除くと(Unicode)ってなってる。
そうかと言って CBEM_SETUNICODEFORMAT を 0 にしてみてもダメだったけど(泣
明示的に〜Aを呼び出してみたら?
そういう仕様なんじゃないの? MSDNにも
> Specifies the maximum number of characters
と書かれてるし(number of bytesではない)。
750740:02/07/19 21:27
>>741
レスどうもです。
仕方がないので、当面妥協しておきます(汗
751745:02/07/19 23:28
>>748
ダメでした。。。sageときます。。。

>>749
う、何かそんな感じしてきたけどきつい仕様やな。。。
通知メッセージ(CBN_EDITUPDATE)とか使ってチマチマやらんとあかんのかな。。。
日本人のみんなは困ってないのかな?
752デフォルトの名無しさん:02/07/20 00:52
Win98SEなんですが
autoexec.batの中でUSB-FDを認識させたいんですが、
何かよい方法ありますでしょうか?
>>752
不可能
だいたいautoexec.batの中ではWin32 APIは使えないんだから
スレ違いの予感
>>754
>autoexec.batの中ではWin32 API
とりあえず意味不明として、

autoexecが動くプロセスってリアルモードなの?
>>755
NT系じゃautoexec.batは意味ないから95系なわけだが、リアルモードっつーか、
Windowsのカーネルがロードされる前だからWin32 APIが使えないのは当然だろ
う。
>>752
とりあえず↓イテコイ
ttp://homepage2.nifty.com/winfaq/index.html
wininetのラッパーDLLを作っています。
現段階で全コールで全パラメータをベタ渡しでwininetにスルーしています。

多くのアプリは動作するのですが、IEが動作しません。

IEを起動するとアクセスを行い実際にコンテンツを表示する段階でurlmon.dllが例外を吐きます。
例外時のスタックは kernel32->MSHTML->urlmon でした。

InternetSetStatusCallbackがクサいのですが、例外発生までコールバック関数は1度だけ指定され、
コールバック関数自体は何度か正常に通過しているようです。

スルーで渡すときの注意点なんかないでしょうか?
ラッパーじゃなくて置き換え?
あ、置き換えてやってます;
オリジナルのwininetをリネームして、LoadLibraryしてます

このへんも上手い処理の仕方があればいいんですが、
起動時にwininet読まれちゃうんで…
kageのソースは?
762758:02/07/21 02:03
なるほど、見てみましたがいろいろやってますねぇ。
APIのフックとかそちらの方で対処できそうです。
ありがとうございました
つーか、どこかにミスがあるんでしょ。
手作業でラッピングしてるなら、なおさら。
あんまり初心者の質問で恐縮なのですが、
MessageBox や Dialog 関数のパラメーターで親ウインドウのハンドル
をNULLにできるのでしょうか?
なんか機械によっては、旨く動かなかったりするので。
>>764
>なんか機械によっては、旨く動かなかったりするので。

できないんだろ。
766752:02/07/21 16:02
753-757 どもでした。
逝ってきます。
767はぐれ:02/07/21 21:55
はぐれJAVAプログラマです
仕事で作れっていわれたアプリで
システムフック、グローバルフックを使って全マウスクリックをフックする必要がありそうなんですが
どーにもWIN32わけわかんないっす(泣)
いろいろ調べてみてるんですが
どこかにサンプルソースとか落ちてるところないでしょうか
ご存知の方あれば是非・・・
768はぐれ(767):02/07/21 21:56
ちなみに言語はCを使っております。
>>767
SetWindowsHookExでぐーぐってみるとか?
>>764
できるよ
772デフォルトの名無しさん:02/07/22 00:13
Windows 2000/XP などで、モデムやVPN接続を行った際に、画面右下のタスクトレイに
接続状況を示すアイコンが表示されます。
アイコンをダブルクリックすると、その接続が開始されてから転送されたデータ
(ダウンロード / アップロード) のバイト数が表示されますが、
外部プログラムからリアルタイムで特定のダイヤルアップ接続の転送量を
取得することはできないでしょうか?
>>772 レジストリから取得
NT,2000系 →HKEY_PERFORMANCE_DATA
95,98,me系→HKEY_DYN_DATA\PerfStats
774デフォルトの名無しさん:02/07/22 18:43
>>773
XP では HKEY_PERFORMANCE_DATA が存在しないようです
winInetを使って色々と遊んでいたときふと思ったんですが
ロボット型サーチエンジンって、ただHyperLinkをたどっているだけなんでしょうか?
なんか、勝手にディレクトリを下がっていって検索しているような
気がするんですが、そーいう関数が見あたらないんです。
(FTPでディレクトリを見るのはわかるけど・・・・)
いったい、どんなプロトコルを使っているんでしょうか?
winInetでおままごと程度のサーチエンジン作れますか?
リンクをたどっているだけ。
ディレクトリの中身を見れない設定ならたどる手段は総当たりしかない
777775:02/07/23 02:47
>>776
うはっ、やっぱりLinkたどっているだけっすか。
そんなこと出来たら、セキュリティー的にまずいとはおもうけど
そんなもんなんですね。勉強になりましたです。

スリーセブンGet!!
ちーん、ぢゃらぢゃらぢゃら…
779デフォルトの名無しさん:02/07/23 13:55
フォーカスが他のウィンドウに移ったらアクション起こしたいんだけど
何をいつから監視すればいいんですか?
好きなときからWM_ACTIVATEを監視すればいい。
781デフォルトの名無しさん:02/07/24 20:46
>66
> GetRandomRgn(hDC, rgn, SYSRGN);

で特定のウィンドウハンドル(hDCの元)のリージョンを取得できたのですが、
クライアント領域(?)になってしまうようです。
タイトルバーやメニューも含めて取得する方法はないですかね?
CreateDIBSectionってウィンドウのビットマップ取得にも使える?
GetDIBitsが遅いのでCreateDIBSectionが使えないかと思ってるんだが。
ぐぐるしても表示に関する事ばかりで見当たらない。
駅スパートの方々教えてください。おながいします。
783デフォルトの名無しさん:02/07/24 22:08
hDC が GetDC した DC だったり、ってことはないですよね。
784デフォルトの名無しさん:02/07/24 22:48
USBのシリアル情報って取れますか?
マウスからパソコンに送られて来る
波形を表示させるといったことはできるでしょうか?
特に何に使うというわけでもなく、興味本位なのですが。
良かったら教えてください。
785デフォルトの名無しさん:02/07/24 23:01
DDK
正直すまんが・・・
GetGlyphOutlineでビットマップ作るんだが
win95の時に定数GGO_GRAY2_BITMAPいれると戻り値にエラー値が
戻ってくるんだがどうしてで?
CGO_BITMAPでは普通にビットマップとれるのだが
おすえてください
787デフォルトの名無しさん:02/07/25 00:23
「名前をつけて保存」ダイアログの作り方がわかりません。
「ファイルを開く」ダイアログとは別物なのでしょうか?
MFCでのやり方はわかるのですが
名前とフラグを変えるだけ
>>787
GetSaveFileName
>783
> hDC が GetDC した DC だったり、ってことはないですよね。

初心者で何の事か分からなかったのですが、
GetDCExでDCX_WINDOWを指定してDCを取得したところ
思ったようになりました。
ありがとうございました。
791デフォルトの名無しさん:02/07/25 13:17
Win32 API でディレクトリの更新日時を
変更したいのですが、うまく行きません。
(環境は Visual C++ 6.0 / Service Pack 入れてないまま 汗)

普通のファイルの場合は CreateFile でハンドルを取得して、
GetFileTime & SetFileTime で問題なく行えたのですが、
ディレクトリに対して CreateFile を使うと
アクセス拒否と言うエラーが出て失敗します。

Windows95/98 でディレクトリのハンドルを取得するには
どうやったら良いのでしょうか?
プラットフォームSDKを読む限りだと、
NT では FILE_FLAG_BACKPUP_SEMANTICS を指定すると
うまく行くようなのですが、95/98 の場合について触れていません。
95/98 では無理と言う事でしょうか?
その場合、他にディレクトリのハンドルを取得する方法は有るのでしょうか。

「ディレクトリ ハンドル CreateFile」で検索かけてみたのですが、
具体的にこれでディレクトリを開いてる話を見かけなかったので
こちらでお聞きしました。どうかよろしくお願いします。
> 95/98 では無理と言う事でしょうか?
ま、そういうことだ。あきらめな。
793デフォルトの名無しさん:02/07/25 13:59
>>792
マジですか?(汗)
鬱だ。数日無駄に過ごした。

ではディレクトリの更新日時とかを 95/98 で
変更するのって不可能なんでしょうか?

ともかくお答えありがとうございました。
ddk使って、アクセスドライバ書くしかない
DDK を使わずとも DeviceIoControl() でダイレクトディスクアクセスは可能。
ディレクトリのタイムスタンプの変更のためにそこまでする価値があるかは激しく疑問だが。(w
>>793
一瞬だけSetSystemTime()で日付変更してディレクトリを作ったら元に戻す
素人にはお薦め出来ない

それはそれとして256色画面での正しいRealizePalette()の使い方しりませんか?
いろいろサイトを回っても諸説紛々で動いたり動かなかったりするんですが…
特にPC-9821の256色専用マシンだと正常に表示されないことが多いです
797デフォルトの名無しさん:02/07/25 22:27
直接メッセージを扱わずに、キーボードの状態変化を検出する方法って
なにかありますか?なにかキーが入力されたらEventをセットしてくれるような
API(DirectInput以外で)を探しているんですが。
>>774
pviewが動いてるからあると思うんだが…
>>791
16ビットDLL書いてサンクダウンして
DOSファンクション71xxhを呼び出すのが唯一の公式な方法
>>796
まずは「諸説」をここに書いてみれ
> なにかキーが入力されたらEventをセットしてくれるようなAPI
キーボードメッセージ
つーか何がしたいんだ?
800797:02/07/25 23:15
>>799
DirectInputのSetEventNotification()に相当する非DirectInputAPIが
欲しかったのです
>>800
キーボードフックして、自分でイベントをセットするなりすれば?
>>801
ありがとう。やってみます
791(=793) です。

皆さん、お答えありがとうございました。

当方素人なので Win32API でサックリ出来ないようですし、
どうも諦めっぽいですね。
>>798
そうか、サンクという方法もあったか。
問題は 16bit コンパイラをどうやって入手するかだが、WinME DDK を DL すれば OK だな。
int 21h, AX=7143h を使えばいいわけだが、>>796 の場合とは微妙に結果が違ったりする。
ACPIに対応してるシステムで電源ボタンを押下するとShutDownとか出来ますよね。
それで、ACPIを使用して「何かのキーを押下した時にShutDownする」ような仕組みを
組み込みたいのですが、ACPIの内部関数(?)及びその使用方法等をご存知ありませんか?

Win2K,VC++6.0(SP5)で作っているのですが...
よろしくお願いします。m(_ _)m
SetSystemPowerState
スタンバイじゃなくてシャットダウンか。
ExitWindowsEx
つーかACPIなんて使うか?
808805:02/07/26 11:28
レスどうもです。
いや、普通に電源を落としても面白くないんで、
ちょっと変わった事をしてみようかと思いまして...
ACPIの内部関数等が判れば面白いコトが出来るかなぁと
こんにちは
インターネットの設定の信頼済みサイトや危険なサイトを、
プログラムで編集するにはどうしたらよいでしょうか。
>>809
レジストリをいじれば?
専用APIがあるかもしれないけど
こんにちわ、結城浩です。

C++プログラミングレッスン応用編へようこそ。
>>810
自分もそう思って検索してみたんだけど発見できず。
知ってたら教えてちょうだい。
>>811
Perlいじっててください
>>812
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains
815デフォルトの名無しさん:02/07/26 23:12
キーボードから文字としての入力をしないときは、TranslateMessageを呼ばなくてもいいですか?
>815
alt+スペースとかも使わないんであれば、いいんじゃねーの。
WM_CHARを使わないのなら問題ない。
WM_KEYDOWN系は普通に送られてくる。
>>816-817
ありがとう。
819812:02/07/29 14:34
>>814
ありがたや
レジストリの見れるマシンが手に入り次第調べてみます。
>>819
レジストリの見れんマシンってどんなのよ?
821関係なくてごめんなさい:02/07/29 14:41
2chでこの前アドのなかにに「yurei」ってのが入ったアド踏んじゃったら
「あなたに憑依しました」って出てきたんすけどなんか問題アリですかね?
関係ないってわかってて聞くアナタに問題アリ
>>820
いま使ってるやつ制限かけられててregeditが起動できない
824API学くん:02/07/29 17:08
質問です。
レバーコントロールを作っているのですが、レバーコントロールの幅を指定する
ことはできないのでしょうか?
レバーコントロールを作成するとツールバーのように上に左端から右端まで全部
占めてしまいますよね。それを右端だけ常に空けるようにしたいのです。
レバーコントロールをCreateWindowEx()で作成した時に、これの引数でウィンドウの
幅を指定する場所があるのですが、ここで指定しても無効みたいです。
どなたか教えて下さい。よろしくお願いします。
レバーもうひとつくればいいじゃん。
826API学くん:02/07/29 17:32
>>825
ありがとうございます。もう少し詳しくお願いします。
レバーを二つ作ったとして、この二つを座標で指定する事は出来るの
ですか?
もしできるなら指定方法をおしえてください。お願いします。
PrintDlg() したときに、

○現在のページ
○ページ指定 [        ]

が網掛けになってしまうのですが、何ででしょう?
pd.Flags は

 PD_ALLPAGES | PD_CURRENTPAGE |
 PD_RETURNDC | PD_USEDEVMODECOPIESANDCOLLATE

って感じなんですが。。。
ちなみにプラットフォームは Windows 2000 です。
自分がCreateProcessしたプロセスが持つ
WindowのWndProc書き換えるにはどうしたら良いですか?

FindWindowでキャプションからHWND取得して
SetClassLongとかSetWindowLongではダメでした。
プロセスにコードを潜り込ませるとか、
フックを仕込んでその中で置き換えるとか
830828:02/07/30 00:36
>>829
プロセスにコード潜り込ませる場合は
そのプロセスのソースコードレベルで潜りこませるということですか?
派生する側のプロセスのコードはいじれないので
フックで何とかやってみようかとも思っていたのですが、
特定のWindow宛てのメッセージだけ置き換えるにはどうすればよいでしょう?

プログラム本体からフック用DLLにHWNDを渡してやっても、
フック用DLLのフックProcではHWNDが設定されなくて
HWND同士の比較が出来ませんでした。

自分で作った子プロセスなのに。はがゆい。
831828:02/07/30 00:38
×派生する側の→○派生後の
>>830
>ソースコードレベルで
ちゃう。
対象プロセスのメモリを書き換える。
kageがやってるから参考に汁

>プログラム本体からフック用DLLにHWNDを渡してやっても、
きちんと共有メモリにしてるか?
フックで刷り込まれたdllは、当然対象のメモリ空間で動作する。
>>832
なるほど。DLLの方は普通にグローバルに宣言すると、
それぞれでメモリとっちゃうんですね。
>対象プロセスのメモリを書き換える。
ってのも、ちょっと勉強してみます。ありがとうございました。
>>827
nMinPageとnMaxPageメンバが同じ値にセットされてないか?
835デフォルトの名無しさん:02/07/30 11:51
プロセスIDからそのプロセスのユーザ名を取得するにはどうすればいいの?
>>834
そうみたいでした。どもサンクスコです。
んで、「現在のページ」が網掛けなのは PrintDlg() では致し方ないことなのですね?
837デフォルトの名無しさん:02/07/30 14:06
リージョン設定についてお聞きします。

今、
IniRgnion()でリージョンハンドラを初期化し、その後
SetRegion()でリージョンを設定し、画面を変形後、ソフトの終了時
DelRegion()でリージョンを開放しています。
関数内部で使用されているhRgnEye[], hRngEyeIn[], hRgnEyeOut[], hRgnWinIn, hRgnWinOut
はグローバル変数です。

リージョンハンドラはグローバル変数で宣言しており、SetRegion()が呼ばれる前に
必ずIniRegin()で初期化しているのになぜ個々の関数内で改めて初期化しなおさねば
ならならいのでしょうか?
838837:02/07/30 14:07
上記のコードです
BOOL SetRegion( HWND hWnd, RECT *EyesWin, BORDER *Border)
{
SetRgnEye( hWnd, Border);

if( SysConfig.ResizeWindow){// ここは常にfalseとしている
SetRgnWnd( hWnd, EyesWin);
CombineRgn( hRgn, hRgn, hRgnWnd, RGN_OR);
}
SetWindowRgn( hWnd, hRgn, TRUE);

return TRUE;
}

HRGN SetRgnEye( HWND hWnd, BORDER *Border)
{
int i;
//RECT Rect;// これと


//SetRectEmpty( &Rect);// これのコメントアウトをはずすとうまく行く

/* リージョン設定*/
hRgn = CreateRectRgnIndirect( &Rect);
for( i = 0; i < 2; i++){
//hRgnEye[i] = CreateRectRgnIndirect( &Rect);// このコメントも
hRgnEyeOut[i] = CreateEllipticRgn( /*略*/);
hRgnEyeIn[i] = CreateEllipticRgn( /*略*/);
CombineRgn( hRgnEye[i], hRgnEyeOut[i], hRgnEyeIn[i], RGN_DIFF);
}
CombineRgn( hRgn, hRgnEye[0], hRgnEye[1], RGN_OR);

return hRgn;
}
839837:02/07/30 14:08
その続きです
HRGN SetRgnWnd( HWND hWnd, RECT *WinEyes)
{
long Width, Height;/* Window 枠サイズ*/
POINT Polygon[20];/* Window 飾り枠*/
//RECT Rect;// これと

Width = WinEyes->right - WinEyes->left;
Height = WinEyes->bottom - WinEyes->top;

/* Window飾り枠リージョンデータ設定*/
Polygon[ 0].x = 10; Polygon[ 0].y = 0;
// 長くて投稿できないので略します
Polygon[19].x = 10; Polygon[19].y = 5;

/* リージョン設定*/
//hRgn = CreateRectRgnIndirect( &Rect);// これのコメントをはずすとうまく行く
hRgnWndIn = CreatePolygonRgn( Polygon, 20, WINDING);
hRgnWndOut = CreateRectRgn( 0, 0, Width, Height);
CombineRgn( hRgnWnd, hRgnWndOut, hRgnWndIn, RGN_DIFF);
return hRgnWnd;
}
840API学くん:02/07/30 18:06
質問です。
CreateToolbarEx()で二つのツールバーを作ったのですが2列にならずに
一列に重なってしまいました。
位置を指定するメッセージか何かを探したのですが見当たりません。
レバーコントロールを使えば実現できますが、使わなくてもツールバー二列は
このような単純な方法で実現可能かどうか知りたいです。
よろしくお願いします、
841API学くん:02/07/30 18:29
>>840の続きです
MoveWindow()でツールバーを移動させようとしましたが、全く変化しません。
もしかしてツールバーは移動不可ということなのでしょうか?
842デフォルトの名無しさん:02/07/30 20:59
>>835
OpenProcessでプロセスハンドルを開いてから
セキュリティAPIでゴニョゴニョ
>>836
nMinPageとnMaxPageを違う値にすればいいんでないの?
>>837
838はRectの定義をコメントアウトしたままではコンパイルエラーになると思うが?
839のhRgnWndはどこで定義されてるの? 長くて省略の中?
>>840-841
レバー以前のツールバーはそのような複雑な使用方法を
まったく想定していない。
843837:02/07/30 22:09
>>842
うまく動作しないときは
hRgn = CreateRectRgnIndirect( &Rect);
の行もコメントアウトです
hWndWndはインクルードしているヘッダファイルにグローバル変数として宣言しています。
ヘッダでは同じ変数を多重宣言しないように
#if !defined( hoge)
#define hoge
// 宣言いろいろ
#else
// extern 宣言いろいろ
#endif
のようにしています。
844837:02/07/30 22:59
長々と読むのはつらいので要点だけ書きますと、
・リージョンハンドラはグローバル変数で宣言している
・リージョンの初期化は初期化関数を用意して最初に初期化している
・リージョンの設定は設定関数を用意して初期化後設定している
・リージョンはソフトの終了直前に開放している
と言うプログラムで、
・設定関数内でCombineRgn()関数を使うとCombineできない(Combine後のリージョンハンドラは当然初期化済)
・設定関数内でCombineRgn()関数を使う前にCreateRgnRect()などで初期化するルーチンを追加するとCombineできる
と言う問題がある。
これは何故か?ということです。私のCの知識ではどちらも同じ挙動を示す(正しくCombineできる)はずですが、
前者ではCombineできません。HRGNなる型はMicrosoftの特例による制限があるのでしょうか?
>>836
PRINTDLGEX構造体を使う
>>837
SetWindowRgnしたリージョンハンドルはシステムの管理下に
おかれるから以後勝手に使っちゃだめ。まずMSDNをちゃんと探せ。
> After a successful call to SetWindowRgn, the system owns
> the region specified by the region handle hRgn. The system
> does not make a copy of the region. Thus, you should not
> make any further function calls with this region handle.

あとハンドルとハンドラはぜんぜん意味が違うから
ちゃんと使い分けろ
逆に言えばSetWindowRgnしなければ一回初期化したものを
ずっと使いまわしてもぜんぜん問題ない。別にHRGNだけが
特別なわけではない。似たような例としてはSetClipboardData
に渡すHGLOBALがある。
こういうのは特別な例だからMSDNを読めばちゃんと書いてあるよ。
848837:02/07/30 23:20
>SetWindowRgnしたリージョンハンドルはシステムの管理下に
>おかれるから以後勝手に使っちゃだめ。
そのSetWindowRgnする前に(SetRgnEye関数)既にうまくいかないのですが・・・
SetWindowRgnしてないのにどうやってCombineできて
ないと確認したのか説明せよ。まさかSetRegionは
アプリケーション全体を通じて1回しか呼ばれないのか?

とりあえずサンプルコード一式どこかにうぷしてみろ。
お前の回りくどい説明聞くより100倍分かりやすそうだ。

どうせそんなわけのわからんグローバル変数の使い方
してるくらいだからくだらんバグでも入れてんだろ。
850デフォルトの名無しさん:02/07/31 01:50
現在タスクマネージャーのようなプログラム作りにはまっています。
問題個所はすでに起動しているアプリケーションの強制終了方法です。
CreateProcess で実行したアプリなら簡単なんですけど、既に動いている *****.exe を他のアプリから強制終了させたいんです。
お力お願いします。
851デフォルトの名無しさん:02/07/31 02:30
>>845
それって 2000 より上ですよね?
95 とか 98 でもオッケーなんでしょうか?
プラットフォームは 2000 と書きましたが、
開発プラットフォームという意味でした。
ターゲットは 95 とかも含みなのです。。。
852MMIO:02/07/31 02:41
あのマジレスですけど、どうしてメモリマップドファイル
って Create していないのに Open で成功するんですか?
853API学くん:02/07/31 06:48
どうも有り難うございます。すっきりしました。
そう言えば昔のソフトはみんな一列でした。
854API学くん :02/07/31 07:05
しまった。>>853の発言は>>842さんに対してのものです。
855837:02/07/31 12:36
>>849
http://members.tripod.co.jp/TeamZiang/hoge.lzh
にソースとヘッダを上げました。
私の冗長な説明は不要でしょうからこれを見て問題点を説明してください。
>>851
9x系の印刷ダイアログに「現在のページ」はなかったと思うが。
2000/XPのときだけ使いたいなら、処理分けれ
>>855
もうないぞ
858837:02/07/31 15:26
すんません
http://members.tripod.co.jp/TeamZiang/hoge.LZH
拡張子が大文字でした
WH_CALLWNDPROCで登録したフックプロシージャで
特定のメッセージを止めてしまいたいのですが、どのようにすればよいでしょうか。
CallNextHookExの返し値を返さず0を返しても素通りでした。
>>859
受け取ったメッセージをWM_NULLに書きかえる。
861859:02/07/31 19:53
>>860
なるほど。と思ってやってみたのですがダメでした
↓こんな感じで、0返しても素通りでした。

LRESULT CALLBACK HookProc(int code, WPARAM wp, LPARAM lp) {
 if ( code == HC_ACTION ) {
  CWPSTRUCT *pcwp = (CWPSTRUCT *)lp;
  switch ( pcwp->message ) {
   case WM_CLOSE:
    if ( MessageBox(0, "ウィンドウを閉じます", "", MB_YESNO) == IDNO ) {
     pcwp->message = WM_NULL;
    }
  }
 }
 return CallNextHookEx(hhook, code, wp, lp);
}
>>859-861
無理。
CallNextHookEx は「次のフックプロシージャ」を呼び出すだけ。
フックプロシージャ内で何をどうしようと、
次のフックプロシージャが呼ばれようと呼ばれなかろうと、
本来のウィンドウプロシージャは、何事もなかったように元々の引数で呼ばれる。
・・・というふうに、リファレンスには書いてあるように読めた。

たぶんSetWindowLongでウィンドウプロシージャを置き換えるとかしないと駄目なんでわ?
863860:02/07/31 20:19
>>861
>>862
MSDN見たら、WH_CALLWNDPROCではメッセージを修正することはできないと書いてた。
なのでWH_GETMESSAGEでやってみたら?
>>863
WH_CALLWNDPROC と WH_GETMESSAGE では捕まえられるメッセージの種類が
違うだろ
865デフォルトの名無しさん:02/07/31 22:28
質問
高速(秒間50回とか)でInvalidateRect(hwnd, NULL, FALSE)を呼ぶと
画面がチラチラします。
ウインドウのクライアント領域しか再描画されていないはずなのに
デスクトップのアイコンやタスクバーまでチラチラするのはなぜですか?
また、これはDirectXというのを使わなくては駄目でしょうか。
良ければ教えてください。
>>865
ゲームでもつくってんの?
867デフォルトの名無しさん:02/07/31 22:37
>>866
説明不足ですみません。
ウインドウズのプログラミングは全然初心者なのですが
マウスの上下(y軸方向)の変位を検出して、
それをリアルタイムでグラフにするようなプログラムを作っています。
うまく説明できないのですが
どんどんグラフが右から左に流れていくというか・・
デスクトップがイカれるのは
hwndにNULLが入っているタイミングが無いか?
常に有効なhwndが入っているか確認汁
869デフォルトの名無しさん:02/07/31 22:51
>>868
レスありがとうございます。
確認してみたところ、やはり有効なhwndは入っています。
念のために if(hwnd!=NULL) と書いてNULLじゃないときっていうように
やってみましたが、結果は変わっていないようです。
>>869
マウスの移動メッセージが1秒間に50回以上処理されていなければ
無意味じゃないの?
871デフォルトの名無しさん:02/07/31 22:57
>>870
はい、それで20ミリ秒ごとに(一秒50回)
GetCursorPos関数を呼んでマウスの位置を取得し
その後描画を行なっているのですが
取得した値は連続して変わっているので、1秒間に50回以上は
処理されているのかなと思います。
>>871
WM_PAINTって優先順位低くない?
>>781
XORで描いて消したら?
874デフォルトの名無しさん:02/07/31 23:01
>>872
すみません、素人なのでよく分からないのですが、
優先順位っていうのはなんでしょう?

どのメッセージから先に処理していくかっていうことでしょうか。
だとスバ、その順位を上げるにはどうすればよいでしょうか。
質問ばかりになってしまい申し訳ありません。
>>874
他のメッセージがあるうちはWM_PAINTは取り出されないと思う。
グラフが1本しかないのなら、XORで描けば画面をクリアしなくて
済むよ。
876デフォルトの名無しさん:02/07/31 23:30
>>875
ありがとうございます。
よく考えたら、WM_PAINTを呼ばないと描画できないと思ってたんですが
別にどこでLineToを呼んでも線は引けるんですよね。
勘違いしていました。
ありがとうございました。
877デフォルトの名無しさん:02/08/01 00:19
>>865
そんな風なの作ってみたけど...要りますか?
...って、もう解決したのかな

MDIで質問があります
子ウィンドウを一斉に最小化しようと思い
列挙した子ウィンドウに直接WM_SIZEで
SIZE_MINIMIZEDをSendMessageしてみましたが
メッセージが受け取られているが、その通りの動作はしませんでした
どうすれば良いのでしょうか?
メッセージ優先順位って、MSDNに載ってる?
879877:02/08/01 00:42
自己レス
ShowWindow使ったらあっさりできてしまいました
お騒がせしました
>>856
あ、やっぱ 9x 系にはないんすね。じゃーあきらめるっす。

ちなみに SDK だけ(MFCとか使わずに)で印刷プレビューとかって簡単に実装できるもの?
ヤパーリ自前でゴリゴリ書かないとダメ?
881デフォルトの名無しさん:02/08/01 01:41
某サイトのプログラムで、EDITコントロールに文字列(プログラムのログみたいな物)
を表示させるプログラムで文字列を一行追加するたびに
iLine = Edit_GetLineCount(hMainEdit);
for (i = 0; i < iLine; i++) SendMessage(hMainEdit, EM_SCROLL, (WPARAM)SB_LINEDOWN, 0);
といった処理を行って画面をスクロールさせてその時点で最後のログが表示されるように
してあるんですが、この方法だと行を追加するたびに最初からスクロールしているのが気になります。
行数が増えるとちらつくのも気になるんですが良い方法ありませんか?
一番最後を選択して置き換え
883デフォルトの名無しさん:02/08/01 02:19
デバッガのように別のプロセスにアタッチしてブレークポイント例外を起こさせるにはどうすればいいのでしょうか?
自分がデバッガになりたいのか、int3を発行したいのかはっきり汁
885865:02/08/01 02:37
>>877
遅レスすみません。
>そんな風なの作ってみたけど...要りますか?
ということですが、もしよろしければ参考にしたいので
頂けないでしょうか?
もしOKということでしたらメアドを取って参りますので
その旨書き込んでいただけると幸いです。
よろしくお願い致します。
886 :02/08/01 02:37
>>883
勘だが、DebugActiveProcessでプロセスにアタッチして、
止めたいタイミングでSuspendThreadして、
GetThreadContextで現在のIPを取ってきて、
そのアドレスにint3をWriteProcessMemoryして、
FlushInstructionCacheして、
ResumeThreadするみたいな感じでどうかね?
XPならDebugBreakProcessで一発
もちろんあらかじめアタッチしておく必要はあるけど
>>855
漏れの環境ではコメント部分があろうがなかろうが
結果は変わらなかったが。
少なくともお前の書いてる部分が問題ではないし
SetWindowRgnしたハンドルをグローバル変数に持ち続けるのは
明らかに間違いだからやめれ
889877:02/08/01 10:13
>>865, 885
メール送るの面倒なので...
http://members.tripodasia.com.hk/rune187/api/q.txt
違ってたらゴメンね
890デフォルトの名無しさん:02/08/01 14:49
MoveTo LineToで描画した線をブリンク(点滅)させるのに、
良い方法はありませんか?
891デフォルトの名無しさん:02/08/01 15:30
>>890
その都度描き直す。これ最強。
892890:02/08/01 15:43
>>891
その都度って、どの都度ですか?
Timer使ってってことですか。
>>892 勝手に点滅させるWinAPIは無いから 891の言う通り 点滅する処理を自分で作るしかないという事
894890:02/08/01 17:12
>>893
そうですよね。ありがとうございました。
895865:02/08/01 18:05
>>877
ありがとうございます。
なるほど、今までの画面をBitbltで一ドットずつ次々に左に転送しているんですね。
大変ためになりました。
どうもありがとうございました。
896855:02/08/02 10:50
>888
>漏れの環境ではコメント部分があろうがなかろうが
>結果は変わらなかったが。
どう変わりませんでしたか?

あなたは質問者を罵倒するだけ罵倒して解決法を示さないのですか?
能力があり、解決するならばあなたの傲慢な態度も甘んじで受けましょう。
しかし、それをしないでおまえはダメだと言うだけなら誰でもできますね。
ツールバーのビットマップの背景を透明にしたいときってどうすたらいいんでしょう?
何も考えずに作ったら、画面の配色変えたらグレーの背景になっちまいましたが。
899デフォルトの名無しさん:02/08/02 16:02
初心者向けの、Win32APIを使っての(MFCを使わない)C++のプログラミング
の本ってないでしょうか?本屋とかで易しそうな本見るとたいていMFCでの
プログラミングの本なんですが。
>>899
猫でも見たら?
猫は見ているんですが、それ以外にないなーと思ったんで。
>899
じゃ、ATLの本でも……
903デフォルトの名無しさん:02/08/02 16:46
ダイアログボックス上にあるリストボックスが
アクティブの時に、WM_MOUSEWHEELをゲトしたいんですが、出来ますか?
スクロールバー無しのリストボックスです。
サブクラス化したらできるはずだが。
905903:02/08/02 17:02
>>904
サブクラス化って、言葉しか聞いたことないな・・・
ちょと調べてみます。
906デフォルトの名無しさん:02/08/02 17:35
スレ違いと言われたのでここにかきます。

すみません。

char a[]="なんらかの文字列";
という長さ・内容不定の文字列があり、始めから1文字づつTextOutでウインドウに表示したいのですが、
たとえば”あ”と”a”ではバイト数がちがうので、
int i=0;///グローバル

mainloop(){

TextOut(hdc,0,0,a,i);
i++;
}

なんてやるとローマ字はちゃんと表示されますが”あ”などの日本語になるとゴミになってしまいます。
かといってi+=2とやると今度はローマ字のところがおかしくなります。
この違いを自動認識するにはどうすればよいのでしょう。
>>906
1文字ずつ出力するんなら、出力前に全角文字の1バイト目かどうか
自分で判定すればいいじゃん。
908デフォルトの名無しさん:02/08/02 17:52
(;´Д`)それがわからんのです。
>>908
文字コード表と睨めっこしてきなさい。
ハァ?_ismbbleadとか、IsDBCSLeadByteとか
CharNextとか、自前判定とか、方法はいくらでもあるだろ
911デフォルトの名無しさん:02/08/02 17:58
>>909
>>910
すみません。今まで長くプログラムやってきましたが文字列の表示時の判別は初めてだったんです。
ありがとうございました。
>>908
Shift-JISなら1バイト目が
0x81から0x9F、または0xE0から0xEFになるんじゃないの?
913三瓶:02/08/02 18:00
今まで長くプログラムやってきましたが初心者だったんです。
ありがとうございました。
914903:02/08/02 18:04
>>904
できますた!904は神!!
>906
_mbclen使うといいんじゃないのかなーとか言ってみるテスト。
この国には神が多いな。
>>916
なんつったって八百万の神々の国ですから
すまん。しょーもないボケでageてしもた
誤って済む問題じゃないな。
謝って済む問題じゃないな
謝って済む問題だと思うに一票
感謝して済む問題じゃにぜ
幻の問題「じゃにぜ」
ビルマ奥地の寒村に伝わると言う、
世界を記述するとも呼ばれた方程式の謎を追い、
我々川口探検隊は以下略。

じゃにぜ事務所
925デフォルトの名無しさん:02/08/03 03:35
プログラムが起動されたデレクトレイを取得する方法があったら教えてください。
デレクトレイとは何か知りませんが
ディレクトリならGetCurrentDirectoryで取得できます。
「プログラムが起動された」の意味によっては
GetModuleFileNameのほうかも。
927デフォルトの名無しさん:02/08/03 03:51
デレクトレイとはな、2ch用語なのじゃよ・・・

教えてくれて、ありがと!助かったヨ
(´-`).。oO(どこの板の方言だ‥‥‥)
929デフォルトの名無しさん:02/08/03 08:22
教えてください
あるライブラリがファイルに直接書いてしまうので。
メモリーディスクのようの物を作成してそこに書かせたいのですが
どのようにすればよいのでしょうか?
よろしくお願いします
RAMディスクを実装する
これでも参考にしてみれば。
http://www.vector.co.jp/soft/winnt/hardware/se168218.html
クリティカルセクションって、同じスレッドで複数回ロックしても
カウントされるだけなんですか?
10個並べてEnterCriticalSectionしたのに、ちっとも無限ループに陥りません。
933デフォルトの名無しさん:02/08/03 14:15
age
関係ないが
Javaのsynchronized文はそんな感じだな。
そうじゃないとマルチスレッドアプリで再帰が使いづらいのかもな。
>>932
そーです。そのとおり。

> Once a thread has ownership of a critical section, it can make additional calls to EnterCriticalSection or TryEnterCriticalSection without blocking its execution.
> This prevents a thread from deadlocking itself while waiting for a critical section that it already owns.
936デフォルトの名無しさん:02/08/03 14:57
GetSaveFileName()で開いたダイアログのファイル名欄に
あらかじめファイル名を表示させたいのですが、
どのようすればいいのでしょうか?
938デフォルトの名無しさん:02/08/03 15:35
OPENFILENAMEは調べたんですが、それらしきメンバが無いみたいです・・・
lpstrFileTitleに文字列入れとけばできるかと思ったのですがダメみたいだし
lpstrFile
(´-`).。oO(何の為にGoogle介してハイライト表示させてると思ってるんだ……
941936:02/08/03 15:46
なるほど・・・
どうもありがとうございました。
winnt\system32\cpuinf32.dll
って使った方います?
使用方法がわかりません。
943899:02/08/03 16:40
944デフォルトの名無しさん:02/08/03 19:23
MFCアプリ作成時でも、コンソールアプリのウィンドウを表示して
そこにprintfかcout使って文字を吐きたいんだけど、どうすればよいの?

>>944
SetStdHandleして_ioinitを呼ぶ
946944:02/08/03 21:12
>945
できたデス。
さんくす。
947デフォルトの名無しさん:02/08/03 23:18
DialogBoxよりもDialogBoxIndirectを使った方がダイアログリソースを
追加しない分プログラムのサイズが小さくなると思ったのですが、
実際に作ってみるとどちらも40KBほどで同じサイズでした。
リソースってプログラムのサイズとは関係ないのでしょうか?
ある
>>947 環境によるんだけど、
リンカの設定によっては実行ファイルのサイズはアラインされるから小さな差が出ない事があるよ
>>947 VCなら /opt:nowin98 とやってみる
952デフォルトの名無しさん:02/08/04 14:14
DialogベースのウィンドウでESCキーで終了しないようにするにはどうしたら
良いのでしょうか? spy++で追っかけると、いきなりDESTROYが飛んでるよ
うですが・・・
IDCANCELが飛んでこなかったっけ?
>>952
>>953が正解。なんで、IDCANCELを受けないようにすればいい。というと、
「右上の×で閉じないんですが」と言われそうなので、そのときは、
WM_SYSCOMMAND捕まえて、wParamがSC_CLOSEだったら終了処理にすれば、
終了させられる。
955952:02/08/04 16:12
大感謝。完璧です。
956デフォルトの名無しさん:02/08/05 02:37
WMPみたいに「常に手前に表示」と同じようなプログラムを作るには
どのような方法がありますか?
SetWindowPos
HWND_TOPMOST
でぐぐれ
958956:02/08/05 02:44
>>957
サンクス。
959JPEG特許問題:02/08/05 16:04
OleLoadPictureFileはMFCでしか使えないのでしょうか?
MFCでいうSetPictureDispatch等がSDKで使えるのなら解決しそうなんですが、
やり方が分かりません。

OleLoadPictureFileがSDKで使えないならIJG・・・・鬱。


SDKでOleLoadPictureFileを使う方法を教えて頂ければありがたいです。
よろしくお願いします。
960デフォルトの名無しさん:02/08/05 16:04
ペゾルドのプログラミングWindowsがいまいち理解できません。
こんな漏れは逝ってよしですか?
このサイコロの目は 裏の目とオモテの目を足すと7になります
1と6は赤
2と5は赤と青
3と4は青に塗られています。

今サイコロを転がして赤が出ました。 裏が赤の確率は?

誤爆カコワルイ
2/3 ?
964デフォルトの名無しさん:02/08/05 16:54
1/2
>>964
why?
>>962
What?
>>961
where?
>>964で合ってるんじゃないのか??
>>968
はぁ?
>>110
テキストボックスは Windowsの用意してるコントロールを使っています
 もしテキストボックスを使う事で何か問題があるなら、Windows上のほぼ
 全てのアプリに問題がある事になるでしょう

なお、一般的にはクライアントアプリで脆弱性を云々しないと思います
>>968
おぃおぃ。。
今、赤が出たなら、目は 1 か 6 か 2。
その中で裏側も赤の場合は 1 か 6 だから、2/3 だろ?違うのか?
>>959
OleLoadPicturePath() で検索しる
973デフォルトの名無しさん:02/08/05 22:03
ハードウェアプロファイルの一覧を取得したのですが、APIとかありますか?
現在のハードウェアプロファイルの内容を取得するAPIはあったのですが(GetCurrentHwProfile)、
HWプロファイルの一覧を取得したいのです。
レジストリから直接でもいいのですが、HWプロファイル名が見つかりませんでした。
どなたか、よろしくおながいします。
974デフォルトの名無しさん:02/08/05 22:11
パスの最後に\をつける(すでに付いていたら何もしない)には
下記の方法で大丈夫でしょうか?
一応「表」フォルダを作って試してみて、ちゃんと\は付いたのですが
他に気をつけることはありますか?

void AddBackslash(LPTSTR lpszPath)
{
  if(IsDBCSLeadByte(lpszPath[lstrlen(lpszPath) - 2]) ||
    (lpszPath[lstrlen(lpszPath) - 1] != '\\')){
    lstrcat(lpszPath, TEXT("\\"));
  }
}
>>974
IsDBCSLeadByteでは「2バイト文字の2バイト目ではない」ことが保証できないから、
ちゃんと頭から調べないとダメよん。
っつか、そのコードだと "a" とか与えたら吹っ飛びそうだが。
>>975
この場合は保証されなくてもよくない?
>>976
すると 「も\」 が 「も\\」 になってしまうがよろしいか?
>>977
Windowsのフォルダ名に\はつけられんよ。
>>980さん、次スレよろしくね
980デフォルトの名無しさん:02/08/05 23:40
フォルダオプションのクリック方法が「ポイントして選択」かどうか(HoverSelection)、調べられません?
ホットトラッキングは、SystemParametersInfo の SPI_GETHOTTRACKING で取得できるンですが…
>>978
コーディングの初期条件である
>パスの最後に\をつける(すでに付いていたら何もしない)
を満たさなくなるってことだろ?
>>981
え?なんで満たさなくなるの?
>>974
PathAddBackslash使わん理由は?
>>985
次スレよろ
断る

カチャ
  ;y=ー( ゚д゚)・∵. ターン
  \/| y |)
>>977
仮に C:\も\ というパスがあったとすると、
> IsDBCSLeadByte(lpszPath[lstrlen(lpszPath) - 2])
で「も」の2バイト目がチェックされて偽となり、次に
> lpszPath[lstrlen(lpszPath) - 1] != '\\'
でパスの最後が \ だからこれも偽となり、結局何もせずに
リターンするから C:\も\ はそのままでは?
俺が立てようと思ったが、今日すでに他のスレを立ててしまって
はじかれてしまった…
>>986
「も」のShiftJISコードは 82 E0 で
IsDBSCLeadByte(0xE0) は TRUE。よって、
    lstrcat(lpszPath, TEXT("\\"));
が実行されるだろ?

やるなら、
if (CharPrev(lpszPath, lpszPath+lstrlen(lpszPath)-1) != '\\')
  lstrcat(lpszPath, TEXT("\\"));
とかだろ。
最近、Win32API書いてないから CharPrev の引数あってるか自信ないけど(w
>>982
それくらい実際にコンパイルすりゃ判るだろうに
>>983
shlwapi.dll が入ってない環境のことは考えないのか?

漏れなら GetFullPathName() 使うよ
新スレ

Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/
おつ>990
埋めちゃえ〜
992JPEG特許問題:02/08/06 10:36
>>972殿

ありがとうございます。

しかし、不思議なテクニックを使う関数ですな。
いわゆるCOMというものでしょうか?
999 ◆itdn3QI6 :02/08/06 11:17
999









1000 ◆itdn3QI6 :02/08/06 11:18
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。