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

Win32API質問箱 Build47

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

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

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn.microsoft.com/library/)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
0655デフォルトの名無しさん2006/12/04(月) 06:08:24
583 名前: デフォルトの名無しさん [sage] 投稿日: 2006/12/01(金) 13:44:42
reader/writer lockってvista以上でサポートかよ。
2000でもサポートしてくれよぉ。

591 名前: デフォルトの名無しさん [sage] 投稿日: 2006/12/02(土) 02:50:20
>>583
Vistaってそういうカーネルレベルの改良意外と多いんだよね。
Win板とか行くとみんなAeroくらいしかないと思ってるみたいだけど

592 名前: デフォルトの名無しさん [sage] 投稿日: 2006/12/02(土) 09:09:33
Win板の連中は表面しか見ない(見えない)からね〜。


ntdll内で実装されているのでカーネルレベルの変更ではない。
目糞鼻糞だな。
0656デフォルトの名無しさん2006/12/04(月) 13:44:34
わざわざコピペしてまで言いたかったんだね。
0657デフォルトの名無しさん2006/12/04(月) 14:15:49
>>656
やぁ、目糞君www
0658デフォルトの名無しさん2006/12/04(月) 14:58:17
リバースエンジニアリングを行わないとntdll内で完結しているとは断言できないな
0659デフォルトの名無しさん2006/12/04(月) 15:05:14
>>654
スレ違いだが、まずは手元の適当なISOイメージが、そのISO-9660ディスクの仕様と一致しているか確かめろ。
一致しているならそれで良し、違ったらお前のググり方が悪い。
0660デフォルトの名無しさん2006/12/04(月) 15:14:47
>>654
raw image fileに仕様があると思っているのか?

>>658
素人乙
0661デフォルトの名無しさん2006/12/04(月) 15:22:02
なんか一人暴れてる馬鹿がいるな
0662デフォルトの名無しさん2006/12/04(月) 19:56:34
ド素人の質問で悪いんだが
reader/writer lockってどんなの?
APIの名前じゃ無さそうだが
0663デフォルトの名無しさん2006/12/04(月) 20:01:07
・誰かが書き込み中なら、読み込み要求は待たされ
・誰かが読み中なら、書き込み要求は待たされ
・皆読み中での、読み込み要求は待たされずにすんなり通る

をプロセス/スレッドまたいで、うまく解決できるようにする機構
0664デフォルトの名無しさん2006/12/04(月) 20:32:05
どうも
0665デフォルトの名無しさん2006/12/04(月) 21:24:00
>>654
とりあえずISOディスクイメージファイルって何ぞやってことだな.
自分用語だから誰もそれが何なのか分からない.

CD-ROM及びDVD-ROMは1セクタにつき2048バイトをデータとする論理構造を持ち
一般的にはそれの1トラックの連結ストリームをイメージファイルとするけど、CD-R
では本来の補助情報を含めた2352バイトを物理的に焼きこめることもあって、各ソフト
毎に好き勝手に独自フォーマットを持っている. (DVDはRAW焼きはできません)
また、TOC情報とかもイメージに取り込んでいるのもあるな.

