■過去ログ置き場に戻る■ 1- 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

Win32API質問箱 Build30
1 名前:デフォルトの名無しさん :皇紀2665/04/01(金) 17:58:06
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。

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

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn.microsoft.com)の利用推奨
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで

2 名前:デフォルトの名無しさん :皇紀2665/04/01(金) 17:59:02
- MSDN Online
http://www.microsoft.com/japan/msdn/
- 猫でもわかるプログラミング
http://www.kumei.ne.jp/c_lang/
- Platform SDK Update
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
- Google
http://www.google.com/

Win32 API入門
http://wisdom.sakura.ne.jp/system/winapi/
Win32 プログラミング入門
http://www7.plala.or.jp/keny01/windows/win32/
Win32 SDK Programming
http://usr_vogel.at.infoseek.co.jp/Win32SDK/

■書籍
Advanced Windows
http://www.amazon.co.jp/exec/obidos/ASIN/4756138055

3 名前:デフォルトの名無しさん :皇紀2665/04/01(金) 17:59:12
-過去スレ
Build29: http://pc8.2ch.net/test/read.cgi/tech/1110281860/
Build28:http://pc5.2ch.net/test/read.cgi/tech/1108199304/
Build27:http://pc5.2ch.net/test/read.cgi/tech/1106103119/
Build26:http://pc5.2ch.net/test/read.cgi/tech/1104109858/
Build25:http://pc5.2ch.net/test/read.cgi/tech/1101393155/
Build24:ttp://pc5.2ch.net/test/read.cgi/tech/1098967135/
Build23:ttp://pc5.2ch.net/test/read.cgi/tech/1095534704/
Build22:ttp://pc5.2ch.net/test/read.cgi/tech/1092524669/
Build21:ttp://pc5.2ch.net/test/read.cgi/tech/1090422324/
Build20:ttp://pc5.2ch.net/test/read.cgi/tech/1088140233/
Build19:ttp://pc5.2ch.net/test/read.cgi/tech/1084697545/
Build18:ttp://pc5.2ch.net/test/read.cgi/tech/1081702990/
Build17:ttp://pc5.2ch.net/test/read.cgi/tech/1077470361/
Build16:ttp://pc2.2ch.net/test/read.cgi/tech/1073830065/
Build15:ttp://pc2.2ch.net/test/read.cgi/tech/1069339866/
Build14:ttp://pc5.2ch.net/tech/kako/1065/10653/1065328397.html
Build13:ttp://pc5.2ch.net/tech/kako/1059/10595/1059549320.html
Build12:ttp://pc5.2ch.net/tech/kako/1056/10560/1056033645.html
Build11:ttp://pc5.2ch.net/tech/kako/1052/10526/1052651750.html
Build10:ttp://pc5.2ch.net/tech/kako/1047/10478/1047819779.html
Build9:ttp://pc5.2ch.net/tech/kako/1044/10449/1044929160.html
Build8:ttp://pc5.2ch.net/tech/kako/1040/10409/1040964626.html
Build7:ttp://pc3.2ch.net/tech/kako/1036/10366/1036654893.html
Build6:ttp://pc3.2ch.net/tech/kako/1032/10325/1032548635.html
Build5:ttp://pc3.2ch.net/tech/kako/1028/10285/1028580373.html
Build4:ttp://pc3.2ch.net/tech/kako/1023/10233/1023361418.html
Build3:ttp://pc.2ch.net/tech/kako/1017/10170/1017072275.html
Build2:ttp://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Build1:ttp://pc.2ch.net/tech/kako/991/991576947.html
(★は「いやーごめんなさい。」に巻き込まれた模様

4 名前:デフォルトの名無しさん :皇紀2665/04/01(金) 18:01:34
ん…>>2のMSDNに英語版のリンク書くの忘れた…。

5 名前:前スレ966 :int 2ch =05/04/02(土) 01:51:00
前スレ966です。
いろいろとソースをいじっていて気づいたことがあります。
cmd.exeのExitProcessをフックできない、と書きましたが、
そもそもcmd.exeのプロセス内にフックDLLが注入されていないようです。

SetWindowsHookEx( WH_GETMESSAGE, GetMsgProc, hModule, 0);
↑でフックをセットして、フックDLLのDLL_PROCESS_ATTACHの所で、
GetCurrentProcessId( )で取得したプロセスIDをOutputDebugString( )で出力してみたのですが、
cmd.exeのプロセスIDが表示されませんでした。
cmd.exeだけ特殊なのでしょうか。

それとも、フックの仕方が間違っているのでしょうか。

ご助言いただけたらと思います。
よろしくお願いします。

6 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 01:58:53 ?###
ホックって読んでました><

7 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 02:57:15
>>5
cmd.exeはGetMessage()を呼んでないと思うよ。

8 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 03:46:45
TCHAR(wchar)をcharに変換したい場合はどうすればいいのでしょうか?


9 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 04:01:13
>>8
その二つで検索してみれ
自分で解決するのも勉強だ
んだ

10 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 04:57:01
一応今は、
char *c = (char*)malloc(sizeof(TCHAR) * _tcslen(str) + 1);
sprintf((char*)c, "%S", str);
っていう風にやってるんですが、これより効率的な方法はあるんですか?

11 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 04:57:28
あ、sprintfのcharキャストは要らないですね。そこはミスです。

12 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 05:18:39
>>10
いったい何がやりたいの?
その2行のコード、無茶苦茶だぞ。

13 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 05:25:04
UnicodeからMBCSに変換したい、ということだとしたら、
そのようにTCHARや_tcslenを使うのは間違い。




14 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 05:31:49
WideCharToMultiByte

15 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 10:35:31
ListViewで アイコン一覧とコメント(名称) のリストを作成したく

LV_ITEM item;
item.mask= LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;


という感じでリストビューを表示したのはよいのですが、
項目が増えると、右にスクロール(水平スクロールバーが表示される)してしまいます。

下に項目が増えていく(垂直スクロールバーのみが表示される)ように設定するには
どうすればよいのでしょうか。教えてください


16 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 11:12:47
>>10
すごいコードだ。最近のこのスレでNo1じゃないのか

17 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 11:28:08
C++相談室で回答を得られましたので
http://pc8.2ch.net/test/read.cgi/tech/1106527792/n757-761
具体的な実装方法を模索していたところ以下のレスを発見しました。

908 名前:デフォルトの名無しさん :03/09/29 17:37
最初にくるメッセージが何であれ、
ATLのメッセージハンドリングっぽくすればいいだろうに。

...
wcex.lpfnWndProc = WndProc1st; //最初のコールバックを設定。
...
Mgr::Instance().SetData( ::GetCurrentThreadId(), this ); // データ一時保存
CreateWindowEx( ... ); // ウィンドウ作成
...

LRESULT CALLBACK WndProc1st( .... )
{
 void * p = Mgr::Instance().GetData( ::GetCurrentThreadId() ); // データ取得
 SetWindowLongPtr( hWnd, GWLP_USERDATA, (LONG_PTR)p ); // なんか処理

 // WndProc を本来のものに変更
 SetWindowLongPtr( hWnd, GWLP_WNDPROC, (LONG_PTR)WndProc );
 return WndProc( hWnd, uMsg, wParam, lParam );
}

LRESULT CALLBACK WndProc( .... )
{
... // なんか処理
};

Mgr::Instance().Get/SetData() で this を渡す方法よりも
よりシンプルに実現する方法、思いつかれる方はいますか?

18 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 11:48:23
外部を経由するしかないと思う
↑のコードは一般化された「外部を経由する」パターンだから
シンプルにしたとしても結局同じことになるよ

19 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 12:14:05
>>17
CREATESTRUCTのlpCreateParamsにthisを持たせるとか

20 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 12:34:42
関数の引数で、例えばMSGのポインタを扱いたい場合、
void hogea(MSG*);
と、
void hogeb(PMSG);
とやるのはどちらが推奨されるんでしょうか?

21 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 12:46:41
PMSG

22 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 13:09:50
しかしPCMSGとかはないから、そういうときは結局 const MSG *などと書かなければならない。

23 名前:デフォルトの名無しさん :int 2ch =05/04/02(土) 13:15:49
>>19
それはできない。
なぜならCreateWindowExを呼んだ後、ウィンドウプロシージャへ来る1番最初のメッセージは
WM_CREATEでもなくWM_NCCREATEでもなくWM_GETMINMAXINFOだから。

24 名前:デフォルトの名無しさん :2005/04/02(土) 18:21:06
なければ作ればいいじゃない。

25 名前:デフォルトの名無しさん :2005/04/02(土) 19:21:43
>>15 はスルーされているが、マルチ?
猫でも・・・の Windows SDK 109 章は見たのかな。
この質問見て、自分の UnLha のファイル・リストにアイコン付けたら、見当ての
ファイルが探しやすいかと気がついた。

26 名前:デフォルトの名無しさん :2005/04/02(土) 19:40:03
>>19
素敵な方法ありがとうございます
さっそく試してみましたら成功しました!

>>23
メインウインドウとコントロールの両方でWM_GETMINMAXINFOを捕捉してみましたが、
メインウインドウにしか投げられてきませんでした。

最大化・最小化に関係のないコントロールなら>>19さんの方法でも良いのかもしれないですね。

みなさんありがとうございます。

27 名前:デフォルトの名無しさん :2005/04/02(土) 23:09:10
hSmile = LoadImage((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),
MAKEINTRESOURCE(IDB_SMILE),IMAGE_BITMAP,
0,0,LR_LOADFROMFILE);
上のようなソースをコンパイルしたところ。

error C2440: '=' : 'void *' から 'struct HBITMAP__ *' に変換することはできません。

というエラーメッセージが出てしまいます。
どこが駄目なのでしょうか?原因を教えてください。お願いします。

28 名前:デフォルトの名無しさん :2005/04/02(土) 23:20:15
>>27
C++ではvoid *から他のポインタ型への変換をするにはstatic_castが必要。
HANDLEはvoid *のtypedefだし、それ以外のハンドルは全てなんらかのポインタからのtypedef。

29 名前:デフォルトの名無しさん :2005/04/02(土) 23:20:25
hSmile = (HBITMAP*)LoadImage(

30 名前:デフォルトの名無しさん :2005/04/02(土) 23:20:55
motoi

hSmile = (HBITMAP)LoadImage(

31 名前:デフォルトの名無しさん :2005/04/02(土) 23:21:59
>>30
通りましたorz

32 名前:デフォルトの名無しさん :2005/04/02(土) 23:44:47
キャストとかの例題をテンプレに追加した方がいいんでないか?
スレが立つ度に見る気がする。

33 名前:デフォルトの名無しさん :2005/04/02(土) 23:56:05
メンバ関数がコールバックに使えません、とか?

34 名前:27 :2005/04/03(日) 00:49:03
先ほどはありがとうございました。
すみません。。もうひとつ質問があります。
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp){
HDC hdc;
PAINTSTRUCT ps;
static HDC hMemDC;
static HBITMAP hSmile;
static BITMAP bitmap;
switch(msg){
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
hMemDC = CreateCompatibleDC(hdc);
hSmile = (HBITMAP)LoadImage((HINSTANCE)GetWindowLong(
hWnd,GWL_HINSTANCE),
MAKEINTRESOURCE(IDB_SMILE),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
SelectObject(hMemDC,hSmile);
GetObject(hSmile,(int)sizeof(MAKEINTRESOURCE(IDB_SMILE)),&bitmap);
BitBlt(hdc,0,0,bitmap.bmWidth,bitmap.bmHeight,hMemDC,0,0,SRCCOPY);
DeleteDC(hMemDC);
DeleteObject(hSmile);
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd,msg,wp,lp));
}
return 0;
}
上記のソースはコンパイルは通るものの、目的の画像が描画されません。(クライアント領域には何も描画されませんでした。)
考えてみたのですがどこが悪いのか全然分かりません。どなたか原因を教えてください。お願いします。

35 名前:デフォルトの名無しさん :2005/04/03(日) 01:05:23
>>34
hSmileがNULLならその引数に問題あり
リソース関係の引数に矛盾や間違いがないか確かめて見たら?

36 名前:デフォルトの名無しさん :2005/04/03(日) 01:18:27
LR_LOADFROMFILE なのに MAKEINTRESOURCE(IDB_SMILE) なところとか。

37 名前:デフォルトの名無しさん :2005/04/03(日) 01:27:57
次は「描画する度にメモリ消費が増えます」と来ると予想。

38 名前:27 :2005/04/03(日) 01:29:53
35さんの言うようにhSmileがNULLでした。
36さんの言うようにLR_LOADFROMFILEはおかしいと思ったので、LR_DEFAULTCOLORに変更。
hSmileがNULLではなくなったようですが、まだ画像が表示されませんorz

39 名前:デフォルトの名無しさん :2005/04/03(日) 01:34:24
>>38
頼むからAPIの戻り値を見て成功してるかどうか調べてから質問してくれ。


40 名前:デフォルトの名無しさん :2005/04/03(日) 01:43:26
>>38
LR_DEFAULTCOLOR?
LR_CREATEDIBSECTIONじゃなかった

41 名前:27 :2005/04/03(日) 02:05:06
GetObject(hSmile,(int)sizeof(MAKEINTRESOURCE(IDB_SMILE)),&bitmap);

GetObject(hSmile,(int)sizeof(BITMAP),&bitmap);
にしたら描画ができました!
みなさん、ありがとうございました。


42 名前:デフォルトの名無しさん :2005/04/03(日) 13:19:32
タスクバーにでてるアプリの名前や情報を取得できるAPIってありますか?
タスクバーにでてるアプリを楽に切り替えできるようにしたいのですが。

43 名前:デフォルトの名無しさん :2005/04/03(日) 13:22:43
無いので頑張ってFindWindowExで潜っていく。
ついでにタスクバーの仕様はOSのバージョンで結構ころころ変わってる。

44 名前:デフォルトの名無しさん :2005/04/03(日) 16:37:42
スクリーンキーボードを作ろうとしているのですが、
SendInputを使用して実現しようとしています。

フラグにKEYEVENTF_UNICODEを用い、
どのキーボード配列でも入力可能にしたいのですが、
UNICODEを使用すると入力された文字が変換待ちの全角になってしまいます。
Windowsのコントロールパネル内のキーボードを英語既定にするとうまくいくのですが、、、
IMEが関係しているのでしょうか?

45 名前:デフォルトの名無しさん :2005/04/03(日) 18:06:35
特殊フォルダをドラッグ&ドロップ出来るようにするにはどうしたらいいのでしょうか?
DragAcceptFilesを使って試してみましたが出来ませんでした。


46 名前:デフォルトの名無しさん :2005/04/03(日) 18:44:09
>>42
EnumWindow

47 名前:デフォルトの名無しさん :2005/04/03(日) 18:50:05
>>44
http://pc8.2ch.net/test/read.cgi/tech/1107926989/701

48 名前:デフォルトの名無しさん :2005/04/03(日) 19:00:49
BitBlt系のラスタオペレーションコードの
数値の法則?はどうなっているのでしょうか。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/289.txt

例えば、http://www14.big.or.jp/~ken1/tech/tech9.html
//↑のラスタオペレーションでNOT演算とSRCANDの作業が一度にできる
と書いてある0x220326の数値はどうやって出したのでしょうか。

49 名前:デフォルトの名無しさん :2005/04/03(日) 19:19:09
Ternary Raster Operations

50 名前:25:ListView+Icon :2005/04/03(日) 23:19:52
>>15
今まで ListBox だった dialog の pane を ListView に変えて、ファイル名の
表示を icon 付きに出来ました。
ListView の属性を、最初「小さなアイコン」で指定すると、item の追加で確かに
横へ追加されました。この属性を「レポート」にすると、縦のみの追加になりました。
また、「カラムにヘッダをつけない」にチェックを入れて、処理コードの方でも
何もしないと、内容の表示自体が出なかったのですが、処理コードの方には見だし
を挿入するようにしたら、期待通りになりました。(見だし挿入では、幅の指定は
ListView の RECT の幅から、垂直スクロールの幅を引いたものを使用。見だしの
文字列は表示はされないので、ダミー。)
選択された行は、(猫でも...にあるように)ListView_GetNextItem() で得られ
ました。


51 名前:デフォルトの名無しさん :2005/04/04(月) 00:32:17
Unix系OSのgettimeofdayをエミュレートするのに
ファイルタイムAPIを使うのはいかがなもんなんでしょう?

QueryPerformanceFrequencyがあんまり重すぎるんで
このあいだwebで見つけたGetSystemTimeAsFileTimeを使って
エミュレートする方法を採用したんですが。

今取り組んでるのがそこそこタイミング精度に厳しいソフトなんで
このままでいいのか元に戻した方がいいのか迷ってます。

ご教授よろしくお願いします。


52 名前:デフォルトの名無しさん :2005/04/04(月) 00:33:12
特定のファイル、フォルダに作成日時とか更新日時を任意にセットする方法はありますでしょうか・・

53 名前:デフォルトの名無しさん :2005/04/04(月) 01:27:55
メインウィンドウにダイアログをCHILDとして貼り付けているのですが
そのダイアログでWM_LBUTTONDOWNメッセージを取得することができません。
どなたか教えていただけると助かります。

54 名前:デフォルトの名無しさん :2005/04/04(月) 02:02:03
>>52
SetFileTimeという、まんまの名前のAPIがあるわけだが。
ちょっとは自分で調べたか?

55 名前:デフォルトの名無しさん :2005/04/04(月) 02:16:01
>>54
すみません
ありがとうございます
次からは気をつけます

56 名前:デフォルトの名無しさん :2005/04/04(月) 02:20:48
>52
)ノ SetFileTime


