トップページ⇒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/
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
不便だなぁ。仕方ないのかも知れないけど。
0253デフォルトの名無しさん2008/03/12(水) 00:43:50
ビッとブリッと屁をこいた
0254デフォルトの名無しさん2008/03/12(水) 12:23:06
>>243
ノートPCならBIOSで拡大表示時の設定が出来るものがある。
デスクトップPCなら液晶のOSDで拡大補完レベルを設定できるものがある。
↑俺のシャープの液晶がこれ
0255デフォルトの名無しさん2008/03/12(水) 12:25:33
>>237
画面の解像度と液晶の解像度が一致しているか確認する。
0256デフォルトの名無しさん2008/03/12(水) 12:28:00
老眼鏡の度があっているか確認する。
0257デフォルトの名無しさん2008/03/12(水) 13:28:00
>>255
PCに繋げられるQVGAの液晶なんてあるのか?
0258デフォルトの名無しさん2008/03/12(水) 13:43:27
>>257
PCから出力されてるドットとディスプレイ上のドットを1対1に対応させることのできる液晶はある
0259デフォルトの名無しさん2008/03/12(水) 19:32:19
低レベルすぎだろw
0260デフォルトの名無しさん2008/03/12(水) 21:37:24
ドラッグ&ドロップしたファイルのパスの取得にはDragQueryFileを使えば良さそうってことはわかったんだけど、どうにもうまくできません
wParamが”値が割り当てられていないローカルな変数”とか警告が出てままだし、
何か根本的な部分で理解できていないようなんですが、どこがおかしいのか教えていただければ幸いです
使っているのはVC++6.0です

HANDLE wParam;

char szFn[256] ;
//DragAcceptFiles(hWnd,TRUE);
//UINT iCount = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0);
DragQueryFile((HDROP)wParam, 0, szFn, 256);
printf("%s",szFn);

これで実行するとszFnの中身がフフフ…でまったく機能してませんでした

真空波動研からflvファイルの画像サイズを取得して、FLVPのiniのウィンドウサイズを書き換えて
等倍で再生されるFLVPの支援ツールを作っていて、ネットのソースを色々流用してflvのパスの取得以外はちゃんと動作するものが
できたんですが、あと一歩なんです
0261デフォルトの名無しさん2008/03/12(水) 21:39:53
APIを使うなら該当部分のヘルプぐらい読めよ。
0262デフォルトの名無しさん2008/03/12(水) 21:56:32
> これで実行するとszFnの中身がフフフ…でまったく機能してませんでした
変数に笑われているようではあと一歩どころでは無かろう

つうかその程度のツールならvbsで作れそうな気もするが
0263デフォルトの名無しさん2008/03/12(水) 22:04:55
 なんか適当だわ
case WM_CREATE:
 DragAcceptFiles(hWnd, TRUE);
 return 0;

case WM_DROPFILES:
 {
  int len = DragQueryFile((HDROP)wParam, 0, NULL, 0);
  char* p_strBuf = (char*)malloc(len+1);
  DragQueryFile((HDROP)wParam, 0, p_strBuf, len+1);

  MessageBox(hWnd, p_strBuf, "message", MB_OK);

  free((void*)p_strBuf);
  DragFinish((HDROP)wParam);
 }
 return 0;
0264デフォルトの名無しさん2008/03/12(水) 22:24:10
>>263
適当にも程がある
0265デフォルトの名無しさん2008/03/12(水) 22:33:42
あと一歩が山あり谷ありで距離も足元の道さえも見えない
これが仕事ならデスマーチ
0266デフォルトの名無しさん2008/03/12(水) 22:48:54
ひいぃぃ・・・!!
0267デフォルトの名無しさん2008/03/12(水) 22:49:50
>>261-265
ありがとうございました
よくわからないので諦めます
確かに後1歩どころではなかったようです
せっかくなんでソース置いときます
ttp://kissho.xii.jp/1/src/1jyou29678.txt

CreateProcess()はネットに合ったのをそのまま使ったので全然わかってません
0268デフォルトの名無しさん2008/03/12(水) 23:36:13
>>267
真空波動研やらFLVPについては関知しないが、
ざっとコード見た感じDragAcceptFiles()やDragQueryFile()じゃなく
コマンドライン引数使えって話のように思える。
0269デフォルトの名無しさん2008/03/12(水) 23:40:18
スクロールバーやツールバーをマウスでクリックすると、そちらにフォーカスが移ってしまうのですが、
使い終わった場合(例えばスクロールが終わったり、ツールバーのボタンを押した後)に
もともとフォーカスを持っていたウィンドウにフォーカスを返すにはどうしたら良いのでしょうか?
0270デフォルトの名無しさん2008/03/12(水) 23:52:43
固定幅のフォントの文字の幅と高さを取得するのに、
デスクトップのDCを使って GetTextExtentPoint32() しても
問題ありませんか?
文字を描画するのは作ったウィンドウなんですが。
0271デフォルトの名無しさん2008/03/13(木) 01:01:58
>>268
ありがとうございます!
出来そうな気がしてきました
0272デフォルトの名無しさん2008/03/13(木) 02:12:20
基本的には思い通りのプログラムができました
ありがとうございました
後は細かい設定をつけていきます
0273デフォルトの名無しさん2008/03/13(木) 02:15:35
こんなもんvbsとかのスクリプトで作った方が早かろう
0274デフォルトの名無しさん2008/03/13(木) 03:42:02
>>270
デスクトップで使われてるフォントで描画した場合の高さと幅が返ってくる
それでも良ければそうしたまえ

>>269
WM_SETFOCUSを見て頑張れ
この場合スクロールバーは子ウィンドウでないと駄目かもな
■ このスレッドは過去ログ倉庫に格納されています