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

Win32API 質問箱 Build8

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

過去スレ・参考 >>2-5
0002デフォルトの名無しさんNGNG
過去スレ
Win32API 質問箱 Build7
http://pc3.2ch.net/test/read.cgi/tech/1036654893/
Win32API 質問箱 Build6
http://pc3.2ch.net/test/read.cgi/tech/1032548635/
Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/
Win32API 質問箱 Build4
http://pc3.2ch.net/test/read.cgi/tech/1023361418/
Win32API 質問箱 Build3
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Win32API【2】
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Win32API 質問箱
http://pc.2ch.net/tech/kako/991/991576947.html

参考
MSDN Online
http://www.microsoft.com/japan/msdn/default.asp
猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang/index.html
00031NGNG
>>1
乙ー
0004かおりん祭 ◇VqKAORinK6NGNG
   ∋oノハヽo∈ / ̄ ̄ ̄ ̄ ̄ ̄ ̄
     从o゚ー゚从< 新スレおめでとうございま−す♪
   = ⊂   )   \_______
   = (__/"(__) トテテテ
0005デフォルトの名無しさんNGNG
>>1 >>4
乙CurrySummer(w
0006デフォルトの名無しさんNGNG
沢村は出入り禁止だ!!
0007デフォルトの名無しさんNGNG
スタートメニューとかお気に入りの項目って
右クリックしたときと左クリックしたときで挙動が違うよね。
あれをやりたいんだけど

TrackPopupMenuで
TPM_LEFTBUTTON | TPM_RIGHTBUTTON
を指定したときに
親ウィンドウにWM_COMMANDが送られてくるんだけど、
これが右クリックか左クリックか分からない。

どうしたらいい?


0008デフォルトの名無しさんNGNG
age
0009デフォルトの名無しさんNGNG
>>7
ここだけの話、奴らはメニューのフリをした独自ウィンドウなんだ。
ナイショダヨ
0010デフォルトの名無しさんNGNG
>>9

えっ!自分で作れってこと?

サンプルはどっかにありませんか?
0011デフォルトの名無しさんNGNG
>>7
WM_COMMANDとWM_CONTEXTMENUを処理してやれば?
0012デフォルトの名無しさんNGNG
>7
> メニューのフリをした独自ウィンドウ
なんだが、不完全に似たことをするなら
> TPM_LEFTBUTTON | TPM_RIGHTBUTTON
から TPM_RIGHTBUTTON を外して
かわりに WM_MENURBUTTONUP を処理する。
0013デフォルトの名無しさんNGNG
スタートメニューは隠れAPIがあるんじゃ。
0014タスクバーのリサイズ方法NGNG
タスクバーのハンドルをFindWindowで取得して
MoveWindowでリサイズしようとしても出来ませんでした。

どなたかご教授いただけないでしょうか。
0015タスクバーのリサイズ方法NGNG
追伸:
タスクバーのスタートボタンなどはMoveWindowsでウィンドウサイズを
変更できるんです。
なぜタスクバーだけうまくいかないんでしょうか・・・。
0016デフォルトの名無しさんNGNG
携帯からだけど
ソースあげてみ

ハンドル取得するところと、ウィンドウサイズ変えるところ
0017デフォルトの名無しさんNGNG
> 携帯からだけど

わざわざ・・・
0018タスクバーのリサイズ方法NGNG
HWND hTaskbar = FindWindowEx(NULL, NULL, "Shell_TrayWnd", "");
MoveWindow(hTaskbar, x, y, cx, cy, TRUE);

携帯からとは・・・。
筋金入りの2ちゃんねらーですな。
よろしくお願いします。
0019gn355my0NGNG
んで hTaskbar の中身は確認したのか?
0020タスクバーのリサイズ方法NGNG
タスクバーのハンドルをFindWindowで取得して
MoveWindowでリサイズしようとしても出来ませんでした。

タスクバーのスタートボタンなどはMoveWindowsでウィンドウサイズを
変更できるんです。
なぜタスクバーだけうまくいかないんでしょうか・・・。

どなたかご教授いただけないでしょうか。

HWND hTaskbar = FindWindowEx(NULL, NULL, "Shell_TrayWnd", "");
MoveWindow(hTaskbar, x, y, cx, cy, TRUE);
0021デフォルトの名無しさんNGNG
実際 MoveWindow でリサイズできないウィンドウってのは作れるわけだし
ウィンドウのサイズの変更はウィンドウ側で制御できるんだから
タスクバーがそのようにしているんでないの?
002220NGNG
> 実際 MoveWindow でリサイズできないウィンドウってのは作れるわけだし
それは知りませんでした。
つまり無理だということですか・・・。
もうちょっと足掻いて駄目だったら諦めます・・・。
0023名無し@沢村NGNG
>>20
無理じゃないよ。実際windowsのタスクバーはリサイズできるわけだし…。
もっと研究してごらん?
0024デフォルトの名無しさんNGNG
さっき携帯から書いた筋金入り(重症の方が的確だな)だけど、出来た。
SetWindowPos(hTaskbar,NULL,100,100,500,500,SWP_NOZORDER|SWP_NOSENDCHANGING);

なんでこんな事をしたいのかはしらないが
0025デフォルトの名無しさんNGNG
名無し@沢村は無視で。
プログラミングしたこともないのにあれこれ突っ込むヒキコモリです。
0026デフォルトの名無しさんNGNG
メニューをフローティングツールバーのように移動できるようにする方法ないですか?
一応、猫で分かる〜のサイトは見たのですが、あれと違うアプローチの仕方ってないでしょうか?
0027デフォルトの名無しさんNGNG
>>26
C+APIでだったら地道に実装するしかないかと。

というか質問の意味を質問させて欲しい。
メニューをフローティングツールバーのように移動、というのを
もうすこし具体的に頼みます
002820NGNG
>>24
おおおっ!!
ありがとうございます。早速試させて頂きます。
実は横長画面のノートでタスクバーを横においてるんですが
なぜかシャットダウンのたびにタスクバーの幅が短くなってしまって
対策プログラムを作ろうと思ってたんです。
002926NGNG
>>27
メニューバーを、レバーコントロールみたいに、ドラッグしながら移動可能にしたいんですよ。
メニューバーってのは、文字だけの「ファイル(F) 編集(E)・・・」とかいうあれです。
0030デフォルトの名無しさんNGNG
>>29
環境は?C+APIですか?なら自分で実装するしかないです。
猫、のアプローチってどんな方法?
003126NGNG
>>30
C+Win32APIです。

猫でも分かる〜はhttp://www.kumei.ne.jp/c_lang/sdk4/sdk_311.htm
ここから説明されてるんですけど、かなり実装が面倒っぽいので
もっとスマートな方法があるんじゃないかと思って。
0032デフォルトの名無しさんNGNG
文字を表示させる関数(TextOutとか)はどれが一番使いやすいのですか?
0033デフォルトの名無しさんNGNG
>>31
いや〜面倒だと思うよ。MFCを使えばある程度簡単に実装できるだろうと思うけれど。
俺の直感では、やはりRebarを使ってなんとかやろうと思うだろうけど、
それだと猫氏のページと同じ方法だし、もしかしたら1から作る方が楽かもしれない。

シェブロンを出さなくていい&フローティング無しならば、wtlを使う方法があるが・・・
これは激簡単だけれど、ATL(C++)のかなりの理解が必要となるから、自信があるなら紹介します。
0034デフォルトの名無しさんNGNG
>>32
場合によりけりです。俺は何も考えずに表示するだけでよければ迷わずMessageBoxです。
0035名無し@沢村NGNG
>>34
俺はMessageBoxをデバッグに使ってるね。
自作のDebug関数の中に入れて、どんな型の引数でも表示できるようにオーバーロードしてるよ。
003626NGNG
>>33
やっぱり面倒ですか。
IEとかその他のアプリでも当たり前のように使われてるので
そういうAPIがあると期待してたのですが。
ATLやWTLは、今回は使いたくないので、なんとかAPIでやってみます。
ありがとうございました。
003734NGNG
>>35
あなたのことは聞いてません。
0038デフォルトの名無しさんNGNG
>>36
ちなみにRebarを使う方法はIEの存在が前提になると思います。多分。
0039デフォルトの名無しさんNGNG
>>37
かまうなって、喜ぶから。
0040デフォルトの名無しさんNGNG
物理メモリのみを確保したいんですが、どうすればいいのでしょうか?
0041デフォルトの名無しさんNGNG
>>40
VirtualLockを使えばできます。これ以上の説明も必要?
0042デフォルトの名無しさんNGNG
MSDNちょっとみてきます。
できればもうちょっと説明していただけるとうれしいです。
0043ルート大芝NGNG
Win98で、C:\にあるファイルとフォルダのパスを列挙する
プログラムを作りたいんだけど、MSDNのFindFirstFileの説明で

ルートディレクトリ内のファイルを検索するには、この関数で "C:\*"
のようなファイル名を指定し、引き続き GetFileAttributes 関数を
使ってルートディレクトリ内を検索してください。

って書いてあるけど、FindFirstFile("C:\\*", &f);は
FindFirstFileが失敗します。どうしたらいいの?
0044ルート大芝NGNG
すまんこ、FindFirstFile("C:\\*", &f);は失敗しませんでした。
0045デフォルトの名無しさんNGNG
>>42
説明はいいんだけれど、解らないことを具体的に聞いてね。
解りづらい部分だと思うから、解らないところを絞ってほしい。
0046デフォルトの名無しさんNGNG
メモリーはnewでしか確保したことなくてnew以外のWinのメモリ確保の
仕方すらまだわかってません。
で、ちょっとさがしたらVirtualAllocを使ってVirtualLockでスワップ不可にして
物理メモリに確保でよろしいのでしょうか?
0047デフォルトの名無しさんNGNG
>>46
特に難しい話ではないです。ロックしたいアドレスを指定すればいいだけ。

sample:
#include <Windows.h>
#define BUF 300

int main(void){char *p=new char[BUF];
BOOL b;
b=VirtualLock(p,BUF);
if(b==0) MessageBox(0,"","失敗",0);
else VirtualUnlock(p,BUF);
delete p;return 0;}

ここで例えば
b=VirtualLock(p,BUF*1000000);
とやると当然失敗する。
GetLastErrorはその時
1453"クォータが不足しているため、要求されたサービスを完了できません。"
になる。
0048デフォルトの名無しさんNGNG
>>47
丁寧にサンプルまでつけていただきどうもです。
ここまでしていただければよくわかります。
フリーな物理メモリは取れるようですから、
それを見た上で適量を確保すればいいっぽいですね。
OS入れなおしたばっかなんで今はできないですが、晩にでもやって報告に来ます。

ファイル解析で時間かかるんで、物理メモリのみの確保だとかなり速くなるんで楽しみです。
0049デフォルトの名無しさんNGNG
CDの挿入を検出し, かつautorunの実行の可否をプログラムから制御するには
どうしたらよいのでしょうか。
何かメッセージが飛んでくるとかいうのをどこかで読んだ気がするんですが。
0050デフォルトの名無しさんNGNG
>>49
俺が知っているのはレジストリのNoDriveTypeAutoRunだけだが…
そんなメッセージがあるのかな?
0051デフォルトの名無しさんNGNG
>>49
捕まえるとしたら
WM_DEVICECHANGE
DBT_DEVICEARRIVAL
あたりかな?
005249NGNG
IQueryCancelAutoPlayで制御できるみたいです。XP限定ですが。
0053質問NGNG
ReBarコントロールで、XPライクなLUNAインターフェースを実現するには、どうすればいいですか?

自分で勉強をしようと思いますので、マイクロソフトのMSDN内に、LUNAインターフェースに関する技術文書はありますか?
0054デフォルトの名無しさんNGNG
検索すればいいじゃん。
0055質問NGNG
>>54
そうか・・・。
あまり詳しい人はいないのか。
0056デフォルトの名無しさんNGNG
>>55
文献探しも勉強のウチ・・・
0057デフォルトの名無しさんNGNG
>>53
LUNAインターフェースとはなんぞや?
0058デフォルトの名無しさんNGNG
>>49
WM_DEVICECHANGEを拾えばよい。AUTORUNのキャンセルも出来る。
Autorunを必ず実行させるのは難しい。けど本質ではないので問題詳細は略。

詳細はここ(英文)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_extending/autorun/autoplay_reg.asp
0059デフォルトの名無しさん NGNG
SetStretchBltModeのHALHTONEの原理はどうなっているの?
色の平均化とかSDKには書いていたけど、どんなふうに平均化しているの?

ペゾルドの本でもチラッとしか書いてなかったよ。




0060デフォルトの名無しさんNGNG
>>59
激しく意味不明
0061デフォルトの名無しさんNGNG
>>60
ちったぁオツム使えや。
0062デフォルトの名無しさんNGNG
>>60
いや、だからさぁ、これを使った後に、StretchBltを使って拡大縮小する場合、
ビットマップが比較的に汚くならないでしょ?

このHALFTONEってどういうことをやっているのかなって思ったわけね。

だから、SetStretchBltModeでHALFTONEを指定して、StretchBltした
場合の内部の処理を知りたいんでした。




0063デフォルトの名無しさんNGNG
>>62
詳しく説明してくれてthx。最初HALHTONEで検索してて意味不明だった(恥
世の中に、それに関してどんな処理があるのかすら解らないです。スマソ。
ここで解決しなければ、ゲーム制作技術板に行くと詳しい人がいるかもしれません。
0064デフォルトの名無しさんNGNG
>>59
↑ペゾルドを読んだことがこいつの自慢らしい。
0065デフォルトの名無しさんNGNG
>>64
その程度は調べた、という風に解釈してやろうじゃないか。煽りは別板で
0066デフォルトの名無しさんNGNG
StretchBltで具体的にどう補間されるかってビデオカード次第だった気もするが。
いまだとテクスチャの補間と一緒にバイリニアとかトライリニアとかでやってんじゃない?
0067デフォルトの名無しさんNGNG
>>66
そういえば、GetDeviceCapsにRC_STRETCHBLTという項目があるしね。
0068質問NGNG
今、猫さんのホームページを見ながらWin32APIの勉強をしています。
http://www.kumei.ne.jp/c_lang/

で、今困っていまして・・・。
猫さんのHPの一部を抜粋↓
「dllのバージョンは5.81以降が必要です。
IE5.0以降がインストールされていれば大丈夫です。
また、生のVC++6.0ではコンパイルできません。
SPをインストールしてもヘッダファイルやライブラリは更新されないので、マイクロソフトのページなどからプラットフォームSDKを更新する必要があります。」

そのプラットフォームSDKを探しているのですが、マイクロソフトのHP内で見つかりません。
MSDNの中とかも探しているんですが・・。

どこにプラットフォームSDKがあるかご存知の方はいませんか?
このままではプログラム開発が進まなくて困ってます。
0069デフォルトの名無しさんNGNG
>>68
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
0070デフォルトの名無しさんNGNG
Win32APIのみでフレームウィンドウを使うにはどうすればいいの?
既出だったらごめん。(というか、多分既出)
0071デフォルトの名無しさんNGNG
そんぐらい検索すれ
0072質問NGNG
>>69
ありました。CoreSDKをダウンロードしてますが・・・

・・・これを見て、ウツになりました。
「Download size: 176.9 MB」
0073デフォルトの名無しさんNGNG
>>72
MSDNに付いてくるからなぁ。
MSに連絡すると、多分郵便で送って貰えるとは思うけど
0074デフォルトの名無しさんNGNG
>>70
1を読め。猫に行け。
007559NGNG
意見くれた方、ありがとうございます。

>>66の「バイリニアとかトライリニア」を参考にして考えてみます。

0076デフォルトの名無しさんNGNG
 Sendinput関数をつかって他のアプリにキー送信をしたいのですが、いい例が見つかりませ
ん。keybd_event関数は使えるのですが、マイクロソフトを閲覧するとSendinput推奨とあった
ものですから。よいものがありましたらお示しください。
0077デフォルトの名無しさんNGNG
SendInputとはまたマイナーなAPIを。
これって、一連の入力を記録する部分は自分で作らなきゃ駄目ですよね?>どなたか詳しい人

>>76
他のアプリにキー送信をしたいだけなら、sendMessageでWM_KEYDOWN等を送ればいいのでは?
SendInputでは特定のアプリに送るのには甚だしく適していません。any questions?
007876NGNG
>>77
 マイナーなんですか? 検索してもなかなか出てこない理由が分かりました。
keybd_eventを使っていたのはALT+Ctrl+○○もできるためだったのですが、
マイクロソフトのサイトで調べているとSendinput推奨とあったものですから。
sendinputだとキー入力の割り込みが発生しない等のメリットがあるようですね。
引き続きよろしくお願いします。
0079デフォルトの名無しさんNGNG
> 推奨

必須ではない。
0080質問NGNG
今、猫さんのホームページを見ながらWin32APIの勉強をしています。
http://www.kumei.ne.jp/c_lang/
開発環境は、WinXP VisualC++6です。

で、話は変わりまして、rebarにメニューをつけようとしていますが、
コンパイルエラーが出ます。
↓
error C2065: 'I_IMAGENONE' : 定義されていない識別子です。
error C2065: 'BTNS_AUTOSIZE' : 定義されていない識別子です。

この問題は猫さんのHPによると、プラットフォームSDKをインストールすれば、解決すると書いてあるのですが、インストールしてもコンパイルエラーがでます。
やはり、VisualC++6では限界があるのでしょうか?VisualC#を買ったほうがいいのでしょうか?

0081デフォルトの名無しさんNGNG
commctrl.h 参照

#if (_WIN32_IE >= 0x0400)
#define TBSTYLE_AUTOSIZE 0x0010
...

#if (_WIN32_IE >= 0x0500)
#define BTNS_AUTOSIZE TBSTYLE_AUTOSIZE
...

#if (_WIN32_IE >= 0x0501)
#define I_IMAGENONE (-2)
#endif
0082名無し@沢村NGNG
>>80
C#でやろうとすると、勉強し直しだよ。
0083質問NGNG
>>81
なるほど。私のVisualC++6に入っているcommctrl.hには、その2つ「BTNS_AUTOSIZE・I_IMAGENONE 」がないですね。
新しいcommctrl.hを入れないと駄目と言うことですね。

探してみます。
(てか、猫さんのHPの言うとおり、SDKをインストールしたんだけどなぁ・・・)
0084質問NGNG
>>82
C++.NETと言う商品があったのですね。
てか、C/C++/C#が同梱されているかと思って。
0085デフォルトの名無しさんNGNG
>>84
Comctl32.dllが5.81以降なら
#define BTNS_AUTOSIZE 0x0010
#define I_IMAGENONE (-2)
を自分で定義する。

ソースの頭の方にでも書いておく。
0086質問NGNG
新しいcommctrl.hが見つかりました。

E:\Microsoft SDK\include\CommCtrl.h

自分でコピペをしないと駄目なんですねw
自動的に更新してくれるのかと思ってまして・・・。

初心者ですいませんでした。
0087質問NGNG
ははは(笑い)

VC++6の「E:\Microsoft Visual Studio\VC98\Include」フォルダの内容を、新しい2002年バージョンに変えたところ、
見事コンパイルができました。

これで、XPライクなインターフェース開発が進みます。
ありがとうございました。みなさま。
0088デフォルトの名無しさんNGNG
>>87
インクルードファイルの参照先を変更and/or追加するのが、普通だと思われ。
0089デフォルトの名無しさんNGNG
俺はVC6でSDKをインストールしたら自動的にパスが追加されたけどな。
0090質問NGNG
>>89
たぶん、VisualStudioのインストール先ディスクパスが「C:\Program Files」でないと駄目なのでは?
私は、Eドライブに重要なアプリを入れているので。
0091デフォルトの名無しさんNGNG
>>90
C ドライブに空き容量が少ないとか、整理のためとか、そういう理由ならわかる
けど、「重要なアプリを」 という分け方に意味はあるのか?
いずれにせよ OS があぼーんしたら再インストールする羽目になるのに。
0092デフォルトの名無しさんNGNG
スクリーンセーバーを以下のようにして起動しています。

SendMessage(GetDesktopWindow( ), WM_SYSCOMMAND, SC_SCREENSAVE, 0);

ただ、これですと、2000/NTでパスワードによる保護にチェックされていても
パスワード入力のダイアログが表示されず、そのまま操作可能な状態に戻ってしまいます。
何か他に良い方法はないでしょうか?
0093デフォルトの名無しさんNGNG
>>90
自動的じゃなくてスタートメニューに追加される
Register PSDK Directories with Visual Studio
を実行したらだった。たぶん。
0094デフォルトの名無しさんNGNG
_beginthread使おうと思って、libcmt.libとmsvcrt.libをリンクし
#include <process.h>して、プロジェクトの設定でも
マルチスレッドにしたのですが

error LNK2001: 外部シンボル "_ThreadAccept" は未解決です
fatal error LNK1120: 外部参照 1 が未解決です。

とエラーが出てしまいます。
何か解決法はありませんか?
0095デフォルトの名無しさんNGNG
>>94
プロジェクトの設定が間違っているんだろう。
DebugとRelease両方とも変えた?
0096デフォルトの名無しさんNGNG
>libcmt.libとmsvcrt.libをリンクし
激しく矛盾の悪寒・・・
0097質問NGNG
コモンコントロールに関する情報が少なくてこまってます。
本屋にも行ったのですが、まったく関連する本がないですね。

REBARで質問ですが、たとえば、IEを開くとウィンドウの上部にREBARが当然表示されてますよね。
そのREBARというのは、はじめからその配置と言うのが固定化されてますが、
REBARの位置情報を設定するにはどうすればいいのでしょうか?

私も同じくREBARを配置してみましたが、ばらばらに配置されるだけで、順番良く配置されません。

できれば、位置情報の設定、そしてウィンドウを閉じる前にそのREBARの位置情報を保存し、再びウィンドウを開くときには、その保存された位置情報を元に、再現するアプリケーションにしたいです。
どうすればいいのでしょうか?
0098デフォルトの名無しさんNGNG
ToolTipを意図的に表示したいのですがどうやればいいのでしょうか?
WindowsXPとか、タスクトレイに表示されたりするから(ハードウェアの取り外しとかのメッセージ)
できるとは思うのですが解りません。
0099デフォルトの名無しさんNGNG
>>97
普通に出来ると思ったんだが。

>>98
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/tooltip/usingtooltips.asp
010098NGNG
>>99
みたけどどれだかわかんないです。。
TTM_TRACKACTIVATEあたり???
0101デフォルトの名無しさんNGNG
おまえら今日ぐらいはやさしく教えてやれよ
■ このスレッドは過去ログ倉庫に格納されています