57 名前:デフォルトの名無しさん :2005/04/04(月) 02:38:06
>>53
その説明では、わかる人は神様しかいないと思うが...
まさか、ダイアログに貼り付けてあるコントロール部分
クリックしてるんじゃないだろね

58 名前:デフォルトの名無しさん :2005/04/04(月) 02:56:49
>57
すみません。説明不足でした。
貼り付けている子ダイアログにはコントロールは貼り付けておらず、
単純にダイアログの領域をクリックしたときのイベントを取得したいと思っています。
ダイアログの作成にはCreateDialog()を使用しています。

CreateDialog(hInst, (LPCTSTR)IDD_MAIN_CENTER, hWnd, (DLGPROC)DlgProc);
その後、

LRESULT CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_LBUTTONDOWN:
// ここにイベントが入って来ない。
break;




といった状況です。
VCリソースエディタでの設定などがわるいのでしょうか・・・
ご教授いただけると大変助かります。。

59 名前:デフォルトの名無しさん :2005/04/04(月) 03:02:51
>>58
作成したダイアログのハンドルがNULLでないかいひょっとして
NULLであれば(LPCTSTR)IDD_MAIN_CENTERを
MAKEINTRESOURCE(IDD_MAIN_CENTER)にかえてごらん


60 名前:48 :2005/04/04(月) 03:08:25
>>49
理解できました。キーワードをありがとうございました。

