トップページ⇒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
0046デフォルトの名無しさんNGNG
それって、非圧縮GIFが使えなくならね?
0047デフォルトの名無しさんNGNG
>>45
なるほど。ありがとうございます。
その方法で試してみます。
0048デフォルトの名無しさんNGNG
>>39
嘘だと思うなら、やってみれば。

確かに解像度は変えられるが、戻ったときに「うげ」となるから。
0049デフォルトの名無しさんNGNG
フルスクリーンな話
http://home7.highway.ne.jp/nomura_y/prog000.htm
0050デフォルトの名無しさんNGNG
Win2k系ではChangeDisplaySettingsを使うと、
各ウィンドウの位置・サイズがおかしくなるみたいですね。
ちなみにうちの98SEの場合は問題ありません。
0051デフォルトの名無しさんNGNG
>>48
だからCDS_FULLSCREENがあるんだろ
環境次第だというならうちのWin2kではDirectX使っても
ウィンドウが勝手に移動しますが何か?
0052デフォルトの名無しさんNGNG
>>51
> うちのWin2kではDirectX使ってもウィンドウが勝手に移動しますが
後始末はしっかりやってる? 俺の環境でも、後始末のタイミング次第で
ウィンドウサイズが復元されない場合があった。
0053デフォルトの名無しさんNGNG
3D迷路のスクリーンセーバーってどうやって解像度切り替えてるの?
Dependency Walkerで見る限りでは明らかにChangeDisplaySettings
使ってるのにWin2kでもウィンドウサイズおかしくなったりしないんだけど
0054デフォルトの名無しさんNGNG
どうしても自前のソート関数で並び替えをしたくて、
オーナー描画のコンボボックス(ドロップダウン)を作ったのですが、
リストから選択すると、テキストボックスに変な文字列が表示されます。
恐らくコンボボックスがテキストだと思ってアイテムデータのアドレスを
テキストボックスに渡しているのだと思うのですが、
CBS_HASSTRING をつけると WM_COMPAREITEM 飛んでこないし、
何かいい方法はないでしょうか?
というかそもそも作り方間違ってます?
0055デフォルトの名無しさんNGNG
内部でソートして、全部挿入しなおしたらええんとちゃう?
005654NGNG
>>55
うーん、できればリアルタイムにソートしたいんですよね。
表示のたびに挿入し直しは無駄が多いような気がするので。
でも何となく雰囲気的に無理っぽい感じですね。

とりあえずソートしつつ挿入という方式でやろうと思いますが、
もしいい方法があったら引き続き情報お待ちしておりますので
よろしくお願いします。
0057デフォルトの名無しさんNGNG
あちしがListViewでやったときは、そんなに速度は変わらなかったけど?
(ただし、挿入ではなく上書きを使ったけどネ)
0058デフォルトの名無しさんNGNG
質問。
かなりレベルの低い質問で恐縮なのですが
ウインドウの背景を青にして
そのウインドウにTEXTOUT関数で文字を出力すると
文字が白い四角の中に表示されてしまいます。
どうすれば青い背景の上に文字を表示できるでしょうか?
よろしかったらお教えください。
0059デフォルトの名無しさんNGNG
>>58
SetBkMode( hDC, TRANSPARENT );
0060デフォルトの名無しさんNGNG
レスありがとうございます。
なるほど、TRANSPARENTっていう指定が
背景をそのまま残すっていう指定になるんですね。
参考になりました。ありがとうございました。
0061デフォルトの名無しさんNGNG
ListViewのエディット機能が非常に使いにくいのですが
(エクスプローラで名前の変更で使うみたいな)
エクセルみたいに軽快にEditを使いたいのですが
どうすればいいんでしょうか?
0062デフォルトの名無しさんNGNG
SHPathFromIDList
の逆で
パスからIDListに変換するのに
使用するAPIって存在しますか?
あるなら教えていただきたいのですが。
IDListについていまいちきちんと理解していないので、
見当外れなら指摘してもらえると助かります。
よろしくでお願いします。
0063デフォルトの名無しさんNGNG
起動している任意のアプリが、ダイアログかどうかを判断
するにはどうしたらよいのでしょうか?
0064デフォルトの名無しさんNGNG
「アプリがダイアログかどうか」ってどういう意味よ。
0065デフォルトの名無しさんNGNG
そのウインドウにWM_SIZEを送って大きさが変わるかどうか、ってのはどうだ?
006663NGNG
>>64-65
表現が曖昧ですいません。
考え直してみたところ、判断したいのはダイアログではなくて
ウィンドウのサイズ変更ができないアプリであり、これはウィンドウスタイルに
WS_THICKFRAMEが含まれているかどうかを判定することにより解決しました。
0067デフォルトの名無しさんNGNG
クラスのメンバ関数をウィンドウプロシージャにする方法はないでしょうか?
単純に、

WNDCLASSEX wcex;
wcex.lpfnWndProc = (WNDPROC)(this->WndProc);

とするとコンパイルエラーになってしまいます。(型変換できないと言われる)
(static関数にすればコンパイルできますが、thisを参照できないので
 困ってしまいます)
0068デフォルトの名無しさんNGNG
>>67
SetProp()でウィンドウハンドルにthisを登録すれば何とか使えます
WM_CREATEの時点では使えませんけどね
006968NGNG
>>67
捕捉、
http://techtips.belution.com/ja/vc/0009/
↑に詳しくのってた
0070デフォルトの名無しさんNGNG
>>68-69
これでうまくいきそうです。
紹介いただいたサイトもお気に入りに追加しました。
ありがとうございます。
0071デフォルトの名無しさんNGNG
OutputDebugString()の出力を表示するプログラムを作りたいんだけれど、
どこかにソース or 情報ありませんか。

(すれ立てるまでもない質問はここでに同じことを書きましたがスレ違い
でした。すんまそ。)
0072ssssssNGNG
>>71
0073ssssssNGNG
>>71
デバッガを作りたいということ?
VC++使ってりゃデバッグウインドウにそのまま表示されるけど、それじゃだめなの?
0074デフォルトの名無しさんNGNG
>>73
その、表示が出るVC++のデバッグウィンドウの部分だけを
独立したソフトとして作りたいのです。
0075デフォルトの名無しさんNGNG
>>71
MFCのソースで見たことあるな。
EditWindowを作って、新たに表示させる文字列を
REPLACEなんとかで文章の最後に置き換える形で追加していく。
0076ssssssNGNG
>>74
ほれ
http://www.anticracking.sk/EliCZ/import/msdn_debug.htm
サンプルビルドしてみたけど、うまくいかん…
がんばってくれ。
0077ssssssNGNG
>>76
これも
http://nps.vnet.ee/ftp/Docs/Asm/IczTutor/tut28.html
0078デフォルトの名無しさんNGNG
>76-77
ありがとうございます。
そろそろ終電だからその資料印刷して帰ろう。。。
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を使っても スレッドが割り込まれると駄目だしさ
■ このスレッドは過去ログ倉庫に格納されています