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

Win32API 質問箱 Build5

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
でも、最低限Web検索ぐらいはしてね。

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

Win32API【2】
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html

Win32API 質問箱 Build3
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html

Win32API 質問箱 Build4
http://pc3.2ch.net/test/read.cgi/tech/1023361418/

参考
MSDN Online
http://www.microsoft.com/japan/msdn/default.asp

猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang/index.html
007978NGNG
今本棚を漁ったら、日経BPのwindowsプログラマのためのデバッグテクニックという本
にもヒントがありました。
0080ssssssNGNG
>>78
残業中かよ!
0081デフォルトの名無しさんNGNG
>>62
IShellFolder::ParseDisplayName()
008262NGNG
>81
ありがとうございます。
早速試してみますね。
0083デフォルトの名無しさんNGNG
ツールバーをサブクラス化してもサブクラス化ルーチンにWM_COMMANDが飛んでこないのですが、そういうものなんでしょうか?
0084デフォルトの名無しさんNGNG
ツールバーの親
008583NGNG
>>84
ボタンコントロールとかをサブクラス化した場合はサブクラス化ルーチンにWM_COMMANDが飛んでくるのにと思ってました。
激しく勘違い。何をサブクラス化してもWM_COMMANDは来ないのですね。

ところで、なんでサブクラス化ルーチンにWM_COMMANDが来ないのでしょう?
サブクラス化の意味が違う?
0086デフォルトの名無しさんNGNG
Win32APIってC言語で記述できるって聞いたけど、どうなの?
0087デフォルトの名無しさんNGNG
>>86 DLLを呼び出す為の仕掛けがC言語自体にはありませんから
  その部分を別にリンクする事で可能になります。

世の中にはDelphiとか そういう機能を内在した言語もあります
0088デフォルトの名無しさんNGNG
>>85
何でサブクラス化したいん?
0089デフォルトの名無しさんNGNG
したいから
009083NGNG
>>88
複数のアプリで同一のツールバーを使う場合、ツールバーをDLL化して、ツールバーが押された時の処理もDLL側で行った方がすっきりして良いかと思いまして。
EXE側もツールバーの事を意識しない方が楽ですし。
0091ssssssNGNG
>>85
サブクラス化云々の問題よりも、
そもそもWM_COMMANDはボタンコントロール(のウインドウ)に送られるメッセージではなく、
ボタンが押された結果他のウインドウ(親ウインドウ)に送られるメッセージだからでしょ。
だから、ボタンにWM_COMMANDが送られるわけはない。
0092デフォルトの名無しさんNGNG
どういうツールバーよ
0093デフォルトの名無しさんNGNG
Windows2000のタスクマネージャのように、起動中のアプリケーションの
タイトル名とアイコンを取得しようと思ったのですが、Delphiなどで
作られた一部のアプリケーションは二つのウィンドウが取得されてしまいます。
(例えばクラス名TApplicationとTFormMainの二つ)
しかもこの二つのウィンドウのアイコンが別々です。

そこで、タスクマネージャのように一つだけ取得し、なおかつアプリケーションの
正しいアイコンを取得するにはどうすればよいのでしょうか。
0094デフォルトの名無しさんNGNG
>>93
でそれらのウィンドウの関係は?
009583NGNG
>>91
サブクラス化って、サブクラス化したウィンドウに関する全てのメッセージを処理するものだと思ってたのです。
WM_COMMANDは仰る通り、考え方が違うのですね。

>>92
主にランチャー機能やタスク切換え機能ですね。
ヘルプ起動とかも行っていますが、これもランチャーに相当すると言えるかも。

あまり深く考えずに親ウィンドウ側でWM_COMMANDを処理してもいいんですが、各EXEに同じようなのを記述するのはいかがなものかと。
その部分だけ別ソースに書き出して工夫するのが良いのでしょうか?
0096デフォルトの名無しさんNGNG
>>95
ランチャーの機能に関する一連の関数、又はクラスをDLLの方に閉じ込めて
親ウィンドウのProcedureから呼べば?
0097デフォルトの名無しさんNGNG
そのためのREFLECT_NOTIFICATION()。
親から子にメッセージを投げ返せ。
0098デフォルトの名無しさんNGNG
>>95=83
>サブクラス化って、サブクラス化したウィンドウに関する全てのメッセージを処理するものだと思ってたのです。

きみはウィンドウ関数(プロシージャ)というものちゃんとを知らないんだね。
0099デフォルトの名無しさんNGNG
>>93