61 名前:デフォルトの名無しさん :2005/04/04(月) 03:08:35
>59
作成したダイアログはきちんとハンドルが取れていました。
MAKEINTRESOURCEで試してもイベントはとれませんでした。
WM_SIZEなどのイベントは取得できるのですが、、、


62 名前:デフォルトの名無しさん :2005/04/04(月) 03:35:55
>>61
ひょっとして、ShowWindowしてないんじゃありませんか?
ShowWindowしてないと多分こないと思いますけど

63 名前:デフォルトの名無しさん :2005/04/04(月) 03:42:45
>62
ShowWindowもしているのですが・・・
通常Windowに子ダイアログを貼り付けて
ダイアログのメッセージプロシージャで
WM_LBUTTONDOWNなどは何の問題もなく受け取れるのでしょうか?

64 名前:デフォルトの名無しさん :2005/04/04(月) 03:53:05
>>63
私の場合も同じ事やってますけど
バンバン来ますよメッセージ
CreateWinodowをオーバーラップウィンドウ作って
それにCreateDialogでインスタンスと親ウィンドウのハンドル渡してます
ダイアログのリソースはChildに設定してあとは何もチェックしてません
正常に動くサンプルを見つけてそれを改造するかたちにしたら
良いのではないでしょうか
私は行き詰った時は、そうしてます
お役に立ちそうもなくてすみません
ではおやすみなさい

65 名前:デフォルトの名無しさん :2005/04/04(月) 03:53:46
>62
度々申し訳ありません。
実は、このダイアログを作成しているクラスの基底クラスで
オーナードローをしているのですが、そこに原因がありました。。。
お騒がせしてすみません。
ご回答ありがとうございました。

66 名前:42 :2005/04/04(月) 04:39:02
>>46
レスありがとうございます。
EnumWindowでウィンドウの列挙をやってみたのですが、この場合タスクバーに表示されてるアプリだけでなく、
タスクトレイにでてるようなアプリも列挙されますよね?
タスクマネージャの一つ目のタブに表示されてるアプリを取得したいのですが。

http://support.microsoft.com/kb/175030/JA/

 一般的なプログラミング タスクの 1 つに、実行中のすべての "アプリケーション" の列挙があります。
Windows タスク マネージャが良い例で、このプログラムでは 2 つの方法で "アプリケーション" の一覧が表示されます。
タスク マネージャの 1 つ目のタブには、デスクトップ上のすべての "アプリケーション ウィンドウ" の一覧が表示されます。
2 つ目のタブには、システム内のすべての "プロセス" の一覧が表示されます。この資料では、これらの両方のタスクを実行する方法について詳しく説明します。
 プロセスの列挙と、デスクトップ上のトップレベル ウィンドウの列挙では、トップレベル ウィンドウを列挙する方が比較的簡単です。
トップレベル ウィンドウを列挙するには、EnumWindows() 関数を使用します。



この資料にかいてある「デスクトップ上のすべての "アプリケーション ウィンドウ" の一覧」を表示したいのですが、
この資料ではその方法がEnumWindowを使用した方法で解説してあります。
すでにかいたようにEnumWindowを使用してやってみたのですが、タスクマネージャの一つ目のタブに表示さてる
アプリだけを取得することはできなかったんです。どうすればいいでしょうか

67 名前:デフォルトの名無しさん :2005/04/04(月) 07:42:56
>51
GetSystemTimeAsFileTimeは、変数の精度は100ns単位だけど、
実際は15ms単位くらいで増えていくことが多い(64回/秒しか変化しない)。
GetSystemTimeAdjustmentを呼べば、実際の精度が判る。
そうなら、timeBeginPeriod(1);して、timeGetTime()を呼んだ方がマシ。

QueryPerformanceCounterがあまりに重い、ってホント?

68 名前:デフォルトの名無しさん :2005/04/04(月) 10:11:39
for( hwnd = GetWindow( GetDesktopWindow(), GW_CHILD );
NULL != hwnd;
hwnd = GetWindow( hwnd, GW_HWNDNEXT ) ) {
if( IsWindow( hwnd ) && IsWindowVisible( hwnd ) &&
(style = GetWindowStyle( hwnd ) & WS_CAPTION) == WS_CAPTION && !(style & WS_POPUP) ) {
// ウィンドウハンドル列挙
}
}


69 名前:デフォルトの名無しさん :2005/04/04(月) 10:24:42
>>51
QueryPerformanceCounterは、デュアルCPUのマシンでも、高々1000クロックくらいだったよ。

これでも重いというのであれば、OSを介さずに、RDTSC命令を直に叩いて取得するのはどう?
ただし、CPUが複数ある場合、それぞれのCPUが別々にカウントしているので、
値がズレているので注意。



70 名前:デフォルトの名無しさん :2005/04/04(月) 10:28:12
////////////////////////////////////////////////////////////////////////////////////////////////////////////SpecialSample2
// 全てのトップレベルウインドウを列挙し、情報を表示
////////////////////////////////////////////////////////////////////////////////////////////////////////////SpecialSample2
//コールバック関数はWindowの数だけ呼び出されるので、
BOOL CALLBACK EnumWindowProc(HWND hWnd, LPARAM lParam)
{
if( IsWindowVisible( hWnd )
&& GetWindow(hWnd, GW_OWNER)==NULL){
charpszWindowText[256];
charpszClassName[256];
//Windowタイトル取得
GetWindowText(hWnd, pszWindowText, sizeof(pszWindowText));
//クラス名取得 シェルの場合は「Progman」となる。
GetClassName(hWnd, pszClassName, sizeof(pszClassName));

DWORD dwProcessId;
//WindowのプロセスIDとスレッドIDを得る
DWORD dwThreadId = GetWindowThreadProcessId(hWnd, &dwProcessId);

TRACE("pszWindowText = %s, pszClassName = %s dwProcessId = %d, dwThreadId = %d \n", pszWindowText, pszClassName, dwProcessId, dwThreadId);
}
return TRUE;
}
void CShareDlg::OnButton56()
{
//コールバック関数EnumWindowProcを指定してEnumWindowを行う。
EnumWindows(EnumWindowProc, NULL);
//処理の流れがすっ飛んでしまうのだ。

}



71 名前:デフォルトの名無しさん :2005/04/04(月) 10:30:01
////////////////////////////////////////////////////////////
// CTestDlg メッセージ ハンドラ
BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// "バージョン情報..." メニュー項目をシステム
・・・
// TODO: 特別な初期化を行う時はこの場所に追加してください。
///////////////////////////////////////////
// 現在起動しているウィンドウの一覧を取得する
// 自分の親、つまり、トップウィンドウを取得し、
// その一覧をリストボックスに入れる
CWnd *pWnd = AfxGetMainWnd()->GetWindow( GW_HWNDFIRST);
CString strwork;
while( pWnd != NULL){
// オーナーがいない
// 表示してるウィンドウ
// タイトルがあるもの
if( pWnd->GetOwner() == NULL &&
pWnd->GetWindowTextLength() != 0 &&
pWnd->IsWindowVisible() == TRUE){
pWnd->GetWindowText( strwork);
m_lstWnd.AddString( strwork);
}
pWnd = pWnd->GetWindow( GW_HWNDNEXT);
}
return TRUE; // TRUE を返すとコントロールに設定・・・
}

