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

Win32API 質問箱 Build4

レス数が1000を超えています。これ以上書き込みはできません。
0001CreateThreadNGNG
スレ立てるまでもない、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
0002デフォルトの名無しさんNGNG
ポケコンのAPIは何個ぐらいあるんでしょうか?
0003デフォルトの名無しさんNGNG
>>1
乙
>>2
氏ね
0004デフォルトの名無しさんNGNG
乙〜
0005デフォルトの名無しさんNGNG
>>1
乙カレー
0006デフォルトの名無しさんNGNG
APIのRegDeleteKeyなんですけど、書籍を見てもWebで調べても
「そのキーにサブキーがある場合は失敗します」って書いてあったんですけど、
何度やってもどうもサブキーごと消してくれちゃうんですよね。
いや、実はその方がありがたいんですけど。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

> 知ってるやつが来るまで待つか。
です。
0028デフォルトの名無しさんNGNG
BI_JPEGとかBI_PNGは、プリンタDCにしか使えないような
感じでMSDNに書いてあるけど、どうなんだろ。

前ここで質問したけど、誰も知らなかったですねぇ(´・ω・`)
0029デフォルトの名無しさんNGNG
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);
}
0030デフォルトの名無しさんNGNG
C言語なら俺に聞けスレから流れてきました
444で質問していたのですがこちらで質問です

猫でも分かるプログラミングという有名ページがありますが
あそこには超初心者用と書いてあります。
あれが理解できても初心者ですか?
Windows(Win32か)プログラミングに関してはかなりのものになると思うのですが
実際はまだまだなのでしょうか…
確かにあそこだけでは自分でオリジナルなものを作るのには
厳しいと思いますけどWindowsの仕組みを理解するには十分すぎる気もします。
0031デフォルトの名無しさんNGNG
>>30
だから初心者ってのは意識の問題だっての。
0032デフォルトの名無しさんNGNG
今31がいいこと言った!
003330NGNG
あそこのことが理解できていればWindowsプログラムの仕組みはOKということですね。
重複までしてご迷惑をおかけいたしました。
少しだけですが自信が出ました。
0034デフォルトの名無しさんNGNG
理解することと使いこなすことは別物(ボソ
0035デフォルトの名無しさんNGNG
ダイアログのリソースで、LTEXTの内容に(&R)を含めておいて、
ALT+Rを押すとComboBoxなどにフォーカスを移す処理をしたいのですが、
どのようにすればいいのでしょうか?
0036デフォルトの名無しさんNGNG
2chには、初心者だといって、甘い対応をしてもらおうとする人間と、
初心者なのに有能なつもりの勘違い君の、2通りのタイプしかいない。
0037デフォルトの名無しさんNGNG
>>35
タブオーダを確認する。
モードレスダイアログならIsDialogMessage()つける。
でいいとおもいます。
0038デフォルトの名無しさんNGNG
ウィンドウクラスを列挙するAPIってありますか?
0039デフォルトの名無しさんNGNG
RegisterClassで片っ端から検索。
0040デフォルトの名無しさんNGNG
以下のコード(省略してありますが...)で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);
0041デフォルトの名無しさんNGNG
>>40
そこで取り出さないといけない理由ってのが気になる。なんで?
0042デフォルトの名無しさんNGNG
>40
WriteFileの後に、FlushFileBuffers汁
もしくは、srcHandleのCreateFileでFILE_FLAG_WRITE_THROUGHを指定汁
結果キボンヌ
0043デフォルトの名無しさんNGNG
早速の返答ありがとうございます。

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

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

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

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

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

長文失礼しました。
0050デフォルトの名無しさんNGNG
>>49
コードでコピーするんじゃなくてCopyFile()使うってのはどう?

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

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

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

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

と汁
0074デフォルトの名無しさんNGNG
>>70
ここみれ
http://www68.dns.ne.jp/~bbs2/upload3/helen/OB00014094.jpg
007552NGNG
>72
漏れは一度もWM_CONTEXTMENUとは言ってない、
とにかくWM_RBUTTONDOWN(当初間違ってLBUTTONと書いた)でメニュー出すのは止めてくれと
0076デフォルトの名無しさんNGNG
>74
ネタが古い
0077デフォルトの名無しさんNGNG
>>75
あんた出てこなくて良いって。
あんたの言ってることはたぶんわかってるから。
WM_CONTEXTMENUの話題に移っただけだk
0078デフォルトの名無しさんNGNG
file:///
にしたらページは開いてくれたんですけど、
#unkouに移動してくれない希ガスるんですが。。
僕タンだけ?
0079デフォルトの名無しさんNGNG
要するにコンテキストメニュー(ショートカットメニュー、右クリックメニューとも言うのかな?)
は、WM_COMTEXTMENUで表示しなさいって事ですか?
0080デフォルトの名無しさんNGNG
M$製以外のソフトのトレイアイコン6個中5個がWM_RBUTTONDOWN・・・
0081デフォルトの名無しさんNGNG
えーとつまりクライアント領域でメニュー出すときは、
WM_RBUTTONDOWNでなくてWM_CONTEXTMENUを使うべし、
タスクトレイでメニューを出すときは、
WM_RBUTTONDOWNでなくてWM_RBUTTONUPで開けってことでいいんすか?
008269NGNG
>>81 それなら激しく納得
0083デフォルトの名無しさんNGNG
APIのみでMFCのビットマップボタンのような機能を実装する方法はありますか?
0084デフォルトの名無しさんNGNG
BS_OWNERDRAWスタイルを指定してオーナードロー
0085デフォルトの名無しさんNGNG
>>83
MFCを使え。
MFCもAPIのみで実現されてる
0086デフォルトの名無しさんNGNG
>84
おかげさまでサンプルプログラムも見つかりましたので何とかなりそうです。
どうもでした。
0087木村 キタキタマシーンNGNG
>>86
ヨカッタネ
0088デフォルトの名無しさんNGNG
>>87=木村 キタキタマシーン
内容のないただの相槌を書き込むのはやめといたほうがいい。
反感をもたれるから。
0089デフォルトの名無しさんNGNG
おまけにどこでもage
009062NGNG
>>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で動作が違うのもいかにも非公開っぽいし
0091デフォルトの名無しさんNGNG
すいません。MSDNサーフに疲れました。
WIN2000でLANの接続状態をひろえるAPIはありませんか。
またはそれに代わる良い方法があれば教えてください。
VBで接続状態の監視ができるようにしたいのです。
0092デフォルトの名無しさんNGNG
その、「LANの接続状態」なる語はいったい何を示しているのか
まずはっきり教えてくれ。
まあとりあえず、定期的に鯖にpingでも撃っとけ。
0093デフォルトの名無しさんNGNG
>>92
うーん、WIN2000のローカルエリアネットワークのプロパティで出てくる
ダイヤログに接俗の『状態:有効(または無効)』ってあるでしょ。
OSでLANの接続状態を監視しているのだろうけど、そいつを利用できないもの
かしらって思ったのです。
今作ってるのはMSDEを使う鯖蔵型のプログラムなんですが、LANが切断されると、
たとえすぐにLANが回復してもDBとのコネクトは回復しないでしょ。
だからLANが切れたときに即、エラー出してプログラムを強制終了させて、つまり
プログラムを再起動させるようにしてしまえば良いカナーっと思ったのです。
0094デフォルトの名無しさんNGNG
>>93
あ、つまりその、接続状態が「有効」か「無効」かってのを知りたいのです。
009592NGNG
ああ、それなら、
GetIfEntry
を使ったらどうかな?
0096デフォルトの名無しさんNGNG
>>95
即レス感謝です。しかしながらすいません。初耳APIです。
どこかに良いTipsなんて出てたらURL教えて下さい。
0097デフォルトの名無しさんNGNG
ぐぐるってなぁに
0098デフォルトの名無しさんNGNG
googleのこと
009997NGNG
>>96
googleだってよ。
0100デフォルトの名無しさんNGNG
文字列を描画するときに文字にグラデーションを掛けたいのですが
使う文字だけ画像データとして持って BitBlt() とかで
描画するのが一般的なのでしょうか?

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

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

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

またひとつ勉強になりました m(_ _)m
0110デフォルトの名無しさんNGNG
ゲームプログラムで、メッセージの無いときの処理を書きたいのですが、
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.エレガントではない
と言う問題が出てしまいます。
何か良い方法は無いでしょうか?
0111デフォルトの名無しさんNGNG
インデントが崩れてしまったので再投稿です。
ゲームプログラムで、メッセージの無いときの処理を書きたいのですが、
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.エレガントではない
と言う問題が出てしまいます。
何か良い方法は無いでしょうか?
0112デフォルトの名無しさんNGNG
>>110
全部メッセージ経由で処理する。

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

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

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

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

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

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

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

でも
AdvancedWindowsと何が違うのでしょうか?
AdvancedWidnows買ってないのであちらはよく分かりません。
あちら、C++で書かれているようですけど。
C++分かれば今ならAdancedWindowsで良いのでしょうか?
0163デフォルトの名無しさんNGNG
AdvancedWidnowsはこれ
http://www.amazon.co.jp/exec/obidos/ASIN/4756138055/qid=1024220278/sr=1-1/ref=sr_1_2_1/249-7181027-3890743
0164デフォルトの名無しさんNGNG
>>162
それでAPI勉強してからC++のMFC勉強しようと思ってるのですが
わざわざAPIを勉強する必要もないですか?
0165デフォルトの名無しさんNGNG
ProgrammingWindowsはWindowsの仕組みがC言語で書かれている書籍。

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

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

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

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

自分で晒しageしとくか。
0177デフォルトの名無しさんNGNG
.NETスレに行ってください。
APIスレであなたは「邪魔」です
0178デフォルトの名無しさんNGNG
わかんねぇよ!何がなんだかさっぱりだよ!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);

0179デフォルトの名無しさんNGNG
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);
}
}
0180デフォルトの名無しさんNGNG
WM_PAINT は処理しない限り延々と発生し続けます。

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

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

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

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

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

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

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

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

とか。
0190デフォルトの名無しさんNGNG
とりあえずcontinue;だけでも置いとけ。
0191デフォルトの名無しさんNGNG
while (1) {
}
がよろしいかと
0192デフォルトの名無しさんNGNG
>>186
よくやるなよ〜。
ビジーループは俺的にタブーって感じだ。
while (1){}もそう。
検索するコンテナなりなんなり
そういうリソースってのは、必ず有限な訳で
()の中に条件式を入れられないケースなんて滅多にないはずだぞ。
何で使う?
0193デフォルトの名無しさんNGNG
>>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();
    }
  }
0194デフォルトの名無しさんNGNG
while (*dst++ = *src++);
こういうのだってあるだろ
0195デフォルトの名無しさんNGNG
こんなのもアリだな。

for (List *p = phead->next; p != NULL; p = p->next)
  ;
0196名無しさん@カラアゲうまうまNGNG
それじゃ意味ないだろ。
for (List *p = phead; p->next != NULL; p = p->next)
  ;
0197デフォルトの名無しさんNGNG
>>196
リストの末尾探し?
ObjectPascalなら使えないけどいい!
0198デフォルトの名無しさんNGNG
>192
> ビジーループは俺的にタブーって感じだ。

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

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

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

case WM_LBUTTONDOWN:
SetCapture(hwnd);
break;

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

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

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

ただ、ライブラリを使うのに比べてコストがかかるから、まずは見積もりを
出して許容範囲にあるか、あるいは別の方法で安く逃げられないかを考え
るけど。
0213デフォルトの名無しさんNGNG
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;
0214デフォルトの名無しさん NGNG
Win2000でメモリ書きかえるときってGetWindowThreadProcessIdと
OpenProcessとWrite/ReadProcessMemoryだけで可能ですか?
0215デフォルトの名無しさんNGNG
>>213
im02 = (IMAGE*)(lParam);
または
* im02 = *(IMAGE*)(lParam);
では?

WM_COPYDATAってメッセージもあったと思うけど使えない?
0216デフォルトの名無しさんNGNG
ウインドウから開いたダイアログの状態(開いているか、閉じたか)
を判定する方法ありませんか?
0217デフォルトの名無しさんNGNG
モーダルダイアログなら、帰ってきた時には閉じている。
モードレスダイアログだとしたら……
a. ダイアログが閉じた時にオーナーウィンドウに通知する
b. IsWindowでハンドルが有効かどうか検査
c. FindWindowでダイアログを探してみる
あたりかな。
0218デフォルトの名無しさんNGNG
>>217
ありがとうございます、やってみます。
0219デフォルトの名無しさんNGNG
>>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;
0220デフォルトの名無しさんNGNG
以下のようにしたらエラーはでなくなったのですが,データがうまく渡せない...

/*ウインドウ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));
0221デフォルトの名無しさんNGNG
ういんどう1とういんどう2が同一プロセスなのか
同一スレッドなのかが重要
0222デフォルトの名無しさんNGNG
>>220
>memcpy(&im02,(PCOPYDATASTRUCT)lParam, sizeof(IMAGE));

何をコピーしてるんだ、何を。
0223デフォルトの名無しさんNGNG
>>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);
とかでは駄目でしょうか? それとも他に関数とかあるのでしょうか?
0224デフォルトの名無しさんNGNG
memcpyすると何が起こるのですか?
memcpyはデータをメモリでコピーするものと言うことでよいのですか?
memory同士でコピーして何になるのでしょうか?
0225デフォルトの名無しさんNGNG
>>224
いろいろあるぞ。
あるデータをちょっと弄って処理するときに、元データを保護する目的とか、
テンプレをconstで持ってて、それ弄る時とか…
0226222NGNG
>memcpyすると何が起こるのですか?
memcpy (&im02, pcds->lpData, pcds->cbData);
lpDataをcdData分im02にコピーする.
#ということを期待している > 私

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

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

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

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

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

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

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

どうすればきちんと取得できるでしょうか?
0230デフォルトの名無しさんNGNG
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;
・・・
としないとコピーは作れない
0231デフォルトの名無しさんNGNG
IMAGE構造体をクラスにしてシングルトンで実装。とかじゃだめなの?
最悪、グローバル変数にするとか。
0232デフォルトの名無しさんNGNG
>>231
Javaの謎と落とし穴を奨める。
他のオブジェクト指向ユーザにも有益。
0233デフォルトの名無しさんNGNG
仮想キーコードをアスキーコードに変換するにはどのように
すればいいでしょうか。
WM_CHARで処理すればいいんですが、CTRL+keyとしたときには
keyはWM_CHARで取れないので困ってます。
特にVK_OEMとかのキーボード固有のやつを処理したいのです。
0234デフォルトの名無しさんNGNG
>>233
決まった方法はない。
変換テーブルを持ってやるのが一般的だが、
キーボード(正確にはドライバ)によって違ってくる。
0235あぼーんNGNG
あぼーん
0236デフォルトの名無しさんNGNG
>>235
マルチしまくりだな。お前、出会い系サイトかなんかにはまってんの?
0237デフォルトの名無しさんNGNG
拡張子は.cと.cppのどちらでプログラムしてますか?
私はエラー(メモリ?)チェックが厳しいと聞いた.cppでプログラムしてますが。
みなさんはどうですか?
0238デフォルトの名無しさんNGNG
>>237
取りあえず基礎からやり直せ。
0239213NGNG
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に
なにも表示されません.
デバックモードで値を見てみたのですが,ちゃんと入っているようでした.
もう少しでちゃんと表示できそうなのですが...うーむ.
あとどこがおかしいのでしょうか?
0240デフォルトの名無しさんNGNG
>>239
窓1からイメージが送られてきても、WM_PAINTメッセージが来ないとイメージ描かれない
よん。WM_USER+100の処理が終わったらUpdateWindow辺りでWM_PAINT送って…
じゃないかな?
0241213NGNG
>240
WM_USER+100の処理の最後にUpdateWindow(hwnd);を入れて,WM_PAINTまで
処理がいっているのを確認したのですが,それでもウインドウ2には何も表示され
ません(正確にはウインドウクラスで定義した背景色の白が表示されています).
うーん...
0242デフォルトの名無しさんNGNG
InvalidateRect
0243デフォルトの名無しさんNGNG
CreateWindow()の第三引数、ウインドウのスタイルの種類ってどんなのがあるの?http://www.microsoft.com/JAPAN/developer/library/jpuipf/_win32_createwindow.htm
で調べたけど、要領得なくてさぁ。
例えば、子ウインドウのエディットボックスで、
CreateWindow("EDIT", "", ここの部分, ・・・・・・・・・);
なんかで指定できる一覧なんか見たいんだけど、サクッと見られるサイトとかないかなー。
0244デフォルトの名無しさんNGNG
え、MSDNのCD2持ってないの?
0245デフォルトの名無しさんNGNG
243
MFCの解説
http://www.microsoft.com/JAPAN/developer/library/vcmfc/_mfc_window_styles.htm
http://www.microsoft.com/JAPAN/developer/library/vcmfc/_mfc_extended_window_styles.htm
0246デフォルトの名無しさんNGNG
>>244
実を言うと俺が買ったんじゃなくってさぁ
VC++6.0の実物見たことなくて、あれってVC++とMSDNの2枚組なの?実は3枚あるとか?
漏れ2枚しかもって無くてフツーにインストールしたけど、なぜかヘルプがみれないんだよねー
しょうがないから、オンラインで検索しまくってんだけど、やっぱ正規に買った方がいいかなー?
0247デフォルトの名無しさんNGNG
VS.NET安く買えるよ。
0248デフォルトの名無しさんNGNG
>>245
ありがとう!
載ってるじゃん!、漏れの検索不足かよー。
できれば、どうやって検索したのかも教えてほちいなぁ。
0249デフォルトの名無しさんNGNG
もう一つ質問です。
CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE | ES_RIGHT, ・・・・);
こんな感じで、指定したんだけどどうしてもES_RIGHTが反映されなくて、左詰めになっちゃいます。

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

いまどきいねーもんな・・・・95
0253213NGNG
ウインドウ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;
0254213NGNG
あと,きになるとすれば,ウインドウ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 ;
0255デフォルトの名無しさんNGNG
213
おまえウザイよ。
いちいちインデント崩れまくりのソースを貼るのはよせ。
現象を再現できる最小限の完全なコードをどこかにUPして、
施した変更や処理の要点だけをここに書け。
0256デフォルトの名無しさんNGNG
http://lounge.dip.jp/~yoshinoya_off/up/upb.cgi
とりあえず、あぷろだ見つけてきたからソースはここにUPれ
0257デフォルトの名無しさんNGNG
im01にセットする部分が無いんだが、それはちゃんと出来てるのか?
im01がちゃんと出来てないとどうしようもないぞ。
0258213NGNG
>>255 >>256
申し訳ありません.まわりでWindowsでCでプログラムをしている人がいないもので,こちらに
何度も聞いてしまいました.

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

それから、もう一つ。
BITMAPINFO構造体をコピーするのもあのままじゃダメ。
パレットをキッチリコピーしてやらないと。
0261213NGNG
>>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形式しか扱ったことがなかったので,よい勉強になりました.
0262デフォルトの名無しさんNGNG
SetLayeredWindowAttributesを使おうと思ったのですが、定義されていないという
エラーでビルドできませんでした。
下記の環境ですがDLLから明示的に呼び出さないと使えないのでしょうか?

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

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

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

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

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

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

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.
0282デフォルトの名無しさんNGNG
>>280
最初の1度に限るのってあんまり意味無くない?
mallocって何か閾値を境に動作が変わるんだったっけ。
0283デフォルトの名無しさんNGNG
>>278
>malloc()の方が早いと思うよ。API呼び出しはオーバーヘッドがでかいって聞いた事あるし。
あふぉか。
0284デフォルトの名無しさんNGNG
>>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.
0285デフォルトの名無しさんNGNG
>283
......
0286デフォルトの名無しさんNGNG
bcc32で来たか...

VCとの差はヒープ管理にかける時間の差かな。
単純パターンじゃなくて複雑な使い方すると、また違った比率になるかも。
0287デフォルトの名無しさんNGNG
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.
0288デフォルトの名無しさんNGNG
bccは10kb以下の小さなブロックでは高速な結果になっている。
謎なのが、100kbの時のmallocの異常な遅さと、
1MBの時の遅さ(他のコンパイラのおよそ2倍)
API呼び出しも遅くなってるのが謎。
0289デフォルトの名無しさんNGNG
VCのソース見ると、

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

みたいなのが書いてある。大きなブロックではAPIと同じぐらいの時間ということか。
謎は解けんが・・・0クリアごときでなぜそんなに違いが出る?
0290デフォルトの名無しさんNGNG
>>288
>1MBの時の遅さ(他のコンパイラのおよそ2倍)
>API呼び出しも遅くなってるのが謎。
アフォか。
0291デフォルトの名無しさんNGNG
>>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.
0292デフォルトの名無しさんNGNG
>>290 >>283 は何が言いたいのだ.
0293デフォルトの名無しさんNGNG
OpenWatcomのCRTも測ってホスィ..
0294デフォルトの名無しさんNGNG
>>292
単にアフォかといいたいだけちゃうんか。
0295デフォルトの名無しさんNGNG
APIで大きなメモリを確保するとヒープの拡張に時間とられるかもな。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Celeron850Mhz,MX400で320x240x16bitの転送に
200msecぐらいかかった。鬱。
0329デフォルトの名無しさんNGNG
サイズは1対1であってて、フラグもSRCCOPYのみ?
0330328NGNG
>>329
その通り。

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

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

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

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

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

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

よろしければ組み方の例など教えていただけるとうれしいです
もしくはマクロに詳しいサイトなど教えていただけると
0340デフォルトの名無しさんNGNG
>339
http://www.st.rim.or.jp/~phinloda/cqa/cqa8.htmlはどうですか?
誤爆しちゃったよ
0341デフォルトの名無しさんNGNG
おお、良いページをありがとうございます
そこによるとどうやら「使わないほうがいい」という結論のようですが、他のFAQもかなり参考になるものばかりでした
感謝いたします

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


#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;
}
0345デフォルトの名無しさんNGNG
バッファオーバーランを防ぐために
vsprintfではなく、vsnprintfを使えという声が近頃は大きい。

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

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

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

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

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

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

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

丹念に小一時間調べれば、
誰も知らない、新事実をお前様があきらかにすることに
なりましょうぞ ・・・・・(;´Д⊂
0366デフォルトの名無しさんNGNG
>>364
M$からzh-chとzh-twのフォントDLさせてもだめ?
(すれ違いだけど)WebBrawserコントロールかCHtmlViewなら簡単に表示できそう
だけど。
0367デフォルトの名無しさんNGNG
>>364
SendMessage(…,EM_GETTEXTEX,…);
で取ってみそ。
0368367NGNG
1つ忘れてた。リッチエディットはRichEdit20Wで作ってね。
0369347NGNG
>>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しましたがダメでした。コントロール系はまだ試してません。

長々と書いてしまって、すみません…
0370デフォルトの名無しさんNGNG
>>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だす。がんがれ!
0371デフォルトの名無しさんNGNG
>>362
アクティブウインドウが存在しない状態は有り得ない。
たとえばデスクトップやタスクバー、
もしくは不可視のウインドウにかならずアクティブ属性が設定されている
0372362NGNG
>>371
でも、GetForegraundWindow()の結果が0になる場合があります。
その時は、フックに通知がいかないみたいです。
0373デフォルトの名無しさんNGNG
0=デスクトップです
デスクトップに表示されているリストビューとかとは別の。
0374362NGNG
>>373
GetDesktopWindow()は0じゃないですよね。
別物なんですか?
0375デフォルトの名無しさんNGNG
>>374
それもデスクトップ。
しかし、Windowsにおける(本来の)デスクトップはもっと
上の階層で、Winlogonデスクトップ(だっけ?)とか、
スクリーンセーバーのデスクトップなる物が存在し、
特定のウインドウをデスクトップと呼ぶ物ではなく
0をデスクトップを表す物として扱っている。
0376デフォルトの名無しさんNGNG
デスクトップとデスクトップウィンドウ混同してるだろ。
デスクトップはHDESK型のハンドルで識別されるまったく別の概念のオブジェクトなので、
GetForegroundWindowの返却値にはなりえない。

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

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

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

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

>>350
.NETが流行るまでだと思う
Win64 APIは今までのように直接使われることはあまりないと予想
0380厨NGNG
デスクトップがアクティブになっている状態でプログラムでマウスの座標を
取得する方法ありませんか?
0381デフォルトの名無しさんNGNG
>>380
自分のプログラムがアクティブのときは
マウスの座標の取得できるんだよねぇ。
グローバルフックでいろいろ検索してみそ。
0382デフォルトの名無しさんNGNG
GetCursorPos()でどう?
0383デフォルトの名無しさんNGNG
380がどんなアプリをつくるかによるな。
0384デフォルトの名無しさんNGNG
インターネット電話関連で簡単なフリーウェアを作っているのですが、
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 ? のようなものが
関連付けられていると思っていたのですが・・・

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

なんとかしてちらつきを低減したいのですが
DirectX以外の方法で実現する方法を教えてください。おながいします。
0458デフォルトの名無しさんNGNG
>>457
WM_ERASEBKGNDを処理汁
0459デフォルトの名無しさんNGNG
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/default.htm?p=/msdownload/platformsdk/sdkupdate/psdk-full.htm
新しいSDKが出てた、あげ
0460457NGNG
>>458
メインフレームで OnEraseBkgnd をオーバーライドして
return 1; としたところ、ウィンドウサイズ変更時に全体がちらつく現象はなくなりました。
しかしスクロールするグラフ部分のちらつきは解消されませんでした。
こちらについてなにかご存知でしたら教えてください。
0461デフォルトの名無しさんNGNG
>>460
お前のスクロール処理がまずいんだろ
0462名無しさん@カラアゲうまうまNGNG
>>456
> 面倒くさいけど、「コントロールパネル」みたいな仮想フォルダを実現できるのは
> このおかげ。

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

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

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

で、50ms間隔で更新したければそのタイミングでInvalidateRect()呼ぶとかでダメ?
0464457NGNG
>>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);
}

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

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

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

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

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

それに比べれば、エディットの自作なんて、DrawText系で書くくらいかな
と思った次第です。
0485デフォルトの名無しさんNGNG
あるクラス(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でするようにしてたんですけど、
他に何かいい方法がありませんか?

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

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

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

このあたりね。検索すると、いくつか解説のページが見つかるよ。
0496デフォルトの名無しさんNGNG
>>493
エディタからエディットコントロールまでには、
まだいくつかハードルがある。
まあ、エディットコントロールを
自作したほうが楽なんてキティな意見を、
無理矢理通そうとする奴に、何言っても無駄だろうが。
0497デフォルトの名無しさんNGNG
>>496
アンタの言うテキストエディタって、
RichEditやEDITを貼り付けるだけの物を言ってる?
コントロール自作出来ない奴は初心者だって言ってるんだが。
0498デフォルトの名無しさんNGNG
IMEの入力受けるだけでも一苦労
0499デフォルトの名無しさんNGNG
>>498
おぃおぃ
0500デフォルトの名無しさんNGNG
>>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フォントを入れるか、各言語ごとにフォントを指定してやらないと多言語混在表示は出来ません。
0501デフォルトの名無しさんNGNG
Win2kでもMS(P)ゴシック、MS(P)明朝はUNICODEフォントだよ。
0502デフォルトの名無しさんNGNG
Arial Unicode MS とかも入ってるんでない?
0503デフォルトの名無しさんNGNG
>>484
何か勘違いしてないか?
誰もHTMLEditだなんて言ってないだろ。
FM20.DLLを知らないの?
0504デフォルトの名無しさんNGNG
>>500
#define UNICODE
してコンパイルしてみそ
CreateWindowEx()すら落ちるようになるから
0505デフォルトの名無しさんNGNG
>>504
明示的にTextOutWとか呼べばいいだけじゃん。
0506デフォルトの名無しさんNGNG
>>505
今回の話はEDITをUnicode対応にするって話だから、
単に表示できるかどうかって話じゃないのよ。
EDITをUnicode対応にするには、
CreateWindowExW()を使わないと駄目ってこと。
0507デフォルトの名無しさんNGNG
TextOutW()とかを使ってEDIT相当のものを自作するのは話が別
0508デフォルトの名無しさんNGNG
ExtTextOutWはWin95でも使えるね。
コレなら9x対応のUNICODEテキストエディタ簡単に作れるよ。
0509デフォルトの名無しさんNGNG
そんなもの作らなくてもFM20.DLLに入ってる。
いくらCOMが面倒でも、コードの量的に考えて、
全部自作する方が10倍以上コード量多いだろ、という話。
0510デフォルトの名無しさんNGNG
自作できるかどうかを問題にしてない
0511デフォルトの名無しさんNGNG
どうなの?
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q224305
0512デフォルトの名無しさんNGNG
>>511
VBのランタイム入れれば済む話
どうせ今回は内輪で使うためで
一般配布が目的じゃないんだろうし
0513デフォルトの名無しさんNGNG
>>512
VBのランタイムに入ってないだろ
Officeの一部だろ
ま、内輪で使うんなら関係ないのは確かだけど
0514デフォルトの名無しさんNGNG
自作自作っつってる奴が多いけど、
そんなに簡単に作れるんだったら、
誰か再配布自由なの作って配ってないの?
0515デフォルトの名無しさんNGNG
TEditorがあるやん
0516デフォルトの名無しさんNGNG
>>501
あら、そうだったのね。と言う事は「Unicodeフォントが入ってない」ではなく
「自国語以外の部分が無い」と言う方が正しいのか?

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

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

MSLUは使わなくても基本的なWideCharToMultiByteとか
TextOutとかGetTextExtentPoint32とかはW版もついてくるから
Unicodeアプリは動かなくても内部でUnicodeを使うことが出来る。
0518デフォルトの名無しさんNGNG
>>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対応にできるということですね。
それでしたら一発解決ですね。
0519デフォルトの名無しさんNGNG
ちなみに元のやりとりはこれ
>>472-476
0520500=516NGNG
>>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 にポツポツとありました。
0521デフォルトの名無しさんNGNG
>>520
CreateWindowWしたウインドウじゃなくても
TextOutWで描画出来るから、普通はあんまり問題にならないでしょ。

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

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

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

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

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

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

横幅が小さいときは、

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

となる
0526デフォルトの名無しさんNGNG
CW_USEDEFAULTで作った後に差分を取ってリサイズ
0527デフォルトの名無しさんNGNG
>>524
おぉ!出来た!!
ありがとうございます.
0528デフォルトの名無しさんNGNG
>>522
HMENUはHWNDじゃないってことだよ。

>>525
アジャくんはあくまでメニューが1行としてしか計算してくれないからね。
サイズ変更した後にクライアント領域のサイズを調べて、
希望どおりになっていなかったらその分引き伸ばして
もう一回リサイズかけるくらいしか思いつかん。
0529522NGNG
>>528
ありがとうございます。
でもHWNDにキャストしてやらないとコンパイル出来ないのですが・・・
もしかしてメニューハンドルを使う事自体間違ってるのでしょうか?
0530デフォルトの名無しさんNGNG
なんでもキャストすりゃ済むってもんじゃない。
0531デフォルトの名無しさんNGNG
>>525
WM_NCCALCSIZEを投げれば
実際にサイズ変更しないでサイズ計算できる
0532デフォルトの名無しさんNGNG
開いたファイルを任意のサイズに変更したい(後半部分を切り捨てたい)
のですが何か良いAPIはありませんか?
今は ReadFile() WriteFile() を繰り返して実現してるのですが…
0533デフォルトの名無しさんNGNG
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.
0534デフォルトの名無しさんNGNG
VC++6.0でPOP3, SMTPクライアントを実装したいのですが、
便利なライブラリってないでしょうか?
0535デフォルトの名無しさんNGNG
>>534
ttp://www.vector.co.jp/soft/win95/prog/se115574.html
0536デフォルトの名無しさんNGNG
>>535
その他にありませんかね?ライセンス気にせず自由に使用できるもので。
0537デフォルトの名無しさんNGNG
>>536
拙作の作りかけpop3ライブラリ。
plain/APOP/AUTH(CRAM-MD5)対応
http://lounge.dip.jp/~yoshinoya_off/up/img/pop3.zip
0538デフォルトの名無しさんNGNG
ありがとうございます。参考にさせて頂きます。
0539デフォルトの名無しさんNGNG
>>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とか使っている人だと楽勝なのだらろうか...
0540デフォルトの名無しさんNGNG
SendMessage(hwnd, WM_NCCALCSIZE,〜)だよ
リファレンス読め
0541デフォルトの名無しさんNGNG
>>540
すんません.MSDNみてもいまいちピントこなかったのです.
で,googleで WM_NCCALCSIZE を調べても SendMessage(hwnd, WM_NCCALCSIZE, 〜
なのがひっかかからなくて,うーむという状態です.

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

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

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

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

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

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

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

となるのですが。
OleInitializeが内部でCoInitializeを呼び出しているのなら良いのですが、
そうでないならOLE以外のコンポーネントを同時に使えないのかなと思いまして。
0554デフォルトの名無しさんNGNG
>551
OPEN_ALWAYS使えばいいんでわ?
0555デフォルトの名無しさんNGNG
>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.
と明記されているではないか。
0556デフォルトの名無しさんNGNG
>>542
そんなのあるなら俺も欲しいな〜
出来たらサンプル公開・・・してくれると嬉しいでやんす。
0557sageNGNG
>>522
よく分からないまま、流れていってしまったのですが・・・
もしかしてメニューのサブクラス化というのは
割と初歩的な事で、本かなんか読めば書いてある事
なのでしょうか?
それとも逆にあまり一般的ではないのでしょうか?
いろいろ試しているのですが相変わらず出来ません
トホホ・・・
0558デフォルトの名無しさんNGNG
>>557
一般的でないどころか世界中でそんなことしてるやつ一人もいないかも
どうしてもメニューをサブクラスかしたかったら
メニューのウィンドウハンドルを何とかしてゲットしてください
ポップアップ中なら座標から何とかなるでしょう
0559デフォルトの名無しさんNGNG
メニューはウィンドウじゃないからサブクラス化なんてできないよ
なんて子供の純真な夢を打ち砕くような台詞をどうしても言わせたいのかキミは

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

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

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

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

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

まあ、俺が担当にいる間ぐらいはちゃんと動くだろうしね...。
0590さらに偽551NGNG
>>588
作らないじゃなくて作れないんです!
0591デフォルトの名無しさんNGNG
>>590
なぜ OPEN_ALWAYS 使わないのか小一時間
0592本物かもしれない551NGNG
>>591
OPEN_ALWAYS はなかったら作る、あったらそのまま、なので
存在したかどうかの判断ができないと思われ。
0593デフォルトの名無しさんNGNG
OPEN_EXISTSでいいじゃん
0594デフォルトの名無しさんNGNG
>>592
551は

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

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

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■となってしまいます。
なぜでしょうか?
0599デフォルトの名無しさんNGNG
>>598
CreateFileだと全部バイナリ形式の読み書き?だったから
\nが\r\nに変換されないせいじゃねーの?
0600デフォルトの名無しさんNGNG
プログラムはそのままで、改行部分だけ\nから\r\nに直したところ
きちんと改行されるようになりました。

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

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

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

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

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

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

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

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

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

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

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

また、タスクトレイをエミュレートするために、
(1)タスクトレイに登録されているアプリケーションのハンドル
(2)実際にタスクトレイに表示されているアイコンのハンドル
(3)そのアイコンがクリックされた際に適切なメッセージを生成してアプリケーションに送信したい場合に、そのメッセージの種類
を知りたいのです。
0648デフォルトの名無しさんNGNG
>>646
MSDNで十分じゃない?
0649クリップボードの使い方NGNG
「猫でもわかるプログラミング」 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 を呼び出した後も、アプリケーションはそのデータに
アクセスできます。」とも書かれていますが、いつ解放されるか分から
ないのでは怖くてアクセスできないと思うのですが・・・
0650デフォルトの名無しさんNGNG
>>649
だから使うなってことだと思うんだけど。
0651デフォルトの名無しさんNGNG
TextOutで画面上に出力した文字を消す方法って
画面全体を消去する以外にありますか?
0652デフォルトの名無しさんNGNG
>>649
ふつうはコピーして使う
SetClipboardData したメモリのことは忘れたほうが無難

0653デフォルトの名無しさんNGNG
>>651
背景と同じ色で上書きしたら
0654デフォルトの名無しさんNGNG
>>647

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

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

トレイはどうだろう。
Shell_No〜をフックすればいけるかも。
0657デフォルトの名無しさんNGNG
文字入力のカーソルの点滅速度を取得するにはどうすれば良いんでしょう?
0658デフォルトの名無しさんNGNG
>>657
GetCaretBlinkTime
0659657NGNG
こりゃまたそのままの名前。
ありがとう。>>658
0660デフォルトの名無しさんNGNG
ウィンドウ全体を背景色で塗りつぶすのに、もっとも手っ取り早い
方法って何?
0661デフォルトの名無しさんNGNG
WM_ERASEBKGNDを送る
0662デフォルトの名無しさんNGNG
>>661
おお、ありがとう。手っ取り早そう
0663デフォルトの名無しさんNGNG
「メニュープロパティ」の「一般」-「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はでないけど,今度はメニューが表示されません.
なんででしょうか?
0664デフォルトの名無しさんNGNG
MAKEINTRESOURCE(IDR_MENU)
とゆうマクロがあるよん。
ウィザードでは(LPCSTR)IDR_MENU
ってキャストしてるけどね。
0665デフォルトの名無しさんNGNG
buro
0666デフォルトの名無しさんNGNG
タスクトレイを右クリックした時に表示されるポップアップメニューのハンドルから、
オーナーのハンドルを取得するにはどうすればいいのでしょうか?

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

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

>>681
ある程度の処理時間がかかるところまで保存しておく方法ですね。
なかなか良さそうな方法なので簡単に実装できたらやってみます。
0683デフォルトの名無しさんNGNG
burororororo
0684666NGNG
>>667
GetWindowProcessIdでいけました。ありがとう。
0685デフォルトの名無しさんNGNG
エディットコントロールの最後尾に文字列を挿入すると
テキストの最初の方を見ていても、最後尾に移動してしまいます。
テキストを挿入しても、その場所に移動しないようにするには
どうしたらいいでしょうか?
0686デフォルトの名無しさんNGNG
>>685
ハァ?
0687デフォルトの名無しさんNGNG
>>685
自動スクロールオフ
0688685NGNG
>>687
自動スクロールオフとは?
ES_AUTOVSCROLなどは設定してません。
0689カンで書いてみる人NGNG
EM_SETCARET
0690カンで書いてみる人NGNG
はずした・・・

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

あと、出来ればReleaseCaptureについての詳しい解説もお願いします。
0693デフォルトの名無しさんNGNG
>>692
2 は HTCAPTION です。

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

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

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

論理和ではなく、SC_MOVE+2 の数値が意味ある。
0698デフォルトの名無しさんNGNG
FindWindow, FindWindowExで、
条件に一致するウィンドウが複数会った場合、どうなりますか?
0699デフォルトの名無しさんNGNG
ハハーン。
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.
0700デフォルトの名無しさんNGNG
>>698
その中から適当にどれか1個でしょう。
0701デフォルトの名無しさんNGNG
LVS_OWNERDRAWFIXED | LVS_OWNERDATA で LVS_REPORT なリストビューを描画するとき、
WM_DRAWITEM の rcItem が微妙にオフセットずれるのって僕だけですか?
(0,0)から描画したいのに(0,2)とかになっちゃうんだけど。
0702694NGNG
>>699
 あ〜、つまり、タイトルバーをつかんでいると、
wParamの下位4ビットが、2になっていると言う事ですか・・・?
0703697NGNG
元質問の >>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;
0704デフォルトの名無しさんNGNG
C言語の基本的なことを理解しただけの者デス。
Windowsアプリケーション作成しようと思ってAPIが必要という事が分かりました。
MFCは使わない方向です。
貴方の使用しているorお勧めする参考書籍おねがいします。。。
0705デフォルトの名無しさんNGNG
>>704
検索すればその辺にコード転がってるだろ。
0706デフォルトの名無しさんNGNG
MFC使え。
0707デフォルトの名無しさんNGNG
>>702
たまたま2だけど2だと決め付けたコーディングは行儀が悪いと書いてるの。
読解力のない奴にいくら言っても無駄だが
0708デフォルトの名無しさんNGNG
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で正常に取得出来ている人はいませんでしょうか?
0709デフォルトの名無しさんNGNG
子ウィンドウを作ってボタンをいくつか配置し、簡単なツールバーを作ろうとしています。
ところが、メインのウィンドウは生成できるのですが、
子ウィンドウを生成するときに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;
 }

0710デフォルトの名無しさんNGNG
ごめんなさい、ごめんなさい、ごめんなさい!
0711どおすればいいんだNGNG
http://www.gamecreators.net/
げげ!!!!!
0712デフォルトの名無しさんNGNG
>>709
RegistClassの中身をみせろ。
0713デフォルトの名無しさんNGNG
>>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
0714デフォルトの名無しさんNGNG
>>709
(MENU)1000 ← これってツールバーにメニューがあるって事?
0715デフォルトの名無しさんNGNG
WM_NOTIFYのときに送られてくるIDじゃなかったっけ?
シンボルブラウザからつくるかせめて
#define MyToolBar 1000
とかしてほしいけどな。
0716デフォルトの名無しさんNGNG
>>695
WINEのソースみるとヒットテストコードとして扱ってるみたい。
0717デフォルトの名無しさんNGNG
>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;
}
0718709NGNG
たびたびすみません。
過去に作った同様の方法で子ウィンドウを生成するプログラムのソースと比較してみました。
そして、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引数を使うには他に手続きとかいるのでしょうか?
0719デフォルトの名無しさんNGNG
子ウインドウの生成というなら、WS_CHILDの指定はどうした?
0720709NGNG
>719
WS_CHILDってつけたら、
確か親ウィンドウの枠の外に出られないウィンドウになりますよね?
それだとツールウィンドウとしては不便なのではずしています。
0721デフォルトの名無しさんNGNG
たしかNTのSP3あたりでパラメータチェックがいきなり
厳しくなってメニューハンドルが有効じゃないと
ウィンドウが作成されなくなったりしたんだよな
0722デフォルトの名無しさんNGNG
>>720
WS_CHILDがついてなかったら子ウィンドウじゃないだろうがボケ

もしかして「所有されてるウィンドウ」と「子ウィンドウ」の
区別がついてないのかな。これをごっちゃにしてる人は
驚くほど多い。
0723701NGNG
つーか >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 ピクセルずつ下にずれているんです。。。
0724709NGNG
>722
>WS_CHILDがついてなかったら子ウィンドウじゃないだろうがボケ
>もしかして「所有されてるウィンドウ」と「子ウィンドウ」の
>区別がついてないのかな。
どうも区別ついてなかったようです。

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

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

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

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

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

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

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

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

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

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

超FAQでしたか…すみませんでした。
それでもレスしてくださってありがとうございました。
早速やってみます。
0745デフォルトの名無しさんNGNG
拡張コンボボックス(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!
0746デフォルトの名無しさんNGNG
_UNICODEを定義しているとか?
0747745NGNG
>>746
してないけど、ちなみに 2000 だから?
確かに spyxx で除くと(Unicode)ってなってる。
そうかと言って CBEM_SETUNICODEFORMAT を 0 にしてみてもダメだったけど(泣
0748デフォルトの名無しさんNGNG
明示的に〜Aを呼び出してみたら?
0749デフォルトの名無しさんNGNG
そういう仕様なんじゃないの? MSDNにも
> Specifies the maximum number of characters
と書かれてるし(number of bytesではない)。
0750740NGNG
>>741
レスどうもです。
仕方がないので、当面妥協しておきます(汗
0751745NGNG
>>748
ダメでした。。。sageときます。。。

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

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

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

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

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

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

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

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

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

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

初心者で何の事か分からなかったのですが、
GetDCExでDCX_WINDOWを指定してDCを取得したところ
思ったようになりました。
ありがとうございました。
0791デフォルトの名無しさんNGNG
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」で検索かけてみたのですが、
具体的にこれでディレクトリを開いてる話を見かけなかったので
こちらでお聞きしました。どうかよろしくお願いします。
0792デフォルトの名無しさんNGNG
> 95/98 では無理と言う事でしょうか?
ま、そういうことだ。あきらめな。
0793デフォルトの名無しさんNGNG
>>792
マジですか?(汗)
鬱だ。数日無駄に過ごした。

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

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

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

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

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

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

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

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

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

 PD_ALLPAGES | PD_CURRENTPAGE |
 PD_RETURNDC | PD_USEDEVMODECOPIESANDCOLLATE

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

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

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

自分で作った子プロセスなのに。はがゆい。
0831828NGNG
×派生する側の→○派生後の
0832デフォルトの名無しさんNGNG
>>830
>ソースコードレベルで
ちゃう。
対象プロセスのメモリを書き換える。
kageがやってるから参考に汁

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

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

リージョンハンドラはグローバル変数で宣言しており、SetRegion()が呼ばれる前に
必ずIniRegin()で初期化しているのになぜ個々の関数内で改めて初期化しなおさねば
ならならいのでしょうか?
0838837NGNG
上記のコードです
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;
}
0839837NGNG
その続きです
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;
}
0840API学くんNGNG
質問です。
CreateToolbarEx()で二つのツールバーを作ったのですが2列にならずに
一列に重なってしまいました。
位置を指定するメッセージか何かを探したのですが見当たりません。
レバーコントロールを使えば実現できますが、使わなくてもツールバー二列は
このような単純な方法で実現可能かどうか知りたいです。
よろしくお願いします、
0841API学くんNGNG
>>840の続きです
MoveWindow()でツールバーを移動させようとしましたが、全く変化しません。
もしかしてツールバーは移動不可ということなのでしょうか?
0842デフォルトの名無しさんNGNG
>>835
OpenProcessでプロセスハンドルを開いてから
セキュリティAPIでゴニョゴニョ
>>836
nMinPageとnMaxPageを違う値にすればいいんでないの?
>>837
838はRectの定義をコメントアウトしたままではコンパイルエラーになると思うが?
839のhRgnWndはどこで定義されてるの? 長くて省略の中?
>>840-841
レバー以前のツールバーはそのような複雑な使用方法を
まったく想定していない。
0843837NGNG
>>842
うまく動作しないときは
hRgn = CreateRectRgnIndirect( &Rect);
の行もコメントアウトです
hWndWndはインクルードしているヘッダファイルにグローバル変数として宣言しています。
ヘッダでは同じ変数を多重宣言しないように
#if !defined( hoge)
#define hoge
// 宣言いろいろ
#else
// extern 宣言いろいろ
#endif
のようにしています。
0844837NGNG
長々と読むのはつらいので要点だけ書きますと、
・リージョンハンドラはグローバル変数で宣言している
・リージョンの初期化は初期化関数を用意して最初に初期化している
・リージョンの設定は設定関数を用意して初期化後設定している
・リージョンはソフトの終了直前に開放している
と言うプログラムで、
・設定関数内でCombineRgn()関数を使うとCombineできない(Combine後のリージョンハンドラは当然初期化済)
・設定関数内でCombineRgn()関数を使う前にCreateRgnRect()などで初期化するルーチンを追加するとCombineできる
と言う問題がある。
これは何故か?ということです。私のCの知識ではどちらも同じ挙動を示す(正しくCombineできる)はずですが、
前者ではCombineできません。HRGNなる型はMicrosoftの特例による制限があるのでしょうか?
0845デフォルトの名無しさんNGNG
>>836
PRINTDLGEX構造体を使う
0846デフォルトの名無しさんNGNG
>>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.

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

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

どうせそんなわけのわからんグローバル変数の使い方
してるくらいだからくだらんバグでも入れてんだろ。
0850デフォルトの名無しさんNGNG
現在タスクマネージャーのようなプログラム作りにはまっています。
問題個所はすでに起動しているアプリケーションの強制終了方法です。
CreateProcess で実行したアプリなら簡単なんですけど、既に動いている *****.exe を他のアプリから強制終了させたいんです。
お力お願いします。
0851デフォルトの名無しさんNGNG
>>845
それって 2000 より上ですよね?
95 とか 98 でもオッケーなんでしょうか?
プラットフォームは 2000 と書きましたが、
開発プラットフォームという意味でした。
ターゲットは 95 とかも含みなのです。。。
0852MMIONGNG
あのマジレスですけど、どうしてメモリマップドファイル
って Create していないのに Open で成功するんですか?
0853API学くんNGNG
どうも有り難うございます。すっきりしました。
そう言えば昔のソフトはみんな一列でした。
0854API学くん NGNG
しまった。>>853の発言は>>842さんに対してのものです。
0855837NGNG
>>849
http://members.tripod.co.jp/TeamZiang/hoge.lzh
にソースとヘッダを上げました。
私の冗長な説明は不要でしょうからこれを見て問題点を説明してください。
0856デフォルトの名無しさんNGNG
>>851
9x系の印刷ダイアログに「現在のページ」はなかったと思うが。
2000/XPのときだけ使いたいなら、処理分けれ
0857デフォルトの名無しさんNGNG
>>855
もうないぞ
0858837NGNG
すんません
http://members.tripod.co.jp/TeamZiang/hoge.LZH
拡張子が大文字でした
0859デフォルトの名無しさんNGNG
WH_CALLWNDPROCで登録したフックプロシージャで
特定のメッセージを止めてしまいたいのですが、どのようにすればよいでしょうか。
CallNextHookExの返し値を返さず0を返しても素通りでした。
0860デフォルトの名無しさんNGNG
>>859
受け取ったメッセージをWM_NULLに書きかえる。
0861859NGNG
>>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);
}
0862デフォルトの名無しさんNGNG
>>859-861
無理。
CallNextHookEx は「次のフックプロシージャ」を呼び出すだけ。
フックプロシージャ内で何をどうしようと、
次のフックプロシージャが呼ばれようと呼ばれなかろうと、
本来のウィンドウプロシージャは、何事もなかったように元々の引数で呼ばれる。
・・・というふうに、リファレンスには書いてあるように読めた。

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

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

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

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

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

すみません。

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

mainloop(){

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

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

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

教えてくれて、ありがと!助かったヨ
0928デフォルトの名無しさんNGNG
(´-`).。oO(どこの板の方言だ‥‥‥)
0929デフォルトの名無しさんNGNG
教えてください
あるライブラリがファイルに直接書いてしまうので。
メモリーディスクのようの物を作成してそこに書かせたいのですが
どのようにすればよいのでしょうか?
よろしくお願いします
0930デフォルトの名無しさんNGNG
RAMディスクを実装する
0931デフォルトの名無しさんNGNG
これでも参考にしてみれば。
http://www.vector.co.jp/soft/winnt/hardware/se168218.html
0932デフォルトの名無しさんNGNG
クリティカルセクションって、同じスレッドで複数回ロックしても
カウントされるだけなんですか?
10個並べてEnterCriticalSectionしたのに、ちっとも無限ループに陥りません。
0933デフォルトの名無しさんNGNG
age
0934デフォルトの名無しさんNGNG
関係ないが
Javaのsynchronized文はそんな感じだな。
そうじゃないとマルチスレッドアプリで再帰が使いづらいのかもな。
0935デフォルトの名無しさんNGNG
>>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.
0936デフォルトの名無しさんNGNG
GetSaveFileName()で開いたダイアログのファイル名欄に
あらかじめファイル名を表示させたいのですが、
どのようすればいいのでしょうか?
0937デフォルトの名無しさんNGNG
>>936
http://216.239.39.100/search?q=cache:9iw1A3FdPVEC:www-ctp.di.fct.unl.pt/~jcs/cg1/commdlg3_1hma.htm+%22Pointer+to+a+buffer+that+contains+a+filename+used+to+initialize+the+File+Name+edit+control%22&hl=ja&ie=UTF-8&inlang=ja
これ?
0938デフォルトの名無しさんNGNG
OPENFILENAMEは調べたんですが、それらしきメンバが無いみたいです・・・
lpstrFileTitleに文字列入れとけばできるかと思ったのですがダメみたいだし
0939デフォルトの名無しさんNGNG
lpstrFile
0940デフォルトの名無しさんNGNG
(´-`).。oO(何の為にGoogle介してハイライト表示させてると思ってるんだ……
0941936NGNG
なるほど・・・
どうもありがとうございました。
0942デフォルトの名無しさんNGNG
winnt\system32\cpuinf32.dll
って使った方います?
使用方法がわかりません。
0943899NGNG
http://black.sakura.ne.jp/~third/win.html
ここもあった
0944デフォルトの名無しさんNGNG
MFCアプリ作成時でも、コンソールアプリのウィンドウを表示して
そこにprintfかcout使って文字を吐きたいんだけど、どうすればよいの?

0945デフォルトの名無しさんNGNG
>>944
SetStdHandleして_ioinitを呼ぶ
0946944NGNG
>945
できたデス。
さんくす。
0947デフォルトの名無しさんNGNG
DialogBoxよりもDialogBoxIndirectを使った方がダイアログリソースを
追加しない分プログラムのサイズが小さくなると思ったのですが、
実際に作ってみるとどちらも40KBほどで同じサイズでした。
リソースってプログラムのサイズとは関係ないのでしょうか?
0948デフォルトの名無しさんNGNG
ある
0949デフォルトの名無しさんNGNG
>>947 環境によるんだけど、
リンカの設定によっては実行ファイルのサイズはアラインされるから小さな差が出ない事があるよ
0950デフォルトの名無しさんNGNG
>>947 VCなら /opt:nowin98 とやってみる
0951デフォルトの名無しさんNGNG
>>947
http://www.asahi-net.or.jp/~kh4s-smz/spi/note/minispi.html
0952デフォルトの名無しさんNGNG
DialogベースのウィンドウでESCキーで終了しないようにするにはどうしたら
良いのでしょうか? spy++で追っかけると、いきなりDESTROYが飛んでるよ
うですが・・・
0953デフォルトの名無しさんNGNG
IDCANCELが飛んでこなかったっけ?
0954デフォルトの名無しさんNGNG
>>952
>>953が正解。なんで、IDCANCELを受けないようにすればいい。というと、
「右上の×で閉じないんですが」と言われそうなので、そのときは、
WM_SYSCOMMAND捕まえて、wParamがSC_CLOSEだったら終了処理にすれば、
終了させられる。
0955952NGNG
大感謝。完璧です。
0956デフォルトの名無しさんNGNG
WMPみたいに「常に手前に表示」と同じようなプログラムを作るには
どのような方法がありますか?
0957デフォルトの名無しさんNGNG
SetWindowPos
HWND_TOPMOST
でぐぐれ
0958956NGNG
>>957
サンクス。
0959JPEG特許問題NGNG
OleLoadPictureFileはMFCでしか使えないのでしょうか?
MFCでいうSetPictureDispatch等がSDKで使えるのなら解決しそうなんですが、
やり方が分かりません。

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


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

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

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

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

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

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

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

漏れなら GetFullPathName() 使うよ
0990デフォルトの名無しさんNGNG
新スレ

Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/
0991デフォルトの名無しさんNGNG
おつ>990
埋めちゃえ〜
0992JPEG特許問題NGNG
>>972殿

ありがとうございます。

しかし、不思議なテクニックを使う関数ですな。
いわゆるCOMというものでしょうか?
0993デフォルトの名無しさんNGNG
Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/l50





0994デフォルトの名無しさんNGNG
Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/l50

Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/l50








0995デフォルトの名無しさんNGNG
Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/l50

Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/l50


Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/l50
Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/l50
0996デフォルトの名無しさんNGNG
Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/l50
Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/l50
Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/l50












0997デフォルトの名無しさんNGNG
Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/l50

Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/l50









0998デフォルトの名無しさんNGNG
Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/l50

Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/l50

Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/l50


0999 ◆itdn3QI6 NGNG
999









1000 ◆itdn3QI6 NGNG
1000
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。