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

Win32API質問箱 Build63

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/03/04(火) 12:15:58
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。

過去スレ、関連リンクは>>2-10くらい。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn2.microsoft.com/library/)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで

- Win32API質問箱 wiki
http://wiki.livedoor.jp/program1/d/FrontPage

【前スレ】
http://pc11.2ch.net/test/read.cgi/tech/1202060403/
0091デフォルトの名無しさん2008/03/07(金) 12:31:50
>>59
その名前のファイル置いてやってみたけど特に問題ないな。
XP SP2 で NTFS のパーティション。

デジカメでフォーマットしたSDとか、そういう変なボリュームを相手にしてない?
(だからってバッファオーバーランは困るけど)
0092デフォルトの名無しさん2008/03/07(金) 12:47:17
C:\がSDカードとかあり得なくね?
0093デフォルトの名無しさん2008/03/07(金) 13:15:09
うちのB:\はsubstしたデスクトップフォルダ
0094デフォルトの名無しさん2008/03/07(金) 14:16:30
いやC:\以外はどうにでも出来るだろw
0095デフォルトの名無しさん2008/03/07(金) 17:11:47
学校にD:にOS入ってて、USBメモリとか挿すとC:として表示されるPCが1台あるんだが
0096デフォルトの名無しさん2008/03/07(金) 17:21:56
>>95
やめときなされ
事実を語っても推奨される環境云々って自説に固執するオバカが騒ぎ出すだけだから
無知は無知のまま放って置けばよいのだ
0097デフォルトの名無しさん2008/03/07(金) 18:08:02
そういえばPC-98とかでC:がFDDだと動作しないソフトがあったな
0098デフォルトの名無しさん2008/03/07(金) 18:12:02
98はAから始まってたし、どーなんだろ
0099デフォルトの名無しさん2008/03/07(金) 21:48:01
>>90
IPropertyUI
0100デフォルトの名無しさん2008/03/08(土) 00:48:20
98 もなにも、今でもフロッピーは A だっしょ。
A, B がフロッピー用に空けられていて、
HDD が C からなのが通例。
あくまで通例であってそうしないといけないわけじゃないが。
0101デフォルトの名無しさん2008/03/08(土) 00:51:26
                |
                |
                |
                |
     /V\        ,J>>100
    /◎;;;,;,,,,ヽ
 _ ム::::(;;゚Д゚)::| ジー
