トップページ⇒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/
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みたいなウィンドウを作る予定はなかったので。
0192デフォルトの名無しさん2008/03/10(月) 02:13:14
特に理由がないときはintにしておくのが一番効率がいいってばっちゃがいってた
0193デフォルトの名無しさん2008/03/10(月) 02:13:54
コンピューターおばあちゃん乙
0194デフォルトの名無しさん2008/03/10(月) 02:27:21
ウォーウ、ウォウ、ウォウ、ウォウォウオウ
0195デフォルトの名無しさん2008/03/10(月) 02:31:48
さてはおまいら同世代だなw
0196デフォルトの名無しさん2008/03/10(月) 02:42:07
古い世代なの?スプーンおばさんなら知ってる。
0197デフォルトの名無しさん2008/03/10(月) 02:42:46
コンピュータ、おばあちゃんときたらアビバしか思いつかない
0198デフォルトの名無しさん2008/03/10(月) 02:42:51
short main(short argc, char **argv)

こんなソースに噴いた事あるw
0199デフォルトの名無しさん2008/03/10(月) 02:52:55
なんだその滅茶苦茶な引数www
0200デフォルトの名無しさん2008/03/10(月) 02:54:02
と戻り値の型
0201デフォルトの名無しさん2008/03/10(月) 02:59:34
sizeof(short int)==sizeof(int)な処理系なんだろ
0202デフォルトの名無しさん2008/03/10(月) 03:28:03
>>191
サイズの小さい変数を使ったら速くなると思ったら大間違い。
WORDなんて中途半端に混ぜるとかえって遅くなる。
そこはRECTのメンバがLONGだから、LONGにするのが普通。
0203デフォルトの名無しさん2008/03/10(月) 03:54:48
速くしたいからなんて書いてないな
最後の一行は同意
0204デフォルトの名無しさん2008/03/10(月) 11:06:34
コンピューターおばあちゃんも明治生まれだから
もうobsoleteだな
0205デフォルトの名無しさん2008/03/10(月) 12:32:40
>>203
じゃあ遅くしたいのか
0206デフォルトの名無しさん2008/03/10(月) 12:43:23
おながいサミヤどん
0207デフォルトの名無しさん2008/03/10(月) 13:18:40
ちと質問なんですが、キーボードメッセージがどのデバイスから送られてきたかを調べて
デバイスごとに処理を振り分けるということは可能なのでしょうか?

具体的にはPS/2とUSB接続の2種類のキーボードが接続されているPCで、
PS/2キーボードでEnterキーが押された場合と、
USBキーボードでEnterキーが押された場合で処理を振り分けたいのです。
0208デフォルトの名無しさん2008/03/10(月) 13:21:08
やったことないので糞レスですまないが
そんなことを実現しているアプリはあるのでできるはず
0209デフォルトの名無しさん2008/03/10(月) 13:27:54
>>207
XP以降ならRaw Inputで区別できる。
02102072008/03/10(月) 13:58:00
>>208-209
RawInputでぐぐったらそれらしい情報が見つかりました。
これで何とかなりそうです。ありがとうございました
0211デフォルトの名無しさん2008/03/10(月) 15:23:09
できるが、WM_***よりもっと上位の部分に食い込まないと無理だろうな
0212デフォルトの名無しさん2008/03/10(月) 17:46:42
プログラム多重起動防止のため、mutexを使うことがよくありますけど、
OpenMutexでミューテックスが開けた場合、そのミューテックスハンドルを元に
ミューテックスを持っているプロセス(≒前のインスタンス)のプロセスハンドル
又はプロセスIDを得る方法ってあるんでしょうか?

頻繁に起動・終了するタイプのプロセスなので、可能ならそれを使って
WaitForSingleObjectしたいのです。
0213デフォルトの名無しさん2008/03/10(月) 17:50:13
212です。
よく考えたら開いたミューテックス自体を使って同期すればいいのか・・・
0214デフォルトの名無しさん2008/03/10(月) 18:02:59
Mutexとか面倒くせえなあ
WinMainの第二引数が使えりゃいいのに
0215デフォルトの名無しさん2008/03/10(月) 19:16:01
多重起動禁止したいときにOpenMutex()が出てくるコードは、やり方を間
違っているので注意。
0216デフォルトの名無しさん2008/03/10(月) 21:00:44
そこまで教えるならCreateMutexを使えと教えてやれよ
0217デフォルトの名無しさん2008/03/10(月) 23:32:49
多重起動禁止といえば、俺はいつもCreateMutex→CreateWindowの順で
やっていたが、CreateWindow→CreateMutexにしないと穴があるな。