72 名前:デフォルトの名無しさん :2005/04/04(月) 11:20:09
画像を表示する時、ウィンドウハンドルの部分をNULLにしてもいいのでしょうか。
hDC = GetDC(NULL);
hDCBack = CreateCompatibleDC(hDC);
ReleaseDC(NULL, hDC);
DeleteDC(hDCBack);

73 名前:デフォルトの名無しさん :2005/04/04(月) 11:23:44
GetDCの解説を読め。

74 名前:デフォルトの名無しさん :2005/04/04(月) 12:31:38
>>72 の質問を見て思い出したんですけど、GetDC() の場合はいいとして、
実際には NULL を指定できるのに、説明には書かれていないことってありますよね。
例えば、SetWindowText() の第2引数とか。
 (a) SetWindowText(hWnd, TEXT(""));
 (b) SetWindowText(hWnd, NULL);
厳密には (a) のように指定すべきだと思うのですが、(b) のようなコードもよく見かけます。
実は NULL を指定してもいいってどこかに書かれていたりしますか?

75 名前:デフォルトの名無しさん :2005/04/04(月) 13:10:21
>>74
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/usingmessagesandmessagequeues.asp

76 名前:74 :2005/04/04(月) 14:00:51
>>75
どうもありがとうございます。
んー、確かに「NULL を指定しても問題はなさそうだ」ということは言えると思うのですが、
解説として明記されている箇所が見つからない限り、まだちょっと不安は残りますよね。
サンプルコードを書いた人が使い方を誤っているという可能性もなくはないですし…。
まあ、そんなことを言い始めると突っ込みどころが多くてキリがないんですが…。

77 名前:デフォルトの名無しさん :2005/04/04(月) 14:17:25
タブページのタイトル上で右クリックされたとき、どのページのタイトルか判別する方法はあるでしょうか?


78 名前:デフォルトの名無しさん :2005/04/04(月) 14:25:13
それはごく普通のタブ切り替えアクションじゃないのか?

79 名前:51 :2005/04/04(月) 15:34:21
>>67,69
情報ありがとうございます。なるほど15ms間隔じゃキツいですね。

それと、重いってのはどうやら勘違い(表現違い)でした。
重いのではなくて、タイムスケジューラが作動している間はずっと
CPU使用率が常に100%になってしまってます。(音楽系ソフトです)

実際そんなに忙しくはないけど忙しそうに見える…みたいな感じで。
これってつまり、GetSystemTimeAsFileTimeが10msくらいの間隔で
サボってたっていう証拠なんでしょうか?計測した方がよさそうですね。

ちなみに最終的にはunix系のgettimeofday()にあわせて
timeval構造体のtv_sec, tv_usec(どちらもlong型)に変換してます。

80 名前:デフォルトの名無しさん :2005/04/04(月) 19:42:25
このスレには勘違いをしている香具師がいるようです。

A 質問をろくに読まずにgoogleで調べてアドレス貼り付ける香具師 ←お手上げ

