Win32API質問箱 Build57at TECH
Win32API質問箱 Build57 - 暇つぶし2ch262:デフォルトの名無しさん
07/09/17 17:06:36
>>261
 >API用にもうひとつ作ってコピーしないといけない理不尽
 コピーした領域をOSに渡す形なら、OS側は任意の時点で領域解放できる。

・アプリが持っている領域を、直接OSに渡した場合、その領域を解放するタイミングを知るスマートな方法はあるか?
(OS側の処理が先に終わった場合、アプリに、その領域を解放してよいか問い合わせるのか?
 それとも、解放要求をアプリに対して発行するのか?
 どちらも本末転倒でしょ?)


263:262
07/09/17 17:08:04
261じゃなくて >>259 だった。すまん

264:デフォルトの名無しさん
07/09/17 17:23:44
ニワトリが先か、タマゴが先か論争に発展してきますた。

265:デフォルトの名無しさん
07/09/17 17:26:01
Javaや.NETはもう一度コピーしてるんだからまだマシ

266:デフォルトの名無しさん
07/09/17 18:18:56
>>265
kwsk

267:デフォルトの名無しさん
07/09/17 18:21:53
>>266
ahsg

268:デフォルトの名無しさん
07/09/17 19:01:46
そもそも>>259はLoadStringの話に見えるのは気のせいか?

269:デフォルトの名無しさん
07/09/17 21:25:47
そうなんです。
LoadString で文字列を取り出すとき
文字列の長さを気にせずに柔軟に取り出せる良い方法ないのかなぁと悩んでます。
いろいろ調べて MFC か ATL 使えばいけるのはわかったんですが
Windows プログラミングの勉強はじめたばかりで
両方ともよくわかってないんで
とりあえず MFC も ATL も使わないで出来る方法ないのかなぁと悩んでたんですけど
三日ぐらいあれこれ考えたんですけど
コレといったのが見つからないんでもう悩むのやめます。

270:デフォルトの名無しさん
07/09/17 21:38:28
それならLoadResourceとかを使えばいいんだよ。
俺もやった。リソース内ではUTF-16LEのくせに、
なぜか9xがLoadResourceWを実装していないというケチさのおかげで。

271:デフォルトの名無しさん
07/09/17 21:40:25
NULLを含まない格納した文字数が返るのだから nBufferMaxの値-1
が返ってきたときはたぶんバッファを増やさないといけないと判断できると思う