既に起動しているインスタンスがあれば、そっちをアクティブにするんだけど
CreateWindowの前に多重起動の判定していると、Mutexはあるがウインドウが
ないという状況が存在するね。
0218デフォルトの名無しさん2008/03/10(月) 23:40:01
ウィンドウがあってもアクティブにできるかどうかわからんぞ
終了直前かもしれんし
0219デフォルトの名無しさん2008/03/11(火) 00:33:30
面倒くさいから、多重起動できちゃったら
「あたり。今日はちょっといいことあるかも」
ってことにしよう。
0220デフォルトの名無しさん2008/03/11(火) 00:49:27
そもそも本当に多重起動を防止すべきソフトなんて限られてると思うが
0221デフォルトの名無しさん2008/03/11(火) 01:19:00
Mutexハケーンしたらタイマー掛けてWindow探せばイイだけじゃないの?
0222デフォルトの名無しさん2008/03/11(火) 02:22:57
>>217
「Win32/C++マルチスレッドプログラミング詳説」
CreateMutexでOwnerを設定し、ウィンドウができたらReleaseMutex
別スレッドはWaitFor
0223デフォルトの名無しさん2008/03/11(火) 06:38:37
普段は多重起動できないのに肝心な時に腐るほど大量に起動してしまうタスクマネージャw
0224デフォルトの名無しさん2008/03/11(火) 09:55:07
あるある
0225デフォルトの名無しさん2008/03/11(火) 10:39:18
Winampって普通多重起動しないじゃんか。
曲を開く度にWinampが起動したら困るっしょ。
だけど、Vistaのエクスプローラで複数選択してコマンドバーから
Winampのアイコン押すと、選択した数だけWinampが起動する。凄い。ヤバい。
0226デフォルトの名無しさん2008/03/11(火) 10:41:01
そうだね。宇宙ヤバイね。
0227デフォルトの名無しさん2008/03/11(火) 11:26:54
他プログラムがファイルに書込んでるんですが、
この書込みが終了したことを知るAPIってありますか?
0228デフォルトの名無しさん2008/03/11(火) 11:38:34
APIレベルじゃムリじゃねーかな
0229デフォルトの名無しさん2008/03/11(火) 12:32:35
書込禁止共有でオープンできるか否か
0230デフォルトの名無しさん2008/03/11(火) 16:03:08
RegSaveKey でレジストリをファイルに落としたのですが、出力するファイルがバイナリのレジストリでした。
レジストリをテキストのレジストリファイルする API などありませんでしょうか。
0231デフォルトの名無しさん2008/03/11(火) 16:34:25
そのテキストの形式は?
regedit.exe互換にしたいということ?
0232デフォルトの名無しさん2008/03/11(火) 16:39:46
>>231
そうです。regedit.exe 互換にしたいと思ってます。
0233デフォルトの名無しさん2008/03/11(火) 17:10:35
特定のプロセスがエラーで死ぬとき、エラーメッセージ(このプログラムは不正な処理云々)を
出さずにそのままプロセス消滅とさせる方法はあるでしょうか?

とあるシェルエクステンションで外部プラグインDLLを利用可能としたとき、プロセス分離させてある
ので出来の悪いプラグインが落ちてもシェルは巻き込まないけど失敗時にエラーが出るのは避け
たい・・・という用途です。
0234デフォルトの名無しさん2008/03/11(火) 17:11:54
233の追記です。
普通のエラー類ならプラグイン呼び出し部だけWin32例外ハンドラで捕まえられますが、
DirectShowモジュール等を使うと例外ハンドラだけではエラーが捕捉しきれないようなのです。
0235デフォルトの名無しさん2008/03/11(火) 18:42:49
まずはその出来の悪いプラグインの作者に文句言って直して貰うんだ
0236デフォルトの名無しさん2008/03/11(火) 18:50:34
StartPage を実行するの前のページで設定していた CreatePen での設定は
引き継がれないdえ初期化されてしまうものなのでしょうか?
0237デフォルトの名無しさん2008/03/11(火) 19:22:14
すいません。win32apiを使って、低解像度(320x240)のフルスクリーンでビットマップを描画すると、
ぼやけた感じになるのですが、これを1ドットずつくっきりと表示させるにはどうしたらいいですか
0238デフォルトの名無しさん2008/03/11(火) 19:23:50
ちなみにdirectXのsprite描画でも同じ結果でした。
低解像度ではぼやけるものなのでしょうか。
0239デフォルトの名無しさん2008/03/11(火) 19:34:37
液晶が悪いって落ちじゃないよな?
0240デフォルトの名無しさん2008/03/11(火) 20:35:21
>>232
http://itaya.corso-b.net/TIPS/TIPS015.html
regeditに引数をつけて呼び出すとか。
0241デフォルトの名無しさん2008/03/11(火) 20:40:09
>>230
受け取ったレジストリ情報を自分でテキストとして出力すればいいだけだろ。
0242デフォルトの名無しさん2008/03/11(火) 20:59:21
>>237一切拡大とかせずに表示してるんだろうな?
0243デフォルトの名無しさん2008/03/11(火) 21:16:39
>>242
はい。BitBltで表示してます。
ていうか、マウスポインタもぼやけて表示されます。
0244デフォルトの名無しさん2008/03/11(火) 21:20:33
>>243
CRTモニタ使うといいんじゃない?
0245デフォルトの名無しさん2008/03/11(火) 21:32:36
だから液晶のディザリングだろうが
0246デフォルトの名無しさん2008/03/11(火) 22:53:22
液晶 ぼやける の検索結果 約 80,800 件
0247デフォルトの名無しさん2008/03/11(火) 23:13:39
液晶 Nyoki の検索結果 約 94 件
0248デフォルトの名無しさん2008/03/11(火) 23:16:09
>>233
SetUnhandledExceptionFilter使えば規定の処理を上書きできるのかなあ?
よくわからん。ごめん。
Advanced Windowsに何か書いてあったような気もするけど…。
0249デフォルトの名無しさん2008/03/11(火) 23:43:46
>>240
Vistaだと管理者パスワードが必要。
>>241のように自分でregedit互換のテキストにするほうがいいんじゃ?
ユーザーに面倒をかけるよりは自分が面倒くさいほうがまし。
0250デフォルトの名無しさん2008/03/12(水) 00:18:09
>>249
その程度でUACなの?
0251デフォルトの名無しさん2008/03/12(水) 00:21:44
regedit.exeそのものがUACに引っ掛かるっしょ
0252デフォルトの名無しさん2008/03/12(水) 00:36:49
不便だなぁ。仕方ないのかも知れないけど。
■ このスレッドは過去ログ倉庫に格納されています