B 的確な答えだが、偉そうに書いている香具師 ←人間的に(ry

C 「調べろ」「勉強しなおしてこい」といった意味のないレス

D 俺みたいな香具師

81 名前:デフォルトの名無しさん :2005/04/04(月) 19:57:21
E 嘘テクを教える香具師

F 何でもかんでもAdvancedWindows嫁と言う香具師(俺


こんなとこで質問する暇があったらAdvancedWindows嫁よ

82 名前:デフォルトの名無しさん :2005/04/04(月) 20:08:14
何を期待してるんだ?

83 名前:デフォルトの名無しさん :2005/04/04(月) 20:08:51
>>82みたいなアフォ

84 名前:デフォルトの名無しさん :2005/04/04(月) 20:09:16
一家に一冊AdvancedWindows

 読者の声----AdvancedWindowsのおかげで競馬で連戦連勝です。

85 名前:デフォルトの名無しさん :2005/04/04(月) 21:02:20
AdvancedWindowsのおかげで彼女も出来てウハウハです

86 名前:デフォルトの名無しさん :2005/04/04(月) 22:43:27
AdvancedWindows のおかげで魔法少女になれました。

87 名前:デフォルトの名無しさん :2005/04/04(月) 22:48:56
AdvancedWindowsのおかげで包丁裁きが前よりも良くなりました。

88 名前:デフォルトの名無しさん :2005/04/04(月) 22:52:51 ?#








             あ             っ             そ









89 名前:デフォルトの名無しさん :2005/04/04(月) 23:06:53
くまぼくじょ う

90 名前:デフォルトの名無しさん :2005/04/04(月) 23:35:30
Win98DOS窓上でexeclp()してmoreなどに出力を渡していたコマンドが
WinXPコマンドプロンプト上ではうまく動作しません。
コマンドプロンプトではどうしたらよいのでしょうか?

91 名前:デフォルトの名無しさん :2005/04/05(火) 03:15:17
>>2 のWin32 API入門を参考にしながら
MDIアプリケーションを作っているのですが
ステータスバーの実装のところでつまづきました。
子ウィンドウには問題なくステータスバーをつけることができるのですが、
親ウインドウにステータスバーをつけようとすると子ウィンドウが開かなくなります。
メッセージ処理部分の
case WM_SIZE:
SendMessage(hStatus , msg , wp , lp);
をコメントにするとステータスバーは再描画されませんが
子ウィンドウはでるようになるのでこの部分が悪さを
しているようなのですが、どうすればいいのかがわかりません。orz


92 名前:デフォルトの名無しさん :2005/04/05(火) 04:53:17
ステータスバーのウィンドハンドルって特殊なんだよたしか

93 名前:デフォルトの名無しさん :2005/04/05(火) 11:54:33
GetObjectの第一引数が、HDCであるバージョンのがありましたら教えてください。

94 名前:デフォルトの名無しさん :2005/04/05(火) 11:55:15
VerQueryValueで返ってくる言語コード(こういうやつ0x0401)を、
英語表記に置き換えたいのですが、対応表ってないのでしょうか?
結構調べてみましたが、みつかりません。


95 名前:デフォルトの名無しさん :2005/04/05(火) 12:38:58
【質問】
.NET Frameworkって普及してるの?

96 名前:デフォルトの名無しさん :2005/04/05(火) 12:40:25
>>93
何を期待してるのか知らんが、んなもんない。

97 名前:93 :2005/04/05(火) 13:21:23
>>96
ありがとうございます。
グラフィック系Win32APIは、HDCに置き換えて作業するものが多いから、
グラフィック計ユーザー関数の引数に、HBITMAPではなくHDCで渡すものがあって、
HDCで出来たらなと思いました。

98 名前:デフォルトの名無しさん :2005/04/05(火) 13:36:28
>>95
Windows Updateで、よくわからずにインストールしちゃってる人は多数いる予感。

俺は一度、馬鹿上司に、勝手にインストールされたことあるよ。
むやみにWindows Updateするだけでも問題なのに、なぜそんなものを入れるか、と。


99 名前:デフォルトの名無しさん :2005/04/05(火) 13:46:12
素直に入れとけ

100 名前:デフォルトの名無しさん :2005/04/05(火) 15:08:52
>97
GetCurrentObject?

101 名前:93 :2005/04/05(火) 17:32:23
>>100
それっぽいです。ありがとうございます。

102 名前:デフォルトの名無しさん :2005/04/05(火) 18:02:19
今ローカルにあるサーバと通信をするプログラムを作っているんですが、
ちょっと困ったことになりました。質問させてください。

Win32アプリからCreateProcess()でサーバプログラム(server.exeとしておきます)を
起動した場合と、コマンドラインからserver.exeなどと打って起動した場合で、
前者はレスポンスが早く、後者はレスポンスが遅くなってしまいます。

両者に何か違いはあるのでしょうか?原因がよく分かりません。。
通信の際に何か別の(OSの)プロセスを介しているから遅くなっているとか?

103 名前:デフォルトの名無しさん :2005/04/05(火) 18:14:39
違いねぇ…
環境変数?
あと、カレントディレクトリが変わるってのは?

104 名前:デフォルトの名無しさん :2005/04/05(火) 18:16:53
デバッグビルドを動かしてるとか?
さもなきゃ同名の別プログラムとか。

105 名前:102 :2005/04/05(火) 18:33:55
お早い返事どうも。

>>103
レスポンスに影響しそうな環境変数というと何があるんでしょう?
カレントディレクトリはどちらも間違いなく同じ位置です。
そもそも、カレントディレクトリが間違っていれば
起動に失敗してしまうサーバですので。。

>>104
今確認してみましたが、これも間違いなく同じプログラムが動作してます。

実は言うと、そのサーバを起動するプログラム(MFC)は自分で作ったものではなくて
自分以外の人間が作ったものなんです。もしかしたら何か全く別の原因なのかも。
CreateProcess()の前に何か小細工でもしてあるんでしょうか?

ちなみに体感的に50msほどの遅れです。

106 名前:デフォルトの名無しさん :2005/04/05(火) 18:35:50
0.05秒の差を感知できるお前は天才

と言う事で

107 名前:デフォルトの名無しさん :2005/04/05(火) 18:39:18
プライオリティが高くなってるとか。

108 名前:デフォルトの名無しさん :2005/04/05(火) 18:41:27
以前、wcharをcharに変換する事で質問したものですが、
その時にWideCharToMultiByteを使えばいい事を
教えて頂いて早速試したのですが、WideCharToMultiByteを使った場合、
wcharでUCS2だったものが、SJISに変換されてしまいます。
wcharをUCS2のままcharに変換できないのでしょうか?
wcharから、上位8bit下位8bitずつとって自分でcharにする以外の方法はないのでしょうか?

109 名前:102 :2005/04/05(火) 18:52:05
>>106
1桁間違えました。その10倍です。

>>107
タスクマネージャから優先度をリアルタイムに変えても同じみたいです。
他にも何かプライオリティを設定する方法があるんでしょうか?

今サーバにメッセージをダンプさせてみたところ、
サーバの処理速度が遅くなっているだけだったみたいです。
通信に関係ないとなるとますます謎です。

110 名前:デフォルトの名無しさん :2005/04/05(火) 19:03:42
>108
何のためにwcharをcharにする必要があるんだ?
UTF-16LE形式のままsendしたい、と言うような話なら、キャストして終わりだ。

111 名前:デフォルトの名無しさん :2005/04/05(火) 19:04:15
>109
何が500ms遅れるの?

112 名前:102 :2005/04/05(火) 19:04:29
>>107
あ、やっぱり優先度関係が濃厚っぽいです。
ProcessWaker使ってプロセスツリーの状態を調べてみたところ
コマンドラインから起動させた場合は、エクスプローラの下で
プロセスが起動しているのに対して、MFCアプリからの起動だと
全く別で、よりrootに近い方のノードから派生してました。

しかも前者が優先度42に対して後者は8になってました。これが原因ぽいです。
エクスプローラの外側に優先度の高いプロセスを生成するってどうやるんでしょう?

質問のレベルが低くてすみません。

113 名前:102 :2005/04/05(火) 19:05:39
>>111
音声処理サーバなので、出音が遅れます。説明不足でした。

114 名前:デフォルトの名無しさん :2005/04/05(火) 19:11:53
>>110

確かにcastで実現できたのですが、アスキー文字が0x00 0x20とかになってしまって・・・。
wcharをcharに変換するってかなりおかしな事なのでしょうか?

115 名前:デフォルトの名無しさん :2005/04/05(火) 19:13:53
では、そのcharのcharsetは何なんだ。Shift_JISでは不満なようだが。

116 名前:デフォルトの名無しさん :2005/04/05(火) 19:26:43
>>114
アスキー文字を1バイトで表現したいんなら、Shift_JISなりUTF-8なり
を使うべし。素人が変な符号化方式を設計しちゃダメだよ。



117 名前:デフォルトの名無しさん :2005/04/05(火) 19:28:03
>>115

wcharのままのcharsetがいいのですが。
単にwcharを1byteずつ扱いたいんです。
何か私がとんだ勘違いをしているのかな????

118 名前:117 :2005/04/05(火) 19:31:37
あれ、wcharのエンコーディングはUCS-2ですよね?

119 名前:デフォルトの名無しさん :2005/04/05(火) 19:33:05
>>117
だから、char*にキャストすればいいやん。
アスキー文字が 0x20 0x00 みたいになることの何が不都合なんだ。

もうちょっと上のレベルで「なんでcharで扱いたいのか」を書いたほう
がいいよ。



120 名前:デフォルトの名無しさん :2005/04/05(火) 19:33:22
>>118
で、なぜ0x00 0x60になるのが疑問なんだ?

121 名前:デフォルトの名無しさん :2005/04/05(火) 19:35:46
違うよ。MSのwchar_tはUCS4のUTF-16。
その証拠にサロゲートペアがサポートされてる。

122 名前:117 :2005/04/05(火) 19:41:47
すいません、渡しがいろいろと勘違いしてたようです。
顔洗って出直してきます。

123 名前:117 :2005/04/05(火) 19:42:43
しかも、最後に誤字。鬱だ氏のうorz

124 名前:102 :2005/04/05(火) 19:49:37
あ、プロセスツリーの位置もあんまし関係ないみたい。
特別なサーバプロセスとして起動させてるのかなとか思ってたけど…。
もし何か思い当たることがある方がいましたら、その時はお願いします。

もうすこし調べてみたいと思います。お騒がせしました。

125 名前:デフォルトの名無しさん :2005/04/05(火) 20:26:47
>>121
・・・おいおい、違うんじゃないか?

126 名前:121 :2005/04/05(火) 20:31:58
どのあたりが?

127 名前:102 :2005/04/05(火) 20:41:33
>>103
環境変数の違いでした!バカだなオレ・・・。
::SetEnvironmentVariable()の行を見落としてました。
ほんとに助かりました。このご恩は一生忘れません。

128 名前:デフォルトの名無しさん :2005/04/05(火) 20:58:12
サービスプログラムでユーザーの偽装を行った後に、ユーザの偽装を
行ったプロセスやスレッドが終了しても、対話的に操作をしている
人がユーザを偽装し続けるには、どうすれば良いですか?

129 名前:デフォルトの名無しさん :2005/04/05(火) 21:07:42
>>126
UCS-4もUTF-16も文字符号化形式の一つだから並び立つ事がない点じゃない?
UCS-4はUTF-32と互換性の高い32(31)ビット固定符号化形式。
サロゲートペアはUnicodeの基本BMP面以外をUTF-16で表現する時に使用する仕組み。

130 名前:121 :2005/04/05(火) 21:44:46
UCS-4は符号化文字集合(CCS)としての意味も持ちますよ。
「4オクテット正規形式は、4オクテットの符号化文字集合として使用でき、
この場合に、UCS-4と呼ぶ」(JIS X0221-1 5.国際符号化文字集合の全体構造)

131 名前:デフォルトの名無しさん :2005/04/05(火) 23:06:38
>>130
君が本来、答えるべきはワイド文字のサポート領域ではなく、
WindowsAPIのUnicode版が返す文字だろう。
何しろ、このスレはWindowsAPIスレなのだから。
間違いを認めたくないのはわかるが潔い態度も必要だ。

132 名前:デフォルトの名無しさん :2005/04/05(火) 23:28:40
おまえがな

133 名前:デフォルトの名無しさん :2005/04/05(火) 23:34:29
「Windowsの事しか知らない厨房だから、それ以上の一般的なこと言われてもわかりません」
と素直に言え。

134 名前:デフォルトの名無しさん :2005/04/06(水) 02:04:02
>>121は消えろよ。これ以上荒らすな。
MSのwchar_tは、UCS-2LEだよ。cygwinのgnuは違う。

135 名前:118 :2005/04/06(水) 02:15:41
やっぱ、UCS-2で合ってますよね?
結局のところどうなんでしょうか。
別にそんなに重要ではないのだけど。

136 名前:デフォルトの名無しさん :2005/04/06(水) 03:16:10
SDKの範疇じゃないかもしれんが
コントロールパネルのサウンド設定でWindowsの起動音とか指定できるが、
あれを独自アプリでやるにはどうすればいい?

137 名前:121 :2005/04/06(水) 07:45:41
 だから、サロゲートペアが出てくる時点で、CCSがUCS-2なわけねーのよ。
UCS-2はBMPしか使えないんだから。
 まあ、サロゲートをサポートしない、NTとか9Xみたいなのは、
UCS-2といってもいいけど。
 LEっていう限定もなぁ。WindowsはIntelの石だけで動く訳じゃなかったし。

138 名前:デフォルトの名無しさん :2005/04/06(水) 08:41:44
>>117
UTF-8へ変換したいってことか?

139 名前:デフォルトの名無しさん :2005/04/06(水) 12:42:47
>>136
HKEY_CURRENT_USER\AppEvents\Schemes\Apps

140 名前:デフォルトの名無しさん :2005/04/06(水) 14:11:40
俺からみると121の言っていることが正しい。
WM_UNICHARの記述でも見れば?

141 名前:デフォルトの名無しさん :2005/04/06(水) 14:12:07
ポップアップメニューってクライアント領域でしかでないですよね。
これをどこでも表示させるようなことってできないんでしょうか。
他とかぶるとまずいんで右クリック+ホイールとか特別な入力で。

142 名前:デフォルトの名無しさん :2005/04/06(水) 14:26:16
ええー?desktopならどこでも出るよ?と思っていた

143 名前:デフォルトの名無しさん :2005/04/06(水) 14:27:19
TrackPopupMenuなら画面上の好きな位置にメニューだしまくれるが?

144 名前:デフォルトの名無しさん :2005/04/06(水) 14:33:29
グローバルなポップアップメニューって嫌だと思いつつ...
SetWindowsHookEx

145 名前:141 :2005/04/06(水) 14:35:05
すいません。説明のしかたが悪かったです。
ポップアップメニューの場所じゃなくて、それをだす方法です。
右クリックでそのアプリのポップアップメニューだせるのはクライアント領域だけですよね。
それをクライアント領域だけでなく、例えばどこでも右クリック+ホイールで自分のポップアップメニューを
だすみたいな方法がないのかと思ったんです。

146 名前:デフォルトの名無しさん :2005/04/06(水) 14:39:18
>>145
144の続き...
ただしSetWindowsHookExを使いこなすスキルがないのならば、
RegisterHotKeyで妥協できない?
こっちの方が楽だから。

147 名前:141 :2005/04/06(水) 15:15:18
>>144=146
丁寧にありがとうございます。
RegisterHotKeyのほうが簡単そうですね。Keyを使わないとならないのが痛いですが。
今いろいろと資料読んでます。

148 名前:デフォルトの名無しさん :2005/04/06(水) 15:22:02
ディスプレイをスタンバイ状態にする方法を教えて下さい

149 名前:デフォルトの名無しさん :2005/04/06(水) 15:23:16
>>146
必要なスキルや工数の少なさもさることながら、
自分がやりたい機能を十分に吟味すると、
RegisterHotKeyで十分な機能が得られるという結論に達することもあると思う。

というか、SetWindowsHookEx()による解決は大げさである場合が多いと思う。

150 名前:デフォルトの名無しさん :2005/04/06(水) 15:23:19
OSはみんなのためにあることをお忘れなく・・・

151 名前:デフォルトの名無しさん :2005/04/06(水) 15:23:23 ?
ディスプレイケーブルを引っこ抜く

152 名前:148 :2005/04/06(水) 15:26:07
すみませんそれは勘弁して下さい

153 名前:デフォルトの名無しさん :2005/04/06(水) 15:34:40 ?
PCをシャットダウンする

154 名前:デフォルトの名無しさん :2005/04/06(水) 15:38:37
どうしても人を信用出来ない奴が一人いるようだな。

155 名前:デフォルトの名無しさん :2005/04/06(水) 15:50:02
>>148
WM_SYSCOMMANDでSC_MONITORPOWER

156 名前:148 :2005/04/06(水) 15:54:29
>>155
ありがとうござます!

157 名前:デフォルトの名無しさん :2005/04/06(水) 16:12:06
うー嫌なアプリだ

158 名前:デフォルトの名無しさん :2005/04/06(水) 16:32:46
プライベートなクラスを持つダイアログボックスのウィンドウプロシージャの
WM_CREATE に初期化パラメータを渡す方法があれば教えてください。
つまり、CreateDialog() 系のAPIが内部で呼び出している CreateWindowEx() の
lpParam に NULL 以外の値を渡す方法を知りたいのです。

159 名前:デフォルトの名無しさん :2005/04/06(水) 16:33:59
>>158
CreateDialogParam()

160 名前:158 :2005/04/06(水) 16:51:53
>>159
レスをありがとうございます。
でも、ダイアログボックスプロシージャの WM_INITDIALOG ではなく、
ウィンドウプロシージャの WM_CREATE に初期化パラメータを渡したいのです。
念のため CreateDialogParam() も試してみたのですが、渡されたのはやはり 0(NULL) でした…。

161 名前:デフォルトの名無しさん :2005/04/06(水) 17:01:23
>>160
なんでWM_INITDIALOGでは駄目なの?

162 名前:デフォルトの名無しさん :2005/04/06(水) 17:03:04
>>160
キミの環境ではDlgProcでWM_CREATEを取得できるのかね?

163 名前:デフォルトの名無しさん :2005/04/06(水) 17:36:11
Sleepって、コールしたスレッドだけとめるんだっけ?

164 名前:デフォルトの名無しさん :2005/04/06(水) 17:37:16
意味和漢ね

165 名前:デフォルトの名無しさん :2005/04/06(水) 17:43:02
Sleepして他のスレッドが止まったら大変だな。

166 名前:デフォルトの名無しさん :2005/04/06(水) 17:50:12
使いどころ難しくてつかえねぇじゃんw


167 名前:158 :2005/04/06(水) 18:01:21
>>161
WM_INITDIALOG が絶対に駄目というわけではないのですが、
何らかのエラーが発生したときに正当な手段ではウィンドウの
作成拒否(WM_CREATE に -1 を返すような動作)ができないことと、
DlgProc と WndProc の間でローカルな変数が共有しづらいという
事情があって、できれば WM_CREATE で初期化を行いたいのです。

>>162
DlgProc ではなく、WndProc の中です。ダイアログテンプレートで
CLASS 指定を行い、ウィンドウプロシージャを定義した場合の話です。
一般に「ダイアログベースのウィンドウ」と言われているやつです。

168 名前:デフォルトの名無しさん :2005/04/06(水) 18:04:12
Sleepみたいな石鹸、花王石鹸ほわいと〜♪

コーヒーにはSleep

169 名前:デフォルトの名無しさん :2005/04/06(水) 18:18:42
>>167
だからDlgProcでしょ?

例えばCreateDialogParamなら、
HWND CreateDialogParam(
HINSTANCE hInstance, // アプリケーションのインスタンスのハンドル
LPCTSTR lpTemplateName, // ダイアログボックステンプレートを指定します
HWND hWndParent, // オーナーウィンドウのハンドル
DLGPROC lpDialogFunc, // ダイアログボックスプロシージャへのポインタ
LPARAM dwInitParam // 初期値
);

WndProcではない。

170 名前:デフォルトの名無しさん :2005/04/06(水) 18:30:42
>>169
>>167が言ってるのは、ダイアログエディタで、
クラス名指定(リソースIDにあらず)したダイアログリソースを使って、
CreateWindowEx()で上記クラス名を指定して作ったウィンドウのことじゃない?


171 名前:デフォルトの名無しさん :2005/04/06(水) 18:40:09
169の無知がばれた瞬間ですた

172 名前:デフォルトの名無しさん :2005/04/06(水) 18:40:15
ちがうだろ

173 名前:デフォルトの名無しさん :2005/04/06(水) 18:57:26
モーダルダイアログからモーダルダイアログを呼び出したいのですが、
どうしたらいいですか?
MFCにはDoModal()ってのがあるのですが、
SDKでは


174 名前:デフォルトの名無しさん :2005/04/06(水) 19:01:39
DialogBox()

175 名前:158 :2005/04/06(水) 19:02:47
>>169
いえ、確かに CreateDialog〜() で指定するのは DlgProc ですが、
ウィンドウクラスを登録し、ダイアログテンプレートの CLASS にそのクラス名を
指定すると、自分で定義した WndProc が呼ばれるようになり、
そこに WM_CREATE も飛んでくるようになるのです。
ネット上で例を挙げるとするなら、↓ここに書かれている方法です。
ttp://wisdom.sakura.ne.jp/system/winapi/win32/win89.html
もしペゾルド本をお持ちでしたら、11.2.3 から書かれている方法です。

>>170
だいたいその通りなのですが…ダイアログの作成は CreateWindowEx() ではなく、
CreateDialog〜() でおこなっています。ひょっとして、CreateWindowEx() に
ダイアログリソースを指定してダイアログを作成することができるのですか?
もしできるのなら、それで >>158 はめでたく解決するのですが…。

176 名前:デフォルトの名無しさん :2005/04/06(水) 19:06:24
>>170
こんなことできんの?初耳なんだが。

177 名前:デフォルトの名無しさん :2005/04/06(水) 19:31:27
>>175
ちょっと質問なんだが、CreatePropertySheetPageでもいける?

178 名前:デフォルトの名無しさん :2005/04/06(水) 19:38:41
Old New thingで、Dialogの出来る仕組みが解説されてたから、
自前でテンプレートからコントロールをCreateWindowしてまわれればええんとちゃう?

179 名前:158 :2005/04/06(水) 20:01:26
>>177
CreatePropertySheetPage() にも適用できますよ。
ていうか、質問者がいつの間にか回答者になってるし…w

>>178
なるほど、ありがとうございます。確かにそれならうまくいきそうですが…
私の中では最終手段という位置付けになりそうです。

180 名前:デフォルトの名無しさん :2005/04/06(水) 20:18:07
マイコンピュータなどの特殊オブジェクトのドラッグ&ドロップを受け付けるウインドウを作成するにはどうしたらよいのでしょうか?


181 名前:デフォルトの名無しさん :2005/04/06(水) 20:28:35
>>178
The Old New Thingだね。
でもそこの英語は読みづらくてかなわない。


182 名前:デフォルトの名無しさん :2005/04/06(水) 20:28:45
>>180
COMを使うことになるんだが、とりあえず RegisterDragDrop て関数を
調べてくれ。

183 名前:180 :2005/04/06(水) 20:54:03
>>182
サンクス さっそく調べてみます。

184 名前:デフォルトの名無しさん :2005/04/07(木) 03:22:51
ダイアログリソースを抜き出して参考にしたいのですがそういうツールはありますか?

185 名前:デフォルトの名無しさん :2005/04/07(木) 03:51:47
たんに見るだけなら、VC++でも見れるよ。
実行ファイルを開くときにリソースを指定すれば、リソースを覗ける。

186 名前:デフォルトの名無しさん :2005/04/07(木) 10:29:05
どちらに質問してよいのかわからなかったので、とりあえずこちらで質問させてください。
180さんの質問に近いかもしれません。

エクスプローラ(またはデスクトップ上)の任意のファイルを
エクスプローラ(またはデスクトップ上)の任意フォルダに対して
ドラッグ&ドロップした時に、ある特定の拡張子のファイルしかコピー(移動)させないような制御を
行うことは可能でしょうか。

制御としては、ドラッグでコピー(移動)できないようにする他に、
マウスカーソルを変更するなどを実装させたいと思っています。

現在VC++でCOMを利用して開発をしているのですがシェル拡張でいけるかなと思いきや、
そう簡単に行うことができず・・・。
宜しくお願い致します。

187 名前:デフォルトの名無しさん :2005/04/07(木) 12:46:41
ファイルはエクスプローラ上にある訳ではないです

188 名前:186 :2005/04/07(木) 12:53:18
>>187
あ、すみません。
お聞きしたいのは、エクスプローラからのイベント取得ではなく、
適当な場所においてあるファイルを、どこか別のフォルダに
ドラッグ&ドロップした時に何かイベントは取れないだろうか
というところです。
そのファイルとフォルダにはプログラムは介在していません。
わかりづらくてすみません。

189 名前:デフォルトの名無しさん :2005/04/07(木) 13:07:47
ドラッグ&ドロップした時にイベントは取れますよ

190 名前:デフォルトの名無しさん :2005/04/07(木) 13:10:44
>>188
こういうものを期待してるのか?

ttp://www.atmarkit.co.jp/fdotnet/dotnettips/281filewatch/filewatch.html


191 名前:186 :2005/04/07(木) 13:43:42
>>189
おおお!それはどのようなイベントが飛んでくるのでしょうか。

>>190
.NETには用意されているのですねー。
開発環境はVC++6.0なのですが、クラスライブラリは使用できるのでしょうか。
無知ですみません。


当初考えていたものはシェル拡張を使用する手法で、
ドロップハンドラを使用するものでした。
しかしこの場合、自作のアプリなどと連動させなければ(?)ハンドラが取れないため、
現在の所、うまくいかず頓挫しております。

常駐プログラムを増やしたくないので、プロセス監視などの方法は避けたいです。


192 名前:デフォルトの名無しさん :2005/04/07(木) 13:56:37
>>191
FindFirstChangeNotification
ReadDirectoryChangesW
をMSDNで参照してみれ

193 名前:デフォルトの名無しさん :2005/04/07(木) 15:54:46
ReadFile関数で

0123456
6543210

のtxtファイルを1バイトずつ読みこんで
配列に入れたいんですが
改行は'\n'で

0123456\n
6543210

15文字になるんですか?

194 名前:デフォルトの名無しさん :2005/04/07(木) 15:58:20
やってみれば?

195 名前:デフォルトの名無しさん :2005/04/07(木) 16:10:56
>>193
改行コードが\r\nかも知れない

196 名前:デフォルトの名無しさん :2005/04/07(木) 16:14:40
TreeCtrlの階層表示でチェックボックスをオンにする際に
ルート項目だけチェックボックスを表示しないことってできますか?
教えてください。
(TreeCtrl全体にチェックボックス属性がつくため無理?)


197 名前:デフォルトの名無しさん :2005/04/07(木) 16:52:32
>>196
オーナードロー

198 名前:デフォルトの名無しさん :2005/04/07(木) 17:52:48
コマンドラインの最大文字長を取得する方法はありますか?

199 名前:デフォルトの名無しさん :2005/04/07(木) 18:44:27
>>198
最初から1024じゃなかったけ?

200 名前:デフォルトの名無しさん :2005/04/07(木) 18:48:52
DialogBoxでつくられたモーダルダイアログを親として
モーダルダイアログをつくりたいのですが
普通にDialogBoxとやると固まります。
どうしたらいいですか?

201 名前:デフォルトの名無しさん :2005/04/07(木) 18:53:24
>>200
リソースエディタから、リストコントロール内のポップアップとかチャイルドとかのウィンドウ属性を変更する。・・はず

202 名前:デフォルトの名無しさん :2005/04/07(木) 18:57:27
>>199
MSDNでCreateProcess見たら、

> lpCommandLine
> The maximum length of this string is 32K characters.
> Windows2000:The maximum length of this string is MAX_PATH characters.

ってなってるけど、どうだろう。

203 名前:デフォルトの名無しさん :2005/04/07(木) 20:23:54
>>191
ドロップハンドラの何がいけないのかが分からない。
というかそれしか方法はないはずだが・・・

204 名前:デフォルトの名無しさん :2005/04/08(金) 03:23:51
>>203

>というかそれしか方法はないはずだが・・・

嘘を教えるなよ

205 名前:186=191 :2005/04/08(金) 14:16:50
>>203
ドロップハンドラでいけるならそれに越したことはないのですが・・・。
何かそれについてご存知でしたら非常に申し訳ないのですが教えてください。

任意のファイルを任意のフォルダにドラッグ&ドロップした時に、特定の拡張子のもののみコピー・移動を許可する。
つまりはWindowsがつかんでいるイベントを横取りさせてくれよというイメージなんですが、それは流石に無理ですかねぇ・・・。
常駐プログラムは存在しないので、常時そのフォルダを監視するのは無理です。

何かご存知の方がいらっしゃいましたら、重ねて宜しくお願い致します。

206 名前:デフォルトの名無しさん :2005/04/08(金) 16:47:57
>>205
何を作ろうとしているのか良くわからないが...

例えば、エクスプローラからD&Dを実装した他のファイラへドラッグする、
もしくはその逆の場合、フックしたいということ?

207 名前:デフォルトの名無しさん :2005/04/08(金) 16:52:22
エクスプローラからエクスプローラのD&Dを奪いたいんだろ。

208 名前:デフォルトの名無しさん :2005/04/08(金) 16:56:49
対象を選ばずファイルのD&Dをフックしたいように読めたが。

209 名前:デフォルトの名無しさん :2005/04/08(金) 16:59:49
>>208
>任意のファイルを任意のフォルダに
これは普通、エクスプローラでの操作ってことじゃね?
別のファイラを想定しているようには読めないんだが。

210 名前:デフォルトの名無しさん :2005/04/08(金) 17:39:40
>>205
コマンドラインからコピーor移動汁!

211 名前:デフォルトの名無しさん :2005/04/08(金) 20:43:44
>>205
試してないがIDropTarget::DragEnterでDROPEFFECT_NONEを返せばいいのでは?


212 名前:デフォルトの名無しさん :2005/04/08(金) 20:53:48
RegisterDragDropをDLL INJECTIONで横取って
自分のプロキシを介するくらいしかないな。

213 名前:デフォルトの名無しさん :2005/04/08(金) 21:01:59
エクスプローラがRegisterDragDropを使っているとは限らな(ry

214 名前:SetErrorModeni :2005/04/08(金) 22:51:23
VB6でHDD→FDDへファイルコピーする際にエラーダイアログ抑制で

 lngOldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS)
 〜
 lngWin32apiResultCode = SetErrorMode(lngOldErrorMode)

をしています。
しかし書き込み中(ランプ点灯中)にFDを取り出すと自プロセスからではなく
システムからのエラーダイアログ(タイトルバー「Windows - ディスクが準備されていません」)がポップアップされます

疑問:
(1)マシンによっては、このエラーダイアログがポップアップされない。
  SetErrorModeとは別にエラーダイアログを抑制するレジストリ設定等があるのか?
(2)SetErrorModeをしても消すことができないエラーダイアログがあるのか?
(3)WinNT4.0ではそのエラーダイアログにフォーカスされているが、
  Win2kではフォーカスがあたらずどっかへとんでいる。その理由は?

過去ログを検索した結果似たような質問

http://pc.2ch.net/tech/kako/1023/10233/1023361418.html

がありますが解決に至っていないようです。

答えを知っている人、教えてください

215 名前:デフォルトの名無しさん :2005/04/08(金) 23:31:55
SetErrorModeはプロセスが起こしたエラーを制御する。
書き込み中にFDを取り出した場合はOSレベルのエラーになる。

マシンによって動作が違うのはOSのバージョンが違うからじゃないかな?


216 名前:デフォルトの名無しさん :2005/04/09(土) 08:02:06
>>214

できればプロセス及びシステムからのエラーダイアログをポップアップさせたくないのです。
(1)で記述したとおり、同じOSでもシステムからのエラーダイアログがポップアップされないマシンがあります。
システムからのエラーダイアログを抑制するレジストリ設定またはサービス設定などが存在するのでしょうか?

217 名前:デフォルトの名無しさん :2005/04/09(土) 09:19:54
もうすでにAPIの質問じゃなくなってるがな

218 名前:デフォルトの名無しさん :2005/04/09(土) 10:05:46
書き込み中にディスクを取り出さないなんて当たり前のことじゃないか。
そんなことする奴が悪い。

219 名前:デフォルトの名無しさん :2005/04/09(土) 10:21:19
書き込み中に取り出しボタン押したら感電する装置

220 名前:デフォルトの名無しさん :2005/04/09(土) 10:29:13
>>218
そう、当たり前のことなのです。わかりきっています

>>216
しかし(1)の現象を解決しなければ先へ進めません。
なぜ同じOSなのにシステムからのエラーダイアログがポップアップされたりされないのか?
その原因を究明し提示しなくてはなりません...orz




221 名前:デフォルトの名無しさん :2005/04/09(土) 10:31:27
仕様です。

222 名前:デフォルトの名無しさん :2005/04/09(土) 10:37:03
なんか、常駐してる別プロセスがいたんじゃないの?

223 名前:デフォルトの名無しさん :2005/04/09(土) 10:48:22
>>222

そうですね。その可能性も疑ってはいるのですが。
レジストリやサービスの内容をWebで検索してもシステムからのエラーダイアログを抑制するような設定は見つかりませんでしたし……。
しかし別プロセスがエラーダイアログを抑制するケースはありえるのでしょうか?

……APIの質問から離れてしまってごめんなさい


224 名前:デフォルトの名無しさん :2005/04/09(土) 11:38:33
>>223
VBのことはよく知らないけど、そのエラーメッセージってVBの
ランタイムが出してる可能性はないか?OSじゃなくてVBの話かも。
一応聞くけど、On Error〜とかでは処理できない?

225 名前:デフォルトの名無しさん :2005/04/09(土) 11:49:27
>>224

VBランタイムは関係ありません。というのもWeb検索したらVC++でも同現象が発生する書き込みを見つけたからです

http://forums.belution.com/ja/vc/000/133/05s.shtml

またシステムからのエラーダイアログはOn Error〜で処理できませんでした。

226 名前:デフォルトの名無しさん :2005/04/09(土) 13:10:23
>>225
つか、そこに対応策かいてあるじゃん。

227 名前:デフォルトの名無しさん :2005/04/09(土) 13:39:39
>>226

やりたいことが違います。
私はHDD→FDDへのファイルコピーの際、FDを取り出すとSetErrorModeしていてもシステムからエラーダイアログが
ポップアップされるのでそれを抑制したいのです

>>225
のURL先での書き込みではFD内のセットアップアプリを起動の際、FDを取り出すとシステムからエラーダイアログがポップアップされるという内容です。
その対応策としてFDの内容をHDにコピーしてそこから実行をかけるというものです

228 名前:デフォルトの名無しさん :2005/04/09(土) 13:45:08
>>227
Ejectボタンのない(SoftEjectな)FDDを使う。

229 名前:デフォルトの名無しさん :2005/04/09(土) 13:55:16
>>228

そうですね。そういうハード的な解決もありだと思います。
しかし「プログラムでは対応できません。だからハード的な解決しかありません」と
言えるような根拠がほしいのです。

>>214
>>216
で記述したように、同じOSでもシステムのエラーダイアログがポップアップされるされないがあるため、
その原因を究明しない限りハード的な解決方法への転換ができないのです


230 名前:デフォルトの名無しさん :2005/04/09(土) 14:47:02
>>229
同じOS、同じOSと繰り返すが、OSのバージョンとハードウェアを特定しないと話が進まないぞ。

231 名前:デフォルトの名無しさん :2005/04/09(土) 17:35:00
>>230

すみません。現象を確認したOSは
 Windows2000(SP4)
 WindowsNT4.0(SP6a)
です。

ひとつのOSに限りシステムからのエラーダイアログがポップアップされるされないではなく、
マシンによって異なるのです


232 名前:デフォルトの名無しさん :2005/04/09(土) 17:57:19

IShellView::CreateViewWindowで作成したウィンドウの閉じ方なんですが
ttp://www.codeproject.com/shell/explorer.asp
では、

PostMessage(CreateViewWindow()で得たハンドル, WM_QUIT, 0, 0);
IShellView::UIActivate(SVUIA_DEACTIVATE);
IShellView::DestroyViewWindow();
IShellViewインターフェースのRelease

とやってます。
UIActivateはSVUIA_DEACTIVATEの説明みて納豆君なのですが
WM_QUITをpostするということはMSDN探しても見つかりませんでした。
試しにWM_QUITをpostしないようにすると、メインウィンドウが閉じても
プロセスが終了しなくなったので必須なようです。
このことを説明してるところはないでしょうか?

233 名前:デフォルトの名無しさん :2005/04/09(土) 19:25:12
IEが現在表示しているアドレスはどのように取得すればいいですか?

234 名前:デフォルトの名無しさん :2005/04/09(土) 20:20:12
プロセスが起動されたときに、OSから通知を受けることは可能でしょうか?

235 名前:デフォルトの名無しさん :2005/04/09(土) 20:35:12
誰が?

236 名前:デフォルトの名無しさん :2005/04/09(土) 21:00:31
任意のプロセスが起動されたときに、
私のプログラムが通知を受けたいのです。

237 名前:デフォルトの名無しさん :2005/04/09(土) 21:03:15
二重起動の防止の方法って、
(1) FindWindow() でウィンドウの検索
(2) ミューテックスを作っておく
というのが定石だと思いますが、
ウィンドウを使わないプログラムでは (1) は使えない、
また、二重起動の防止のためだけにミューテックスを使いたくない。

ということで、自分の実行ファイル名と同じ名前のプログラムが
2つ以上起動されていれば、二重起動だ、という判定法のほうがありえるなー。
どうだろう?

238 名前:デフォルトの名無しさん :2005/04/09(土) 21:10:01
プロセスリストを取得してゴニョゴニョするより
余程Mutex使った方が無駄がないと思うがどうだろうか。

239 名前:デフォルトの名無しさん :2005/04/09(土) 21:12:06
>>238
ゴニョゴニョは起動時だけだが、
ミューテックスは終了するまで常時存在する。
起動を早くしたいのでなければ、ミューテックスのほうが無駄だろう。

240 名前:デフォルトの名無しさん :2005/04/09(土) 21:14:13
システムリソースを保持しつづけるからって無駄ことね。
それなら、どうぞ起動時にお調べください。

241 名前:デフォルトの名無しさん :2005/04/09(土) 21:16:26
起動時にプロセスリストを調べるコードが占めるメモリ

ミューテックス1個

242 名前:デフォルトの名無しさん :2005/04/09(土) 21:29:38
Mutexを使った多重起動防止には穴がなかったか。

243 名前:デフォルトの名無しさん :2005/04/09(土) 21:30:39
Mutexは名前がかち合う可能性がある

244 名前:デフォルトの名無しさん :2005/04/09(土) 21:31:27
同じ名前のMutexを生成するキラーアプリを常駐させておけば
嫌いなアプリの実行防止ができる

245 名前:デフォルトの名無しさん :2005/04/09(土) 21:38:17
多重起動防止無効化ツール = Mutex削除ツール(?)
http://www.sysinternals.com/ntw2k/freeware/handle.shtml

usage: handle [[-a] [-u] | [-c <handle>]] [-p <processname>|<pid>] [name]

-c Closes the specified handle (interpreted as a hexadecimal number).
You must specify the process by its PID.



246 名前:デフォルトの名無しさん :2005/04/09(土) 21:41:06
実行ファイル名の判定方法は、別パスにコピーしたものは判定できないってのがあるね。
ファイル名部分だけだと、名前がかち合う可能性があるかと。

247 名前:デフォルトの名無しさん :2005/04/09(土) 21:44:29
DLLの参照カウントを使うのがベストかな

248 名前:デフォルトの名無しさん :2005/04/09(土) 21:46:32
>>247
side-by-side

249 名前:デフォルトの名無しさん :2005/04/09(土) 21:51:39
ほぼ同時に複数のプロセスが起動された場合

プロセスAがMutex存在確認>存在しないので起動処理
プロセスBがMutex存在確認>存在しないので起動処理

プロセスAが起動処理でCreateMutex
プロセスBが起動処理でCreateMutex

という順番で処理されてしまうと同時起動してしまうとかだったような気がするんだが。

250 名前:デフォルトの名無しさん :2005/04/09(土) 21:52:57
>>249
おまえはCreateMutexの戻り値を調べないのか


■過去ログ置き場に戻る■ 1- 次250 最新50
DAT2HTML 0.33f Converted.