最初 260 とかでスタックにとって、それで足りなそうな場合だけ動的に 260*2 。
それでもだめなら 260*2 *2 。それでにだめなら 260*(ry
って感じか?



272:デフォルトの名無しさん
07/09/17 21:51:57
俺はめんどくさいからそんな仕様にしない

273:デフォルトの名無しさん
07/09/17 22:25:38
ネットで勉強してウィンドウとメニューバーまでは作れるようになったけどあと
がまったくわかりません(´・ω・`)
フリーソースのを見て勉強するのがいいってよくみるけど読んでみてもチンブンカンブン
需要はあるはずなのになんでWin32APIの書籍ってこんなに少ないんだろ…
どこかいいサイトか本ありませんか?

274:デフォルトの名無しさん
07/09/17 22:27:22
>>271
そーいやリソース文字列は、最大65536バイトまでだったけ?

275:デフォルトの名無しさん
07/09/17 22:32:51
>>273
猫でも読んでろ

276:デフォルトの名無しさん
07/09/17 22:34:23
>>273
知識つけたきゃテンプレの猫とかAPI入門嫁

アドバイスしとくと、どこまで覚えるかより何をしたいかが重要だったりする
それと人のソースはあくまで一例と捉える

277:デフォルトの名無しさん
07/09/17 22:34:28
>>274
URLリンク(msdn2.microsoft.com)
[quote]
For 16-bit string resources, 255 characters is the maximum length.
For 32-bit string resources, 65535 characters is the maximum length.
[/quote]

278:デフォルトの名無しさん
07/09/17 22:36:58
>>277
おーいえ
さんくす

279:デフォルトの名無しさん
07/09/17 23:59:48
>>275-276
㌧ 猫ってAPIのもあったのね。HPは見づらいから今度探して買ってくる

280:デフォルトの名無しさん
07/09/18 00:13:28
>>279
あほは死ね

281:デフォルトの名無しさん
07/09/18 00:23:21
>>280
「あはは死ね」だと思った。

282:デフォルトの名無しさん
07/09/18 00:42:50
>>279
あはは死ね

283:262
07/09/18 02:02:37
>>279
 猫は「apiの使い方の外枠をつかむ」目的に限定した方がいいです。 コードは問題ありすぎ……。
(コーディングに関しては、オライリーの牛本を参照してください。)

ページが見づらいのは「書籍を買ってくれ」って事なのかね?

284:デフォルトの名無しさん
07/09/18 02:10:05
>>262は死ね

285:デフォルトの名無しさん
07/09/18 02:50:39
みんな死ななくていいよ

286:デフォルトの名無しさん
07/09/18 04:08:18
ツールバーのちらつき対策で質問があります。
ウィンドウサイズを変更するとツールバーがちらついて困ってます。
メインウィンドウは仮想画面化してるのですが、ツールバー部分はHDCがなくてちらついてしまってます。
書き換えタイミングを0.1秒単位にづらすとかはやりましたが軽減できてもちらつき自体をなくす事はできませんでした。
どういった解決方法があるでしょうか?ご教授お願いします。

287:デフォルトの名無しさん
07/09/18 04:10:29
子ウィンドウをクリッピング領域からはずす

288:デフォルトの名無しさん
07/09/18 04:14:22
背面消去をなくす

289:286
07/09/18 04:30:28
>>287
すみません。クリッピング領域から外すということは書き換えないってことでしょうか。。
今のサイズ変更部分はこうなってます。
case WM_SIZE:
MoveWindow(hTool, 0, 0, LOWORD(lParam), 50, TRUE);
break;
出来ればもう少し詳しくお願いできないでしょうか・・・orz

290:デフォルトの名無しさん
07/09/18 04:32:17
ツールバー作成時に
WS_CLIPCHILDRENとWS_CLIPSIBLINGSを追加

試してない

291:290
07/09/18 04:34:01
ごめん超勘違いしてた
俺のは忘れろ

292:デフォルトの名無しさん
07/09/18 10:27:18
>>286
うろ覚えだが
メインウィンドウのクラスのスタイルから、CS_HREDRAW、CS_VREDRAWをはずすか、
またはメインウィンドウのWM_ERASEBKGNDで何もしないように対処すればよいと思われ

293:286
07/09/18 10:33:24
>>292
既にそれは、やってしまってるんです。。
それでもちらつくんですよね。。
今も悩んでいて、面倒臭いですが一つ一つのボタンにハンドルを持たせればクリアできるのはないかと考え、
プログラム作成中です。

294:デフォルトの名無しさん
07/09/18 10:50:11
気になるのなら自前で描くしかない

295:デフォルトの名無しさん
07/09/18 10:59:43
ちらつくのは所詮描画の問題なので、普通に考えれば
メインウィンドウの背景(WM_ERASEBKGND)、メインウィンドウの描画(WM_PAINT)、
ツールバーの背景、ツールバー自身の描画
のいずれかで無駄な背景初期化を行っているくらいしかないと思うのだが

メインウィンドウの仮想画面化とかツールバー部分のHDCって何?
あとボタンにハンドルに持たせるとかも意味が分からない

ツールバーの描画で何か特別なことやってる?

296:286
07/09/18 11:13:46
>>295
ツールバーにHDCみたいなのあればメモリ上にメモリDC取ってちらつき対策できないかと考えてました。
ハンドルというかボタン一つ一つにHWND型で持たせてクリアしようかと。。ツールバーの場合、ツールバーのHWND
単体でサイズ変更してるため、ちらついてるんじゃないかと考えています。

297:デフォルトの名無しさん
07/09/18 11:42:52
>>296
ツールバーはOS標準のコントロールなんだから単体で対処可能なちらつき対処くらいやってるだろ
そんなことに力をそそぐくらいなら、>>292あたりもう一度見直したほうがいいのでは?

スタイル設定したつもりが反映されていないとか
メッセージハンドラを定義してみたけど名前が違ってたりして呼び出されてないとか
実はメインウィンドウの子のビューがツールバーと重なっていて、ビューの背景消去が問題だとか

298:デフォルトの名無しさん
07/09/18 12:03:26
標準コントロールはちらつき対策なんて元から考えていないが、
対処くらいやっているだろうとか考えられてしまうそのおめでたい頭がうらやましい。

299:デフォルトの名無しさん
07/09/18 12:26:19
そもそもツールバーってちらついたっけ?
VC2005+MFC+WinXPSP2だと、ToolBarのみとReBar+ToolBarの構成で作れるが、
どちらもちらつきは発生しなかったぞ。
昔のMFC自前実装の奴(ペイントとか)はちらつくけど。

300:デフォルトの名無しさん
07/09/18 12:31:11
>>298
いや言い方はよくなかったもしれないけど、そんな高度なことを議論する
つもりはなくて、普通メインウィンドウのリサイズで気になるほどちらついたり
はしないんじゃないのってことを言ったつもりだった

そうでないと、ツールバーを使う人は全員描画のカスタイズをしないといけなく
なるけど、自分でもそんなコードは書いたことがないし、それで特に気になったこともない

>>286の気にしているのがどの程度なのかは知らないので断言はできないけど

301:デフォルトの名無しさん
07/09/18 12:33:25
ちらつく理由を考え、それがあってるか検証し、
それを元に対策を考える。

302:デフォルトの名無しさん
07/09/18 12:51:23
>>299
言われるまで気づかなかったが、最近の標準コントロールはちらつかないな。
Explorerのウィンドウをムキになってリサイズしてみたが悔しいほどちらつかないw
ツールバーよりウィンドウの幅が狭くなったときに出る>>のマークだけがちらついてる。

303:デフォルトの名無しさん
07/09/18 13:02:01
チラリズム

304:デフォルトの名無しさん
07/09/18 13:39:06
WM_SIZE時、TOOLBARにWM_SIZEを送る
クライアント部分は子ウィンドウにしてToolbarと重ねない

305:デフォルトの名無しさん
07/09/18 13:58:03
専門用語でフリッカーと言うんだよ

306:デフォルトの名無しさん
07/09/18 14:26:04
>case WM_SIZE:
>MoveWindow(hTool, 0, 0, LOWORD(lParam), 50, TRUE);
>break;
なんかこの辺が間違ってる気が

307:デフォルトの名無しさん
07/09/18 14:30:39
>>298
死ね

308:286
07/09/18 19:24:40
>>306
サイズ変更時に書き換えなさいって命令なので、その部分をカットすればちらつきませんが、
その場合、サイズ変更時ツールバーが変になってしまうので・・・。
検証の結果、ボタン一つ一つにHWNDを持たせるか、>>294さんの言うようにオーナードローで描くか。
現在は、この2択です。もっと簡単にできないか、考えて見ますね。

309:デフォルトの名無しさん
07/09/18 19:33:51
>>308
あほは死ね

310:デフォルトの名無しさん
07/09/18 19:51:28
MoveWindow の最後の引数ってなんだっけ。

311:デフォルトの名無しさん
07/09/18 19:53:58
            ∩_
           〈〈〈 ヽ
          〈⊃  }
   ∩___∩  |   |
   | ノ      ヽ !   !
  /  ●   ● |  /
  |    ( _●_)  ミ/ <こいつ最高にアホ
 彡、   |∪|  /
/ __  ヽノ /
(___)   /


312:デフォルトの名無しさん
07/09/18 19:56:22
>>310
ググれよ。カス。

313:デフォルトの名無しさん
07/09/18 20:34:30
>>310が一番的確な解決方に導いていると思うぞ

314:デフォルトの名無しさん
07/09/18 20:38:02
             ∩_
           〈〈〈 ヽ
          〈⊃  }
   ∩___∩  |   |
   | ノ      ヽ !   !
  /  ●   ● |  /
  |    ( _●_)  ミ/ <こいつ最高にアホ
 彡、   |∪|  /
/ __  ヽノ /
(___)   /

>>313
>>308
最後の引数には気付いている。
おかしいのは最後の引数ではない。

315:デフォルトの名無しさん
07/09/18 22:18:15
そもそもツールバーをAPIで作ったときにMoveWindowなんて書いた記憶が無い件

316:デフォルトの名無しさん
07/09/18 22:55:03
そもそもメインウィンドウは仮想画面化してるとか
ツールバー部分はHDCがないとか言う不思議君だから
リサイズでMoveWindowくらいするだろう


317:デフォルトの名無しさん
07/09/18 23:47:20
検証もせずに批判ばかりする奴より、検証しようと努力してる奴の方が俺は好感を持つ。

318:182
07/09/18 23:51:20
すみません
GetLocaleInfo() でファイルの言語を取得できるようになったんですが、
.net で作ったexeの場合、自分で取得すると「日本語」が返ってくるんですが
「ファイルのプロパティ」だと「ニュートラル言語」になってるんですが、
どうすりゃ取れるんでしょうか。


319:デフォルトの名無しさん
07/09/18 23:57:10
>>317
正解が既に>>304で出てるのに無視されてるからじゃないの?

>>308
ツールバーのリサイズはMoveWindowでなく、WM_SIZEを直接SendMessageする

URLリンク(msdn2.microsoft.com)


320:デフォルトの名無しさん
07/09/19 00:38:22
>>319
MoveWindowはダメとかSendMessageとか命令の問題じゃない気がするが・・・
試しに俺が検証してみた。

* ツールバーを作成する */
hTool = CreateWindowEx(
WS_EX_TOOLWINDOW, TOOLBARCLASSNAME, NULL,
WS_CHILD | WS_VISIBLE | WS_THICKFRAME,
0,0,0,0,
hWnd, (HMENU)IDR_TOOLBAR, hInst, NULL);

ボタン略。

>case WM_SIZE:
>SendMessage(hTool, WM_SIZE, wParam, lParam);
>break;

ちらついてるじゃねーか。orz

321:デフォルトの名無しさん
07/09/19 01:45:18
>>320
俺も今試してみたが(WinXP SP2)、特にちらつきはないぞ?

//ツールバー作成部分(ボタンは2個)
hToolBar = CreateToolbarEx(hWnd, WS_CHILD | WS_VISIBLE, ID_TOOLBAR, 2,
hInst, IDB_TOOLBAR, tbb, 2, 0, 0, 16, 15, sizeof(TBBUTTON));
//他は省略

ベースはVC2005のWin32アプリのウィザード生成物で、ツールバー処理追加以外に以下を修正
×wcex.style = CS_HREDRAW | CS_VREDRAW;
○wcex.style = 0;
×wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
○wcex.hbrBackground = (HBRUSH)NULL;

なお、WM_SIZEの追加コードは

(a)SendMessage(hToolBar, WM_SIZE, wParam, lParam);
(b)MoveWindow(hToolBar, 0, 0, LOWORD(lParam), 50, TRUE);

の両パターンを試したがどちらも問題はなし

322:デフォルトの名無しさん
07/09/19 02:12:26
>>321
ちらつきの考え方の違いかな。。
ウィンドウの枠、右部分を(マウス左)ドラッグして左右に振ってみて欲しい。
ツールバーのボタンがちらついてない?
俺もCreateWindowExとCreateToolBarExだと違いがあるのかと思って両方試してみたが
両方ともちらつかないか?俺も気になってきたw

323:322
07/09/19 02:27:21
補足
ちらつきが分かりやすいように、ラージサイズのアイコン使用中。

324:デフォルトの名無しさん
07/09/19 02:28:22
ちらしの裏にでも書いてろ低脳

325:デフォルトの名無しさん
07/09/19 02:31:20
Vista使えばちらつきなんて気にならん

326:デフォルトの名無しさん
07/09/19 02:34:06
>>322
OSは何?
こちらで試したプログラムでは、メニューの文字はわずかにちらつくが、ツールバーは
それよりずっと安定していて目で認識できる範囲のちらつきはない

ボタンのデザインはグレーの背景に手書きで1、2と書いてあるだけなので
目立ちにくいかもしれないが、少なくともメニューと同じくらいちらついてくれれば確実に分かる

327:322
07/09/19 02:40:27
>>326
環境 (WinXP SP2)
ボタンのデザインは、既存のBMP。フォルダアイコンのラージサイズを貼り付けてる。

tbBmp.hInst = HINST_COMMCTRL;
tbBmp.nID = IDB_STD_LARGE_COLOR; /* 標準の大サイズのアイコンを使う宣言

328:デフォルトの名無しさん
07/09/19 09:38:55
ちらつくのはいちいち消して(バックグラウンド塗りつぶし)描くからだよ
もともと全部描きなおすタイプならけさんでいい

329:デフォルトの名無しさん
07/09/19 12:07:36
再度試してみた

背景消去を行わない(ウィンドウクラスの背景ブラシをNULLにするか、WM_ERASEBKGNDを無視)
とした場合でも、クラスのスタイルにCS_HREDRAW | CS_VREDRAW が残っていると、ボタン部分が
かすかにちらつく(メニュー文字のちらつきの半分程度)

>>322>>286の言ってるちらつきがこれってことはないのか?

330:デフォルトの名無しさん
07/09/19 12:19:23
WS_CLIPCHILDRENしてるか?

331:デフォルトの名無しさん
07/09/19 17:39:11
Visual Basic 6.0ってありましたよね?
あの言語でIsNumericって関数があったんですけど、
あれをVC++側で実装する場合、
OLE関連の関数群に存在するのでしょうか?
もし、存在するなら、その名称を教えていただきたいです。


332:デフォルトの名無しさん
07/09/19 17:44:40
>>331
市ね

333:182
07/09/19 18:06:08
>>318
VerLanguageName() で自己解決しました。
LangID は LocaleID の下位4バイトでした。
帰ります。


334:デフォルトの名無しさん
07/09/19 19:19:25
>>331
VariantChangeTypeで数値関連の種類に変換できるか試せば、
同じような動作になると思う。

335:デフォルトの名無しさん
07/09/19 21:14:29
Win98からVistaまで動作するプログラムを作ろうと思ってます。
Vistaのフォルダ書き込み権限を取得するために、ConvertStringSidToSidを
使っているんですが、Win98でこのプログラムを動作させようとすると
ConvertStringSidToSidがないとエラーになってしまいます。

ConvertStringSidToSidを使いつつ、両方のOSで動作するようにするためには
どうすればいいんでしょうか?

336:デフォルトの名無しさん
07/09/19 21:16:52
>>335
LoadLibrary, GetProcAddress

337:デフォルトの名無しさん
07/09/19 21:17:21
むり

338:デフォルトの名無しさん
07/09/19 21:20:28
>>336
ありがとうございます。
試してみます。

339:デフォルトの名無しさん
07/09/19 23:23:04
> Win98からVistaまで動作するプログラムを作ろうと思ってます

ムダな努力だと思うがどうよ?
依頼主からの指示?

340:デフォルトの名無しさん
07/09/19 23:51:17
98-Me
2000-XP
Vista
と3種類のリリースに分けて作る方が得


341:デフォルトの名無しさん
07/09/20 01:02:59
最初にOSのバージョン調べて、それを元に挙動変えるのはだめなん?

342:デフォルトの名無しさん
07/09/20 01:10:52
98でSIDとかあったっけ

343:デフォルトの名無しさん
07/09/20 01:18:23
> Win98からVistaまで動作するプログラムを作ろうと思ってます
 Win16で作れば、Win3.1から動くのが作れます。

冗談はともかく、Win98,Me対応は面倒な筈です。
OSのバージョン依存部分に1枚皮を被せて、呼び分ける必要があります。
OS依存部分を別DLLにして、LoadLibraryするとか。

344:デフォルトの名無しさん
07/09/20 02:03:21
>>343
> Win16で作れば、Win3.1から動くのが作れます。
残念ながら64bit版Windowsで動きません。

345:デフォルトの名無しさん
07/09/20 03:09:00
.Netでつくる

346:デフォルトの名無しさん
07/09/20 03:51:25
Win95って.netインストールできないんじゃなかった?

347:デフォルトの名無しさん
07/09/20 03:53:24
>>343はWin98からと言ってるから問題ない

348:デフォルトの名無しさん
07/09/20 04:19:38
まだ98つかってる香具師いるのか

349:デフォルトの名無しさん
07/09/20 05:48:08
買い換えるまでWin98という奴はいるだろ

350:デフォルトの名無しさん
07/09/20 06:40:37
オレは win98 + winXP。去年から win98 -> vista と思っているが、評判が
よくないので、ママ。win98 機は gateway なんだが、keyboard に慣れていて
ホレ今も、それと coding にも使っている。hardoff で見つけた 6GB HDD で
動かしていて、元の HDD は後生大事にとってある。時々換装しないといけない
が、今年はやってない。フラットケーブルが煎餅みたいに割れそう。

351:デフォルトの名無しさん
07/09/20 06:44:20
Win98をWebに繋ぐなんて最早犯罪だろ。

352:デフォルトの名無しさん
07/09/20 07:09:11
ダブルバッファリングのコードを書いたつもりでしたが、上手くいきません。

InvalidateRect()関数によってWM_Paintが要請されるまで、描画が行われない予定
なのですが、InvalidateRect()を呼び出さずにもWM_Paintが発行されているようで、
TextOutによる文字列が描画されてしまいます。ご教授お願いします。

URLリンク(sakuratan.ddo.jp)

353:デフォルトの名無しさん
07/09/20 07:21:51
>>335
もう見てないかもしれんが、俺のプログラムでは同様の事例で
リンカーオプション「/DELAYLOAD」を使っている

354:デフォルトの名無しさん
07/09/20 07:44:06
見てるよ
ずーっと見てる
君を見てる

355:デフォルトの名無しさん
07/09/20 07:48:07
質問に答えろぉぉぉおおお!

356:デフォルトの名無しさん
07/09/20 07:50:29
>>355
m9(^Д^)プギャー アホスギ

357:デフォルトの名無しさん
07/09/20 07:52:40
>>352
せいぜい、WM_PAINT内でii.hScreenを使っていいかどうかを見る
フラグでも用意しておくしかないと思う。

358:デフォルトの名無しさん
07/09/20 07:55:20
>>352
とりあえず、ダブルバッファがどうとか考える前にメッセージを理解してくれ


359:352
07/09/20 08:03:57
サンプルがわるかたかな・・・。
hScreenに描画している限り無効領域は発生せず、
WM_Paintは発行されないと思ってたんだけど、その認識が間違ってるのかな。

360:デフォルトの名無しさん
07/09/20 08:05:23
>>359
fとWindowProcは同じスレッド?

361:352
07/09/20 08:07:38
>>360
fという関数は、WM_Createで行うとエラーがでる部分を退避させるため
だけに暫定処置として作りました。

362:デフォルトの名無しさん
07/09/20 08:20:11
ああすまん、WM_CREATE内から呼んでいるね。
ってそれだとWM_CREATE内から呼んでいることに変わりはないだろ。

363:デフォルトの名無しさん
07/09/20 08:26:04
どう見てもAPI以前のレベルです、本当にありがとうございました。

364:352
07/09/20 08:31:52
一応、猫でもわかるのサンプルみて作ったつもりなんだけど、
なんで描画されるんだろ。



365:デフォルトの名無しさん
07/09/20 08:40:02
>>359
ウィンドウ作った時点じゃ、最初から無効領域

366:352
07/09/20 09:32:48
>>365
なるほど!動作確認の仕方が間違っていたのですね。
おかげさまで問題を解決することができそうです。
ありがとうございました。

367:デフォルトの名無しさん
07/09/20 09:34:31
重なっている上のウィンドウが移動したり、新しくウィンドウが作られたり、
そのウィンドウがリサイズしたりして、新たに描画しなければならないところが無効領域。
InvaridateRectは、そういった条件にかかわらず無効領域にするAPIだから。

368:デフォルトの名無しさん
07/09/20 12:21:27
>366
この手のタイプは、「できませんでした。教えてください。」ってまた来るんだよな・・・orz

369:デフォルトの名無しさん
07/09/20 13:29:37
教えて頂きたいのですが、MDIにおいて、
親ウインドウと子ウィンドウの透過率を変えることは可能でしょうか?

親ウィンドウに色のついた透明な子ウィンドウを重ねたいのです。
(一旦メモリデバイスにコピーした後、AlphaBlend()により色を付ける方法は
成功しました。)

SetWindowLong(),UpdateLayeredWindow()などが関連してくると思うのですが。

370:デフォルトの名無しさん
07/09/20 13:40:03
子ウィンドウをレイヤードウィンドウすることはできない

371:デフォルトの名無しさん
07/09/20 13:49:17
>370
やはり、そうでしたか。WS_CHILDとWS_EX_LAYEREDのスタイルを合わせると
ウィンドウが作れないんですよね。

ここから推測するに、親ウィンドウ(透過率255)、
子ウィンドウ(透過率127)のようなことも出来ないとなりますね。

現在のAlphaBlend()とUpdateLayeredWindow()を上手く使ってって方法を
取っていきます。

372:デフォルトの名無しさん
07/09/20 20:46:07
GetKeyboardStateで、現在のキーボードの状態を取得しているのですが、
アプリのウィンドウがアクティブでないときにGetKeyboardStateすると、
上手く情報を取得してくれません・・・、解決するにはどうすればよいでしょうか?

ウィンドウをアクティブにしたフリをして、GetKeyboardStateを動かすこととか出来ないですかね?

キー入力はフックしていて、キーボードでキーが入力されると、
アプリのウィンドウがアクティブでないときでも、
イベントが呼ばれてGetKeyboardStateが走る仕組みです。

動作・開発環境は以下の通りです。
OS : WindowsXP SP2 .net framework 1.1
言語 : C#

宜しくお願い致します。

373:デフォルトの名無しさん
07/09/20 20:49:24
>GetKeyboardStateで、現在のキーボードの状態を取得しているのですが、

ドキュメントにちゃんと書かれているとおり、
GetKeyboardState は現在のキーボードの状態を取得するAPIではありませんので、
別のやり方、たとえば GetAyuncKeyboardState を使うなどに変えた方が良いでしょう。


374:デフォルトの名無しさん
07/09/20 20:50:17
>>373
GetAsyncKeyboardState

375:デフォルトの名無しさん
07/09/20 21:05:51
>>373-374
GetAsyncKeyStateですよね?
試してみます。ありがとうございました!

376:デフォルトの名無しさん
07/09/20 21:30:16
335です。
>>353さんの方法で出来ました。
ありがとうございました。

377:デフォルトの名無しさん
07/09/20 22:00:05
WinSock関連での質問です。
TCPによる接続でconnection関数を利用していますが、
対象のホストを見つけられない場合は、
一定時間処理が停止しています。
これの対処法を、皆さんはしていますか?

スレッド側に投げて対処?
それとも、connectionよりいい関数があるんでしょうか?


378:デフォルトの名無しさん
07/09/20 22:28:19
非ブロックソケット



379:デフォルトの名無しさん
07/09/20 23:29:06
>>377
スレッド
非ブロック
非同期

380:377
07/09/21 00:04:40
>>378-379
スレッド案で非同期化を試みます。
ありがとうございました!

381:デフォルトの名無しさん
07/09/21 00:14:20
SHBrowseForFolder() で質問です。
BROWSEINFO.hwndOwner に設定したウィンドウに対してモーダルで
ダイアログが開きますが、他にモードレスのウィンドウがあるとき、
それらは無効にならずにフォーカスを奪えてしまいます。
全ウィンドウに対してモーダルで開いて欲しいのです。
しょうがないので SHBrowseForFolder() の前後に
「hwndOwner と同じプロセスの全有効ウィンドウを無効/有効にする」
というのを入れたら希望する動作になったんですが、
なにかオフィシャルな手段は提供されてないんでしょうか。

382:デフォルトの名無しさん
07/09/21 00:38:48
その、他のウィンドウの構成が間違っている

383:デフォルトの名無しさん
07/09/21 03:11:36
>>369-371
MSの公式サイトにはUpdateLayeredWindow()の方を使えって書いてある


384:デフォルトの名無しさん
07/09/21 03:15:26
ごめん逆だった
SetLayeredWindowAttributesを使えって書いてある
URLリンク(msdn.microsoft.com)


385:デフォルトの名無しさん
07/09/21 04:19:28
>>384
どこに?

386:デフォルトの名無しさん
07/09/21 11:20:33
lstrlenWなどの文字列の長さを返すAPIの説明に、
「文字単位の長さ」とありますが、
サロゲートペア文字は2文字と数えるのでしょうか?
それとも1文字?
もし1文字で数えられてたら、自分のプログラムが大変なことになります・・・・

387:デフォルトの名無しさん
07/09/21 11:26:10
>>386
MSDNに書いてあるよ。

> The return value specifies the length of the string, in TCHAR
> values. This refers to bytes for ANSI versions of the function
> or WCHAR values for Unicode versions.


388:デフォルトの名無しさん
07/09/21 11:27:30
サロゲートペアのことは書いてないようだけど

389:デフォルトの名無しさん
07/09/21 11:28:24
>>388
「WCHARの長さ」って書いてあるやん


390:デフォルトの名無しさん
07/09/21 12:54:30
早く全面的にUTF32に汁

391:デフォルトの名無しさん
07/09/21 13:39:30
キーボードで入力されたキーコードとシフト状態を元に、文字を作成する関数って

ToAscii
ToAsciiEx
ToUnicode
ToUnicodeEx

上記以外に無いのでしょうか?あれば教えていただきたいです。
宜しくお願い致します。

392:デフォルトの名無しさん
07/09/21 13:58:43
>>381 ShowOwnedPopupsは ? (試してないけど)
386関連。EM_LIMITTEXT/EM_SETLIMITTEXTはどーなってますか

393:392
07/09/21 15:46:57
ShowOwnedPopupsは忘れてください

394:デフォルトの名無しさん
07/09/21 17:08:10
DLLを自分で作って使ってみたいと思い挑戦しているのですが
どーしてもわからないっす。

VC2005Expressを使用してDll projectでDllをビルド
LoadLibraryで読み込む←成功
先にtypedef int (*DLLFUNC)(int, int) ;と宣言しておき
DLLFUNC Add ;
Add = (DLLFUNC)GetProcAddress(hDll, "Add") ;

↑でNULLが帰ってきて「指定されたプロシージャが見つかりません」って出てます。
DLLのソースは
#include <windows.h>
int WINAPI DllMain(HINSTANCE hInstance , DWORD fdwReason , PVOID pvReserved) {
return TRUE;
}
__declspec (dllexport) int Add(int nValue1 , int nValue2)
{
return (nValue1 + nValue2) ;
}
です。よろしくお願いします。

395:デフォルトの名無しさん
07/09/21 17:10:07
def作ったほうが確実

396:デフォルトの名無しさん
07/09/21 17:12:22
そのソースのファイル名は .c か .cpp か。


397:デフォルトの名無しさん
07/09/21 17:16:31
>>395
defを使う方法はまだやった事無いです。今から勉強します。
>>396
.cppです。

398:デフォルトの名無しさん
07/09/21 17:19:45
>>397
では、.c にリネームして試してみるべし。


399:デフォルトの名無しさん
07/09/21 17:22:01
extern "C"をつけて名前マングルをやめて、かつdefでエクスポートすればいける

400:デフォルトの名無しさん
07/09/21 17:33:35
誰だマングリなんて作ったの
意味ねーだろ

401:デフォルトの名無しさん
07/09/21 17:43:01
.cにリネームしたらいけました!
さらに.cppに戻した後 >>399に書かれていたextern "C"の方法でも
出来ました!有難うございます。

402:デフォルトの名無しさん
07/09/21 17:48:39
>>400
多重定義とかメンバ関数とか名前空間とか同名の区別に必要。
型安全なリンクにも繋がる。

403:デフォルトの名無しさん
07/09/21 21:18:10
>400
んじゃオーバーロードとか使うなよ

404:デフォルトの名無しさん
07/09/21 21:33:43
せめて同一プラットフォームではマングリングは統一して欲しいところ
BCCとVC++でオブジェクトリンクできないとかもうね

405:381
07/09/22 01:54:58
>>382
今はテストプログラムで遊んでいるところなので、たしかにこういう
状況はレアケースだと思います。
たとえば「モーダルダイアログ→その上に[参照...]ボタン」だったら
全然問題ないです。
何を隠そうVB6で書いてるんですが、もしかしてVB特有の現象でしょうか。
C&SDKもMFCも分からないヘタレなもので、
.NETでFolderBrowserDialogクラスで試してみたら、ちゃんと全ウィンドウに
対してモーダルでした。
.NETでSHBrowseForFolder() をP/Invoke するのをこれから試します。

>>392
その関数はちょっと目的とは違う気がします。(試してないけど)


406:デフォルトの名無しさん
07/09/22 02:03:47
その前にspyしてWindow構成見たほうが早くね

407:デフォルトの名無しさん
07/09/22 02:09:08
micsoroftがツール提供してるってことは、
spyは合法ってことでおk?

408:デフォルトの名無しさん
07/09/22 02:20:53
何言ってんだおめぇ

409:デフォルトの名無しさん
07/09/22 03:48:12
>>404
COM

410:デフォルトの名無しさん
07/09/22 03:55:58
1PはPLAYERだろーが

411:デフォルトの名無しさん
07/09/22 04:03:12
ごめん

全然うまくないから

412:デフォルトの名無しさん
07/09/22 04:08:01
>>411
相手にならん
もっと練習してから来い下手糞

413:デフォルトの名無しさん
07/09/22 05:28:35
ちょっとフォルダ内のファイル一覧を作る処理を書こうとしてるんですが
FindFirstFile~FindNextFile...は遅い!と思いしばらく実験...
ひょっとしてコマンドプロンプトでdir~するより遅いんじゃないか?・・・と調べたらさすがにdirよりは早いようだったorz

しかしもっと早くしたいのです、FindFirstFile系より早い関数知ってる人いますか?

414:デフォルトの名無しさん
07/09/22 06:00:23
IShellFolderのEnumObjectsはもっと遅い

415:デフォルトの名無しさん
07/09/22 06:18:51
こんなスレで質問していないで、早く試行錯誤でバグ回避策を見つける仕事に戻るんだ!
何?やる気がありません?なら辞めろや、他の派遣雇うからw


416:デフォルトの名無しさん
07/09/22 06:21:40
IShellFolderですか、COMってやつですか?
初めて見るのでよく分からんですが、こいつはこいつで奥が深そうですね

417:デフォルトの名無しさん
07/09/22 07:13:35
>>413
遅いって何ファイルで何秒くらい?

418:デフォルトの名無しさん
07/09/22 07:14:45
自分で作ればいいのに
能なしは大人しく既存の関数使っとけ

419:デフォルトの名無しさん
07/09/22 07:35:59
>>417
5万で一秒くらいです、ちっとも遅くない・・・ですか?

420:デフォルトの名無しさん
07/09/22 07:39:12
そんなに速くしたいならWindowsの外でやれ

421:デフォルトの名無しさん
07/09/22 07:39:46
1msで50ファイル。どこが不満なんだ‥‥


422:デフォルトの名無しさん
07/09/22 07:42:25
実際計って以外に早いなと・・・
他の部分が重いのでしょうね、スレ汚し申し訳なかったです

423:デフォルトの名無しさん
07/09/22 07:45:46
windowsプログラムのお話
VC++2005EEのスケルトンプログラムのソースが何をやっているのか教えてぽ・・・。

424:デフォルトの名無しさん
07/09/22 07:46:04
キャッシュが効いてただけと予想

425:デフォルトの名無しさん
07/09/22 07:48:20
一覧の表示をListViewとかでやってるなら検索中は更新止めるとかしないと笑える程遅くなるぞ。

426:デフォルトの名無しさん
07/09/22 08:04:49
キャッシュはメモリのコンパクションツール(っていうのかな?)を使えば消えますよね?
その状態だと5万ファイルで一分ぐらい、次回実行以降高速化してます・・・
ListViewとかじゃなくvector<string>に入れて後でファイルに保存してます、時間計測は純粋にファイルリスト取得部分のみです

再起動とかしてちゃんと計測し直した方がいいですかねぇ?

427:デフォルトの名無しさん
07/09/22 08:09:58
うるせーバーカ死ね

428:デフォルトの名無しさん
07/09/22 08:11:21
>>426
HD直接触ってみるとか

429:デフォルトの名無しさん
07/09/22 08:25:20
キャッシュですねぇ、>>424さんの指摘どおりのようです
再起動して実行すると初回が91秒、10回実行して平均とか出してたんですが2回目以降は750msぐらいで安定してます
HDD直に触るのは魅力的ですよね、一度はやりたいです

しかしこれ、それでも使えないほど遅いかと言われればそんなこともない速度でしょうか
どうも昔触って以来FindFirstFile系は遅いと思い込んじゃってたんですかねぇ

430:デフォルトの名無しさん
07/09/22 08:27:18
くそう

431:デフォルトの名無しさん
07/09/22 08:33:48
>>423の言ってるのが「空のプロジェクト」をチェックしないで普通に作った奴なら
単にウィンドウ出してメニューつけて、だけをやってるんだと思う
なんかReadMe.txtってのもプロジェクトに参加してるみたいだし一度目を通されてはどうでしょう

間違ってたらスマソ

432:デフォルトの名無しさん
07/09/22 08:36:17
>>429
APIの呼び先で予想外のコードが動いている可能性もあるから確認してみるといいよ。
アンチウィルスソフトはよくやってる。
とりあえずカーネルデバッグしてみ。

433:デフォルトの名無しさん
07/09/22 08:48:42
カーネルデバッグと、初めて聞いたもので調べておりますが
カーネルデバッガというものを使うようですね、おすすめなんてありますか?

434:デフォルトの名無しさん
07/09/22 09:15:36
とりあえず無難にWinDbgを使って見るのがいいんじゃない?
無料でダウンロードできるよ。
URLリンク(www.microsoft.com)

WinDbgの文法覚えとけばCUIのデバッカへの移行もしやすいから出先でデバックする機会とかあるなら役立つかもね。

あと、カーネルデバッグするしないにかかわらずシンボルをインストールすることを忘れずに。
たとえば、Visual Studioでデバッグする場合不明なシンボルがあるとコールスタック表示するのをそこであきらめるし、
シンボル名が表示されてりゃブレークポイント貼るとき楽だしね。

435:デフォルトの名無しさん
07/09/22 09:30:31
>>434さん、折角教えて頂いたばかりですが現在の私の能力ではここまでのようです・・・
かなり便利そうには見えるのですが習得には少しかかりそうです・・・

いろいろとご指摘くださった皆さんありがとうございました、
今回はFindFirstFile~でとりあえず作り、後は次回の課題とさせていただきます。

436:デフォルトの名無しさん
07/09/22 09:32:40
>>431
やさしい人ありがとう><
みんなプログラム作る時は空のプロジェクトでやるのかな・・・?

437:デフォルトの名無しさん
07/09/22 09:34:17
ああ

438:デフォルトの名無しさん
07/09/22 09:48:51
坊主。男は黙って空のプロジェクトで作るもんだぜ?( ゚Д゚)y─┛~~

439:デフォルトの名無しさん
07/09/22 14:21:56
質問させてください。
BitBltで描写している800*600のビットマップ画像を毎秒20ピクセルぐらい
で高速横移動させようとすると、描写がおっつかないのか移動中画像がぶれる
のです。(上から下に走査線の波がはしるように画像がゆがみます)

ひょっとしてWINAPIではそこまでの描写はできないのでしょうか?
DirectXを使えということなのでしょうか。


440:439
07/09/22 14:24:04
↑すみません、移動値が間違っていました。
一回10ピクセルの移動を、毎秒20回ほどです。

441:デフォルトの名無しさん
07/09/22 14:25:19
ププ

442:デフォルトの名無しさん
07/09/22 14:29:24
>>439
DirectXには垂直同期を待つ機能がある
GDIだけではできない

443:439
07/09/22 14:41:27
>>442

ご回答ありがとうございます。

今まさにGDIに垂直同期させる方法がないか考えているところ
でしたが、できないのですね。。。

DirectXを勉強することにします。
ヒント、感謝します。

444:デフォルトの名無しさん
07/09/22 16:46:25
"C:\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*.*"

これがOKなのが許せない

445:デフォルトの名無しさん
07/09/22 16:51:28
/////////////////////////////////////home/unko
URLリンク(www.2ch.net)
普通だろ

446:デフォルトの名無しさん
07/09/22 16:53:02
VC++2005EEで途中まで文字入力したときのポップアップヘルプが
出なくなっちゃたよぅ・・・><

447:デフォルトの名無しさん
07/09/22 16:57:37
EEなんて使ってるからだ
大人しくプログラミング引退しなさい

448:デフォルトの名無しさん
07/09/22 17:03:58
そんなぁ・・・><

449:デフォルトの名無しさん
07/09/22 17:06:19
と、思ったら僕の勘違いでした・・・
ごめんなさい

450:デフォルトの名無しさん
07/09/22 17:21:41
>>444
パス名の先頭に\\?\(Cなら\\\\?\\)でもつければ?

451:デフォルトの名無しさん
07/09/22 21:14:40
>>446
あのピョコってでるのは確かインテリセンスって言うはずだ
プロジェクトのフォルダ内に.ncbって拡張子のファイルがあると思う、表示される情報はこれに保存されてるらしい
で、情報の更新に若干タイムラグが出る事があってポップアップが出ない事がある、これは数秒待てば出るようになるよ
前の行にビルドエラーになる箇所があるとそれ以降インテリセンスも更新されてなかったりするのでこまめにビルドするといいかも

452:デフォルトの名無しさん
07/09/22 21:30:29
じゃあ、コンパイル成功してもIntelliSense動いてくれないのはなぜなんだぜ?
特にBoostとか使ってるとき、特定の行以降/ブロック内で起こる。

453:デフォルトの名無しさん
07/09/22 21:53:56
それはC++がキモすぎるかr

454:デフォルトの名無しさん
07/09/22 22:27:03
いやキモいのはbo


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