GetWindow(hWnd,GW_OWNER) でゼロを返すほうが真のメインウィンドウ
0100デフォルトの名無しさんNGNG
>>71
dbmonのソース。
Platform SDKに入ってると思う
010183NGNG
>>96
親で受け取ったWM_COMMANDがツールバーのものなのか判定するというのがいかがなものかと思いまして。

>>97
REFLECT_NOTIFICATIONで解決かと思ったのですが、使い方が分かりません。
しかしプラットフォームSDKの標準ヘッダーでは定義されていないですね。
MSDNを見ていたらATLマクロだということは分かりましたが、SDKなプログラムにREFLECT_NOTIFICATIONのみを実行させることは可能なのでしょうか?

>>98
はい。残念ながら知らないようです。
私の抱える問題を解消出来るような方法は御存じないでしょうか?
010296 NGNG
>>101
はて、そのこころは?
010383NGNG
>>102
複数のEXEで同様な判定処理を行う事になるからです。
大した事ではありませんが、見た目上、同じツールバーを備えるEXEでも、EXE側での処理如何ではツールバーの動作が異なる可能性が出てくるためです。
今回、私の作っているツールバーでは、主にランチャー機能を持たせる訳ですから、EXE側にとってはツールバーの処理は無関係な訳です。

今のところ、ツールバーをサブクラス化したルーチンで、WM_LBUTTONUPの処理時にTB_ISBUTTONPRESSEDを使ってツールバーのどのボタンが押されたか調べる事が出来ましたので、他に良案が無ければこの方法でいこうかなと思います。
010483NGNG
>>102
ちょっと書き方に不備がありましたね。すみません。

>複数のEXEで同様な判定処理を行う事になるからです。

つまり結局の所、[各EXEのWM_COMMANDでLOWORD(wparam)==ツールバーのボタンか?]の処理が必要になるのが如何なものか? ということです。
0105102 NGNG
>>104
私個人としては、
「ウィンドウプロシージャに飛んで来るWM_COMMANDの振り分け」自体面倒な処理では無いと思うが..