ので、一般的にisoイメージと呼ばれているものはその実はそれが何なのかは、
それだけでは分からない. 一番可能性が高いのは1セクタ2048バイトなシングル
トラックイメージというだけ.
0666デフォルトの名無しさん2006/12/05(火) 00:33:47
アイコンハンドラやコンテキストメニューハンドラ等のShell Extension関連の
お勧めな書籍はありますか?
Delphiのですと下記のが一応見つかりましたが、VCでお勧めがありましたら…。
シェルプログラミング入門
ttp://www.amazon.co.jp/exec/obidos/ASIN/479730782X
0667デフォルトの名無しさん2006/12/05(火) 00:55:34
MSDN マジオススメ
0668デフォルトの名無しさん2006/12/05(火) 01:48:44
GetWindowLong()で、GWL_WNDPROCとDWL_DLGPROCの違いがわからない。
ウィンドウとダイアログの違いって?(^^;
0669デフォルトの名無しさん2006/12/05(火) 05:42:42
>>620
ExpandEnvironmentStringsの話ならおk?
0670デフォルトの名無しさん2006/12/05(火) 05:47:34
>>596
Vistaに限らずNT系の新APIに見えるものは実はntdllの非公開APIに公開の皮を
かぶせただけ、ってパターンも結構あるな。
Win9x切り捨てたので遠慮する必要がなくなったんだろう
0671デフォルトの名無しさん2006/12/05(火) 09:51:21
>>668
ttp://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/dialogboxes/aboutdialogboxes.asp
>Dialog boxes usually belong to a predefined, exclusive window class.
>The system uses this window class and its corresponding window procedure for both modal and modeless dialog boxes.
>When the function is called, it creates the window for the dialog box, as well as the windows for the controls in the dialog box,
>then sends selected messages to the dialog box procedure.
0672デフォルトの名無しさん2006/12/05(火) 10:15:18
初歩的な質問ですみません。

VisualC++ 2005 EE を使い始めたのですが、
VisualC++ 6.0と違ってリソースエディタがありません。

なので、無理矢理コントロールをウインドウに貼り付けて処理したいと思うのですが、
どのように貼り付ければ良いのか、参考となるサイトなど教えていただけないでしょか?
0673デフォルトの名無しさん2006/12/05(火) 10:33:34
>>672
VC6のリソースエディタなりサードパーティ製リソースエディタ使えば?BCCFormとか。
0674デフォルトの名無しさん2006/12/05(火) 10:41:56
ダイアログのWindowProc(DefDlgProc)はこんな感じ。

LRESULT API DefDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  BOOL result = FALSE;
  hwnd->DWL_MSGRESULT = 0;
  if(hwnd->DWL_DLGPROC
    && (result = CallDlgProc(hwnd, message, wParam, lParam))
  {
    //メッセージに応じてDWL_MSGRESULTかresultを返す
    return DWL_MDGRESULT or result;
  }
  else
  {
    switch(message)
    {
    /*さまざまなメッセージハンドラ*/
    case WM_XXXX:
      return 何とか
    default:
      return DefWindowProc(hwnd, message, wParam, lParam);
    }
  }
}

DlgProcはダイアログのWindowProcのフロントエンドなので、
DlgProcでデフォルト処理後に独自の処理を加えるのはメンド臭いです。
06756722006/12/05(火) 11:14:36
>>673-674
迅速なレス有難う御座います。
方法すら見当もつかなかった自分としては、お二方のご指南本当に有難いです。
やはりソースコードで全て処理するとなるとやや時間もかかり、
面倒かもしれませんが、頑張ってみようと思います。
0676デフォルトの名無しさん2006/12/05(火) 11:28:37
ドラッグ・アンド・ドロップで
DragQueryFile関数を使いパスつきのファイル名が取得できますが
パスなしのファイル名が取得できる関数はあるのでしょうか?
0677デフォルトの名無しさん2006/12/05(火) 11:30:53
パス削ったらいいがな(´・ω・`)
0678デフォルトの名無しさん2006/12/05(火) 11:37:49
PathFindFileName
06796762006/12/05(火) 11:44:27
>>678
ありがとうございます。
0680デフォルトの名無しさん2006/12/05(火) 13:35:57
>>672
その方法は面倒だが、それだって探せばいくらでも見つかる。
親のWM_CREATEで子をCreateWindow(Ex)すればいいだけ。
0681デフォルトの名無しさん2006/12/06(水) 13:52:31
WindowsでUSBメモリとかで繋いだときにそのタイミングで
接続されたイベントを取得したい場合どうすればいいでしょうか?
ipodを繋いだらitunesが起動するみたいなことがやりたいです。
msdnとかで調べたけどわかりませんでした。
お願いします。
0682デフォルトの名無しさん2006/12/06(水) 14:04:19
WM_DEVICECHANGE
0683デフォルトの名無しさん2006/12/06(水) 15:19:42
DirectXを利用しているプログラムで
日本語入力をしたいのですが
IMEに未確定文字を表示させないようにして
独自で描画することはできますか?
06846832006/12/06(水) 15:49:39
すまん、やっぱDirectXスレのほうで聞いてくる。
0685デフォルトの名無しさん2006/12/06(水) 17:10:55
>>681
SHCNE_MEDIAINSERTEDだな。
0686デフォルトの名無しさん2006/12/06(水) 19:21:50
ツールバーのあるアプリケーションを
ValidateRectで描画を更新しているのですが

VC++6.0から実行すると、ツールバーが消えてしまいますが
exeから動かすとツールバーが表示されています。

これはどうしようも無いんでしょうか。
BeginPaint〜EndPaintだとVC++6.0の実行でも問題なし
0687デフォルトの名無しさん2006/12/06(水) 21:16:06
>>686
絶対なんかやってることがおかしい。

あと「ValidateRectで描画を更新」って何だよ?
0688デフォルトの名無しさん2006/12/06(水) 21:33:28
ValidateRectって「もう描画しなくてもいいよ」って命令じゃなかったぽ?
0689デフォルトの名無しさん2006/12/06(水) 21:35:21
WM_PAINTする領域に含めなくていいよ、という命令
0690デフォルトの名無しさん2006/12/06(水) 21:37:14
その逆はそのまんまでInvalidateRect。
06912032006/12/06(水) 21:48:28
メッセージは
while( 1 )
{
 if( ::PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE ) )
 {
  if( ::GetMessage( &msg, NULL, 0, 0 ) <= 0 )
   return msg.wParam;

  ::TranslateMessage(&msg);
  ::DispatchMessage(&msg);
 }
}

プロシージャでは
GetClientRect( g_hWnd, &wrc );
GetClientRect( g_hTool, &trc );
wrc.top = trc.bottom;
を
case WM_TIMER:
 InvalidateRect( g_hWnd, &wrc, TRUE );
 UpdateWindow( g_hWnd );
 break;

case WM_PAINT:
 ValidateRect( g_hWnd, &wrc );
 break;
といった感じで処理しています。
たまにツールバーが出現したりして謎です。
ValidateRectの描画の更新は、すいません表現を間違えました。
0692デフォルトの名無しさん2006/12/06(水) 21:50:27
標準リストビューの行の高さって変更できますか?
やり方教えてください。
06936912006/12/06(水) 21:50:56
名前欄間違えた。
×203
○686
0694デフォルトの名無しさん2006/12/06(水) 21:51:25
そのビジーループには何か意味があるの?
06956922006/12/06(水) 21:51:31
全部の行ではなくて指定した行の高さってことです。
0696デフォルトの名無しさん2006/12/06(水) 21:52:50
TextOutで�@、�Tとかの表示の文字化けは大丈夫でしょうか。
0697デフォルトの名無しさん2006/12/06(水) 21:53:28
Sleep(1)とかしろよ。
06986962006/12/06(水) 21:54:44
自分は9x系を使っていて、9x系なら大丈夫みたいですが、
他ののWindowバージョンだとどうでしょうか。
0699デフォルトの名無しさん2006/12/06(水) 21:57:10
PeekMessageは何の意味が?
0700デフォルトの名無しさん2006/12/06(水) 21:59:53
>>692
http://www.google.com/search?num=100&hl=ja&ie=EUC-JP&q=%A5%EA%A5%B9%A5%C8%A5%D3%A5%E5%A1%BC%A4%CE%B9%D4%A4%CE%B9%E2%A4%B5
0701デフォルトの名無しさん2006/12/06(水) 22:00:33
IDLE時に何かしたい時にあういうループ組むね
ゲーム作ってる時とか
0702デフォルトの名無しさん2006/12/06(水) 22:02:11
ループなんてどうでもいいが
WM_PAINT内の処理がありえないな
せっかく描画しようとしてるところを、描画もせずに「もう描画しなくていいよ」なんていや消えるのは当たり前だろ
ツールバーも親ウィンドウ上にあるものだぞ?
0703デフォルトの名無しさん2006/12/06(水) 22:05:48
>>691は要は
人に「ちょっとこっち来て!」って呼んどいて
来たら「こっち来るんじゃねーよ!」って言うようなもんだな。
07046862006/12/06(水) 22:06:39
InvalidateRect と ValidateRect に
NULLなりGetClientで得た領域をそのまま渡すと
ツールバーが塗り潰されてしまいます。

ツールバーとValidateRectは合わないのだろうか
0705デフォルトの名無しさん2006/12/06(水) 22:07:49
>>700
>>695
0706デフォルトの名無しさん2006/12/06(水) 22:09:42
>>704
つーかあんた、最初の自分の書き込みで最後に結論出してるだろうが
07076862006/12/06(水) 22:12:12
>>706
BeginPaint〜EndPaint を使うと
DirectXの
Clear, BeginScene, EndScene, Present使うと
チラチラチラチラするもんで
出来れば ValidateRect を使いたいなと
07087042006/12/06(水) 22:12:30
後キミ、InvalidateRectを目が痛くなるまで調べてこい
0709デフォルトの名無しさん2006/12/06(水) 22:44:13
ちょっと待って
>>686=>>704=>>708なの?
0710708=7062006/12/06(水) 22:46:58
すごく、ミスです・・・orz
07116962006/12/06(水) 22:54:02
どなたか、>>696>>698についてお願いします。
0712デフォルトの名無しさん2006/12/06(水) 22:56:44
文字化けが大丈夫かって、どう大丈夫なのかわかりゃせんし
文字化けするかしないかってだけなら

そ ん な こ た ぁ 自 分 で 実 行 し て み り ゃ わ か る だ ろ
0713デフォルトの名無しさん2006/12/06(水) 22:59:31
そもそも、�@とか�Tとかの文字化けがなぜ起こるのかを知ってたら
>>696みたいな質問は出てくるわけがないと思うんだが。
0714デフォルトの名無しさん2006/12/06(水) 23:00:38
丸数字とかはOSの違いによる文字化けじゃなかったか?
まあソフトで使う分には、対象言語圏が日本なら心配要らないだろう
0715デフォルトの名無しさん2006/12/06(水) 23:03:07
そんなに心配ならTextOutW使っておけ。9xでも対応している。
0716デフォルトの名無しさん2006/12/06(水) 23:05:44
かなり誤解を招きそうなので訂正

丸数字の文字化けを考えないといけないのは違うOSで表示させる場合
(WEBアプリケーションとか)
0717デフォルトの名無しさん2006/12/06(水) 23:06:26
つ プリンタにフォントが無い

この場合も化けはしないけどな
07186962006/12/06(水) 23:21:48
みなさまありがとうございます。
参考になりました。
0719デフォルトの名無しさん2006/12/06(水) 23:34:04
うっかりCreateFontでCharSet(文字集合)がとんでもないものを指定してしまったフォントでは化ける。
勿論丸付き数字どころの騒ぎではない。
0720デフォルトの名無しさん2006/12/07(木) 00:09:42
タスクバーに表示させない方法はあるのでしょうか?
0721デフォルトの名無しさん2006/12/07(木) 00:15:00
何を?
0722デフォルトの名無しさん2006/12/07(木) 00:26:59
天は自ら助くる者をタスク
07237202006/12/07(木) 00:41:14
ウインドウが開いているときにタスクバー
に表示させない(つかわない)方法はないでしょうか?
0724デフォルトの名無しさん2006/12/07(木) 01:09:40
ウィンドウのスタイルを変えるかタスクバーのリストビューをフック
0725デフォルトの名無しさん2006/12/07(木) 01:20:22
WS_EX_APPWINDOWだっけ?
0726デフォルトの名無しさん2006/12/07(木) 02:07:18
アイコンエディタって何が使いやすい?
0727デフォルトの名無しさん2006/12/07(木) 05:58:30
俺は Axialis のシェアウェア使ってる。
その他のアイコンエディタをほとんど使ってないから、
他と比べてどうかは知らんが満足してる。
0728デフォルトの名無しさん2006/12/07(木) 07:05:56
>>720
不可視の親ウィンドウ
0729デフォルトの名無しさん2006/12/07(木) 10:15:11
>>704
>ツールバーが塗り潰されてしまいます。
DirectXが塗りつぶしているのなら、DirectXの使う領域を指定する。
単一色で塗りつぶされているのなら、ウィンドウスタイルにWS_CLIPCHILDRENをつける。
または、WNDCLASS(EX)のhbrBackground=NULLでもいいと思う。

それより、DirectX描画用の子ウィンドウをつくり、
WM_SIZEでクライアント領域のツールバーの下に移動する方が簡単。
0730デフォルトの名無しさん2006/12/07(木) 10:27:26
つーか何ゆえに
別にウィンドウが一旦隠れたわけでもないのに
メッセージループ内からWM_PAINT発生させてんのか理解できんのだが
そんなことすりゃチラつくのは当たり前だろうと
WM_PAINTの存在意味を解って無いだろ
0731デフォルトの名無しさん2006/12/07(木) 11:39:00
>そんなことすりゃチラつくのは当たり前だろうと
BeginPaintせずにValidateRectしてるんだからちらつきましぇん。
07326862006/12/07(木) 11:59:59
>>729
有難うございます
WS_CLIPCHILDRENで解決しました。

領域を指定しての最初のValidateRect
は無効領域を残したままだったので
いつまでもWM_PAINTが残っている状態でした。
かといって全領域を指定するとWM_PAINTは消えますが
ツールバーごと塗り潰すといった事態に

DirectXに関してはPresentに
ツールバー分を引いたクライアント領域に
転送(2番目引数)するようにしています。

>DirectX描画用の子ウィンドウをつくり、
>WM_SIZEでクライアント領域のツールバーの下に移動する方が簡単。
その内使わせて頂きます。

>>730
アニメーションやらシミュレーションやらを入れたいと思ったので
WM_PAINTを発生させまくる状況を作ってみました。
0733デフォルトの名無しさん2006/12/07(木) 16:31:03
>>726
@icon + ドットエディタ
0734デフォルトの名無しさん2006/12/07(木) 20:26:05
Direct3Dを使っていてなぜ
アニメーションやらシミュレーションやらを入れるのにWM_PAINT連打せねばならぬのか
0735デフォルトの名無しさん2006/12/07(木) 23:34:51
C#を使ってプログラミングしてます。
他アプリケーションのDataGridに表示されている値を取得する方法はありますでしょうか?
LABELやConboBoxの値はWin32APIを使って取得する方法は分かるのですが
DataGrid系に表示されている値の取得方法がどうしても分かりません・・・('A`)
0736デフォルトの名無しさん2006/12/08(金) 01:29:31
マ板で質問したのですが、ム板に誘導されましたので、こちらで質問します。

CD-Rや、DVD-Rなどの光メディアに、プログラムから書き込むことって可能ですか?
API名とか、ヒント下さい。

0737デフォルトの名無しさん2006/12/08(金) 01:56:42
>>736
IMAPI
0738デフォルトの名無しさん2006/12/08(金) 01:59:27
>736
SPTI
0739デフォルトの名無しさん2006/12/08(金) 02:00:54
GetPixel()でDirectX使ったアプリの色情報を取得したいのですが、
どうしても0が返されます。

DirectXアプリ以外のエリアで情報を取得する分には問題ないのですが。

特殊なやり方をしないととれないのでしょうか。
0740デフォルトの名無しさん2006/12/08(金) 02:07:02
>>737-738
なるほど、こんなのが有ったんですね。
ありがとうございます。助かりました。
0741デフォルトの名無しさん2006/12/08(金) 03:15:59
文字認識や手書き認識の再利用可能なモジュールってどこかにあるのだろうか?
0742デフォルトの名無しさん2006/12/08(金) 04:25:42
Win32 APIに?
0743デフォルトの名無しさん2006/12/08(金) 05:08:28
Tablet PC Platform SDKでは提供されているみたいだけどね。
0744kk2006/12/08(金) 08:51:48
WinAPI + C++で、リソーススクリプトで作った
ダイアログのエディットボックスに入力されてる文字列はどうすれば
PTSTRなどに入れられるのでしょうか
0745デフォルトの名無しさん2006/12/08(金) 08:57:56
普通にGetDlgItemText/GetWindowText
0746kk2006/12/08(金) 09:17:28
リソーススクリプトを使用しているので、エディットボックスのHWNDがないのですが。。。
0747デフォルトの名無しさん2006/12/08(金) 10:02:43
なんで、リソーススクリプトを使用していると、エディットボックスのHWNDが無いと思うの?
07482452006/12/08(金) 11:21:04
CreateCompatibleDCで作った場所に、
rectangleで書きこんで一部消去とか(真中だけ抜く)は、
抜きたい部分をXORで合成するしかないでしょうか?
指定したrectの分だけ消去するとかできないもんでしょうか。
CreateCompatibleDCで作った場所に書きこんで、
ほかのDCに書きこんだら、CreateCompatibleDCにrectangleしたところ意外は、
透明でほかのDCに書きこまれるので、rectangleの真中だけ書きこむ前の透明にしたいです。
0749デフォルトの名無しさん2006/12/08(金) 11:23:28
>>748
日本語でおk

rectangleしたところって意味不明すぎるw
0750デフォルトの名無しさん2006/12/08(金) 11:25:40
>>746
GetDlgItemTextは親のウィンドウハンドルと子のIDがあれば十分。
GetWindowTextLengthとGetWindowTextのコンビを行いたければ、GetDlgItem使え。
07517482006/12/08(金) 12:33:40
// Rectangleするとこ
HDC hDC = GetDC(hWnd)
HCD hMemoryDC = CreateCompatibleDC(hDC);
HBITMAP hBitmap = CreateComatibleBitmap(hDC, 640, 480);
SelectObject(hMemoryDC, hBitmap);
DeleteObject(hBitmap);
SelectObject(hMemoryDC, GetStockObject(GRAY_BRUSH));
Rectangle(hMemoryDC, 0, 0, 640, 480);
ClearRect(hMemoryDC, 160, 120, 480, 360);// Rectangleで書いたところの一部を消したい

----------
WndProcでWM_PAINTのところ
case WM_PAINT:
 hDC = BeginPaint(hWnd, &ps);
 BitBlt(hDC, 0, 0, 640, 480, hMemoryDC, 0, 0, SRCCOPY);
 EndPaint(hWnd, &ps)

↑みたいな処理で、ClearRectに該当する処理を探しています
0752デフォルトの名無しさん2006/12/08(金) 12:47:57
>>751
>SelectObject(hMemoryDC, hBitmap);
>DeleteObject(hBitmap);

こういうところ見ると仕組みを理解してないのがよくわかる。
ここを一通り呼んで勉強してくれ。
ttp://msdn.microsoft.com/library/en-us/dnanchor/html/gdi.asp
07537482006/12/08(金) 13:02:33
>>752
ttp://www13.plala.or.jp/kymats/study/MULTIMEDIA/bmp_multibuf.html
ここを参考にしました
07547482006/12/08(金) 13:11:20
>>751
使っている間は、DeleteObjectしたらあかんという意味ですね。
プログラミングWindowsを読むと、WM_DESTROYでDeleteObject(hBitmap)みたくなっているのが多いので。
■ このスレッドは過去ログ倉庫に格納されています