Win32API質問箱 Build19

このエントリーをはてなブックマークに追加
ここはAPIスレだからそれでもいいけど
一般にはストリームから直接構造体に読み込むのは
移植性無さ過ぎるぞ
891デフォルトの名無しさん:04/06/21 23:27
構造体に読む込むってのは、どうやって
かるく例を書いてもらえるとありがたいんですが
BITMAPFILEHEADER f;
fread(&f, sizeof f, 1, fp);

みたいなことだろ
pretty hackey wayですね(hackyだっけ)
Google先生にお伺いを立ててみたところ
hackyジャネーノ? と言われますた
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&oe=UTF-8&q=hackey
別スレで質問したのですが、そのスレが終わってしまったのでこちらで質問します。

マイコンピューターの、ドライブ名の一覧を取得するにはどうすればよいのでしょう。
デジカメなどのマスストレージなども含めて取得したいです。
OSで開いた場合の「マイコンピュータ」フォルダと同じ内容が得られれば目的を果たせるのですが。
OSはXP、言語はDelphiです。
>>895
IShellFolder::EnumObjects
897デフォルトの名無しさん:04/06/22 10:32
フォントダイアログの「文字飾り-色」だけを非表示にするAPIってありますか?
文字飾りグループを全部消せるのは知っています。
CFHookProcでフォントダイアログにフックを引っ掛けて
その中で目的のコントロールを非表示でよいんじゃないのか?
>>897
ShowWindow
>>896
できますたありがとうございます
901デフォルトの名無しさん:04/06/22 15:54
CreateProcessを使って立ち上げたexeの標準出力&エラーを
元で取得するにはどうしたらよいでしょうか。
よろしくお願いします。
>>901
パイプ
パイプ(名無し)は WaitFor ができないのが難点。
>>904
CreateProcessするんだからプロセスハンドルじゃだめか?
906904:04/06/22 16:58
>>905
プロセス終了後にまとめて読むんだったらそれでよいけど、
子プロの吐く内容をリアルタイムで取得したい場合もあるから。
たとえば対話式コマンドとか。
それはスレッド使うのが定石。
908904:04/06/22 17:09
スレッド使ったところで、ReadとWaitのループで待つわけだから、
パフォーマンスとレスポンスのトレードオフになる。
てか、名前憑きは使えないんだっけ?
>>908
>ReadとWaitのループで待つわけだから、
ReadFile自体がブロックするからWaitは不要。
レスポンスも悪くないよ。

>>901
>190351 - HOWTO: Spawn Console Processes with Redirected Standard Handles
http://support.microsoft.com/?id=190351
ユーザー名から、そのユーザーのユーザーグループ(アドミニとかパワーユーザー)を
知りたいんですがそんなAPIありませんでしょうか?
WM_INITDIALOGの中でSetTimer(hDlg, NULL, 1000, NULL)すると
何かダイアログを操作するまでWM_TIMERがこないんですが、何故でしょうか?
設定したダイアログに対して何か操作をすると
それからは設定した時間ごとにWM_TIMERが飛んでくるんですが・・・
タイマIDって0よかったっけ?
>>910
NetUserGetLocalGroups
914911:04/06/23 00:13
>>912
MSDNにはダメとは書いてないですし、SetTimer()の戻り値も正常なので大丈夫かと。
一応適当な数値でやってみましたが、症状変わらずです・・・
>>911
モーダルとモードレスがわかっていない阿寒
916911:04/06/23 00:28
あー単純なモーダルダイアログでやってみたらきちんと来ました。
何かミスってるぽいですね。

>>915
解決法をご存知でしたら教えていただきたいんですが、
モードレスダイアログの場合CreateWindow()で作ったWindowのように
PeekMessage()した後にIsDialogMessage()を呼ぶのではダメなんでしょうか?
>>916
どんなメッセージループを書いたのか、書いてみ?
918911:04/06/23 01:09
>>917
/* ダイアログ作ったり */

while( hDlg || hMainWnd )
{
  while ( ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE) )
  {
    if ( hDlg && ::IsDialogMessage( hDlg, &msg ) )
      continue;
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
  }
  /* 毎回呼びたい関数とか */
}

