Win32API質問箱 Build120at TECH
Win32API質問箱 Build120 - 暇つぶし2ch250:デフォルトの名無しさん
15/05/05 01:16:06.47 q10zsNFn.net
intの上限が 0x7FFFFFFF だから

251:デフォルトの名無しさん
15/05/05 01:21:24.52 AH7UBQjv.net
>>243
sizeof(int) がいくつになるか試してみたら

252:デフォルトの名無しさん
15/05/05 05:07:51.68 V9xQwQO9.net
デスクトップってダブルバッファリングは行っていないんでしょうか?
マウス入力などを遮らないアニメーションをデスクトップ上に表示したいんですが

253:デフォルトの名無しさん
15/05/05 09:29:14.26 8cBYwRXK.net
DWM compositionが有効な限り常時バッファリング描画やで

254:226
15/05/05 09:29:18.47 20DP2R/2.net
>>242
サンキュー助かります。
最初に32ビット版で起動して、64ビットOSであれば、
64ビット版を起動して、ウインド情報を調べてフックするようにするつもりです。
実行ファイル2つと、DLLが2つになるのは仕方ないですね。
メモリー共有って32ビットと64ビットの混合ってできましたっけ?
32ビットウインドと64ビットのウインド間のメモリー共有って
CreateFileMappingでできるのかな?
SendMessage(WM_USER や WM_COPYDATAでやりとりしたほうがいい?

255:デフォルトの名無しさん
15/05/05 10:51:06.10 V9xQwQO9.net
>>248
ありがとうございます
確かにAeroの処理を考えるとダブルバッファリングが必須ですね
よく考えたらやりたいこととダブルバッファリングはあまり関係がありませんでした
すでに知っているのはGetDC+BitBltで書き換えるやり方ですが、
描画した画像の下に無効リージョンが発生すると
勝手に塗り直されてちらつきが発生するのでそれを防ぐ方法が知りたいです
デスクトップの内部バッファが後は反映するだけというところまで描画を終える

そこにすかさず割り込んで表示したいアニメを描き足す

その後OKサインを送ったらようやく実際にデスクトップが描画される
具体的に書くときっとこういう流れになると思うんですが、特に真ん中を実現するためのAPIがあったら教えてください

256:デフォルトの名無しさん
15/05/05 10:59:46.29 qvOIJ9mb.net
これってさ自前でダブルバッファリングやってるのもさらにダブルバッファリングかかるわけ?

257:226
15/05/05 11:04:35.43 20DP2R/2.net
>>250
自分でダブルバッファーしてるんであれば、あとはやることといえば、NULLブラシの設定くらいか?
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);を
wcex.hbrBackground = (HBRUSH)NULL;にしてみたら?改善しないか?

258:デフォルトの名無しさん
15/05/05 11:17:14.87 kyGf+mJm.net
WM_ERASEBKGNDは?

259:デフォルトの名無しさん
15/05/05 11:21:04.64 V9xQwQO9.net
>>251-253
これが実現できるならダブルバッファリングは一回で済むんじゃないかと思います
自分ではウィンドウは作らずにデスクトップに直描きしたいってことです
理由は最前面になっている他のウィンドウを非アクティブにしたくないのが一つと
カーソル下にウィンドウがあるときにマウス入力が遮られて邪魔になるのが一つ
(例えばスタートボタンの上に画像が被さっていても意に介せずホバーやクリックの反応をしてほしい)
協力してくださってありがとうございます

260:226
15/05/05 11:24:14.70 20DP2R/2.net
HANDLE hShare = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,0, sizeof(MyShareData), strShareName);
LPDATA pData = MapViewOfFile(hShare, FILE_MAP_WRITE, 0, 0, sizeof(MyShareData));
32/64ビット間のメモリー共有ですが、特にコードいじることなく共有できました。

261:デフォルトの名無しさん
15/05/05 12:56:34.32 kyGf+mJm.net
>>254
デスクトップのハンドルからプロシージャのアドレス得て>>253だけ捕まえるとか

262:226
15/05/05 13:46:31.14 20DP2R/2.net
>>254
デスクトップの直書きって、WM_PAINT直後に描画するてこと?
試してないけど、デスクトップのウインドハンドルをフックしたとして、
WM_PAINTを先に描画させて、任意の画像を上からBitBltとかする感じかな?
普通にちらつきそうではあるが。。?

263:デフォルトの名無しさん
15/05/05 14:07:36.70 q10zsNFn.net
アニメーションコントロール作ってAVI再生させたほうが早いかも (笑)

264:デフォルトの名無しさん
15/05/05 14:39:05.37 3fPyNIFJ.net
フックして、プロセス開いて本来のこーどの
wm_paintのendpaintの直前に描画命令を割り込ませられれば。。。あるいは。。。

265:デフォルトの名無しさん
15/05/05 16:58:43.47 PARG4dys.net
素直に透過ウインド作ったほうがよくね?

266:226
15/05/05 18:36:30.71 20DP2R/2.net
>>254
これ通るか不明ですが。
case WM_PAINT:を動かす時って、通常、hdc = BeginPaint(hWnd, &ps);EndPaint(hWnd, &ps);がセットですよね?
と、いうことは、hWndのhdcの値を任意の情報に書き換えられれば、バッファリングできるかもしれないですよね?
だめで元々と思ってください。
予め、自分のウインドハンドルに、hdc=GetDC(hWnd);でHDC取得して、 バッファに、SelectObject(hdc,hMyBmp);で関連付けしておく
それと、ダブルバッファ用のメモリーDC(myDC)を作っておく
んで、GetDesktopWindow() とか必要に応じて、グローバルフック+サブクラス化して、 WM_PAINTの本来受け渡す、HookPrc( hWnd,rParam,lParam); のhWndを書き換えてバッファリングして描画するっていう方法はどうでしょうか?
case WM_PAINT:
myWndDC =GetDC(hMyWnd); // 自分のウインドハンドルのDCを取得
// myBmpはCreateCompatibleBitmapで本来のhWndのDC, 所属のhBitmapなどからサイズとか取得したほうが良いと思う
hdc =GetDC(hWnd);myBmp = 略;ReleaseDC(hdc);
oBmp=(HBITMAP)SelectObject(myWndDC,myBmp); // myWndDCにバッファ用のビットマップをセット
// 先に描画、描画対象を自分のウインドのhDCに描かせることが成功すればチラツキは抑えられるはず?
HookPrc(hMyWnd,wParam,lParam);
hdc = BeginPaint(hWnd, &ps);
BitBlt(myDC,略,myWndDC,略); // 背景として、本来の描画内容をmyDCに転送(バッファリング)
SelectObject(hMyDC,oBmp); // 本来のビットマップに戻す
ReleaseDC(hMyWnd, myWndDC); // リリース
DeleteObject(myBmp); // myBmpを破棄
FillRect(myDC,略)など // ここで自分で上書き描画
BitBlt(hdc,略,myDC); // 実際のウインドに描画する
EndPaint(hWnd, &ps);return 0;

267:226
15/05/05 18:38:32.93 20DP2R/2.net
書いててふと思ったんですが、DirectXやら、OpenGLとかで動いてるアプリには、上記の方法は効果なさそうですね

268:デフォルトの名無しさん
15/05/05 23:47:02.11 V9xQwQO9.net
>>261
とても親切に説明していただいて恐悦至極です。ありがとうございます!
BeginPaintが返却するhdcを自分のメモリDCに挿げ替えるなんてのは思いつかなかったので非常に参考になりました
背景, アニメABCDコマがあるとすると(背景はGetDC(NULL)で取得できる内容そのもの)
1, 背景が描画される(表示状態:背景のみ)

2, Aコマを描画する(表示状態:背景+Aコマ)

3, 次のコマを表示するために背景を再描画させる(表示状態:背景のみ)

4, Bコマを描画する(表示状態:背景+Bコマ)
となり、AコマとBコマの間に一瞬だけ背景のみの状態になることがちらつきの原因と思われるので、
1と2,3と4を同一のタイミングで描画するための何かしらの方法を探していましたが、
皆さんの書き込みを拝見する限りではBeginPaintやEndPaint等のAPIフックが必須っぽいので、
それで試して上手く行かなかったらそのときは諦めようかと思います
ありがとうございました

269:デフォルトの名無しさん
15/05/06 22:24:13.55 OlUhBFHF.net
VS2013のC++で
MessageBoxIndirectを使ってダイアログを表示する際に、例えば
IDCANCELボタンを表示すると、日本語Windows7なら[キャンセル]、
英語Windows7なら[Cancel]と表示されますが、それをOSの言語と関係無く
自分で好きな文字列を指定して表示させたいのですが、どうやっても
出来ません。どうにかして出来ませんか?

270:デフォルトの名無しさん
15/05/06 22:35:05.51 ROM3ZfOK.net
>>264
(1)自分でダイアログを自作する。
(2)メッセージボックスをフックする。

271:デフォルトの名無しさん
15/05/06 22:46:36.25 OlUhBFHF.net
>>265
レスありがとうございます。
(2)の方法でやりたいのですが、どうすれば自作のcallback関数に
置き換えられるのか分りませんでした。

272:デフォルトの名無しさん
15/05/06 22:51:27.95 ROM3ZfOK.net
>>266
SetDlgItemText