ヽツ.(ノ::::::::::.:::::.:..|)
  ヾソ:::::::::::::::::.:ノ
   ` ー U'"U'
0102デフォルトの名無しさん2008/03/08(土) 00:53:25
>>101
0103デフォルトの名無しさん2008/03/08(土) 00:57:35
>>100
ネタなのかPC-98を知らないゆとり世代なのか
0104デフォルトの名無しさん2008/03/08(土) 01:06:31
>>103
あの時代は HDD はそんな一般的じゃなくて、
フロッピー2枚差しが普通だっただろ?
その時代、ドライブレターは頭から A, B と振ってた。
そこに HDD がやってきて、それがフロッピーの次の C から振られるようになって、
その後フロッピーが1つしかなかったりそもそも無くなったりすることが増えたけど、
結局 HDD のドライブレターは C から振られるので定着してしまっていた、
という流れだと思っていたのだが。
0105デフォルトの名無しさん2008/03/08(土) 01:12:14
PC/AT互換機はABドライブがフロッピー用に予約されてて
テープメディア等を繋ぐとC以降が割り当てられた。
拡張FDDをつければCがFDDにもなる。
その後、テープメディア等からHDDに変わったけど
ABドライブは相変わらずフロッピー用に予約されてる。

そんな事知らないNECが作ったPC-98は起動ドライブが無条件でAになる。
こっちの方が分かり易いとでも思ったんだろうな。
だから、HDDから起動すればHDDがAドライブになる。
Cドライブに固定するのは確か出来なかった気がするけどもう忘れた。
0106デフォルトの名無しさん2008/03/08(土) 01:18:05
そうだったっけ。
もう記憶があやふやだな・・・。
0107デフォルトの名無しさん2008/03/08(土) 01:31:44
PC98のせいでPC普及が遅れたのか
PC98のおかげでPCが普及したのか

どちらにせよPC98独自ルールになれてた漏れは
Win95からAT互換機移るときに苦労した思い出がある
DOSゲーやりたいがためにWindows95が出た後もPC98買ってた馬鹿がここに一人いますよ
0108デフォルトの名無しさん2008/03/08(土) 01:38:43
DOSの頃はNEC PC98の方がVRAMいじり易くて好きだったな。
0109デフォルトの名無しさん2008/03/08(土) 01:40:10
0番地弄くりまくれる
0110デフォルトの名無しさん2008/03/08(土) 01:43:06
VALUESTAR 買ったな。
当時はまだ PC98 買う人はいた気はする。
0111デフォルトの名無しさん2008/03/08(土) 01:50:08
PC98じゃなくてPC-98だろ
0112デフォルトの名無しさん2008/03/08(土) 01:58:51
昭和61年生まれの俺だってPC-98ぐらい知ってるよ。
ゆとり世代馬鹿にすんな。
0113デフォルトの名無しさん2008/03/08(土) 02:02:13
そこら辺は突っ込んだら負けかなと思った
0114デフォルトの名無しさん2008/03/08(土) 02:02:39
平成元年生まれだがPC-98知ってるぞ
実機は見たことないが
ゆとり世代馬鹿にすんな。
0115デフォルトの名無しさん2008/03/08(土) 02:23:50
昭和生まれなので、amiga使ってました
ビデオトースターとか
0116デフォルトの名無しさん2008/03/08(土) 02:50:29
馬鹿はいつまでたっても馬鹿
馬鹿はいつの時代にもいる
馬鹿は量産される
0117デフォルトの名無しさん2008/03/08(土) 03:10:58
そろそろお別れのお時間となりましたのでドライブレターの話は終了
0118デフォルトの名無しさん2008/03/08(土) 03:13:16
もう終わってるのだが。
0119デフォルトの名無しさん2008/03/08(土) 03:14:49
ここまで誰もスレ違いと指摘していないことに驚きを禁じ得ない
0120デフォルトの名無しさん2008/03/08(土) 03:34:44
お題に沿った話は「ググれば?」「思い違いだよ」のパターンで固定化されちまってるから・・
0121デフォルトの名無しさん2008/03/08(土) 03:43:58
ちなみにPC/ATのFDDはドライブが1台しかなくても
A:/B:どちらでもアクセスできるようになっていた
PC-98の場合は・・・
0122デフォルトの名無しさん2008/03/08(土) 03:46:05
USB-HDとかネットワークドライブとかを
いっぱいマウントしてD〜Z使い果たしているPCで
さらにマウントするとBにマウントされたのに感動
0123デフォルトの名無しさん2008/03/08(土) 04:56:50
うるせーだまれRAIDぶっ壊すぞ
0124デフォルトの名無しさん2008/03/08(土) 09:39:06
>>105
PC-98でも、Windows 2000を新規インストールすると、
起動するHDDパーティションがC:になるって聞いたことがある。
0125デフォルトの名無しさん2008/03/08(土) 10:19:31
質問スレは雑談を始める奴が出たしたら終わり。
そしてそれを咎める奴を無視したり叩いたりしたら再起不能。
0126デフォルトの名無しさん2008/03/08(土) 10:57:04
>>124
初期のPC-98と最近の(今でもあんのか知らんが)PC98は違うよ
0127デフォルトの名無しさん2008/03/08(土) 11:58:20
エロゲーなどで、
フルスクリーン時にマウスカーソルをウィンドウ上部に持ってくると、
上からタイトルバーがにょきっとスライドして出てくるものがありますが、

にょきっと出現させるAPIがあるのでしょうか?
それとも自前のプログラムですか。
0128デフォルトの名無しさん2008/03/08(土) 12:04:45
>>127
SetMenuNyoki
0129デフォルトの名無しさん2008/03/08(土) 12:11:25
そんなのあるんですね、調べてみます。
0130デフォルトの名無しさん2008/03/08(土) 12:15:20
むりやりAPIの話に戻した感が否めない
0131デフォルトの名無しさん2008/03/08(土) 12:23:55
>>128
パラメータkwsk
0132デフォルトの名無しさん2008/03/08(土) 12:29:21
DirectGDI+の話?
0133デフォルトの名無しさん2008/03/08(土) 12:39:49
SetMenuNyoki( HWND hParentWnd,HWND hMenuWnd,BOOLEAN bOpenHide,LPVOID pVoid )

ParentWnd 親ウインドウハンドル
hMenuWnd メニューのハンドル
bOpenHide TRUE:メニュー表示、FALSE:メニュー隠す
pVoid     拡張のための予約。NULLに設定。
0134デフォルトの名無しさん2008/03/08(土) 12:43:17
オンマウスオーバー処理は?
0135デフォルトの名無しさん2008/03/08(土) 12:47:17
ああいうアニメーションてどうやってるんだろう
動いてる間UIスレッド止まったりしないし
VistaのスクロールバーからMouseLeaveで徐々に色が消えるやつとか
01361272008/03/08(土) 12:47:26
>>128
ちょっと本気でググってしまいました。

>>132
DirectXでできるんでしょうか?

素人考えですが、
タイトルバーが上からスライドしてくるということは、
その分、押し出される感じでクライアント領域が下にずれるから、
画面の描画内容が動かないようにするためには、
描画位置をその分上にスライドしないといといけないのかなと、
思うんですが、どうなんでしょうか。
0137マジレスでごめん2008/03/08(土) 12:53:35
つ ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwinui/html/_win32_animatewindow.asp
0138デフォルトの名無しさん2008/03/08(土) 12:55:35
へーこんなのあるんだ
>>127じゃないけどためになった

ただゲーム以外でどこで使うのか思いつかない
0139デフォルトの名無しさん2008/03/08(土) 12:59:21
そのエロゲー作ってる会社に入って技術盗んでくればいいだけの話
ここで聞くな
01401272008/03/08(土) 13:11:27
>>137
ありがとうございます。
こんなAPIがあるとは。
タイトルバーだけに適用できるんでしょうか。
0141デフォルトの名無しさん2008/03/08(土) 13:37:33
対象はウィンドウ。流行らなかったけど画面のはじにカーソルを持ってくるとにょきっとタスクバーが
表示されるようなアプリケーションで使われる。
0142デフォルトの名無しさん2008/03/08(土) 13:52:59
タイトルバーだけのウィンドウを作っておくとか
0143デフォルトの名無しさん2008/03/08(土) 13:59:42
エロゲー会社の技術力って半端ないな
IT業界みんなの憧れだわ
01441272008/03/08(土) 14:25:04
思い返すと、にょきっと出るゲームはごく一部で、
多数のゲームは単純にタイトルバーを表示していただけかもしれません。

タイトルバーだけのウィンドウと、
クライアント領域だけのウィンドウを作って、
AnimateWindow(hTitleWnd, 600, AW_SLIDE | AW_VER_POSITIVE);で、
タイトルバーウィンドウだけ、にょきっと出してみようと思います。

>>143
初心者が2chで質問して、2時間であたりがつく技術。
半端ないですね。
0145デフォルトの名無しさん2008/03/08(土) 15:08:55
IEの全画面表示でもSetMenuNyoki使われてるね。
0146デフォルトの名無しさん2008/03/08(土) 15:16:01
Nyoki言うなw
0147デフォルトの名無しさん2008/03/08(土) 16:34:25
Visual Studioで各種ツールバーを自動的に隠す、の設定にしてる時のあれでないの?
0148デフォルトの名無しさん2008/03/08(土) 17:21:17
#define SetMenuNyoki(hParentWnd, hMenuWnd, bOpenHide, pVoid) \
    AnimateWindow(hMenuWnd, 200, (bOpenHide) ? AW_SLIDE : AW_HIDE)
0149デフォルトの名無しさん2008/03/08(土) 17:45:03
Windows98の出荷年以前までは実際Koeiも真っ青ってなエロゲメーカがゴロゴロしてたんだけどねぇ
0150デフォルトの名無しさん2008/03/08(土) 19:50:21
BOOL WINAPI DllMain(HINSTANCE hInst, WORD wReason, LPVOID lpReserved)
{
switch(wReason)
{
case DLL_PROCESS_ATTACH:
VERBOSE(DLLTEXT("Process attach.\r\n"));
break;

case DLL_THREAD_ATTACH:
VERBOSE(DLLTEXT("Thread attach.\r\n"));
break;

case DLL_PROCESS_DETACH:
VERBOSE(DLLTEXT("Process detach.\r\n"));
break;

case DLL_THREAD_DETACH:
VERBOSE(DLLTEXT("Thread detach.\r\n"));
break;
}
ユニドライバの最初にこうあるのですが、それぞれのメッセージは
どのようなときにおくられてくるのですか?またVERBOSEとはなんでしょうか?
0151デフォルトの名無しさん2008/03/08(土) 19:53:54
もうググレカスとしかいえない
0152デフォルトの名無しさん2008/03/08(土) 20:01:09
かもく or うざったモード
0153デフォルトの名無しさん2008/03/08(土) 21:21:06
いいから説明しろよカス
0154デフォルトの名無しさん2008/03/08(土) 21:36:13
それぞれのメッセージは
Process attach.のときにおくられてくる
Thread attach.のときにおくられてくる
以下略
0155デフォルトの名無しさん2008/03/08(土) 21:45:20
>>150
お前ってさ自己中で友達とかいないだろw
0156デフォルトの名無しさん2008/03/08(土) 23:36:13
ビットマップ画像のサイズを調べるときに、以下のような処理をしてるんですが、
描画するわけでもないのに、画像読込、解放してるのが凄く無駄な気がします。
サイズ取得用のAPIなど、もっといい方法ってないでしょうか?

BITMAP bmp;
HBITMAP hbmp = (HBITMAP)LoadImage(hInst, <画像のパス>, IMAGE_BITMAP, 0,0, LR_LOADFROMFILE);
GetObject(hbmp, sizeof(BITMAP), &bmp);
width = bmp.bmWidth; //画像幅取得
height = bmp.bmHeight; //画像高さ取得
DeleteObject(hbmp);
0157デフォルトの名無しさん2008/03/08(土) 23:47:01
ビットマップならヘッダに書いてると思うけどそういう事じゃなくて?
0158デフォルトの名無しさん2008/03/08(土) 23:47:43
CreateFileして24バイト読み込む

最初の14バイトがBITMAPFILEHEADER
以降がBITMAPINFOHEADER
0159デフォルトの名無しさん2008/03/08(土) 23:48:24
ごめんw
24じゃなくて54バイトw
0160デフォルトの名無しさん2008/03/08(土) 23:49:32
http://www.umekkii.jp/data/computer/file_format/bitmap.cgi
ここ見て必要なデータを直読みするといいよ
0161デフォルトの名無しさん2008/03/09(日) 00:00:06
どうもありがとうございます。
ヘッダから読み込むことにします。
0162デフォルトの名無しさん2008/03/09(日) 00:41:35
ここで質問するべきなのか迷いましたが、該当するようなスレがないようなので質問させていただきます

指定のフォント、フォントサイズで文字列の画面上でのサイズを計算したいのですが、
どんなAPIを使えばできますか?
0163デフォルトの名無しさん2008/03/09(日) 00:47:04
GetTextExtentPoint32
0164デフォルトの名無しさん2008/03/09(日) 00:48:46
>>163
即レスありがとうございます!
助かりました
0165デフォルトの名無しさん2008/03/09(日) 01:47:55
なんか2つとも同じ質問が最近出たような・・・
0166デフォルトの名無しさん2008/03/09(日) 01:48:57
気にするなよ( ´_ゝ`)
0167デフォルトの名無しさん2008/03/09(日) 10:39:25
main()で開始したコンソールに対して、
プログラム内部からSetWindowLongを試みたところ

GetLastErrorで5番のアクセス拒否が返ってきたのですが
これはやっちゃいけないことなんでしょうか
0168デフォルトの名無しさん2008/03/09(日) 10:45:29
コンソールはcmd.exeの所有なんじゃね
0169デフォルトの名無しさん2008/03/09(日) 10:48:39
システムのメッセージを間借りして、自分の送りたい情報をSendMessageで送ってもいいものでしょうか?

例えば、
::SendMessage(hParent, WM_PARENTNOTIFY, MAKEWPARAM(WM_NCDESTROY, id), (LPARAM)hWindow);
の様な感じで
0170デフォルトの名無しさん2008/03/09(日) 10:51:53
と言うことはコンソールに拡張スタイルを適用するのは難しいですか
ありがとうございました
0171デフォルトの名無しさん2008/03/09(日) 10:53:42
>>169
なんでもおkという訳ではないけど、そういう使い方をするものは存在する

WM_HITTESTとか
0172デフォルトの名無しさん2008/03/09(日) 10:57:07
いやWM_APPでも使えば良いだけの話だろ
0173デフォルトの名無しさん2008/03/09(日) 11:17:11
>>171
ウインドウの終了を親ウインドウで捕まえたいのですが、POPUPスタイルだったり、MDIの子ウインドウだったりした場合
WM_PARENTNOTIFYを捕まえることが出来ないので自分で明示的に送ろうかと思ったのですが問題がでたらいやだなぁと思い
質問させていただきました

>>172
たしかに、WM_APPを使うのが楽でいいのですが...
オリジナルのWindows用クラスライブラリで使うので、WM_APPの使用は極力避けたいのです
0174デフォルトの名無しさん2008/03/09(日) 12:13:34
RegisterWindowMessage
0175デフォルトの名無しさん2008/03/09(日) 15:38:16
_beginthreadex を使用したプログラムで、MSDNには

abort、exit、_exit、または ExitProcess を呼び出したスレッドがあると、
すべてのスレッドが終了します。

と書かれていたのですが、明示的に終了関数を呼ばない場合
スレッドは生きたままになるのでしょうか?
0176デフォルトの名無しさん2008/03/09(日) 15:58:32
>endthread や endthreadex は、パラメータとして渡されたルーチンからスレッドが戻ると自動的に呼び出されます。
0177デフォルトの名無しさん2008/03/09(日) 16:09:46
>>175
普通に組むと、
エントリポイント - CRTのスタートアップ関数 - main/WinMain
という構造になる。
VC2005のCRTだと、main/WinMainから帰ってきた後で_exitが呼ばれているので、
その結果他のスレッドも終了させられる。

微妙にスレ違いなネタの気がしなくもないな。
01781752008/03/09(日) 17:44:51
>>176,177
とんくす。それが知りたかった。
0179デフォルトの名無しさん2008/03/10(月) 00:21:01
サイズ復元ボタンを持っているけれど、
クライアント領域がないタイトルバーだけのウィンドウって、
どうやって作ればいいんでしょうか。
0180デフォルトの名無しさん2008/03/10(月) 00:31:23
ttp://www.google.com/search?q=%22%E3%82%B5%E3%82%A4%E3%82%BA%E5%BE%A9%E5%85%83%E3%83%9C%E3%82%BF%E3%83%B3%22