こんな感じです。よろしくお願いします
919911:04/06/23 03:09
よく分かりませんが、主要部分は全部クラス化してたので
GUIの部分だけ書き直したら正常に動作しました。
正直意味不明です。コード内容ほとんど変わってないのに・・・orz
お騒がせしました。
RGBで色を指定するときボタンの色とかのWindowsのシステムカラーを指定するのってどうすればいいんですか?
GetSysColor
>>921
R:00 G:00 B:01ならボタンの色とかRGB値で直接指定できたりはしないの?
>>922
できません。それだと RGB=(0,0,1) の色が使えなくなっちゃうじゃん。
ブラシ (HBRUSH) を取る関数なら、 (HBRUSH) (COLOR_BACKGROUND+1) とかで
いけるんだけどね。
何いってんの?256カラーモードで使えば?
>>923
それは本来GetSysColorBrush(COLOR_BACKGROUND)とするべきではないのか。
>>923
補足で蛇足。先方が OCX コントロールだったりして、OLE_COLOR 型で色指定する場合には、
OleTranslateColor の説明に出てくるいろんな方法 (0x80000000 | COLOR_BACKGROUND とか)が使えます。
927デフォルトの名無しさん:04/06/23 13:44
>>901
パイプで解決しました。
ありがとうございます。
自分以外のウインドウのサイズ変更を制限することは可能でしょうか?
自分のウインドウのサイズを制限する場合はウインドウプロシージャで
WM_GETMINMAXINFOメッセージを処理すれば出来るらしいので、
DLL作ってフックプロシージャで制限したいウインドウのメッセージを
処理しようとしているのですがうまくいきません。

LRESULT CALLBACK MsgProc( int nCode, WPARAM wParam, LPARAM lParam )
{
 CWPSTRUCT *pCWP;
 MINMAXINFO *lpmmi;
 if( nCode == HC_ACTION ) {
  pCWP = (CWPSTRUCT *)lParam;
  if( pCWP->hwnd == hWnd ) { //hWndはサイズ変更を制限したいウインドウのハンドル
   switch( pCWP->message ) {
   case WM_GETMINMAXINFO:
    lpmmi = (MINMAXINFO *) pCWP->lParam;
    lpmmi->ptMinTrackSize.x = 600;
    lpmmi->ptMinTrackSize.y = 480;
    lpmmi->ptMaxTrackSize.x = 1024;
    lpmmi->ptMaxTrackSize.y = 768;
    return 0;
   }
  }
 }
 return CallNextHookEx( Msg, nCode, wParam, lParam );
}

lpmmi = (MINMAXINFO *) pCWP->lParam;
のところを
lpmmi = (MINMAXINFO *) lParam;
に変えてみても出来ませんでした。
ご存知の方いらっしゃいましたらご教授下さい。
>>928
>return 0;
これじゃあ、ターゲットのウインドウまでWM_GETMINMAXINFOが届かない。
メッセージをいじった場合でも、メッセージをブロックする場合以外は
Call〜()を呼ぶ。
あ、ごめん。
この場合これでいいのか。929は忘れてくれ。
単純にグローバルフックになってないとか。
>>931
WM_GETMINMAXINFO以外にもメッセージをフックしていますが、
そちらは正常に動いていますのでグローバルフックにはなっていると思います。
念のためreturn 0;の前にメッセージボックスを入れて確認しましたが、
サイズを変更しようとするときちんと表示されています。
それなのに600*480よりも小さくなってしまうんです…。
MSDNより
> CallWndProc フックプロシージャはメッセージを調べることはできますが、
> 変更することはできません。
>>933
そういうことでしたか…
勉強不足でした。ありがとうございました。
>>934
フックで先方のプロセスに入り込んだ後でサブクラス化(Window Proc の付け替え)すればOKだと思うよ。
>>935
結構雑事が多いから整合取るの大変だけどね
937デフォルトの名無しさん:04/06/23 20:07
複数のファイルのドロップソースになりたいのですが、
フルパスのITEMIDLISTから、デスクトップのIShellFolderを使い
GetUIObjectOfをすればいいんですか?
それとも、やっぱりIDataObjectを実装しないとならないのでしょうか?
>>928
サブクラス化により無事制限出来ました。
どうもありがとうございました。
>>919
???