ここはAPIスレだからそれでもいいけど
一般にはストリームから直接構造体に読み込むのは
移植性無さ過ぎるぞ
891 :
デフォルトの名無しさん:04/06/21 23:27
構造体に読む込むってのは、どうやって
かるく例を書いてもらえるとありがたいんですが
BITMAPFILEHEADER f;
fread(&f, sizeof f, 1, fp);
みたいなことだろ
pretty hackey wayですね(hackyだっけ)
別スレで質問したのですが、そのスレが終わってしまったのでこちらで質問します。
マイコンピューターの、ドライブ名の一覧を取得するにはどうすればよいのでしょう。
デジカメなどのマスストレージなども含めて取得したいです。
OSで開いた場合の「マイコンピュータ」フォルダと同じ内容が得られれば目的を果たせるのですが。
OSはXP、言語はDelphiです。
>>895 IShellFolder::EnumObjects
897 :
デフォルトの名無しさん:04/06/22 10:32
フォントダイアログの「文字飾り-色」だけを非表示にするAPIってありますか?
文字飾りグループを全部消せるのは知っています。
CFHookProcでフォントダイアログにフックを引っ掛けて
その中で目的のコントロールを非表示でよいんじゃないのか?
901 :
デフォルトの名無しさん:04/06/22 15:54
CreateProcessを使って立ち上げたexeの標準出力&エラーを
元で取得するにはどうしたらよいでしょうか。
よろしくお願いします。
パイプ(名無し)は WaitFor ができないのが難点。
>>904 CreateProcessするんだからプロセスハンドルじゃだめか?
>>905 プロセス終了後にまとめて読むんだったらそれでよいけど、
子プロの吐く内容をリアルタイムで取得したい場合もあるから。
たとえば対話式コマンドとか。
それはスレッド使うのが定石。
スレッド使ったところで、ReadとWaitのループで待つわけだから、
パフォーマンスとレスポンスのトレードオフになる。
てか、名前憑きは使えないんだっけ?
ユーザー名から、そのユーザーのユーザーグループ(アドミニとかパワーユーザー)を
知りたいんですがそんなAPIありませんでしょうか?
WM_INITDIALOGの中でSetTimer(hDlg, NULL, 1000, NULL)すると
何かダイアログを操作するまでWM_TIMERがこないんですが、何故でしょうか?
設定したダイアログに対して何か操作をすると
それからは設定した時間ごとにWM_TIMERが飛んでくるんですが・・・
タイマIDって0よかったっけ?
>>910 NetUserGetLocalGroups
>>912 MSDNにはダメとは書いてないですし、SetTimer()の戻り値も正常なので大丈夫かと。
一応適当な数値でやってみましたが、症状変わらずです・・・
>>911 モーダルとモードレスがわかっていない阿寒
あー単純なモーダルダイアログでやってみたらきちんと来ました。
何かミスってるぽいですね。
>>915 解決法をご存知でしたら教えていただきたいんですが、
モードレスダイアログの場合CreateWindow()で作ったWindowのように
PeekMessage()した後にIsDialogMessage()を呼ぶのではダメなんでしょうか?
>>916 どんなメッセージループを書いたのか、書いてみ?
>>917 /* ダイアログ作ったり */
while( hDlg || hMainWnd )
{
while ( ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE) )
{
if ( hDlg && ::IsDialogMessage( hDlg, &msg ) )
continue;
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
/* 毎回呼びたい関数とか */
}
こんな感じです。よろしくお願いします
よく分かりませんが、主要部分は全部クラス化してたので
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 サブクラス化により無事制限出来ました。
どうもありがとうございました。