> "サイズ復元ボタン" に一致する日本語のページ 1 件中 1 - 1 件目
0181デフォルトの名無しさん2008/03/10(月) 00:32:33
リサイズ禁止にした上でウィンドウの高さをタイトルバーの高さに合わせれば
0182デフォルトの名無しさん2008/03/10(月) 00:37:07
>>180
「元のサイズに戻す」ボタンでした。
0183デフォルトの名無しさん2008/03/10(月) 00:52:39
ウインドウ作成するときに
ウインドウサイズを指定できるけど
クライアントサイズから
ウインドウサイズを算出することはできない?
0184デフォルトの名無しさん2008/03/10(月) 00:54:50
AdjustWindowRect
0185デフォルトの名無しさん2008/03/10(月) 00:57:02
NyokiWindowRect
01861792008/03/10(月) 01:00:10
>>181
最大化も最小化もしていないので
「元のサイズに戻す」ボタンが表示されなくて、
でも、最大化してしまうとクライアント領域ができてしまいます。

>>183
なんか丁度10分前くらいに作ったので。どうぞ。
void getWindowSize(WORD clientW, WORD clientH, WORD* pWindowW, WORD* pWindowH, DWORD style) {
RECT rect = {0,0,clientW, clientH};
AdjustWindowRect(&rect, style, FALSE);
*pWindowW = (WORD) (rect.right - rect.left);
*pWindowH= (WORD) (rect.bottom - rect.top);
}
0187デフォルトの名無しさん2008/03/10(月) 01:04:01
メニューバーやスクロールバー等を考慮するとAdjustWindowRectでは対処出来ないので、
実際に表示してから目的の状態になるまでリサイズを繰り返すしかない。
0188デフォルトの名無しさん2008/03/10(月) 01:10:23
メニューはAdjustWindowRectExである程度考慮してくれる。
これだって完璧にやってくれるわけではないけど。
0189デフォルトの名無しさん2008/03/10(月) 01:26:03
>>186
なぜWORDなのか理由を聞きたい
0190デフォルトの名無しさん2008/03/10(月) 01:27:55
NyokiWiki希望
0191デフォルトの名無しさん2008/03/10(月) 01:40:22
>>189
深い理由はないけど、
サイズ4294967296みたいなウィンドウを作る予定はなかったので。
■ このスレッドは過去ログ倉庫に格納されています