case WM_COMMAND:
switch (LOWORD(wp)) {
case ID_TOOLBAR:
OnToolBarMsg(hWnd, msg, wp, lp);
break;
....
とかじゃダメなの?

WM_LBUTTONUPだとウィンドウ外でクリック->ホールド->ツールバーの上でリリース
でもイベントトリガーに...
0106デフォルトの名無しさんNGNG
>101
だから、REFLECT_NOTIFICATIONマクロと
実質的に等価なコードをかけや。
010783NGNG
>>105
case WM_COMMAND:
switch (LOWORD(wp)) {
case ID_TOOLBAR:

この場合、LOWORD(wp)にはツールバーリソースIDではなくてボタンIDが入りますので、ボタンが複数あるとcase文を増やさねばなりません。
もちろん、面倒ではないですが。

>WM_LBUTTONUPだとウィンドウ外でクリック->ホールド->ツールバーの上でリリース
>でもイベントトリガーに...

ある意味、そのような操作をすると無駄なイベントは発生してしまいますが、TB_ISBUTTONPRESSEDを使ってツールバーのどのボタンが押されたか調べているので、実質的には問題は無いでしょう。

>>106
そのマクロと等価なコードがどんなものなのか分からないのです。
単にWM_COMMANDをツールバーに投げるだけですか?
0108 NGNG
>>103
DLLでツールバーとその親ウィンドウを作って、EXEには
親ウィンドウを張り付けりゃいいんでないの?
010983NGNG
>>108
そういう手がありましたね。一番素直な組み方かも。
フローティングツールバーみたくする時も、この方が応用が効いて良さそうです。
ありがとうございます。
0110デフォルトの名無しさんNGNG
変な設計
011183NGNG
変ですか?
0112デフォルトの名無しさんNGNG
普通親子が別ウィンドウになったりはしない
0113112NGNG
ごめん勘違い
0114CRectNGNG
あのー超初心者質問でスマンす。VC6 win32アプリ作成,標準で

#include <windows.h>
#include "StdAfx.h" だけだと

CRect

が”定義されてません”のエラーになるんですが,
これは何をインクルードすれば使えるんでしょうか。

--------------------構成: a7 - Win32 Debug--------------------
コンパイル中...
a7.cpp
C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\MyProjects\a7\a7.cpp(24) : error C2065: 'CRect' : 定義されていない識別子です。
0115デフォルトの名無しさんNGNG
RECTじゃだめなの?
0116デフォルトの名無しさんNGNG
atltypes.hです
MSDNに載ってるぞ
0117デフォルトの名無しさんNGNG
なんでWin32APIスレで(゜Д゚)
0118CRectNGNG
ですね。
それつかうんならSDKじゃないとやっと気付いた私。ごめ。
0119デフォルトの名無しさんNGNG
ところで stdafx.h って何やってるファイルなの?
コンソールアプリ作る分には windows.h 読んどきゃ OK っぽいけど...
0120デフォルトの名無しさんNGNG
MSDN読んだ?
0121デフォルトの名無しさんNGNG
>>119
プリコンパイル済みヘッダファイル作成用だと思う
0122デフォルトの名無しさんNGNG
親のウインドウの中にCreateWindowで、
リストとエディットを作ったんだけど、その二つは横に並べるのね。
そんでお互いに接してる部分だけサイズ変更ってどうやるんでしょう?
↑エクスプローラのフォルダ表示エリアとファイル表示エリアみたいな関係にしたいのです。
 フォルダ表示エリアの幅を広げると、ファイル表示エリアの幅が狭くなるって感じで。
CreateWindowのスタイルでWS_SIZEBOXとかやると、
4辺全部変えられるようになっちゃうし。
教えて下さいー。
0123デフォルトの名無しさんNGNG
>>122
IEのフレームみたいなのか?
あれはMFCではできるけどAPIだと自力でどうにかしろだったと思うが。
0124デフォルトの名無しさんNGNG
GetWindow(hWnd,GW_OWNER)で0を返すウィンドウのリスト(タスクマネージャのような。)
を作り、それぞれのウィンドウのサイズやZオーダーを変更したり最小化・最大化しようとして
それぞれのウィンドウへSendMessageしたのですが、最小化などはできるのですが
サイズ変更やZオーダーは変更できないウィンドウがあります。
具体的にはDelphi製のソフトが該当するようなのですが、
Zオーダーなどの変更方法としてこの方法は間違っているのでしょうか?
間違っているのならどのような方法をとればよいのでしょうか?
0125デフォルトの名無しさんNGNG
Delphi製のソフトって、目に見えているウインドウが最上位のウインドウではなく、
その上にもう一つウインドウがある。
0126デフォルトの名無しさんNGNG
Delphi製アプリは不可視のトップレベルウィンドウとそれに所有される
メインフォームという構造になってる
たぶんその関係では?
0127126NGNG
>>125
式はいつにしますか?
0128124NGNG
不可視ウィンドウから可視ウィンドウ(メインフォームウィンドウ?)を
取得するにはどうすればよいのでしょうか?
0129デフォルトの名無しさんNGNG
>>127?
0130124NGNG
内容がかぶったのでケコン→ケコン式はいつにしますかということだと・・・

不可視ウィンドウとはクラス名TApplicationというやつぽいですが
これ以外の同キャプションをメインフォームと判断するのは
ちょっと乱暴なやり方でしょうか・・
0131デフォルトの名無しさんNGNG
別ユーザとして他のプロセスを起動したいんですが、LogonUser()でうまくいきません。

LogonUser( TEXT( "Administrator" ), TEXT( "." ), TEXT( "password" ),
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken );

こんな感じなんですが、どうですか?
0132デフォルトの名無しさんNGNG
>123
そうですねー。
IEのフレームみたいなやつ。
APIでは対応してないのですかー・・・
MFCってさっぱりわからんのであきらめますかな・・・
どーもでした。
0133122NGNG
上の132は122でした。
しつれーい。
0134デフォルトの名無しさんNGNG
>>132
左右のウィンドウの間にフレーム用のウィンドウを作る。
そのウィンドウがドラッグされたら左右のウィンドウのサイズを調整。
0135デフォルトの名無しさんNGNG
>>130
列挙して不可視ウィンドウがオーナーになってる奴を探す
0136デフォルトの名無しさんNGNG
>>131
起動元のユーザーはTCB特権を持っていますか?
0137デフォルトの名無しさんNGNG
>>136
TCB特権って何ですか?
調べてみたんですけど、それらしいものがでません。。。
0138デフォルトの名無しさんNGNG
>>13
これじゃないの? 手元の MSDN Library だと LogonUser() API の解説に
書いてあったんだが。
> LogonUser 関数を呼び出すプロセスは、SE_TCB_NAME 特権を備えて
> いなければなりません。

ついでにサポート技術情報から。

> 注意: ユーザー マネージャ [原則] - [ユーザーの権利] で、高度なユーザー権利の
>     [オペレーティングシステムの一部として機能] をユーザーに許可することで
>     上記の権限をユーザーに持たせられます。
0139デフォルトの名無しさんNGNG
ちなみにむやみに特権を付加するのはセキュリティの問題があるからな。
SE_TCB_NAMEを付加するくらいだったら最初からAdministrators
与えとけよというくらい危険
0140138NGNG
>>139
話が逸れるんだが、Win32 の特権について詳解している書籍とかって知ってる?
MSDN Library にはパラパラとは書いてあるんだが、全体像を把握しかねてて。
0141デフォルトの名無しさんNGNG
DelphiのTApplicationウィンドウは可視という罠
0142デフォルトの名無しさんNGNG
質問なのですが
Sleep関数の精度っていうのはどの程度なのでしょうか?
どうも1ミリ秒単位で正確ではないようなのですが。

やはり正確さを取るには
for(dwTime=timeGetTime()+10; timeGetTime()<dwTime; Sleep(0));
のようにするか、for文の中でQueryPerformanceCounterを回して
時間の差を判定するしかないのでしょうか。

でも、こうするとやたら重くなるのでできればSleepのような軽い関数が
あればいいなぁ・・・
0143デフォルトの名無しさんNGNG
timeGetTime()だってSleep()と同じ精度だろ。
0144ssssssNGNG
>>122
今回の場合に使えるかどうか分からないけど、
WM_NCHITTESTを処理すれば、
特定の辺だけサイズ変更できる(マウスでドラッグできる)
ってことができるんじゃないかと思います。
0145デフォルトの名無しさんNGNG
>>142
 正確な時間を何の為に欲しいの? 
Win32アプリだと QueryPerformanceCounterを使っても スレッドが割り込まれると駄目だしさ
0146YahooBB237224045.bbtec.netNGNG
100万回は既出だと思いますが,jpg画像 を表示
する段取を初心者用に
書いたアーティクルはないもんでしょうか.
「猫でもわかる」その他検索しましたが見つけられません.
スージプラグインとか必須ですか?
0147142NGNG
>>143
違います。
timeGetTime()は1ミリ秒ですが
Sleepは最低5ミリ秒くらいの精度になります。

>>145
ある一定の間隔でポートから出力したいんです。
±0.1ミリ秒程度の精度が欲しいのですが、やはり無理なのでしょうか。
0148デフォルトの名無しさんNGNG
>>142
RDTSC
0149デフォルトの名無しさんNGNG
>>146
http://www.google.co.jp/search?q=StretchDIBits+jpeg

>>147
 殆ど使われてない マザーのbeep機能を使ったらどう?
0150JPEG特許問題NGNG
>>146
前スレでOleLoadPicturePathを教えてもらいますた。
環境により使用関数は変わりそう。
0151デフォルトの名無しさんNGNG
メモリを追加/解放したい時って VirtualProtect で
要求サイズを変更すればいいんでしょうか?
その場合元のメモリの内容は保障されてるのでしょうか?
よろしくお願いします。
0152デフォルトの名無しさんNGNG
いっそのことDirectMusicのアレを使うとか。重いが。
01531NGNG
d
0154デフォルトの名無しさんNGNG
>>146
JPEGは特許がやばいからやめとけ。
0155 NGNG
>>151
悪いことは言わないから、おとなしくmalloc/freeを使っとけ。
0156DELLNGNG
図形を移動させる方法を教えてください。
VBの場合ならshape1.move x,y でできましたが、

APIはRectangle(hdc,x,y,x+10,y+10);
をどこのプロシージャで使えばいいか分かりません。

しかも上記のアルゴリズムでは移動するということではなく、
次々と新規に描かれていくように思えます。

だれか図形を移動させる方法教えてください。
0157デフォルトの名無しさんNGNG
>>155
VirtualProtectってCなの?
C++ならnew/deleteだと思われ
0158デフォルトの名無しさんNGNG
>>157
きみはこのスレで何を言ってるのかね
0159デフォルトの名無しさんNGNG
SetWindowRgn() では WM_PAINT が発生しますか?
もしそうだと case WM_PAINT: でこれをつかったら
∞ループにはまりますよね.
0160デフォルトの名無しさんNGNG
日本では拒絶されるらしいって書いてるけど
http://www.matsusaka-u.ac.jp/~okumura/compression/jpegpat.html
0161151NGNG
>>155
いぢわるしないで教えてください。
malloc/free に当たる処理を作りたいんです。

>>157
realloc に当たる処理が無いですけどね < new/free
普通は std::vector 使うから。


というか VirtualAlloc が成功しないです…。
何が悪いんだろう…
とりあえず某 VB のサイトにあった引数を参考にして試してるのですが…。
VirtualAlloc (NULL, 4096, MEM_COMMIT, PAGE_READWRITE | PAGE_NOCACHE );
環境は Windows2k です。
アドバイスお願いします。
0162デフォルトの名無しさんNGNG
RegisterClassに渡すウィンドウクラスの名前は、全角文字でも問題ないですか?
もしかしたら、NT系/非NT系によりますか?
0163デフォルトの名無しさんNGNG
> SetWindowRgn() では WM_PAINT が発生しますか?

最後のパラメータを false にすると発生しないと思う

> もしそうだと case WM_PAINT: でこれをつかったら

普通、そんなに頻繁にウィンドウリージョンを設定しないだろ
0164デフォルトの名無しさんNGNG
>>162
普通そんなこと誰もしない=誰も知らないバグが残ってる可能性がある
やめとけ。
0165デフォルトの名無しさんNGNG
>>161
ノーキャッシュをはずしたらどうよ?
0166デフォルトの名無しさんNGNG
>>161
PAGE_NOCACHE
が怪しい。こんなものはまず使わん。
0167166NGNG
またケコーン…
0168165NGNG
>>167
たいせつにするよ。
0169151NGNG
>>165, >>166
ケコーンおめでとうございます。

ちょっと簡略化の為に嘘書いてました。
要求サイズをページサイズ分に切り上げる処理を書き間違ってて
中途半端なサイズを要求していた事が原因でした。

で、やっぱり VirtualProtect でサイズを変えることは出来ないんでしょうか?
0170コギャルとHな出会いNGNG
http://kado7.ug.to/net/


朝までから騒ぎ!!
   小中高生
 コギャル〜熟女まで
   メル友
  i/j/PC/対応

女性の子もたくさん来てね
  小中高生大歓迎です                 
全国デ−トスポット情報も有ります。
全国エステ&ネイル情報あります。

  激安携帯情報あります。
0171 NGNG
>>169
どうやっても無理。おとなしくmalloc/free使っとけって。
0172デフォルトの名無しさんNGNG
>>169
自分ででっかいプールをつくったら?
0173151NGNG
>>171
やっぱり Heap系じゃないと増分は無理なんですか?
そういう書き方だと教えてくれてるのか煽りなのか区別がつかないもので…。

>>172
でっかいプールを作るのに VirtualAlloc を使いたいんですよねー
0174デフォルトの名無しさんNGNG
前スレでマウスの変位が右から左にどんどん移動するような
グラフを書きたいといって、
右端で直線を引きながら
BitBlt(memdc, 0, 0, 520, 460, memdc, 1, 0, SRCCOPY);
(memdcは裏画面のデバイスコンテキスト)
というようにすれば右から左に流れるような直線が書けると
教えていただいたのですが、これだとやはり時間がかかってしまいます。
何か高速な画面の移動の方法は無いでしょうか。
0175デフォルトの名無しさんNGNG
>>174
XOR
0176デフォルトの名無しさんNGNG
>最後のパラメータを false にすると発生しないと思う

なるほろ.
しかしそれではせっかく設定したリージョンが..

0177デフォルトの名無しさんNGNG
>>175
早レスありがとうございます。

XORっていうのは、
LineToを呼んで、背景色と色AのXORの色Bで直線を描画して、
今度は色Bの上から色Aで描画すれば背景色に戻る
っていうので合ってるでしょうか?

LineToを何度も呼ぶことになると思いますが、その方が高速なんでしょうか。
0178 NGNG
>>173
煽っているつもりは全くないのだが。
VirtualProtectはメモリの保護モードを変更するものなので、
サイズを変更することはできない(てか、ヘルプ読めよ)。

unixのbrkのような使い方をしたいのであれば、
あらかじめVirtualAllocで巨大な領域をreserveしておいて、
必要になった時点でcommitすることで、似たような動作にすることはできる。
■ このスレッドは過去ログ倉庫に格納されています