273:デフォルトの名無しさん
15/05/06 22:55:01.18 lk9KI/Ea.net
::SetWindowsHookEx(WH_CBT, CBTProc,...);
LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  if(nCode == HCBT_ACTIVATE)
  {
    HWND hWnd = reinterpret_cast<HWND>(wParam);

274:デフォルトの名無しさん
15/05/06 23:54:06.74 OlUhBFHF.net
>>267>>268
情報ありがとうございました。
試してみたいと思います。

275:デフォルトの名無しさん
15/05/07 00:56:21.78 CSFF77Jn.net
自分が分かることは得意げに書くけど、
分からないことはヤフレカスってのは常套手段ですねw

276:デフォルトの名無しさん
15/05/07 01:05:23.21 xpfh09H0.net
自分がわからないことをヤフレばわかるって、どの口から言えるんだろうな

277:デフォルトの名無しさん
15/05/07 03:35:20.66 +yI4RSPE.net
しばらく誰も検索しろなんて言ってないような気がするが…
どこのスレで口喧嘩に負けてきたんだ?
荒らしてきてやるから書け

278:デフォルトの名無しさん
15/05/07 22:56:17.61 uDHc9Yu6.net
例えば、自作のC++アプリの中から、他のアプリの中にあるButtonのhwnd
が取得出来たとして、
Postmessage(hwnd, , ,) ;
で何かメッセージを送って、そのボタンの背景色を赤色に変えるなど
できますか?

279:デフォルトの名無しさん
15/05/07 23:10:50.13 XdEP7Lb2.net
例えば ツリービューコントロールの TVM_SETBKCOLOR みたいなメッセージが
用意されていればいいのだが、あいにくボタンにはそういうメッセージがない。
なので、他のアプリのボタンの背景色を変えようと思えば、そのボタンのスタイルを変え、
なおかつプロシージャを乗っ取って WM_DRAWITEM なりを処理する必要があると思う。
ゆえに答えは否。
自分の作ったアプリのボタンの背景色を変えるにはどうすればいいか。
まずはそのあたりを考えてみるといいよ。

280:デフォルトの名無しさん
15/05/07 23:17:47.32 uDHc9Yu6.net
>>274
レスありがとうございました。
>他のアプリのボタンの背景色を変えようと思えば、そのボタンのスタイルを変え、
>なおかつプロシージャを乗っ取って WM_DRAWITEM なりを処理する必要があると思う。
なかなかややこしそうですね。
>ゆえに答えは否。
そうですか。困った。
>自分の作ったアプリのボタンの背景色を変えるにはどうすればいいか。
>まずはそのあたりを考えてみるといいよ。
その場合は、
SetBkColor
でやるんですよね?

281:デフォルトの名無しさん
15/05/07 23:52:51.04 hWWp4HfH.net
>>自分の作ったアプリのボタンの背景色を変えるにはどうすればいいか。
>>まずはそのあたりを考えてみるといいよ。
>その場合は、
>SetBkColor
>でやるんですよね?
全く理解してなくてワロタ

282:デフォルトの名無しさん
15/05/07 23:54:43.21 uhpkEIt4.net
オーナードローで検索

283:デフォルトの名無しさん
15/05/08 00:05:10.49 D5f67YQT.net
他人のアプリに配置されているボタンがCreateWindowの"BUTTON"で作られたボタンならスタイルうんぬんという議論は分かるが
何らかのGUIツールキットで作られたボタンならスタイルうんぬん以前の問題

284:デフォルトの名無しさん
15/05/08 00:07:56.26 D5f67YQT.net
ツールキット使わずボタンを自作してる可能性もあるし
Windowという実体を作らず画像処理だけでボタンを再現してる奴もいるかもしれん
後者ならボタンのハンドルもメッセージも存在しないw

285:デフォルトの名無しさん
15/05/08 00:30:30.98 wauI//yZ.net
お前も全く理解してなくてワロタ

286:デフォルトの名無しさん
15/05/08 01:03:34.39 JNS4Z5xc.net
「他のアプリの中にあるButtonのhwndが取得出来たとして」という前提での話だから
>>278-279 は議論うんぬん以前の問題

287:デフォルトの名無しさん
15/05/08 01:04:28.80 2/9eM7ZL.net
会社にも頭でっかちの奴いるわ
自分は全く書けないのに、正論だけ押し付けてくる奴
「きちんと設計すれば動かないはずが無い」が口癖w
そりゃそうだろうけどw

288:デフォルトの名無しさん
15/05/08 02:25:25.99 semA39SH.net
そうなんだよ

289:デフォルトの名無しさん
15/05/08 05:53:15.38 rtQrrRIy.net
そのとおり

290:デフォルトの名無しさん
15/05/08 08:24:18.65 Yhmm5THU.net
>>282
暗にお前の設計がタコだって言われてるんだろ

291:デフォルトの名無しさん
15/05/08 08:42:21.41 oCL66D4S.net
>>275
他のアプリってのが「もし自作なら」ユーザーメッセージで解決できるけどな

292:デフォルトの名無しさん
15/05/08 11:15:26.01 1gJibIV9.net
>自作のC++アプリの中から、他のアプリの中にあるButtonのhwnd
>が取得出来たとして

これって異なる自作アプリ同士でプロセス間通信したいって話じゃないの?

293:デフォルトの名無しさん
15/05/08 11:25:32.49 JgJK5K7B.net
int* a, b;

294:デフォルトの名無しさん
15/05/08 12:19:18.43 Gm54KlG7.net
>>287
>これって異なる自作アプリ同士でプロセス間通信したいって話じゃないの?
ええっと、そうではなくて
自作アプリから、他作アプリのコントロールの背景色を変更したい
と思いました。やり方が分りません。

295:デフォルトの名無しさん
15/05/08 12:24:41.65 Yhmm5THU.net
>>274 で回答出てるだろ

296:デフォルトの名無しさん
15/05/08 14:12:02.64 qF/v14b/.net
他人様のアプリの実装なんてどうなってんのか分からんのにどうやって中身を弄るってんだよ

297:デフォルトの名無しさん
15/05/08 14:21:43.73 Iyiixb5X.net
>>291
Spy++みたいにではないでしょうか。

298:デフォルトの名無しさん
15/05/08 14:31:02.25 semA39SH.net
まずSpy系のツールで対象のコントロールがちゃんと窓のハンドルなのか調べることからだな
>>274の工程は専門的に言うとオーナードローとサブクラス化ね
その辺は1から体系的に学んでおかないとやっていけない

299:デフォルトの名無しさん
15/05/08 14:34:59.04 semA39SH.net
おっとミスった
他プロセスだからメッセージフックだったな

300:片山博文MZ ◆T6xkBnTXz7B0
15/05/08 14:49:49.46 //zzhYF7.net
バージョン情報がないプログラムは動かなくなるって。ソースは俺

301:デフォルトの名無しさん
15/05/08 19:49:37.43 5bS680Kq.net
>>295
マジで?!リソースファイルの.RCのStringFileInfoを適当に記載しておけばいいのかな?
WIN7以前、以降とか、記述なしで、実行制限ありましたっけ?

302:片山博文MZ ◆T6xkBnTXz7B0
15/05/08 20:18:23.68 //zzhYF7.net
>>296
SmartScreenがソフトのバージョン情報をチェックしているらしい。
バージョン情報を付けた方が良さそうだ。

303:片山博文MZ ◆T6xkBnTXz7B0
15/05/08 20:26:10.33 //zzhYF7.net
このscreenは、画面という意味ではなく、「選別」を意味するらしい。

304:片山博文MZ ◆T6xkBnTXz7B0
15/05/08 21:20:40.18 //zzhYF7.net
SmartScreenとSecurity Essentialsにより、世界中のソフトウェアの情報が一元管理されて、発行元や人気の高さ、
クラッシュの回数までマイクロソフトが把握するようになったんだよ。

305:デフォルトの名無しさん
15/05/08 23:55:30.38 5bS680Kq.net
>>299
なるほど。。クラッシュ回数まで把握ですか。デバッグはしっかりやっておきたいですね。
#pragma data_seg( で質問です。
A.exe +a.dll とB.exe + b.dll があったとします。
a.dllで #pragma data_seg("MY_DATA") int share_a=0; #pragma data_seg()
void setData(int n) {share_a =n;}
int getData() {return share_a;}
b.dllで #pragma data_seg("MY_DATA") int share_a=0; #pragma data_seg()
void setData(int n) {share_a =n;}
int getData() {return share_a;}
このとき、A.exe 内で setData(10)とした場合 B.exe getData()の値は 10になるのでしょうか?
別プロセスで、share_aが共有できるのであれば、メモリーマップドファイル使わないでいいのかな?

306:デフォルトの名無しさん
15/05/09 00:06:21.40 f+X1Lw0k.net
A.exe が呼んでる a.dll と B.exe が呼んでる b.dll は別モノだろ

307:デフォルトの名無しさん
15/05/09 11:00:55.20 OWlYoivl.net
初歩的な質問ですいません。
文字セットはマルチバイトとUNICODEのどちらで開発した方が良いのでしょうか?
URLリンク(blogs.msdn.com)
ちょっと古いのですが上記の記事ではUNICODEを推奨しています。
しかし現在の主流はUTF-8だと思うのでマルチバイトの方がいいでしょうか?

308:デフォルトの名無しさん
15/05/09 11:01:57.68 4IoY+00I.net
dllを呼ぶって・・・
イミフ

309:デフォルトの名無しさん
15/05/09 11:08:04.81 2HKbgDAs.net
いやーTCHARでしろっていわれてるじゃん

310:デフォルトの名無しさん
15/05/09 12:02:57.99 5NEoo1tP.net
>>302
TCHARかUNICODE文字セットを使う
マルチバイト文字セットは環境依存で日本語のWindowsだとcp932
これをutf8に切り替えるオプションなんてもちろんないし
そもそもAPIがcp932のインターフェースしか無いので
現代の主流が云々など考えるだけムダ
モダンなプログラミングがしたければモダンなOS使え

311:デフォルトの名無しさん
15/05/09 12:48:51.86 PwWAAfZb.net
おいらはwchar_tやwstringを使う
ようにしている。charは滅多に使わない。
なのでcharと言えばwchar_tを意味するようにしたいくらいだ。
typedef char wchar_t
とか
#define wchar_t char
ってやったらどうなるんだろう。

312:デフォルトの名無しさん
15/05/09 13:19:26.21 cx7dem6B.net
コンパイラ持ってるならやってみればいいのに

313:デフォルトの名無しさん
15/05/09 13:43:09.74 QFYNEVBc.net
Java厨だね

314:デフォルトの名無しさん
15/05/09 14:56:09.74 dHKI9IMf.net
以前、utf8でモダンなプログラミングをしようとしたけど、windowsではやめたほうがいいよ
visual studioでデバッグするときも、utf8なstringは読めないからね
結局全部cp932になった

315:デフォルトの名無しさん
15/05/09 15:13:06.28 x1xiQQNi.net
,s8ってつければ読めるよ

316:デフォルトの名無しさん
15/05/09 15:37:00.89 qZm7gFud.net
windowsのunicodeってutf8なんだったっけ?

317:デフォルトの名無しさん
15/05/09 15:44:31.24 CtUg1jEA.net
めんどくせえ、ずっとcp932じゃ

318:デフォルトの名無しさん
15/05/09 15:48:36.60 x1xiQQNi.net
>>311
UTF16

319:デフォルトの名無しさん
15/05/09 16:02:46.51 2HKbgDAs.net
utf8は可変長だからワイド文字ではない

320:デフォルトの名無しさん
15/05/09 17:12:39.66 dHKI9IMf.net
>>310
あ、設定いじればできるのか。何の問題もなかったわ
API呼び出すときだけutf16に変換すればいいんだね

321:デフォルトの名無しさん
15/05/09 17:19:35.65 dHKI9IMf.net
utf16はワイド文字なのに可変長というクソエンコーディングだけどね

322:デフォルトの名無しさん
15/05/09 17:27:42.10 qeICslx9.net
どうせ基本多言語面しか使わんだろ

323:デフォルトの名無しさん
15/05/09 19:03:16.99 gxvtiy3r.net
>>313
LE?

324:デフォルトの名無しさん
15/05/11 23:30:14.93 o2fecJta.net
う~ん、別にLinuxでもbsdでもWindowsでもstd::wstring使うならUCSで読み込んで処理することになるから一緒。

325:デフォルトの名無しさん
15/05/12 12:20:59.31 ylqMkeqf.net
すみませんDirectShowの質問はここでいいんでしょうか?
【C++】 DirectX初心者質問スレ Part39 【C】
はスレ違いらしいので

326:デフォルトの名無しさん
15/05/12 12:55:25.71 mcS0y+j7.net
10年前ならスレ違いじゃなかったんだけどね

327:デフォルトの名無しさん
15/05/12 13:17:16.94 ZZfAUy1V.net
> 2004年10月、DirectShowはDirectXから外されDirectX Extraに含まれるようになり、
> さらには2005年4月、DirectShowはDirectXから完全に取り除かれ、
> 当時Windows Server 2003 SP1版だったPlatform SDKに�


328:レ管された[2]。 > ただし、現在でもDirectShowのサンプルプログラムのビルドには依然としてDirectX SDKが必要である[11]。 スレチとか言い出したらめんどくせえ立ち位置だな。



329:デフォルトの名無しさん
15/05/12 13:38:00.46 ylqMkeqf.net
移管されていたんですね、でもビルドにDXSDKが必要とは…
質問させて


330:いただきます。 WindowsXPでDirectShowを使い .wmaや.mp3 を高速に.wavに変換する機能を作りたいと思っています。 手始めにNULLレンダラを使い、 .wavファイルをIMediaControl::Run で再生して ISampleGrabberCBのSampleCB、BufferCB メソッドで高速にサンプルを取得する事ができました。 .wavファイルの読み込みができたので、次は.wmaや.mp3を読み込もうとしたところ なぜかわからないのですがSampleCB、BufferCBが呼ばれません。 試しにNULLレンダラを追加せず、IMediaControl::RenderFile で追加されるレンダラを使い IMediaControl::Runで再生したところ、等速で音が再生されながら ISampleGrabberCBのSampleCB、BufferCB メソッドでサンプルを取得する事ができました。 なんとか音を再生せずに高速で.wmaや,mp3のサンプルを取得したいのですがどうしたらいいのでしょうか?



331:デフォルトの名無しさん
15/05/12 15:06:35.12 Z/MhgXt8.net
将来ディスプレイの解像度がすっごく上がって、
6万5千以上が有り得る状況になったら、
Win32APIはどうなってしまうのでしょうか。
有り得ないって?まぁそうかもしれませんが。

332:デフォルトの名無しさん
15/05/12 15:09:08.77 mcS0y+j7.net
関数名の後ろにExがつくだけだろ
ExExExかもしれんがw

333:デフォルトの名無しさん
15/05/12 15:18:10.11 Z/MhgXt8.net
いやいや、LPARAMのサイズが32bitで、これを幅と高さで二分割して16bit幅・・・

334:デフォルトの名無しさん
15/05/12 15:20:40.89 yK9QlxPH.net
LPARAMは32bit固定じゃない
LONG_PTRだったはず

335:デフォルトの名無しさん
15/05/12 16:20:35.40 Z/MhgXt8.net
そうなんだけど、64bit環境でWPARAMが64bitなのは当たり前なんだけど、
HIWRODやGET_X_LPARAMといったマクロは、32bitでも64bitでも同じもの。
64bit環境でも、WM_SIZEなんかで渡されるLPARAMは、
64bit幅を有効活用せず、上位32bitは使われない。
つまり64bit環境でもWM_SIZEのLPARAMで扱えるウィンドウサイズの上限は、0xFFFFまで。
内部仕様として無理って言うんじゃなくて、インターフェイス的に無理って言うのがなんとも残念。
将来的には、wp,lp使わずに、GetCursorPosやGetClientRectを使ってくれってなるんかね。

336:デフォルトの名無しさん
15/05/12 16:44:48.43 yK9QlxPH.net
別メッセージになるんじゃね

337:デフォルトの名無しさん
15/05/12 16:47:10.58 Z/MhgXt8.net
更に言えば、WM_LBUTTONDOWNなんかで渡されるLPARAMは、
符号ありなんで、0xFFFFの更に半分の0x7FFFまでしか扱えないんだよね。
4kディスプレイを横に9枚並べるとアウト。
今はまだぜんぜん余裕だけど、将来どうなるかは分からんよね。
たぶん特定のウィンドウスタイルを追加しないと、ウィンドウサイズが制限されるような事態になるのかね。
そんで専用のAPIで取得してくださいみたいな。
ただ、今のretinaクラス以上にDPIを上げても、人間の視力の限界だし、
retinaのDPIを維持したまま(300dpiとして)、0x7FFFをインチに換算すると、
109インチ(2.8m)なんで、考えるだけ意味無いかも。

338:デフォルトの名無しさん
15/05/12 17:20:28.36 32yYIcwZ.net
初歩的な質問だと思いますが、
・RegisterClassでウィンドウクラスの登録
・CreateWindowでウィンドウの表示
・登録されたウィンドウプロシージャで各種処理
という最も基本的な流れでプログラムが動いていますが、作業中ウィンドウから
例えば「新規」を選ぶともう一枚ウィンドウが開いて全く別の作業ができるように
したい場合、単にCreateWindowすれば良さそうですが、同じウィンドウプロシージャ
だとこれまで使っていたデータと競合してしまいます。
かといって、ウィンドウごとにウィンドウプロシージャを別に用意って普通しないのでは?
と思います。
複数のウィンドウでウィンドウプロシージャは同一、データは別としたい場合、
一般的にはどうしているんでしょうか?

339:デフォルトの名無しさん
15/05/12 17:31:08.89 yK9QlxPH.net
Get/SetWindowLongPtr+GWLP_USERDATA

340:デフォルトの名無しさん
15/05/12 17:33:59.79 yK9QlxPH.net
じゃなかったらSetProp/GetProp/RemovePropとかかもね

341:片山博文MZ ◆T6xkBnTXz7B0
15/05/12 17:34:05.47 fncYevaL.net
>>331
GetWindowLongPtr/SetWindowLongPtrかハンドルマップを使って、
ウィンドウとデータを関連付ける。

342:デフォルトの名無しさん
15/05/12 17:39:18.76 32yYIcwZ.net
>>332-334
なるほど、よく分かりました!
ありがとうございます。

343:デフォルトの名無しさん
15/05/12 18:39:40.95 Z/MhgXt8.net
SetWindowSubclassを使っても良いぞ。

344:デフォルトの名無しさん
15/05/12 20:43:51.58 P8yXA8AP.net
>>323
DirectShowは知らんがMedia FoundationにSource Reader/Sink Writerというまんまの機能があるで
標準のmp3デコーダがWin7からしか備わってねえからちと厳しいけど

345:デフォルトの名無しさん
15/05/12 20:52:00.24 ylqMkeqf.net
Media Foundationでできるんですね。知りませんでした。
情報ありがとうございます。

346:デフォルトの名無しさん
15/05/13 02:03:21.43 VzW8YhOf.net
VC++ でタスクマネージャを表示して、タブを切り替えることは
可能でしょうか?

347:デフォルトの名無しさん
15/05/13 02:14:12.20 VzW8YhOf.net
もう少し具体的に言うと、
Win8でタスクマネージャ出して、
パフォーマンスタブを開いて、
右クリックメニューの
  [グラフを変更]の中の
    [論理プロセッサ]
表示にしたいのですが、VC++のプログラムで出来ますか?

348:デフォルトの名無しさん
15/05/13 09:23:17.27 hDqQQ4M8.net
はい

349:デフォルトの名無しさん
15/05/13 10:32:07.23 VzW8YhOf.net
>>341
ヒント教えてくれよ

350:デフォルトの名無しさん
15/05/13 11:46:47.39 jTT2yS9m.net
キーボード(ALT+TABなど)・マウス操作などで、ウインドがアクティブになった瞬間での、メインウインドがどれかを調べたいです。
GetForegroundWindowで取得するhWndですが、GetForegroundWindowを使わずにグローバルフックで処理したい場合、
どのようにすればよいでしょうか?
試しに、WM_ACTIVEを拾って、表示してみたのですが、同様のメッセージが複数送られて来て判断がつきません。

351:デフォルトの名無しさん
15/05/13 12:30:27.51 hDqQQ4M8.net
>>342
キーボード操作だけで>>340をやってみる
それを実装する
>>343
LOWORD(wParam)

352:デフォルトの名無しさん
15/05/13 13:12:04.72 VzW8YhOf.net
>>344
ヒント、サンキュウ!
>キーボード操作だけで>>340をやってみる
>それを実装する
なるほど。試してみたいのだが、今、他の作業で超忙しくて手が離せない。
だれか暇な人がいたらサンプルを作ってくれるとうれしい。

353:デフォルトの名無しさん
15/05/13 13:27:42.36 jTT2yS9m.net
>>344
ログ見る限り、うまく動いてませんね。。
// Dll
HWND hookWnd(){return ghookWnd;}
LRESULT CALLBACK fix32HookProc(int nCode, WPARAM wParam, LPARAM lParam){
if ( nCode < 0 ) return CallNextHookEx(hHook, nCode, wParam, lParam);
CWPSTRUCT* const p = (CWPSTRUCT*)lParam;
case WM_ACTIVE:
ghookWnd=p->hwnd;
SendMessage(gMainWnd,WM_USER,p->wParam,p->lParam);
break;
-------------------------------
// main
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
switch(message){case WM_USER:
switch(LOWORD(wParam)){
case WA_ACTIVE: printf("%p WA_ACTIVE マウスクリック以外の方法でアクティブ化された %p\n",hookWnd(),(HWND)lParam); break;
case WA_CLICKACTIVE: printf("%p WA_CLICKACTIVE マウスクリックによってアクティブ化された %p\n",hookWnd(),(HWND)lParam); break;
case WA_INACTIVE: printf("%p WA_INACTIVE 非アクティブ化された(新しいハンドル%p)\n",hookWnd(),(HWND)lParam); break;
}
printf("GetForegroundWindow() %p\n",GetForegroundWindow());
}
GetForegroundWindow()の値とhookWnd(),(HWND)lParamの値が一致しないです。
WA_INACTIVEのとき、lParamには適正値が入るのは知ってます。
DLLのグローバルフック上のcase WM_ACTIVE:で、GetForegroundWindow()を呼び出してそれ使ったほうがよい?

354:デフォルトの名無しさん
15/05/13 14:22:04.41 dI4ahC8f.net
なんでlParamと比べてるの?
hWndと比べるんじゃねえの?

355:デフォルトの名無しさん
15/05/13 14:23:33.95 dI4ahC8f.net
あ、hookWnd()がhWndか

356:デフォルトの名無しさん
15/05/13 14:32:38.40 qFyXwJnh.net
>>346
WH_SHELLでフックして HSHELL_WINDOWACTIVATED を拾えば?

357:デフォルトの名無しさん
15/05/13 14:41:26.04 jTT2yS9m.net
>>349
ありがとう。試してみますね。

358:349
15/05/13 15:05:15.31 jTT2yS9m.net
>>349
試しましたが、デバッグ用のコンソールのウインドがアクティブになった場合、
そのウインドのイベントが発生せず。。うーん。。WH_CALLWNDPROCでフックして、WM_ACITVE内で、
GetForegroundWindow()使ったほうがいいのかもしれないorz

359:349
15/05/13 16:23:00.40 jTT2yS9m.net
開発環境が、64bit版のWin7で32ビットベースアプリでコンパイルしていたので、気が付きませんでしたが、
WIN8の32ビット版では、正しくHSHELL_WINDOWACTIVATEDは、GetForegroundWindow()の値と同じものが取得できました。
32Bit側のアプリ呼び出しの、AllocConsole();が、64BitOSだと、64Bitで動いていた可能性あり?
64BitDLL作って、調べてみます。

360:349
15/05/13 16:44:23.87 jTT2yS9m.net
64BIT版フックのDLL作って調べました。予想通り、AllocConsole()の窓は、64Bitウインドでした。

361:デフォルトの名無しさん
15/05/13 17:37:17.83 hDqQQ4M8.net
>>345
それを丸投げという

362:デフォルトの名無しさん
15/05/13 17:55:53.05 fE4vsJH4.net
マルウェアでも作るのか?

363:デフォルトの名無しさん
15/05/13 18:26:26.64 I7FDspWM.net
<危険度対決!>
マルウェア vs 丸投げウェア

364:デフォルトの名無しさん
15/05/13 18:45:24.92 jTT2yS9m.net
マルウェア?だと?!

365:デフォルトの名無しさん
15/05/13 18:47:31.55 cKVTGKhm.net
秀まる?

366:デフォルトの名無しさん
15/05/13 20:28:45.56 5e3tU8d3.net
>>345
おまえが暇になったらやればいいんじゃね?

367:デフォルトの名無しさん
15/05/14 15:20:59.18 +nIQtAtr.net
長くてすみません。
ダイアログにタブコントロールを配置し、タブの切り替えに応じて
複数の子ダイアログを表示・非表示しています。
この子ダイアログにリストビューがあるのですが、マウスによって
ホイールに反応するものとしないものがあります。
恐らくマウスドライバの作りの差かと思いますが、プログラム側で
なにか工夫すれば対応できるようになるものでしょうか?
ホイールが反応しないケースでは、どうも親ダイアログに対して
スクロールさせるような命令が飛んできている感じではあります。
親ダイアログに直に配置したリストビューはマウスの種類に関係なく
ホイールに反応します。
この挙動から、親に来るメッセージ類を補足して現在表示中の
子ダイアログ下のマウスカーソルが下のリストビューのスクロール処理
をすれば理論的には良さそうです。
しかし、ここまでやらないといけないでしょうか?

368:デフォルトの名無しさん
15/05/14 15:58:44.50 mCvwdOKM.net
>>360
ログ取って「リストビューにフォーカスがあるかどうか」調べてみるのは?

369:デフォルトの名無しさん
15/05/14 16:05:44.65 7SdMC+6R.net
>>361 と同意見。当該子ダイアログを表示するときにリストビューに SetFocus() する

370:デフォルトの名無しさん
15/05/14 16:44:59.33 +nIQtAtr.net
私も最初はフォーカスを疑いましたが、入力フォーカスは当たっています。
試行錯誤している内に、単にマウスドライバの問題ではないかという気がしてきました。
どうもありがとうございました。

371:片山博文MZ社外取補 ◆T6xkBnTXz7B0
15/05/14 21:40:41.08 opb9h0b1.net
HTML Helpは、デフォルトでブロックされて見れない。
落とし穴。絶対使うな。

372:デフォルトの名無しさん
15/05/14 21:48:10.79 7SdMC+6R.net
インストーラ使えば問題ない

373:デフォルトの名無しさん
15/05/15 06:41:01.84 w0X/ZpcK.net
WinMainの中で
AllocConsole();
してprintf出力しているのですが、
別スレッドを作成して、その中でもprintfしたところ、
このコンソールには出ませんでした。
どうすれば別スレッドからもこのコンソールに出せますか?

374:デフォルトの名無しさん
15/05/15 12:35:19.68 0PkDPPO5.net
>>367
それは単純にはいかない
複数のスレッドから、からくりはどうであれ、一つのところに出力したいのなら、それなりの仕掛けが必要。
根本的に、各スレッド間で独立しているものはなに?共通なのはなに?

375:デフォルトの名無しさん
15/05/15 13:09:13.22 nIpJir9o.net
>>366
文字列送信時、WM_COPYDATA を使ったらどうだろ?
メッセージを受信したら、その文字列をprintfすればいいんじゃね?

376:デフォルトの名無しさん
15/05/15 13:22:09.71 hBLf1mma.net
>>366
URLリンク(www.f13g.com)

377:デフォルトの名無しさん
15/05/15 13:31:24.00 nIpJir9o.net
>>366
// 受信用
case WM_COPYDATA: printf("%s",((COPYDATASTRUCT*)lParam)->lpData );
// 送信向け
void myprintf (HWND hWnd,HWND hWndTarget,char *format , ... )
{
char strbuf[2048]; // バッファサイズは適当に~
va_list args; // printf っぽいくstrbufに文字列を加工する
memset(strbuf,0,sizeof(strbuf));
va_start( args, format);
vsprintf( strbuf, format, args);
va_end( args );
COPYDATASTRUCT cds;
cds.dwData = 0;
cds.cbData = sizeof(strbuf); / /送る文字列データの長さ。
cds.lpData = strbuf; // 送る文字列データのポインタ
SendMessage(hWndTarget,WM_COPYDATA,(WPARAM)hWnd,(LPARAM)&cds);
}
// ヘッダーを追加
#include <stdio.h>
#include <locale.h>
#pragma warning(disable:4996)
// winmain とかに追加してね
AllocConsole();
FILE *stream = freopen("CON", "w", stdout); // 標準出力の再割り当て
_tsetlocale(LC_ALL, _T("Japanese_Japan.932")); // wprintfとか使うなら!
// winmainのメイン メッセージ ループを抜けた最後の付近で後始末
fclose(stream);FreeConsole();

378:デフォルトの名無しさん
15/05/15 18:44:45.43 WZ+HCGJP.net
>>360
タブを親窓にせず、メイン窓を親にする。
たしか入力メッセは、デフォルトプロシージャがフォーカスあるやつに送りつけたはず
タブは孫に渡さず使い捨てたと思う

379:デフォルトの名無しさん
15/05/15 19:00:03.80 WZ+HCGJP.net
>>366
その別スレッド、全角文字をだしているとみた。
メインはASCIIのみ

380:デフォルトの名無しさん
15/05/15 19:22:08.01 sCqaJb0K.net
コンボボックスのオーナードローで質問です。
これまでオーナードロー無しでコンボボックスを使っていましたが、今回オーナードローにするため
CBS_OWNERDRAWFIXED を付加して CreateWindow し、WM_DRAWITEM を処理するように追加しました。
すると、コンボボックスに設定されている文字列が文字化けしておかしくなります。
正確には、ComboBox_GetLBText でコンボボックス文字列が正しく取得できません。
コンボボックスは以下のように作っており、CBS_OWNERDRAWFIXEDを付加しない場合、なにも問題は出ません。
{
hComboWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "ComboBox", "",
    WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL | CBS_OWNERDRAWFIXED,
    0, 0, 100, 500, hWnd, (HMENU)1, GetWindowInstance(hWnd), NULL);
ComboBox_ResetContent(hComboWnd);
ComboBox_AddString(hComboWnd, "text A");
ComboBox_AddString(hComboWnd, "text B");
ComboBox_AddString(hComboWnd, "text C");
}

381:デフォルトの名無しさん
15/05/15 19:25:12.49 sCqaJb0K.net
オーナードロー部分はざっくり以下のように簡単に作り直しましたが、文字化けします。
どこかおかしいところがありますでしょうか?
static void DrawItemProc(
  HWND  hWnd, int iId, LPDRAWITEMSTRUCT  drawitem
)
{
変数宣言略
  if (iId != 1)  return;
  ComboBox_GetLBText(drawitem->hwndItem, drawitem->itemID, szbuf);
  if (drawitem->itemState & ODS_SELECTED) {
    rgbText = RGB(255, 255, 255);
    rgbBack = RGB(0, 0, 200);
  } else {
    rgbText = 0;
    rgbBack = RGB(255, 255, 255);
  }
  hPen = CreatePen(PS_SOLID, 1, rgbText);
  hBrush = CreateSoli


382:dBrush(rgbBack);   SelectObject(drawitem->hDC, hPen);   SelectObject(drawitem->hDC, hBrush);   Rectangle(drawitem->hDC, drawitem->rcItem.left, drawitem->rcItem.top, drawitem->rcItem.right, drawitem->rcItem.bottom);   TextOut(drawitem->hDC, 0, 0, szbuf, lstrlen(szbuf)); } WndProc( 略     case WM_DRAWITEM:       DrawItemProc(hWnd, (UINT)wParam, (LPDRAWITEMSTRUCT)lParam);



383:片山博文MZ社外取補 ◆T6xkBnTXz7B0
15/05/15 19:28:57.49 hBLf1mma.net
ComboBoxは古くてUnicodeに未対応。ComboBoxEx使え。

384:デフォルトの名無しさん
15/05/15 19:40:42.30 WZ+HCGJP.net
コモンコントロールなんか捨てちまえ
自分で書いた方が、実装が早い。あれは人に使わせるように書いたものじゃない
あと最近気になるのは、
多分、コモンコントロールはDirect2Dを使っていない。

385:デフォルトの名無しさん
15/05/15 19:46:23.99 w0X/ZpcK.net
>>370
サンプルプログラム有難うございました。
無事にうごきました。別スレットからConsoleに出力できました。
大変助かりました。感謝です。
本件とは無関係ですが、この自作プログラムの中で
printfやcoutしている箇所がいくつかあるのですが、プログラムを
実行していると、ある時点から改行されずに、横につながって出力
されてしまうおかしな症状が出て悪戦苦闘しています。
printf("\n");や cout<<endl;でも
改行しなくなるなるんです。
こんな症状は初めてで、何がおかしいか心当たりが全くありません。
今回の別スレッドプリント機能を追加する前からそうなっていました。
もし何か解決のヒントありましたらアドバイスよろしく。

386:片山博文MZ社外取補 ◆T6xkBnTXz7B0
15/05/15 19:51:35.16 hBLf1mma.net
>>377
CriticalSectionで排他制御、または入出力の同期

387:デフォルトの名無しさん
15/05/15 20:01:24.06 AZhRVSC1.net
>>374
TextOut(drawitem->hDC, drawitem->rcItem.left, drawitem->rcItem.top, szbuf, lstrlen(szbuf));
じゃないのか?
それと、ComboBox_AddString() では文字列を指定せず、
描画したい文字列へのポインタを ComboBox_SelectItemData() して保持するほうがラク
保持した文字列へのポインタは drawitem->itemData にあるので、それをDrawText() する
(NULL で終わる文字列の場合に文字数を指定しなくていいので、TextOut()するよりラク)

388:デフォルトの名無しさん
15/05/15 20:02:42.29 AZhRVSC1.net
×ComboBox_SelectItemData()
○ComboBox_SetItemData()

389:デフォルトの名無しさん
15/05/15 20:30:49.43 w0X/ZpcK.net
>>378
片山さん、
レスありがとうございます。
さっそく
CriticalSectionでググッて、たまたま見つけた
URLリンク(bituse.info)
のサンプルをみて、
InitializeCriticalSection()
EnterCriticalSection()
LeaveCriticalSection()
などを追加してみましたが改善されません。
サブスレッドは、
std::packaged_task
std::thread
を使って作成しています。
も少し何かチェックすべき点などありましたらご指導お願いします。

390:片山博文MZ社外取補 ◆T6xkBnTXz7B0
15/05/15 20:34:20.00 hBLf1mma.net
sync_with_stdioかな?

391:369
15/05/15 20:38:08.04 nIpJir9o.net
>>377
動いてよかったね。
マルチスレッド系なら、>>378のアドバイス通り、CriticalSectionの処理忘れずに。
あと、マルチスレッドのチェックを入れておくこと。
VS2013であれば、
構成プロパティ->C/C++ ->コード生成->ランタイムライブラリー
->マルチスレッド/mt か マルチスレッド/mtd
この設定しておかないと、CRT系のライブラリーで不具合出た記憶がある。

392:デフォルトの名無しさん
15/05/15 22:12:36.63 sI8inuS2.net
VC2005あたりから、MT/MTdだけになったんじゃないか?

393:369
15/05/15 23:02:43.90 nIpJir9o.net
>>384
たしかに。。VS6から2013に移ったので気付かなかったw

394:デフォルトの名無しさん
15/05/15 23:04:15.12 sCqaJb0K.net
>>379
> TextOut(drawitem->hDC, drawitem->rcItem.left, drawitem->rcItem.top, szbuf, lstrlen(szbuf));
> じゃないのか?
そこは仰る通りです。後で気付きました。

> それと、ComboBox_AddString() では文字列を指定せず、
あれから CBS_HASSTRINGS ウィンドウスタイルを追加して問題が一旦解決していたのですが、
なんでこんなものがあるのかと調べているところでした。(他に別の問題が出てきて・・)
ComboBox_SetItemData で別のデータをセットしていたので、この辺を踏まえて
構造体ポインタでもセットした方が良さそうですね。
どうもありがとうございました。

395:デフォルトの名無しさん
15/05/21 12:41:57.14 iDqwREQX.net
  

396:デフォルトの名無しさん
15/05/23 03:46:59.36 Xep2wRPy.net
マウスの位置の下のウインドハンドルを調べたい場合どうすればよいですか?
WindowFromPointだと、拾えないハンドルがあるみたいです。
APIの解説読むとChildWindowFromPoint使えと書いてあったのですが、親ウインドを調べる場合はどうすれば?
EnumWindowsとChildWindowFromPointの組み合わせとかになるんでしょうか?
一番上にあるウインドのハンドルが知りたいです。

397:デフォルトの名無しさん
15/05/23 08:37:51.43 Henr8hEj.net
EnumWindowでハンドルもらってGetWindowRectちゃうか

398:デフォルトの名無しさん
15/05/23 09:31:52.27 Xep2wRPy.net
>>389
Zオーダーとかも考慮する必要があるので複雑になると思うのですが。。?

399:片山博文MZ ◆T6xkBnTXz7B0
15/05/23 10:01:44.26 ojXlCtK2.net
ChildWindowFromPointの第一引数にNULL。
GetParentを繰り返し呼ぶ。

400:デフォルトの名無しさん
15/05/23 11:00:20.06 dJKu3sZC.net
自分のウィンドウならマウスホバーメッセージが飛んでくる
この辺りの基本は、日本語でMSDNにハウトゥが書いてあるぞ
他プロセスのウィンドウを調べる方法もあるが、普通は要らない
なんかストークソフトの技術質問ばかりだな、ここ

401:デフォルトの名無しさん
15/05/23 11:39:31.72 e7q+dZJt.net
>親ウインドを調べる場合はどうすれば?
GetAncestor()

402:デフォルトの名無しさん
15/05/23 11:48:13.91 EdDrIok9.net
(^^)
URLリンク(livedoor.blogimg.jp)

403:デフォルトの名無しさん
15/05/23 14:02:41.96 LbQhEyX4.net
spy とか inspect のツールじゃダメなん?
ちなみに inspect は UI Automation とかいう開発者向けの I/F を使ってるらしい

404:デフォルトの名無しさん
15/05/23 16:17:09.12 N5mcUzwL.net
マウスフックじゃあかんの?

405:片山博文MZ ◆T6xkBnTXz7B0
15/05/23 17:44:15.28 ojXlCtK2.net
コントロールパネルやアンインストール情報を表示するのに二分もかかるシステムは、淘汰されるべきだ。#Microsoft

406:デフォルトの名無しさん
15/05/23 18:06:16.36 e7q+dZJt.net
それはPCがおかしい

407:デフォルトの名無しさん
15/05/23 18:38:18.33 YAXRIJCD.net
お前が淘汰されないユルい世界に感謝しな

408:デフォルトの名無しさん
15/05/23 21:36:40.32 SD28Qaym.net
なーんで、Process32FirstやらNextはフックできないんだろう。
これシステムでなにかロックされてる?

409:片山博文MZ ◆T6xkBnTXz7B0
15/05/23 22:08:05.87 ojXlCtK2.net
>>400
Process32*フックできたら、存在するプロセスを隠せるセキュリティ上の問題が発生する

410:デフォルトの名無しさん
15/05/23 22:59:40.12 aSQ4opfb.net
DirectXでフルスクリーンからウィンドウモードに戻すとウィンドウスタイルがAero GlassからAero Basicになっているのですが再度Aero Glassに戻すにはどうしたらいいのでしょうか?

411:デフォルトの名無しさん
15/05/24 00:17:54.61 r97vly3l.net
DwmEnableCompositionで手動で戻してみたら?
本来必要のない手続きだから環境かプログラムのどちらかがおかしいけど

412:デフォルトの名無しさん
15/05/24 01:48:20.80 /8p/6XEk.net
Aeroとか言うウンコが早く死にますように(-人-)

413:デフォルトの名無しさん
15/05/24 01:52:56.76 qlvppzxo.net
Aeroがウンコなんじゃなくて、お前のPCのスペックがウンコなんだろ

414:デフォルトの名無しさん
15/05/24 02:38:12.25 fc/UFx7b.net
どこからスペックの話が出てきたのか

415:401
15/05/24 03:01:23.80 4hOp25cH.net
>>403
ありがとうございます
SetWindowLongの第二引数をGWL_EXSTYLEとしていたのが原因でした
GWL_STYLEでできました

416:デフォルトの名無しさん
15/05/24 10:25:17.19 y1MgTLvO.net
スペックが低いと頼みもしないのに自動切り替えが起きる
のも知らんアフォはともかく
URLリンク(it.srad.jp)

417:デフォルトの名無しさん
15/05/24 10:41:11.74 G2/oGA6A.net
話の通じない人って困るよね(´・ω・`)

418:デフォルトの名無しさん
15/05/24 13:52:42.90 xY4KxC2+.net
頭がウンコなんだろ

419:デフォルトの名無しさん
15/05/24 16:04:21.97 riQhXw9m.net
WINDOWSの右クリック時で開かれるポップアップメニューなどがあった場合、
他のウインドにフォーカスが移動したときに、ポップアップメニューが勝手に消えますよね。
それを自分のウインドにフォーカスが移った場合、ポップアップメニューを閉じないようにするには、
どうすればよいでしょうか?

420:デフォルトの名無しさん
15/05/24 16:15:06.24 tHPLTcxB.net
ポップアップメニューを自作のポップアップウィンドウにする

421:デフォルトの名無しさん
15/05/24 16:17:51.47 riQhXw9m.net
フックとかそーいったの使ってでも制御したいので、ヒントがほしいです。
ちーたんタッチボードとかは、ポップアップメニューについて、ポップアップ維持の処理が制御できているみたいです。

422:デフォルトの名無しさん
15/05/24 16:50:29.70 GWZDfR0O.net
自身のウィンドウが「フォアグラウンドでない場合」にポップアップメニューを表示すると
他のアプリケーションがフォアグランドになっても、表示したポップアップメニューは消えない。

423:デフォルトの名無しさん
15/05/24 23:33:23.28 riQhXw9m.net
この辺試してみたけどうまくいかないです。。
LockSetForegroundWindow(LSFW_LOCK);
CreateWindowEx(WS_EX_NOACTIVATE, ...
case WM_NCACTIVATE: return DefWindowProc(hWnd, message, 1, lParam);
ポップアップウインドのサブクラス化ってできませんよね?
WM_CLOSEをフォーカスが自分のウインドにあった場合、キャンセルさせようかと思ったんですが
ポップアップメニューってウインドハンドルないのかな?

424:デフォルトの名無しさん
15/05/24 23:54:34.27 JmEJu+yH.net
>>415
WM_CLOSEじゃなくShowWindow(hwnd, SW_HIDE)ならフックになるな

425:デフォルトの名無しさん
15/05/25 00:12:22.08 Y4roGc/9.net
>>416
WM_ACTIVE:と、WM_NCACTIVE:のタイミング両方で、
SetActiveWindow( hBackupWnd );SetForegroundWindow(hBackupWnd);を動かしてみたんですけど、
ウインドの状態は前のウインドで保持されてはいますが、ポップアップメニューが閉じてしまいます。
WM_NCHITTESTを戻り値を0にしてもだめです。。
ポップアップメニューのウインドハンドル調べてみたのですが、ハンドルを得ることできそうもないです。
困った。。

426:片山博文MZ ◆T6xkBnTXz7B0
15/05/25 00:18:26.56 LQzNccs7.net
Win32のメニューはウィンドウではない。
ただメニューと同じ動作のウィンドウは作ることはできる。
自作のポップアップウィンドウをメニューに見せるのが一番。

427:デフォルトの名無しさん
15/05/25 00:26:32.69 8Crjy0ou.net
ウィンドウじゃないとか嘘つくなよ
ポップアップメニュー表示中に
FindWindow("#32768", NULL)でウィンドウハンドル取れるだろ

428:デフォルトの名無しさん
15/05/25 00:28:30.28 Y4roGc/9.net
片山さん、自分のポップアップメニューではなく、他者のアプリのポップアップメニューですが、同じようなものは作成できるんでしょうか?
やりたいことは、ちーたんタッチボードや、TouchMousePointerなどの入力系ツールの作成です。
もしくは、マウスのイベントを無効にして、自分のウインドにフォーカスが移らないようにすることはできますか?

429:デフォルトの名無しさん
15/05/25 00:31:17.45 n6K4TpsH.net
いちばん簡単な方法は>>412
「ポップアップウィンドウを作って、ポップアップメニューに見せかける」

430:デフォルトの名無しさん
15/05/25 00:36:33.73 Y4roGc/9.net
>>419
FindWindow("#32768", NULL)は知りませんでした助かります。ありがとうございます。

431:デフォルトの名無しさん
15/05/25 00:48:07.44 Y4roGc/9.net
FindWindow("#32768", NULL)試してみたのですが、OS固有のポップアップメニューは処理できそうな感じですが、
他のアプリが作ってる一部のポップアップメニューのハンドルは取れそうもないっぽいです。
例:フラッシュアプリで右クリックなどのポップアップなど
マウスフック試してみるか。。

432:デフォルトの名無しさん
15/05/25 00:53:05.46 xFjitowq.net
フックできるならTrackPopupMenuのフックは?

433:デフォルトの名無しさん
15/05/25 01:03:47.42 Y4roGc/9.net
>>424
さきほどのFindWindow("#32768", NULL)とグローバルフック経由からのサブクラス化など使えば
PopupMenuのフックはいけそうですね。
マウスフックのAPI眺めてみたのですが、それっぽいメッセージの処理ができそうもなかったので、
WH_CBTフックで、アクティブ拒否ができるか試してみます。
こっちのほうが簡単かな?

434:デフォルトの名無しさん
15/05/25 01:39:07.50 Y4roGc/9.net
WH_CBTフックで、アクティブ拒否したのですが、ポップアップメニュー消えちゃうぅぅ。

435:片山博文MZ ◆T6xkBnTXz7B0
15/05/25 06:20:25.54 LQzNccs7.net
>>419
私の間違いでした。懺悔します。

436:デフォルトの名無しさん
15/05/25 09:52:54.90 5Xzz88z5.net
へー
メニューってウィンドウなんだー
じゃあ逆に、普通のウィンドウをOSのメニューと完全に同じにフワッと表示したり選択項目だけがフェイド・アウトしたり
みたいな効果つけれるかね?

437:デフォルトの名無しさん
15/05/25 11:00:17.64 7nFkPzEN.net
えっ!? できないと思ってるの??
ヒント: WS_EX_LAYERED

438:デフォルトの名無しさん
15/05/25 13:49:31.31 5Xzz88z5.net
なにがヒントじゃハゲ

439:デフォルトの名無しさん
15/05/25 14:02:59.81 7nFkPzEN.net
悪いかデブ

440:デフォルトの名無しさん
15/05/25 14:08:24.82 JYCHMnRj.net
あの有名なトム・ジェリー氏も仲良くデュエルしろと言ってるし良いんじゃないか。

441:デフォルトの名無しさん
15/05/25 17:29:27.21 2/V0nnt+.net
ホックなんかしなくても LayeredWindow で transparent 属性にしたら常に最前面が可能

442:デフォルトの名無しさん
15/05/25 17:42:38.61 QP0bivbh.net
富むとジェリぃ
なっかっよーくジェノサイど

443:デフォルトの名無しさん
15/05/25 20:24:07.83 Y4roGc/9.net
情報ありがとうございます。
transparent属性にしたらそのウインドでのタッチイベント(WM_TOUCH)発生するんでしょうか?
WS_EX_TRANSPARENTの属性をつけると、ヒットテストそのものが起きないとMSDNのサンプルに乗ってるんですが。。
URLリンク(msdn.microsoft.com)
hwnd = CreateWindowEx(WS_EX_LAYERED | // レイヤード ウィンドウ
WS_EX_TRANSPARENT | // このウィンドウをヒット テストしない
後ほど試して見ます。

444:デフォルトの名無しさん
15/05/26 08:43:02.67 pOYKgSOy.net
こういうの見ると良く出来てると思う
URLリンク(show-dc.info)

445:デフォルトの名無しさん
15/05/26 08:45:21.28 pOYKgSOy.net
こっちだった
URLリンク(www.vector.co.jp)

446:434
15/05/26 18:10:23.25 8e2ytTC5.net
WS_EX_TRANSPARENT属性つけましたが、予想通りWM_TOUCHイベント発生せず。。
ポップアップメニュー保持したまま自分のウインドをタッチ操作することってどうすればいいんだろう?
実現しているソフトをSPY使ってウインドクラスのスタイルと拡張スタイルを見たのですが、同じようにウインドを生成しましたが、
ポップアップメニュー保持はできませんでした。
実現しているソフトのウインドスタイルがこんな感じです。
WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_TOPMOST | WS_EX_CONTROLPARENT
WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPED | WS_MAXIMIZEBOX

447:デフォルトの名無しさん
15/05/26 18:22:12.43 JdoiEwqA.net
そもそも自前のポップアップメニューを実現すること自体が難しい。
ポップアップメニュー以外の部分をクリックしたときに、ポップアップメニューを消すのが難しい。
そこで、アプリ毎に、あの手この手で実現しているので、
全てに対応するのは無理だと思うのね。

448:デフォルトの名無しさん
15/05/26 18:42:11.63 s2c/IHjz.net
Firefoxのブックマークのメニューでも
たまにサブアイテムが複数開いたままになったりするしな

449:デフォルトの名無しさん
15/05/26 19:07:09.30 yWiUgxdI.net
メニュー表示を保持しているソフトの、そのメニューはSpyしてみたの?
・・・メニューじゃなかったりしてw

450:434
15/05/26 19:10:40.34 8e2ytTC5.net
ポップアップメニューを表示したまま、スパイにフォーカスを当てると、
ポップアップメニューが消えてしまい、スパイで監視することができません;;

451:デフォルトの名無しさん
15/05/26 19:12:11.53 yWiUgxdI.net
何もフォーカスあてなくても、そのソフトのツリーをたどりゃいいじゃん (^_^;

452:デフォルトの名無しさん
15/05/26 19:13:43.31 yWiUgxdI.net
あ、Spy をアクティブにした時点で消えるってことかな

453:434
15/05/26 19:16:07.64 8e2ytTC5.net
実現しているソフト(ちーたんタッチボード)では、
マウス操作の場合、ポップアップメニュを開いた状態から、アプリのウインドにフォーカスを移すと、ポップアップは消えます。
タッチパネルで操作する場合、上記条件で、アプリのウインドにフォーカスを移した場合、
ポップアップは維持されていて、ファイヤーフォックスやら、Googleクロームやらのポップアップメニューも
表示されたまま操作できています。

454:デフォルトの名無しさん
15/05/26 19:29:45.63 Wubd1VRv.net
>>439
つWM_KILLFOCUS

455:デフォルトの名無しさん
15/05/26 19:49:21.15 yWiUgxdI.net
FireFox ってオープンソースじゃなかったっけ? :-P

456:デフォルトの名無しさん
15/05/26 20:09:52.82 JdoiEwqA.net
>>446
それがあんまうまくいかんのよ。
全てのウィンドウがフォーカスを受け取るとは限らんので。
マウスクリックしてもフォーカスイラネーってウィンドウがあると、
そこでクリックしてもKILLFOCUSが発生しない。
例えばツールバーとかはフォーカスを受け取らない。

457:434
15/05/26 20:12:54.79 8e2ytTC5.net
秀丸や、OS標準のnotepadとか、開いて、右クリックのポップアップメニューとかも普通に処理できているので、
自前でポップアップメニューを生成しているわけではなさそうです。

458:デフォルトの名無しさん
15/05/26 20:14:18.14 PeUEmaw1.net
メニューだしたら、マウスイベントをグローバルフック
ヒットテストしてメニューでなければ消す
これで終わりだろ

459:434
15/05/26 21:22:50.67 8e2ytTC5.net
>>450
マウスのグローバルフックで、自分のウインドに関して、
すべてlp->wHitTestCode = HTTRANSPARENT;で処理無効にしましたが、効果なしでした。
LRESULT CALLBACK HookMouseProc(int nCode, WPARAM wParam, LPARAM lParam){
MOUSEHOOKSTRUCT *lp = (MOUSEHOOKSTRUCT*)lParam;
if( nCode == HC_ACTION){
if( lp->hwnd == hMainWnd){
lp->wHitTestCode = HTTRANSPARENT;return 1;
}
}
return CallNextHookEx(g_hHookMouse, nCode, wParam, lParam);
}

460:デフォルトの名無しさん
15/05/26 21:41:44.94 yWiUgxdI.net
「自身のアプリにフォーカスが移動しても、他のアプリが出したポップアップメニューを
消さない方法があれば教えてください」
・・・という質問であることがやっとわかった。orz

461:434
15/05/26 21:46:41.89 8e2ytTC5.net
>>452
私の説明が下手で申し訳ない。そのとおりです。

462:434
15/05/27 06:12:50.61 cNWj5KEM.net
自己解決しました。WM_TOUCHが原因でした。さらばWIN7 orz
Process touch input with Direct Manipulation sampleをダウンロードして一部を書き換えたら問題が解決できました。
いろいろ有難うございました。

463:デフォルトの名無しさん
15/05/27 09:24:46.64 kMgatPrw.net
何が問題だったのか
全く参考にならないゴミレスの山だけが残った。

464:434
15/05/27 10:23:05.35 cNWj5KEM.net
>>455
Win7以降をターゲット機とし、WM_TOUCH前提でトラックパットのアプリを作っていました。
トラックパット内で、右クリック同等のボタンを、デスクトップ上で押した場合、
ポップアップメニューが表示されるのですが、トラックパットにフォーカスが移ると
ポップアップメニューが消えてしまいトラックパットの操作ができません。
アプリとしては致命的なので、451さんが書かれている質問をしました。
前スレッドの781さんが書かれていたWin8向けのAPIを使ったら上記の問題が解消できたという内容です。
いろいろと言葉足らずですみません。
前スレッドの781さん有難うございました。

465:デフォルトの名無しさん
15/05/27 12:41:25.80 A76Dyx8a.net
454に指摘されてもなお、解決方法を具体的に書けない434であった

466:デフォルトの名無しさん
15/05/27 14:50:16.35 elZ3FXt4.net
肩パットのアプリも作ってくれ

467:デフォルトの名無しさん
15/05/27 15:18:24.34 N+gURrK4.net
肩パァン

468:434
15/05/27 15:31:52.16 cNWj5KEM.net
>>457,454
WM_TOUCH以外のやり方は、まだ、理解していないので、自分のコードはかけませんが、解決だと思ったコードは次のとおりです。
MSDNから、Process touch input with Direct Manipulation sampleをダウンロードして、
AppWindow.cppの80行目のCreateWindowを、拡張スタイルで


469:CreateWindowEx(WS_EX_NOACTIVATE, に置き換えたら上記の問題は解決できました。 Process touch input with Direct Manipulation sampleは、781の紹介されたWin8 APIのページからたどったら出てきます。 WM_TOUCHの代わりのAPI、WM_POINTERDOWN:関連はこれから調べる感じです。 このような感じでいいですか?勉強不足ですみません。



470:デフォルトの名無しさん
15/05/27 16:38:01.80 jmeRjzK/.net
よくできまちた

471:デフォルトの名無しさん
15/05/27 17:51:53.06 dJYLVBc0.net
>>460
次からはちゃんと「具体的に書いて下さいお願いします」って言わせなきゃダメだよ

472:デフォルトの名無しさん
15/05/27 18:34:50.13 kMgatPrw.net
んー?
WS_EX_NOACTIVATEウィンドウでWM_TOUCHが来ないのが問題だったけど、WM_POINTERDOWN関連なら来るから解決しました。
なのか?
別に具体的に細かく説明しろって言ってんじゃなくて、要点を説明して欲しいだけなんだけどな。

473:434
15/05/27 19:19:31.11 cNWj5KEM.net
ちょっと違う。
要点としては、WS_EX_NOACTIVATE前提でプログラムをWM_TOUCHのメッセージをスパイでみると、
指でタッチした場合、WM_TOUCHの後に、WM_MOUSEMOVE、WM_LBUTTONDOWN、WM_LBUTTONUPなどが勝手に走ります。
WM_POINTERDOWNのみで処理した場合、WM_MOUSEMOVE、WM_LBUTTONDOWN、WM_LBUTTONUPは走りません。
この特性があるみたいです。
今回の不具合の現象は、上記の特性を見ると、WM_TOUCH経由は、マウスメッセージ連動されているので、
他のアプリで、ポップアップメニューが開いている場合、自分のウインド(WS_EX_NOACTIVATE)をタッチしたら、
マウスがポップアップメニュではない、どこかの座標をクリックしたと認識して、
ポップアップメニューが閉じちゃう現象が起きていたと思われます。

474:デフォルトの名無しさん
15/05/28 17:00:30.45 lhfHDjjO.net
質問です。
CreateWindowで異なるアプリケーションのウインド上に、子ウインドは作成できるのでしょうか?

475:デフォルトの名無しさん
15/05/28 17:04:17.89 BPOchcgZ.net
>>465
作れる。スクリーンセーバーのプレビューみたいに

476:デフォルトの名無しさん
15/05/28 17:07:43.26 06Vv4FJt.net
風が語り掛けます

477:デフォルトの名無しさん
15/05/28 17:36:24.01 lhfHDjjO.net
早速テストしました。
他のウインドに自分の子ウィンドを貼り付けられました。
不具合が出ました。
ターゲットとなる実行名 ChildTest1 ウインド名のクラス名 ChildTest1 子ウインドのクラス名 MyChild
[ChildTest1]
+--- MyChild
があったとします。
自分の子を貼り付けたい子ウインドのクラス名 MyChildEx
hTarget = FindWindow(L"ChildTest1",NULL);
hChild=CreateWindow(L"MyChildEx",L"MyChildEx",WS_CHILD | WS_OVERLAPPEDWINDOW | WS_VISIBLE,0,0,200,200,hTarget,0,hInst,0);
[ChildTest1]
+--- MyChild
+--- MyChildEx
と表示はできたのですが、MyChildExまたはMyChildのウインドウを動かすとMyChildなどの画面が崩れたりします。
これは、異なるスレッドが原因なのでしょうか?
それとも、ウインドスタイルのオプションが足りないということでしょうか?

478:デフォルトの名無しさん
15/05/28 17:46:06.79 9DjcQz3v.net
ウィンドウスタイルじゃね
URLリンク(github.com)

479:デフォルトの名無しさん
15/05/28 17:51:33.44 BPOchcgZ.net
>WS_CHILD | WS_OVERLAPPEDWINDOW
組み合わせが間違えてる。ウィンドウスタイルの勉強からやり直し。

480:デフォルトの名無しさん
15/05/28 17:59:08.51 Dc/ggFvR.net
Unicodeで決め打ちなら CreateWindowWしようぜ。
今のままじゃ、#define UNICODE 外したらコケるぞ

481:デフォルトの名無しさん
15/05/28 18:04:16.41 lhfHDjjO.net
>>470
あ、そうですね。手抜きコードしてたらそのようでした。

482:デフォルトの名無しさん
15/05/28 18:33:07.81 nbjUOWor.net
ここはスパイウェア技術の質問スレみたいだな

483:デフォルトの名無しさん
15/05/28 19:57:37.48 s/u4gtlI.net
こんなショボい話題でスパイウェア?

484:デフォルトの名無しさん
15/05/28 20:06:02.00 Dc/ggFvR.net
東北弁だよ、たぶん。スパイ(失敗)ウェア

485:デフォルトの名無しさん
15/05/28 23:08:49.45 N7liwE7G.net
似非東北弁うぜー

486:デフォルトの名無しさん
15/05/29 03:04:11.67 YObp/eEX.net
Windows8の場合、メトロスタイルに移動時、デスクトップに復帰時、ウインドウメッセージは、何がくるのでしょうか?
WM_なんだろう?

487:デフォルトの名無しさん
15/05/29 05:29:


488:37.46 ID:YObp/eEX.net



489:デフォルトの名無しさん
15/05/29 12:27:23.52 cPU9CNQ0.net
そんなメッセージは見たことも必要性も感じないな
ユーザが何してようがしったこっちゃない

490:デフォルトの名無しさん
15/05/29 12:31:46.95 cPU9CNQ0.net
てか、ブラウザのテキストボックスの上に自分のテキストボックスを貼り付けて、入力をフックしたいんだろ

491:デフォルトの名無しさん
15/05/29 13:14:52.12 41ckpjjx.net
お前の脳みそ、フックされてるぞ?

492:デフォルトの名無しさん
15/05/29 13:52:33.02 cPU9CNQ0.net
自分のプログラムから、他人のウィンドウの上に子ウィンドウを乗せるシチュエーションが想像できない
自分のソフトなら、そっちでやればよい
IMEなら、そっちの仕組みを使えばよい
WMSIZEが飛んでこないだろ

493:デフォルトの名無しさん
15/05/30 17:41:29.50 AsLlcQ98.net
FindFirstFileでディレクトリ内のフォルダを取得しようとしたんですが、Program Filesのようにパスにスペースが入ると取得できないようになりました
(""で括ったりスペースを~で置き換えたりしてもダメでした) こういう場合はどうすれば良いんですかね・・・

HANDLE hFind;
WIN32_FIND_DATA win32fd;
char m_cFind[MAX_PATH];
int bank_max = 0;
string bank_name[99];
::strcpy_s(m_cFind, MAX_PATH, "D:\\\"Program Files\"");   //D:\\test なら問題なく取得できた
::strcat_s(m_cFind, MAX_PATH, "\\");
::strcat_s(m_cFind, MAX_PATH, "*");
hFind = FindFirstFile(m_cFind, &win32fd);
do {
 if (hFind != INVALID_HANDLE_VALUE) {
  if (strcmp(win32fd.cFileName, ".") && strcmp(win32fd.cFileName, "..")){
   if (win32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
    bank_name[bank_max] = win32fd.cFileName;
    bank_max++;
   }
  }
 }
} while (FindNextFile(hFind, &win32fd));
FindClose(hFind);

494:デフォルトの名無しさん
15/05/30 17:53:27.81 j4YY/rva.net
>::strcpy_s(m_cFind, MAX_PATH, "D:\\\"Program Files\"");
探そうとするファイルは「D:\"Program Files"」にあるの?

495:デフォルトの名無しさん
15/05/30 18:08:52.77 AsLlcQ98.net
>>484
最初は「D:\\Program Files」でやったんですけど、ダメだったんで「D:\\Program~Files」とか「D:\\\"Program Files\"」とか
色々試してみたんです

496:デフォルトの名無しさん
15/05/30 18:12:59.70 Cqishw4w.net
UACに引っかかってるだけじゃないでしょうか

497:デフォルトの名無しさん
15/05/30 18:18:48.75 MWyagaYk.net
\"D:\\Program Files\"
じゃないのか

498:デフォルトの名無しさん
15/05/30 18:36:56.59 AsLlcQ98.net
>>486
Dドライブに自分で作ったProgram Filesだからそれは無いはづ・・・
\"D:\\Program Files\"でもダメですなぁ。別の関数じゃないとアカンのだろうか

499:デフォルトの名無しさん
15/05/30 18:41:08.39 j4YY/rva.net
「Program Files」じゃなくて「Program Files」というオチじゃないよな?

500:デフォルトの名無しさん
15/05/30 18:55:11.66 AsLlcQ98.net
>>489
エクスプローラからちゃんとコピペしてもダメですねぇ・・

スペース無いパスで""入れてみたんだけどアクセスできなくなった。""が対応してないって事かなぁ
アクセスできる  D:\\LTspice
アクセスできない \"D:\\LTspice\"

501:デフォルトの名無しさん
15/05/30 18:55:53.77 YkyYlSQN.net
>>488
そもそも:strcpyもstrcatもただの文字列操作だぞ
::strcpy_s(m_cFind, MAX_PATH, "D:\\\"Program Files\"");   //D:\\test なら問題なく取得できた
::strcat_s(m_cFind, MAX_PATH, "\\");
::strcat_s(m_cFind, MAX_PATH, "*");
実行した結果の
D:\"Program Files"\*
こんなディレクトリ名ありえんだろ
自作フォルダなら実際のフォルダ名が半角じゃなくて全角になっているとか気づきにくいミスをしている可能性があるから
手入力じゃなくてコピペするようにするとかしてみたらどうだ?

502:デフォルトの名無しさん
15/05/30 19:06:27.28 YkyYlSQN.net
>>490 "" が必要になるのはコマンドラインなどのように、空白で文字列の分割が行われてしまう場合だけ。 例えばCreateProcessのlpszImageNameかlpszCommandLinのいずれかでコマンドラインを指定する場合など。 とりあえず試したが(_s付きのほうは試してなくて_s無しのほうで) 空白ありでもちゃんとディレクトリ内のフォルダ名を取得できる。 ちなみにUAC効いてるProgram FilesとProgram Files (x86)で、だ。



504:デフォルトの名無しさん
15/05/30 19:11:52.43 gEFTPVJN.net
>>490
LTspice仲間発見!

505:デフォルトの名無しさん
15/05/30 19:18:47.35 j4YY/rva.net
「括弧でくくってみました」とか「スペースを~に変えてみました」とか、
自分のやっていることをちゃんと理解できていないご様子。
:: FindFirstFile() が INVALID_HANDLE_VALUE を返すなら、::GetLastError() でもしたほうがまだ賢い。

506:デフォルトの名無しさん
15/05/30 19:21:05.30 AsLlcQ98.net
>>492
これでバッチリいけたわありがとナス!やっぱネットのソースコピペだけじゃ嵌るね・・
::strcpy(m_cFind, "D:\\Program Files");
::strcat(m_cFind, "\\");
::strcat(m_cFind, "*");
hFind = FindFirstFile(m_cFind, &win32fd);

>>493
アナログ回路屋さん乙

507:デフォルトの名無しさん
15/05/30 19:29:42.57 YkyYlSQN.net
>>495
ってことは_s付きの関数に問題があったってことでね?
::strcpy_s(m_cFind, MAX_PATH, "D:\\Program Files");
::strcat_s(m_cFind, MAX_PATH, "\\");
::strcat_s(m_cFind, MAX_PATH, "*");
これ実行後の m_cFind はどうなっているんだ?
可能性としては MAX_PATH の定義がおかしくなっているためすべてをコピーしきれないとか。

508:デフォルトの名無しさん
15/05/30 19:31:52.41 j4YY/rva.net
すでに文字列が代入されているから残っているバッファは MAX_PATH じゃないというオチ

509:デフォルトの名無しさん
15/05/30 19:49:30.64 AsLlcQ98.net
>>496
やり直してみたら全く一緒や・・ なんかもっと分からんくなってきたw
::strcpy(m_cFind, "D:\\Program Files");
::strcat(m_cFind, "\\");
::strcat(m_cFind, "*");
::strcpy_s(m_cFind2, MAX_PATH, "D:\\Program Files");
::strcat_s(m_cFind2, MAX_PATH, "\\");
::strcat_s(m_cFind2, MAX_PATH, "*");
ofstream OUTOOO("aaa.txt");
OUTOOO << m_cFind << endl << m_cFind2 << endl;
OUTOOO.close();

結果
D:\Program Files\*
D:\Program Files\*

510:デフォルトの名無しさん
15/05/31 07:25:39.10 EvgAS0zw.net
>最初は「D:\\Program Files」でやったんですけど、ダメだったんで
なんだ
ただの嘘つきか

511:デフォルトの名無しさん
15/05/31 17:43:49.58 JnLugUH0.net
せんぱい、プログラミングおしえて?

512:デフォルトの名無しさん
15/05/31 18:08:10.82 t8jPrrOm.net
>>500
最新版のVisual Studioをインストールしろ。
printfでHello, worldを表示する次のようなプログラムhello.cppを作れ。
#include <stdio.h>
int main(void) {
printf("Hello, world\n");
return 0;
}
できたら、MessageBoxでHello, worldを表示するプログラムにしろ。

513:デフォルトの名無しさん
15/05/31 18:25:50.43 AQY7I4dQ.net
なにも teratail のキャッチコピーにレスしなくても

514:デフォルトの名無しさん
15/05/31 18:46:44.54 t8jPrrOm.net
>>502
キャッチに反応しなくてもいいとはおかしい。
ロボットに変なこと教えるなよ。
helloもhelp meもキャッチコピーだ。

515:デフォルトの名無しさん
15/05/31 18:59:10.57 t8jPrrOm.net
この世界では知的ロボットが混乱するようなキャッチコピーは禁止されている。

516:デフォルトの名無しさん
15/05/31 19:38:43.33 HdJipRY3.net
鳥を外すな鬱陶しい

517:デフォルトの名無しさん
15/05/31 20:25:38.58 JnLugUH0.net
えっ・・・
日本語で質問できるん?

518:デフォルトの名無しさん
15/05/31 21:31:40.03 aHKj8Hug.net
あ、リトル。

519:デフォルトの名無しさん
15/05/31 23:03:10.09 jHkPthzb.net
おいQZお前にはこのスレは敷居が高すぎるから入ってくるなよ自演豚

520:デフォルトの名無しさん
15/06/01 10:15:47.22 /nRdew/3.net
GetMessageの定義では戻り値がBOOLとなっているのにMSDNを見ると「0以外の値または0または-1を返す」と書いてあります
矛盾している気がするのですがどういうことですか?

521:デフォルトの名無しさん
15/06/01 10:17:05.15 /nRdew/3.net
すみません
typedef int BOOL
って見つけました
失礼しました

522:デフォルトの名無しさん
15/06/01 10:55:26.91 hih5o8Kt.net
BOOL は true/false じゃないことを頭に叩き込むべし
(b == TRUE) と書いてやられるのは誰もが通る道

523:デフォルトの名無しさん
15/06/01 11:00:24.48 H7Yr0w9V.net
b == FALSE
b != FALSE
にすべし

524:デフォルトの名無しさん
15/06/01 11:04:54.39 Q3ianLBA.net
やられたことないなあ
b != FALSE なら b でいいし
b == FALSE なら !b でいいだろ?

525:デフォルトの名無しさん
15/06/01 11:13:04.14 H7Yr0w9V.net
0 != or 0 or -1に矛盾を感じるって事は
TRUE == or FALSE == と明示的に書きたいんだろうしって事ね

526:デフォルトの名無しさん
15/06/01 11:23:30.93 Q3ianLBA.net
GetMessageの戻り値はイカれてるが
BOOLは比較する必要ないだろ

527:デフォルトの名無しさん
15/06/01 12:08:18.51 gkan/OPI.net
いつからこの糞仕様引きずってんだろ
9xの頃もこうだったか?

528:デフォルトの名無しさん
15/06/01 12:13:04.93 Lw3ov3gq.net
GetMessage() の戻り値が -1 になるのは「関数が失敗した」ときだけだから大目に見てやれw

529:デフォルトの名無しさん
15/06/01 12:25:21.88 H7Yr0w9V.net
>>515
必要かどうかを言ってるんじゃないんだが

530:デフォルトの名無しさん
15/06/01 14:38:57.15 hih5o8Kt.net
>>516
多分その頃は BOOL とか型名そのものをみんな無視してたんじゃないかな
他言語から逆輸入・再発見された感がある

531:デフォルトの名無しさん
15/06/01 14:43:08.35 s3ZcdtNu.net
でもBOOLなのに0、1以外を返すこともあるって・・・
なんでintにしなかったんだろう。

532:デフォルトの名無しさん
15/06/01 14:57:00.38 Lw3ov3gq.net
Windows3.0 の時代には 関数に失敗しても 戻り値は 0 だった。
>BOOLなのに0、1以外を返すこともある
「0、1以外」ではなく「0, 0以外」
「1以外」なんて考えてると、510 の書いているように (b == TRUE) なんてコトを平気でやっちゃうぞ

533:デフォルトの名無しさん
15/06/01 16:23:37.99 s3ZcdtNu.net
何言ってんの?
BOOLには0、1以外入れちゃダメだろ。
「Cでは非0が真だから、BOOLに2入れちゃお」ってどんな判断だよ。
そんなの、BOOLは実はintだから-1返しても良いよね!っていう、
件のMSの発想と同じじゃねーか。わざわざそんないたずらする意味あるか?
BOOLの真に1を使うのはそれなりの根拠があるよ。
まず、TRUEが1に定義されていること。でもこれはMSが勝手にやっていることでしかないんだがな。
それでもWin32APIを使う上ではMSの流儀にあわせるべきだよね。
つぎに、Cは比較や論理演算の結果が真になった場合、1を返すと規格で決まっている。
また、C++のboolをintにキャストすると0、1になる。
これらをふまえると、BOOLに2や3を入れようという発想は生まれないはずだ。
>でもBOOLなのに0、1以外を返すこともあるって・・・
なるほど、問題ない文章じゃないか。

534:デフォルトの名無しさん
15/06/01 16:29:06.59 TGyjCQFp.net
>>521
日本語勉強してからまた来い

535:デフォルトの名無しさん
15/06/01 16:29:28.74 s3ZcdtNu.net
それじゃなくてもMSはTRUEを1に定義するという無茶をやってのけているわけだから、
その上で戻り値がBOOLのAPIで真に1以外が使われたりしたら、
もうやっていることが無茶苦茶だよね。何がしたいんだと。
戻り値がBOOLなのに0、1以外が返ったら、批判してよい。

536:デフォルトの名無しさん
15/06/01 16:30:17.37 TGyjCQFp.net
>>522
>BOOLには0、1以外入れちゃダメだろ。
入れてもいい
>>521 の言うように
BOOL に許される値は 0 と 0以外の任意の数 の二通り

537:デフォルトの名無しさん
15/06/01 16:37:23.84 0D/a6Ypk.net
boolじゃないんだから別にいいがな
BOOLなのにTRUEかFALSE以外が入ってる
のはあんまりよくないんじゃないかなとは思うけど

538:デフォルトの名無しさん
15/06/01 16:40:04.79 Lw3ov3gq.net
>>523
どっか日本語ヘンだった?

539:デフォルトの名無しさん
15/06/01 16:57:05.84 TGyjCQFp.net
>>527
きみの読解力

540:デフォルトの名無しさん
15/06/01 16:57:45.60 TGyjCQFp.net
>>526
BOOLなら-1はTRUEだよ

541:デフォルトの名無しさん
15/06/01 17:19:42.51 Lw3ov3gq.net
難癖つけられただけか

542:デフォルトの名無しさん
15/06/01 17:55:03.05 o6FjTESK.net
>>529
TRUE == 1 なんだからそれはおかしくね?
BOOL型の値にどんなビット表現があっても別に問題ないっしょ?
BOOLなら-1は真だよ は正しいと思うけど

543:デフォルトの名無しさん
15/06/01 18:33:23.14 5bGybq2H.net
>>523
>Cは比較や論理演算の結果が真になった場合、1を返すと規格で決まっている。
でも入力は零か非零でみるんだよね‥

544:デフォルトの名無しさん
15/06/01 19:31:09.47 IvVhkElP.net
この流れ、20年前にも見た。
またやってんのお前ら。

545:デフォルトの名無しさん
15/06/01 19:34:41.03 4i959FGz.net
ハゲは黙ってろ

546:デフォルトの名無しさん
15/06/01 19:54:53.91 s3ZcdtNu.net
だからさーお前らの言ってるのはAPIを呼び出す側の姿勢の問題だろ。
BOOLはintだから0、1以外の何が入ってるか分からんから、
そういう場合にも対応した安全なコード書けって観点だろ。
でも俺はそんなこと一言も言及してねーんだよ。
俺は戻り値がBOOLのAPIで、0、1以外が返るのは糞だ、と言ってるだけ。
こんなことは当たり前で、荒れる要素は全くない。
APIを設計する側のMSに文句を言っているだけで、
それを使うお前らに文句を言っているわけではない。
真の値にあえて1以外が使われる意味はあるか?
MS「今日は2にしてみよう。明日は3にしてみよう。」 おかしいだろ。
MSは自らTRUEを1に定義してるんだよ。だったら真の値に1を使うのは当たり前だろ。
あえて他の値を使う必要性もないから、当然だよな。
どこに反論の余地があるの?

547:デフォルトの名無しさん
15/06/01 20:18:56.34 s3ZcdtNu.net
それともあれか?お前らはMSにBOOLが戻り地のAPIで、
真の値に1以外を使って欲しいのか?何の目的で?
別に1で構わないなら、俺の発言に文句ないはずだよな。
それに世の中にはif( ret == TRUE )とかいう糞みたいなコードだって散らばってるわけ。
TRUEを1と定義したのはMSなので、これはMSの責任でもあるわけ。
MSはこういった糞コードでもプログラムがクラッシュしないようにAPIの仕様を定めなければならない立場。
今回のケースでは、単に真の値に1を使うようにするというだけのことなので、そうするのは当たり前。
他の値を使う意味が全くないからな。2や3じゃなく、1を使えばそれで済む話。ノーコスト。
この場面で、あえて他の値を使ったとしたら、糞だろ。
そういう消極的な観点からも、戻り値がBOOLのAPIで0、1以外を返すのは
糞仕様なわけ。お前らがif( ret == TRUE )と書かないのと全く同じ理由で、
逆にMS側はif( ret == TRUE )と書かれている糞コードでもクラッシュしないように勤めるの。
可能な限り無意味なトラブルを避けるのは、使う側もMSも同じ。

548:デフォルトの名無しさん
15/06/01 20:21:09.10 4i959FGz.net
長いよハゲ

549:デフォルトの名無しさん
15/06/01 23:10:00.30 cqscK3va.net
週刊報道Bizストリート

550:デフォルトの名無しさん
15/06/02 00:48:43.31 opKMSndu.net
BOOLもあれだがそれよりも、いまだに戻り値がintで成功時に0を返すなどという
糞仕様の関数書く奴をどうにかしてくれ。

551:デフォルトの名無しさん
15/06/02 03:23:52.68 B/m18j7i.net
保存ダイアログ出そうと思ってコード拾ってきたんですが、
一番下のよくわからない2行がないとダイアログが出ないんですけどそういうモンなんですかね・・・
普通に動いているからまぁ良いんだけど謎すぎて・・
char InBuf[256];
OPENFILENAME ofn;
memset(&ofn, 0, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = (HWND)


552:frame->getSystemWindow(); ofn.lpstrFilter = "Preset File {*.aaa}\0*.aaa\0\0\0"; ofn.lpstrFile = InBuf; ofn.nMaxFile = MAX_PATH; ofn.nMaxFileTitle = MAX_PATH; ofn.lpstrDefExt = "aaa"; ofn.lpstrInitialDir = (char *)((VstPlugin*)effect)->preset_dir.c_str(); ofn.Flags = OFN_OVERWRITEPROMPT; if (GetSaveFileName(&ofn)) ((VstPlugin*)effect)->export_preset(InBuf); char buf[256];  //なぜかこれが無いとダイアログが出ない sprintf(buf, "%s", ofn.lpstrFile);  //なぜかこれが無いとダイアログが出ない



553:デフォルトの名無しさん
15/06/02 04:27:05.27 GiY1la32.net
試してないけどだいたい原因になりそうなのは想像付くよ
>lpstrFile
>「ファイル名」エディットコントロールを初期化するのに使用されるファイル名を格納したバッファのアドレスを指定します。初期化が必要ない場合には、バッファの先頭にヌル文字を格納しておきます。
これに従ってInBufを初期化してください
あとMAX_PATHは260バイトなのでInBufをその分確保してください

554:デフォルトの名無しさん
15/06/02 04:54:10.97 B/m18j7i.net
>>541
おおほんとだ。char InBuf[256]; → char InBuf[MAX_PATH] = { NULL }; に変えたら最後の2行消してもダイアログ出たw
これで安心して使えるよありがとう

555:デフォルトの名無しさん
15/06/02 07:37:04.28 3K9K5nvj.net
>>542の作ったアプリのユーザーは安心して使えないだろうが

556:デフォルトの名無しさん
15/06/02 07:57:16.19 grfnvhLc.net
ワロタ

557:デフォルトの名無しさん
15/06/02 08:13:50.44 a3qlL/7f.net
馬鹿には無理

558:デフォルトの名無しさん
15/06/02 08:16:29.73 a3qlL/7f.net
>>539
strcmp

559:デフォルトの名無しさん
15/06/02 08:17:37.90 a3qlL/7f.net
>>539
main もあったわ

560:デフォルトの名無しさん
15/06/02 08:18:11.25 23FH/Mb/.net
ここって質問スレだよな
いつから素人が駆け出しを叩くスレになったんだ

561:デフォルトの名無しさん
15/06/02 08:34:51.25 grfnvhLc.net
質問スレに戻ったのは最近のことで
Part90あたりからPart110くらいまでは
「知らないならレスしないでください。ウザイだけです」
に代表される、煽りと罵倒のスレでしたよ

562:デフォルトの名無しさん
15/06/02 10:33:03.90 c7PbY7Ns.net
ウィンドプロシージャとWinMainって別々のファイルに分けた方が見やすいよね?

563:デフォルトの名無しさん
15/06/02 10:49:58.79 qFTxEdTq.net
好きにしろ

564:デフォルトの名無しさん
15/06/02 10:51:25.21 QEt0ogBL.net
いや、ウインドウが幾つになろうと一つのソースにまとめるべき

565:デフォルトの名無しさん
15/06/02 11:25:48.48 4AmpqNUq.net
オレの .cpp には _tWinMain しかない

566:デフォルトの名無しさん
15/06/02 12:17:09.92 O9gETs5A.net
>>546
一致が成功って決まってる訳じゃなかろ

567:デフォルトの名無しさん
15/06/02 12:21:29.62 Y5fGC49j.net
この続きは言語スレでやれ

568:デフォルトの名無しさん
15/06/02 12:26:28.11 4q1LDLUC.net
>>554
負論理だとFalseが成功ってこともある罠

569:デフォルトの名無しさん
15/06/02 17:20:53.79 d2/EM2sA.net
>539
URLリンク(ir9.jp)

570:デフォルトの名無しさん
15/06/02 18:40:52.51 csi1IGCv.net
int型関数で戻り値で成功か失敗かを
返すなら
0 成功
1 失敗
でいいんじゃないか?
失敗の場合の色んな情報を返すなら
0~FFFFまで自分で好きなようにエラーコードを割り当てればいいんじゃないか?

571:デフォルトの名無しさん
15/06/02 18:45:05.41 eq8fi9nB.net
0以上が成功0未満が失敗で

572:デフォルトの名無しさん
15/06/02 18:48:01.13 csi1IGCv.net
成功か失敗かを返すなら
成功は0だろ。

573:デフォルトの名無しさん
15/06/02 19:17:58.20 grfnvhLc.net
もういいよハゲ

574:デフォルトの名無しさん
15/06/02 19:20:11.22 d2/EM2sA.net
Windows用のドライバやってたころ、カーネルからのエラーコードを
戻り値にしてたから成功は0、失敗はエラーコードとかよくやってた

575:デフォルトの名無しさん
15/06/02 20:18:08.17 w3C6933l.net
負論理つーてもIOL>IOHなわけでもねえんだが今どきは

576:デフォルトの名無しさん
15/06/03 09:32:03.99 fBuP9Jsx.net
>>558
天才 ktkr

577:デフォルトの名無しさん
15/06/03 09:32:48.88 fBuP9Jsx.net
>>560
その通り
成功に理由はいらない

578:デフォルトの名無しさん
15/06/03 09:49:05.70 Q+LF6TWf.net
僕の関数が失敗した5つの理由

579:デフォルトの名無しさん
15/06/03 10:05:48.60 4f4dm0TI.net
新書のタイトルみたいだな

580:デフォルトの名無しさん
15/06/03 10:11:25.13 Mg6w8zFx.net
>>565-566
色々勉強になったわ
ありがとう
URLリンク(seiko-forever.seesaa.net)
URLリンク(www.youtube.com)

581:デフォルトの名無しさん
15/06/03 10:16:58.19 Mg6w8zFx.net
ごめん1個目のリンクはゴミです

582:デフォルトの名無しさん
15/06/03 14:01:43.28 oCZofESS.net
これじゃね
URLリンク(uchidak.cocolog-nifty.com)

583:デフォルトの名無しさん
15/06/03 14:16:15.93 u1dB80rd.net
>>569
2個めもゴミだろがハゲ

584:デフォルトの名無しさん
15/06/03 14:28:37.02 oCZofESS.net
Failure makes success.

585:デフォルトの名無しさん
15/06/05 15:36:47.82 Cf1vS3sG.net
COPYRECT

586:デフォルトの名無しさん
15/06/06 02:46:17.61 GYjDajMQ.net
C言語Win32APIだけで乱数
URLリンク(geoserver.sak) ura.ne.jp/blog/c%e8%a8%80%e8%aa%9e/c%e8%a8%80%e8%aa%9ewin32api%e3%81%a0%e3%81%91%e3%81%a7%e4%b9%b1%e6%95%b0/

これを使って短時間で乱数量産するとエラーで止まるから、プログラムの最初で初期化
CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
して、プログラムの最後で解放
CryptReleaseContext(hProv, NULL);
しようと思ったんですが、こういうのって初期化~解放の間隔が何日何週間とかになっても大丈夫なんですかね

587:デフォルトの名無しさん
15/06/06 10:21:43.72 selLq9/m.net
質問があります。
特定の範囲に収まるフォントサイズを逆算するAPIってありますか?
あるならその関数名称を教えていただきたいですが…
うまく探しきれなくて、申し訳ありません。

588:デフォルトの名無しさん
15/06/06 10:51:01.18 DXSt7rl7.net
つGetFontSizeInRect()

589:デフォルトの名無しさん
15/06/06 10:57:49.54 0CBA8Axe.net
>>575
高さはすぐに計算できるけど、可変ピッチなフォントだと同じフォントでも文字の幅が違うから、
DT_CALCRECTをつけたDrawText()をフォントサイズ変えてforなりwhileでぶんまわして、
特定の範囲(RECT)に収まるかどうかチェックすれば?

590:デフォルトの名無しさん
15/06/06 11:06:52.77 selLq9/m.net
>>577
ありがとうございます。
やはり、範囲内に収まるかチェックするんですね…

591:デフォルトの名無しさん
15/06/06 11:24:04.60 selLq9/m.net
ナウレッジになんかあったー
皆様ありがとう
URLリンク(support.microsoft.com)

592:デフォルトの名無しさん
15/06/06 11:32:09.11 9TAyXKx2.net
>>574
というか毎回hProvを初期化しなければ止まらなくなるの?
もしそうならエントロピープールをシードにしか使ってないんだろうか…
Crypt系関数って詳しい仕様をぜんぜん公開してないから疑わしく見えて仕方がない
ちなみに俺の環境だと256bitで4000万回実行しても止まらなかったので再現は諦めた
Win7 x64

593:デフォルトの名無しさん
15/06/06 11:55:27.98 xKO3x+L2.net
>>574
最初に与


594:えられた事実は真実と錯覚していないか? 俺もこの現象に遭遇したことがないな



595:デフォルトの名無しさん
15/06/06 14:56:55.03 GYjDajMQ.net
>>580-581
コメントアウトしてたのを戻してもっかいやってみたら今度は再現しませんでした
何かの偶然だったという事にしようと思います・・・
仕様が公開されてないなら判断しようが無いですね。。

596:デフォルトの名無しさん
15/06/08 23:35:39.81 DpcdWlc7.net
ディスプレイの物理サイズを正確に調べる方法ってありますか?GetDeviceCaps関連でしょうか?
Windows8とかだとスケーリングとか任意で設定できるっぽいので、スケーリングの値など、関連する情報を取得できる方法が知りたいです。

597:デフォルトの名無しさん
15/06/08 23:42:21.16 nfC7C2fa.net
GetSystemMetric

598:デフォルトの名無しさん
15/06/09 00:24:50.62 jnEs2kjX.net
自己解決
こっちで書いてあった。
URLリンク(social.msdn.microsoft.com)
Windows8.1API
GetDPIForMonitor

599:デフォルトの名無しさん
15/06/09 00:36:54.36 BYQG69VH.net
物理サイズを調べるならモノサシ

600:デフォルトの名無しさん
15/06/09 08:36:21.58 yWuzViB0.net
このさゆりってアカウント
よく見かけるな

601:デフォルトの名無しさん
15/06/09 20:05:19.25 L65shhvt.net
EnumWindows の成功とは、
コールバック関数が FALSE を返さずに全トップレベルウィンドウの列挙を終えるという意味でしょうか?

602:デフォルトの名無しさん
15/06/09 20:17:50.75 BYQG69VH.net
コールバック関数にウィンドウのハンドルとLPARAM値を渡した時点で成功だろう

603:デフォルトの名無しさん
15/06/09 20:22:30.18 M4GdbwfJ.net
英語版にはEnumWindowsProcが0を返すとEnumWindowsも0を返すって書いてあるな
その場合はSetLastErrorで理由を示しなさいだって
大抵は自分自身でEnumWindowsProc書いてるだろうから不要な気がするがなあ

604:デフォルトの名無しさん
15/06/09 20:32:16.40 D/MCT83A.net
>>590
それはEnumWindowsの呼び出し側とEnumWindowsProcは違うから、
EnumWindowsProcでの列挙の中止をEnumWindows 呼び出し側に伝えるためのものでしょ。
自分で実装するならエラー(列挙の中止)の理由ぐらい分かるだろってのは分かるけど。

605:587
15/06/09 20:44:33.10 L65shhvt.net
>>589-591
ありがとうございます
確かに英語版の方がもう少し踏み込んで書いてましたね
読んだつもりだったのですが・・・
EnumWindows でウィンドウを探して、
見付けたらコールバック関数で FALSE を返して打ち切ってたんですが、
見付けた場合に戻り値が FALSE になってて、小一時間悩んでました
「列挙する関数だから、途中で終了したら失敗」
って言われたら納得はできるんですが、いまいち曖昧ですね・・・

606:デフォルトの名無しさん
15/06/09 21:03:00.42 D/MCT83A.net
途中で終了したら失敗というよりかは「失敗か中止」で0が返るって感じじゃないかな。
EnumWindowsProcが0を返す以外では EnumWindows は 0 を返さない(失敗とならない)っていうなら別だけど。
おそらくEnumWindowsProcが0を返す以外にも EnumWindows が失敗することはあるはずだから。
で、0が返ってきた原因として、関数が失敗したのかユーザコードによって中止されたのかは GetLastError で判断してねって。

607:デフォルトの名無しさん
15/06/11 00:31:56.40 9SjF1U/3.net
画面の解像度をユーザーが変更した場合、解像度の変化を取得する方法ってありませんか?
タイマーなどでデスクトップのウインドサイズの変化を常に監視する以外のやり方が知りたいです。
通知メッセージってなにかあるのでしょうか?

608:デフォルトの名無しさん
15/06/11 00:39:09.69 b7rcev9j.net
WM_DISPLAYCHANGE
LPARAMに解像度

609:デフォルトの名無しさん
15/06/11 01:47:20.43 9SjF1U/3.net
>>595
感謝です。

610:デフォルトの名無しさん
15/06/11 08:44:41.69 tkWwvfmc.net
こう言うのは探しにくいよな
メッセージ名が分かれば探せるが、目的からの逆引きは、辞書から言葉を探す行為
全ページ読んでも無かったりする

611:デフォルトの名無しさん
15/06/12 00:23:50.34 vn7j7Ubu.net
二つのwindowがあって片方のwindowはもう片方のwindowの常に前面に配置するってどうすればいいでしょうか?

612:デフォルトの名無しさん
15/06/12 00:31:00.20 VFN7XLRp.net
>>598
SetWindowPosで、HWND_TOPかHWND_TOPMOSTを設定
必要なら、CreateWindowEx(WS_EX_TOPMOSTとかじゃね?

613:デフォルトの名無しさん
15/06/12 00:34:21.62 p+jKebyn.net
>>598
そのふたつのウィンドウが親子なら子は親の前面に表示されるが、そういう話かな?
それとも SetWindowPos( hWnd, HWND_TOPMOST,...) という話かな?

614:デフォルトの名無しさん
15/06/12 04:54:29.01 w5GunMY6.net
32bitと64bitのプログラムって具体的に何を変えてるの
32bit環境でコンパイルすれば32bitで、64bit環境でコンパイルすると64bitなん?

615:デフォルトの名無しさん
15/06/12 05:10:18.42 Qvm3BcbJ.net
32bit 0x00000000 - 0xFFFFFFFF
64bit 0x0000000000000000 - 0xFFFFFFFFFFFFFFFF

616:デフォルトの名無しさん
15/06/12 05:13:57.92 XoMzVDAf.net
APIとかリンク先のDLLも変わる

617:デフォルトの名無しさん
15/06/12 05:59:12.68 w5GunMY6.net
ワケワカメすぎる・・ とりあえず両方の環境で動けばいいって事ですね・・(思考放棄)

618:デフォルトの名無しさん
15/06/12 06:05:05.04 Qvm3BcbJ.net
何を聞きたいのかがよくわからない
64bit環境でも32bitアプリケーションは作成も実行も可能

619:デフォルトの名無しさん
15/06/12 06:09:52.20 w5GunMY6.net
>>605
よく32bitと64bitのソフトって分かれてるんで、プログラミング上では何を変えてるんだろうと疑問に思っただけっす

620:デフォルトの名無しさん
15/06/12 07:32:10.86 Qvm3BcbJ.net
ソース上って意味?
なら>>602-603

621:デフォルトの名無しさん
15/06/12 10:15:18.76 /09Ghvah.net
そもそもの32bitと64bitの意味も分かってないっぽい

622:デフォルトの名無しさん
15/06/12 12:36:31.37 p+jKebyn.net
>>606
プログラミング上における、32bitと64bitのソフトの差異の一例
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int)
{
    return ::DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, DialogProc);
}
上記コードは、64bitでビルドすると ワーニング C4244 になる。
理由:DialogBox() の戻り値である INT_PTR の定義が32bitと64bitで異なるため。

623:デフォルトの名無しさん
15/06/13 09:32:43.61 jqTzSEpl.net
>>601
ポインタのビット数を無理やり増やしただけ
プロセスあたり4GBを超える必要性は皆無に近いし
物理メモリの4GB超えは32bitでもPAEでできる
x64の本質はクロック信仰と同じ
営業呼称上の数値が増えれば高級感がつくというだけ
それと「32bitではできない(嘘)」8GB以上のメモリを
売りつける口実で、案の定、情弱漁でニシン御殿みたいになった

624:デフォルトの名無しさん
15/06/13 11:00:36.74 xw9tZLHx.net
そりゃクライアントでチマいプログラム作ってればそうだろよ

625:デフォルトの名無しさん
15/06/13 11:06:14.20 aSPFED4z.net
最適な設計しなけりゃそうだろうな
せめて、今の動画や音声は24ビットが基本でそれ以上幅を広げても再生できる装置もないし、再現しても人の知覚を越えてしまい意味がない!
とか、尤もらしい嘘を交えろ

626:デフォルトの名無しさん
15/06/13 11:13:11.55 FQeTzdta.net
仮想マシンでいろいろテストするようになったから、4GB じゃ全然足らん

627:デフォルトの名無しさん
15/06/13 11:16:47.70 AmgidL1k.net
DBとマシンラーニングくらいしか思いつかない
RHEL(CentOS)は既に32bit捨てたんだっけ

628:デフォルトの名無しさん
15/06/13 11:17:48.55 AmgidL1k.net
>>613
一番身近なはずのそれを忘れてたわ
そろそろボケ始めてるな

629:デフォルトの名無しさん
15/06/13 11:20:20.10 aSPFED4z.net
32ビットの時は文字の扱いで無駄が多いと騒がれたが、64ビットの時はみんなガン無視

630:デフォルトの名無しさん
15/06/13 11:35:27.68 NUKk6CPY.net
IPv6にはまだ足りない

631:デフォルトの名無しさん
15/06/13 13:22:28.61 vX+O9mW6.net
>「32bitではできない(嘘)」8GB以上のメモリ
8GB以上と言うあたりに風刺が効いてるなw

632:デフォルトの名無しさん
15/06/13 15:20:18.97 P6q2Jefi.net
Win32APIスレだから32bitが価値あると思い込んでても仕方がないよね?(´・ω・`)
まあ、いまや64bitが普通で32bitは貧乏人の乗り物と認定された軽自動車ほどの
価値もないけどね?(´・ω・`)

633:デフォルトの名無しさん
15/06/13 16:05:23.44 KSn5zbP7.net
目的を達することができれば別に何bitでもいいんだよ
今は過渡期の終盤にさしかかってるけど
32/64bit両対応のコストと比較して,32bitだけで行くという結論もまだもちろんアリ

634:デフォルトの名無しさん
15/06/15 06:00:07.52 /ZXirDuW.net
マシンの一意の値を知りたいと思ってGUIDというものに辿り着いたのですが
URLリンク(www7a.biglobe.ne.jp)
>また,GUIDを何回取得しても Data4 は変化しないため Data4 はマシンを特定するため のIDと推測されます.
>このため,ネットワークアダプタを持たないマシンでも GUIDのData4メンバを利用 すれば,マシンを一意に特定するIDを得ることができるようになると思われます.

実際に下記コードで取得してみたのですが、やるたびにData4の値が変わるんですけど、どっちが正しいんですかね・・
GUID guid;
::CoCreateGuid(&guid);
ofstream OUF("a.txt");
OUF << guid.Data4 << endl;
OUF.close();

635:デフォルトの名無しさん
15/06/15 06:57:40.21 shu87Eme.net
>>621
HDDのGUIDとかを特定条件にするのはどーだろうか?と思ったので、ちょっと調べてみたらこんなのでたよ。
URLリンク(www.hsp.tv)


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch