Win32API質問箱 Build ..
[2ch|▼Menu]
446:425
07/11/25 15:57:42
>>443
サンクス。こっちでは何も書いてないんだけど、やっぱ無理かな?
URLリンク(msdn2.microsoft.com)
使い方は合ってるはずなのにできないってことは無理なのかもしれませんが

447:デフォルトの名無しさん
07/11/25 15:58:09
>>444
コンソールで入力街に入るのを回避したいなら
_kbhitでチェックしてから_getchが常道かと

448:デフォルトの名無しさん
07/11/25 17:14:34
>>437
おぉありがとうございます。TCS_MULTILINEも指定しないと無視されるようですね。
また一つ勉強になりました。しかし、>>439を見て調べたのですがTCS_RIGHTJUSTIFYは
0x0000と定義されてました。これって指定できないということなんですかね???
いくら>>424のようにしても、TCS_RIGHTJUSTIFYはあってもなくても変わりませんよね?
0と論理和とっても変化なしですしね・・・どうすれば・・・

449:440
07/11/25 18:17:38
>>445
同時キーや引数をいっぱい変えて GetAsyncKeyState を実行しまくるのが非効率でしたので
GetKeyboradState が理想でしたが、いろいろ無理そうですので素直に諦めます。

>>447
_getch よりも Get〜による同時押しも欲しかったのですが
いろいろ問題ありそうですんで諦めます 。
アドバイスありがとうございました。

450:デフォルトの名無しさん
07/11/25 19:16:31
>>425
それってツリービューじゃ駄目なの?

451:デフォルトの名無しさん
07/11/25 20:20:21
>>448
デフォルトでそういう動作っていう意味だろう

452:425
07/11/25 20:55:11
>>450
表示の切り替え(アイコンとか詳細とか)が必要なんです。
何とかならんかなぁ

453:デフォルトの名無しさん
07/11/25 20:57:57
>>452
予め自分でデータを持っておいて、ListViewがクリックされた時にその位置に挿入/削除して
擬似的にツリービュー的な動作を再現すればいいと思うが。

ネットで見かけるTreeListViewのサンプルとかがそういう事をしている。

454:425
07/11/25 21:10:19
う〜ん、そうするしかないようですね。

455:デフォルトの名無しさん
07/11/25 22:05:50
或いは詳細表示の時だけTreeViewに切り替えるとか。

456:デフォルトの名無しさん
07/11/26 02:09:51
比較的大きなドキュメントを読み込むときに、一気に読み込まず、一定のサイズごとに
シーケンシャルに読み込んでいくプログラム、例えばIE、でデータの読み込みにしたがって
右側のスクロールバーのスクロールボックスの大きさが小さくなっていく
ああいう動作はどうやって実現してるんだ?
スクロールバーの操作や、つまみ(スクロールボックス)のサイズの調整はできるんだが
読み込み中はスクロールバー自体が消えたようになってしまう。

ファイル読み込み(例えば256Byteずつ)のループ
{
ファイルの読み込み処理
行数を調べて
SetScrollInfo関数で、新しい範囲の設定
}

これでスクロールバーは更新されるはずなんだが・・ダメだ
ファイル全体の読み込み処理の終了の後、ウィンドウ全体を再描画させるとスクロールバーも出現する。

ちなみにクライアント領域の右側につく(WS_VSCROLL)、標準スクロールバーの話です。
SDK

457:デフォルトの名無しさん
07/11/26 02:16:02
>これでスクロールバーは更新されるはずなんだが

されねえよw
それだとループしてる間はWM_PAINTが発生しないから再描画されるわけないだろ

手っ取り早いのは副スレッドで読み込みとスクロールバーの設定をしてInvalidateRectする
そうすればメインスレッドは滞りなく再描画する

458:デフォルトの名無しさん
07/11/26 02:32:52
>>456
ウインドウメッセージを処理してやらなきゃ駄目だよ。
普通はマルチスレッド化、どうしてもスレッドが嫌ならループ内に
メッセージ処理を組み込む。

459:デフォルトの名無しさん
07/11/26 02:34:26
RDW_FRAME
RDW_UPDATENOW
SWP_DRAWFRAME

辺りでぐぐれ

460:デフォルトの名無しさん
07/11/26 02:34:58
それだけならDispatchMessageはさむだけで良さそうだけど
副作用出てくるような操作するときはマルチスレッドにするべき


461:デフォルトの名無しさん
07/11/26 02:36:09
こんな時間に何してんだお舞ら

462:デフォルトの名無しさん
07/11/26 02:41:05
質問に回答してるだけだが、何か?

463:デフォルトの名無しさん
07/11/26 02:45:46
>>446
まだ見てるか分からんけど
URLリンク(msdn.microsoft.com)

>LVGS_COLLAPSIBLE 状態フラグを使用すると、グループを折りたたんだり展開したりできるようになります。
>グループを折りたたむと、グループに属するリストビュー項目が非表示になります。
>プログラムで LVGS_COLLAPSED 状態フラグを使用すると、グループを折りたたむことができます。

464:456です。
07/11/26 05:27:46
一応、副スレッドでの読み込みでも同じようにやってみたけど×だったorz

>>457
スマソ
書き忘れた
SetScrollInfo();
InvalidateRect();
UpdateWindow();

と、きちんとやってるんだが
もちろんファイルから読み込んだ内容は順次表示されていく
だけど、スクロールバーが消えてしまう
で、これがなぜかわからない

一応ループ部分のソース(つっても分かりにくいと思う。)
do{
ZeroMemory(lpTemp, CHUNK_SIZE);
bRet = ReadFile(hFile, lpTemp, CHUNK_SIZE, &dwRead, NULL);

lstrcat(lppms->lpString, lpTemp);

iLines = StrChrCount(lppms->lpString, TEXT('\n')) + 1;//行数の取得
SendMessage(lppms->hwnd, WM_MY_SETRANGE, 0, (LPARAM)iLines); //メインスレッド内にある、ウィンドウプロシージャに範囲の設定の指示
//LPARAMで範囲の最大値を渡してる
InvalidateRect(lppms->hwnd, NULL, TRUE);
UpdateWindow(lppms->hwnd);
Sleep(100);
}while(dwRead && !lppms->bKill);

465:デフォルトの名無しさん
07/11/26 05:28:24
で、主スレッド内でのメッセージの受け取り
case WM_MY_SETRANGE:
si.fMask = SIF_RANGE;
si.nMin = 0;;
si.nMax = (int)lParam;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
return 0;

466:デフォルトの名無しさん
07/11/26 07:11:19
スクロールバーに再描画送ってない

467:デフォルトの名無しさん
07/11/26 08:44:59
スレッドがスリープなりして使用権を返却していない。

468:デフォルトの名無しさん
07/11/26 10:37:47
>>466だと思う

469:デフォルトの名無しさん
07/11/26 11:18:55
仮想リストビューにアイテムを追加するときは
LVN_GETDISPINFOメッセージを監視して自分で追加していくのは解るのですが
どうやってLVN_GETDISPINFOメッセージを発生させるのでしょうか?
通常のリストビューのようにListView_SetItemでいいのでしょうか?

470:デフォルトの名無しさん
07/11/26 11:26:36
アイテム数をLVM_SETITEMCOUNTで設定すれば
画面の更新が必要になると勝手に飛んでくる

471:デフォルトの名無しさん
07/11/26 11:41:54
ある自作メインアプリケーションに「ログイン」の機能を持たせ、
それを起動している最中は他の自作アプリケーションが
そのログインユーザの情報にアクセスできるようにしたいと思っています。
(メインアプリケーション終了時にログインユーザの情報も消す)

そうなると、メインアプリケーション内のログインユーザの情報を
アプリケーション間で共有できるようにしなければいけないとは思うのですが、
このようなグローバルな情報はどのように共有するものなのでしょうか。

感覚的には、「OS内で唯一のインスタンスがあって、みんなでextern参照」
といった使いかたをしたいのですが、
Mutexみたいなものを使って実現できるものなのでしょうか。
なにかよいサンプルなどがあれば、教えていただけると嬉しいです。
よろしくお願いいたします。

472:デフォルトの名無しさん
07/11/26 11:50:55
ファイルマッピングオブジェクト(メモリマップトファイル)

データが短いならグローバルアトムで十分

473:471
07/11/26 12:37:48
>>472
情報ありがとうございます。
両方調べさせていただきました。

メインアプリケーションのプロセスに聞きに行くのではなく、
各アプリケーションがそれぞれ任意のタイミングで
「メインアプリケーションがどこかにセットした現在のユーザ情報」を
自分で見に行くという動きを考えているので、
メモリマップトファイルよりはグローバルアトムのほうが
それに適した実装ができそうですかね。
こっちの方法を勉強してみようと思います。

474:デフォルトの名無しさん
07/11/26 12:48:39
>[メインアプリケーションがどこかにセットした現在のユーザ情報」を
>自分で見に行くという動きを考えているので、
>メモリマップトファイルよりはグローバルアトムのほうが
>それに適した実装ができそうですかね。

たぶん逆
その用途ならメモリマップトファイルの方が楽

アトムだと中身にアクセスするには生成した識別子(=一定ではない)を
SendMessageか何かで他のプロセスに渡さなきゃいけない

メモリマップトファイルは名前(=一定の値)でカーネルオブジェクトを呼び出せるから
何かを渡したりとかは必要ない

475:471
07/11/26 12:56:12
>>474
アトムの識別子って決めうち文字列じゃなかったんですね。
一時的なレジストリみたいなものだと勘違いしてました。
間違った方向に進むところでした。ありがとうございます。

476:デフォルトの名無しさん
07/11/26 13:00:46
>>470
なるほど
数だけ教えてあげれば勝手にやってくれるんですね
解決できました、ありがとうございました

477:デフォルトの名無しさん
07/11/26 13:12:10
>>475
ちなみにその「一時的なレジストリ」を使って実現してもいいんだよ

478:425
07/11/26 13:15:48
>>463
情報サンクス。でもLVGS_COLLAPSIBLEの値がわからないです。
誰か分かる方います?

479:425
07/11/26 13:17:14
てかvista以降って書いてない?

480:471
07/11/26 13:27:29
>>477
レジストリだと、実行中にレジストリエディタで簡単に書いたり消したりできますよね。
もちろんアトムやメモリマップトファイルでも、
本格的にセキュリティ対策するならそのまま使うわけにはいかないでしょうけど、
OS付属のエディタで読み書きできてしまうことくらいは避けておきたいなと思いまして。

481:デフォルトの名無しさん
07/11/26 13:36:04
>>479
じゃあVista以降なんだろう。残念だな。

482:425
07/11/26 13:40:42
そうなんでしょうね、諦めます。
で、次の質問なんですが、ListViewでマウスホイールが回転されたことを取得したいんですけど、
サブクラス化するしかないですよね?

483:デフォルトの名無しさん
07/11/26 13:43:19
他にも方法はあるけど、サブクラス化が一番楽でコストも低いような

484:425
07/11/26 13:54:04
おk、サンクス

485:デフォルトの名無しさん
07/11/26 16:48:58
URLリンク(software.nikkeibp.co.jp)
ここのPart3のFileCopyプログラムですが
表示されるべきのメニューが表示されません。。。

COPYやEXITなどのメニューを表示するようにするには
どうすればいいですか?

486:デフォルトの名無しさん
07/11/26 17:03:18
リソースファイル (*.rc) をコンパイルしてリンクしたか?

487:デフォルトの名無しさん
07/11/26 17:38:18
>>486
ご指摘のように
リソースファイルをプロジェクトに追加するのを
忘れていたのが原因だったようです。

表示するようになりました。ありがとうございます。

488:デフォルトの名無しさん
07/11/26 18:56:47
文字列置換や文字列検索に使える関数ってSDKにない?

489:デフォルトの名無しさん
07/11/26 19:01:02
検索や置換のダイアログの表示なら
FindTextやReplaceTextで可能です。

490:デフォルトの名無しさん
07/11/26 19:14:03
>>489
ありがとうございます
FindTextとReplaceTextについて調べてみよ

491:デフォルトの名無しさん
07/11/26 20:10:01
デバッガAがDebugActiveProcessでプロセスBにアタッチした後、
デバッガCがデバッガAのアタッチを強制的にデタッチして
プロセスBにアタッチしなおすことって、出来るんでしょうか?

その過程の間、プロセスBは停止したらダメ、という条件で。

ちょっと分かりにくいですが、要するにデバッガAをデバッガCに
差し替えてしまうことができるか、ということです。(AはCに
ついては何も知らないプログラムなので、連携した動作は
ありません)

デバッガAを強制的に終了するとプロセスBも終了してしまう
ようで、一見すると不可能っぽいのですが。OSは2000〜Vista
です。よろしくお願いします。

492:491
07/11/26 20:11:58
すみません、上げさせてください。

あと、「プロセスBは停止したらダメ」というのは、ようするに
終了は不可と言うことで、ブレーク状態になるのは構いません。

493:デフォルトの名無しさん
07/11/26 20:17:20
XP以降ならDebugActiveProcessStopってのがある。

494:デフォルトの名無しさん
07/11/26 20:34:23
>>493 どうもありがとう

495:491
07/11/26 21:14:53
教えてもらったので早速実験してみました。

WinMain(){
DebugActiveProcessStop(GetCurrentProcessId());
 :
 :
 :
}

ってやってデバッグ実行開始したら、デバッガ(VC8)が
外れると期待したのですが、外れずにそのまま下に
行っちゃいました。

もしかしてDebugActiveProcessStopはデバッグ対象じゃなくて
デバッガのプロセスIDを渡すのかしら? それとも自プロセスが
デバッガから強制離脱することはできない…?

あるいはDebugActiveProcessを呼んだあとに、そのプログラムが
デバッグ対象を切り離す用途で使うのかも。それだと>>491
外部からのデバッガの差し替えはできませんね。

憶測ばかりで申し訳ないですが、このAPI、ググっても細かい
ところがよく分かりませんでした。


496:デフォルトの名無しさん
07/11/26 22:04:52
コレ見た感じだと DebugActiveProcess 呼んだデバッガが自分で
デタッチするときに使うような感じっぽくない?

URLリンク(msdn2.microsoft.com)

497:デフォルトの名無しさん
07/11/26 22:30:55
ある特定のトップレベル・ウィンドウを、最前面に持ってくるのってSetWindowPos関数?
ほかにも何かいい方法ありますか?

498:491
07/11/26 22:30:58
>>496
情報ありがとう

499:デフォルトの名無しさん
07/11/26 22:57:02
>>497
BringWindowToTopはどう?

500:497
07/11/26 23:48:53
>>499 トン
これもいいな
コードがすっきりした

表に持ってきたウィンドウの再描画が完了したのを検地したのを知る方法ってある?
タイマーで1秒くらい待ってから、ってやってるけどエレガントじゃない

501:デフォルトの名無しさん
07/11/27 00:09:25
FindWindow

502:デフォルトの名無しさん
07/11/27 04:34:26
プログラムの実行中に、ウィンドウが常に最前面に表示されるようにウィンドウスタイルを変更したいです。
SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_TOPMOST);
SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
うまくいきません。助けてケロ

503:デフォルトの名無しさん
07/11/27 05:10:48
てかWS_EX_TOPMOSTが付いてれば後ろに引っ込んだりしないだろ

…他にWS_EX_TOPMOSTを持ってるウィンドウがなければ

504:デフォルトの名無しさん
07/11/27 05:17:10
>>502
なんでそこまでいっておいて、SetWindowPosを調べないんだ?
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
これだけでいい。

SetWindowLongはいらない。

505:デフォルトの名無しさん
07/11/27 09:26:31
SetWindowLong入らない?

506:デフォルトの名無しさん
07/11/27 09:39:24
XPの制限ユーザー上で実行するとはProgramFiles以下に書き込めません。
Vistaではこのようなファイル操作はVirtualStoreにリダイレクトされるようです。

実際のプログラムで設定ファイルを保存する場合は、
実行されたパスが読み書き可能なものであるか? Yes→実行されたパスに書き込み
No↓
ユーザーディレクトリ(AppDataなど)を取得し、そこに書き込み

このような動作が必要だと思います。
これをどのwindowsでも確実に動作させるにはどのようなAPIを使えばいいのでしょうか。


507:デフォルトの名無しさん
07/11/27 09:45:01
>>505
CreateWindowExの段階でWS_EX_TOPMOST付けてるなら要らないと思うけど

508:デフォルトの名無しさん
07/11/27 09:45:53
>>506
常にユーザディレクトリに書けばいいやん

509:デフォルトの名無しさん
07/11/27 11:04:14
>実行されたパスが読み書き可能なものであるか? Yes→実行されたパスに書き込み
この考えがそもそも間違い
ユーザーディレクトリに置くかレジストリを使用すべき

510:デフォルトの名無しさん
07/11/27 11:33:00
共用というのであれば、それなりのアクセス権もってAll Usersに置けばいいし。

511:デフォルトの名無しさん
07/11/27 11:37:09
どうしてもやりたければOSのバージョンを取得してやればいいんじゃね

512:デフォルトの名無しさん
07/11/27 12:38:15
>>500
InvalidateRectしてからUpdateWindowすればWM_PAINTが完了するまで待てるけど
あれって他プロセスのウィンドウに使えたかな?

513:デフォルトの名無しさん
07/11/27 12:40:47
WH_CALLWNDPROCRETを見てればWM_PAINTの処理が終わったかは分かる

こんなことでフックするなんて蛇足にも程がある気がするけど

514:デフォルトの名無しさん
07/11/27 13:42:59
この場合、InvalidateRectが無くてもいいでしょう。
UpdateWindowだけで再描画されなくても、WM_PAINTは抜けてるって事だし。

515:デフォルトの名無しさん
07/11/27 14:24:24
インストールせずにスタンドアローンで使うことを想定しているのですが、
万が一ユーザーがProgramFiles以下に置いた場合でも正常に動作させられるようにしたいのです。

516:デフォルトの名無しさん
07/11/27 14:26:44
ユーザーがProgramFiles以下に置いた場合でも置かない場合でも、
常にユーザディレクトリに書いとけばいつでも正常に動作する

517:デフォルトの名無しさん
07/11/27 14:27:36
だったらなおさら、どこに配置されようとAppDataを使うべきだろ
System32に入れる奴だっているかもしれないんだし(もっともXP以前ならそこでも読み書きできるが)

518:デフォルトの名無しさん
07/11/27 14:28:28
>>515
たぶん、あなたが言いたいそれを「スタンドアローン」とは言わないと思う。
Readme にでも注意書きを書いておけば、わざわざ Program Files に
配置するスキルがあるユーザなら、意味をくみ取ってくれるんじぇね?

519:デフォルトの名無しさん
07/11/27 14:31:25
専用のインストーラ・アンインストーラを設けないなら、
ユーザフォルダやレジストリに情報残すと削除がめんどいってのは同意するけども。

520:デフォルトの名無しさん
07/11/27 16:18:05
>>515
気持ちは分かるけど、妙な俺様仕様を作らないほうがいいよ。
OSが推奨する共通の方式に従ったほうが
安全だしセキュアだし管理しやすいし将来の互換性も期待できるし
結果ユーザにとっても使い勝手が良いから。

521:デフォルトの名無しさん
07/11/27 17:35:43
>>503-505
レスありがとう
解決した。
だけど、SetWindowPos に指定するフラグで、HWND_TOPMOSTはドキュメントに載ってるが
HWND_NOTOPMOSTはヘッダー見て初めて知った
最前面化:SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
最前面化解消:SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
でOKだた

522:デフォルトの名無しさん
07/11/27 17:36:45
そういやexeあるフォルダのの下にファイル作るプログラム、そのままVistaでちゃんと動いてるなと思って
ファイル探したら、ユーザーの下のVirtualStore\Program Files (x86)\xxx の下にできてたわ。
勝手にマッピングしてくれるみたいだな。

523:デフォルトの名無しさん
07/11/27 17:56:19
>>520
MSが互換性に気をつけると思っているのですか

524:デフォルトの名無しさん
07/11/27 18:02:56
実際気をつけてるよ

525:デフォルトの名無しさん
07/11/27 18:17:32
>>522を下位互換性と呼ばずになんと呼ぶと?

526:デフォルトの名無しさん
07/11/27 18:18:56
>>525
新機能

527:デフォルトの名無しさん
07/11/27 18:28:47
GetSysColorBrush(COLOR_***)の結果と、HBRUSH(COLOR_*** + 1) って使用上で何か違うの?

528:デフォルトの名無しさん
07/11/27 18:46:04
>>524
なぜIEとFirefoxでは表示が異なるのですか?

529:デフォルトの名無しさん
07/11/27 18:51:40
Firefox の仕様準拠度が低いからだな

530:デフォルトの名無しさん
07/11/27 19:06:03
>>527
GetSysColorBrush はブラシのハンドルが返る
HBRUSH(COLOR_*** + 1) ってのは、WNDCLASSEX 構造体のメンバーに入れてると思うが
これはRegisterClassExを呼んだ先でインデックスかブラシのハンドルか判断して
内部でGetSysColorBrushに相当するものを呼んでるだけだろう。
+1なのはインデックス0とNULLを区別するためだなw

531:デフォルトの名無しさん
07/11/27 19:28:39
FillRectとかでHBRUSH(COLOR_*** + 1)入れても動くよな?

532:デフォルトの名無しさん
07/11/27 19:37:24
>>529
違います。
IEの独自仕様のためですよ。

533:デフォルトの名無しさん
07/11/27 19:42:46
違います
仕様が曖昧だからですよ

534:デフォルトの名無しさん
07/11/27 19:43:23
IEの仕様解釈がおかしいのは認めるが、Firefoxも解釈おかしいよ

535:デフォルトの名無しさん
07/11/27 19:53:09
>>532
えーと実際に Firefox で Acid2 とか試したことありますか?


536:デフォルトの名無しさん
07/11/27 19:55:09
ある文字列(改行含む)から、最長行の文字数を返す関数ってあります?
UNICODE/ANSIどっちでも対応できるもので、マルチバイト文字もうまく扱ってくれるもの

前に便利な文字列操作関数っていうサイトを見た希ガスるんだけど、見つからん

537:デフォルトの名無しさん
07/11/27 19:57:02
>>535
Acid2なんて飾りだよ

538:デフォルトの名無しさん
07/11/27 19:58:06
>>536
Win32API に、ですよね。
そういう関数はありません。

539:デフォルトの名無しさん
07/11/27 19:58:23
>>536
等幅フォント?

540:デフォルトの名無しさん
07/11/27 20:06:27
指定したフォルダにあるファイルのファイル名を全て取得する関数ってありますか?

541:デフォルトの名無しさん
07/11/27 20:11:12
>>540
FindFirstFile FindNextFile FindClose

542:デフォルトの名無しさん
07/11/27 20:13:54
>>539
そうです。

>>538
別にAPIになければ、APIじゃなくてもいいです。
自作するのはちょtっとミリなので

543:デフォルトの名無しさん
07/11/27 20:13:54
>>541
ありがとうございます。貴方のおかげで道が開けまんた。

544:デフォルトの名無しさん
07/11/27 20:23:18
>>542
なぜ自作するのが無理なんだ?

int line = 0;
int maxlen = 0;
int i = 1;
while (fgets(s, ...)) {
 int len = strlen(s);
 if (maxlen < len) {
  line = i;
  maxlen = len;
 }
 i++;
}
こんな感じでどうにかなるだろ。

545:デフォルトの名無しさん
07/11/27 20:32:00
>>542
size_t maxCharsInLine(LPCTSTR p)
{
 size_t maxLen = 0;
 size_t len = 0;
 while (*p) {
  switch (*p) {
   case 0x0d: case 0x0a:
    len=0; break;
   default:
    if (maxLen < ++len) maxLen = len;
  }
  p = (LPCTSTR) CharNext(p);
 }
 return maxLen;
}

546:鈴木
07/11/27 20:41:03
164 名前:鈴木[who@am.i] 投稿日:2007/11/27(火) 13:12:56

MiniDumpWriteDump をつかって、Dumpを出力しているのですが、
どのようにしてファイルの中身は見れるでしょうか?

547:デフォルトの名無しさん
07/11/27 20:42:50
>>546
よう鈴木、こないだ貸した5000円返せよ

548:鈴木
07/11/27 20:43:36
>>547
しゃ、借用書はあるのかっ!

549:デフォルトの名無しさん
07/11/27 21:01:46
>>531
そうなのか。
それも内部でブラシ取得してるんだろう。
ハンドルかインデックスかは、上位ワードが
0かどうかを見てる気がする。

550:デフォルトの名無しさん
07/11/27 21:16:30
質問です。

windowsで流れているサウンドをフックすることは可能でしょうか?
もし方法があれば、調べれば良いポイント・キーワードなどを教えていただけないでしょうか。

551:デフォルトの名無しさん
07/11/27 21:21:47
そういうことを質問する前に最低限、
録音プログラムぐらいは作ったことがあるんだろうな?

552:デフォルトの名無しさん
07/11/27 21:23:57
>>551
Windowsでサウンドプログラミングの経験があります。

553:デフォルトの名無しさん
07/11/27 21:34:15
>>550
「サウンドをフックする」っていうのがわからない。

途中で加工したい?
それとも覗ければ(キャプチャできれば)十分?
audio 関連の filter driver を書けばいいと思うんだけど、
Vista 以前の OS だと色々なパスがあって面倒だと思う。

特定のアプリが対象なら話は遙かに簡単になるけど。

554:デフォルトの名無しさん
07/11/27 21:35:57
>>553
> それとも覗ければ(キャプチャできれば)十分?
はい、覗けるだけで十分です。
加工して戻すということは想定していません。

555:デフォルトの名無しさん
07/11/27 21:36:23
>>552
録音するプログラムを組んだことがあるのか無いのか聞いているんだが、ニホンゴワカリマスカ?

556:デフォルトの名無しさん
07/11/27 21:39:58
>>555
録音するプログラムを書いたことがあります。

557:デフォルトの名無しさん
07/11/27 21:41:24
>>556
じゃあ既に問題は解決している。

558:デフォルトの名無しさん
07/11/27 21:42:21
新規質問です。
Beep関数で、XPでは音が出るもののVistaでは音がでません。
プログラムはVisualStudio2005のC++でコンパイルしています。
VistaではBeep関数を使えないのでしょうか?

559:デフォルトの名無しさん
07/11/27 21:44:42
>>558
MessageBeep を使ってみてはいかが?

560:デフォルトの名無しさん
07/11/27 21:47:04
>>558
マザーボード上の内蔵Beepデバイスから出ているのなら、
物によってはマザーボードからスピーカーに繋げなければ音が出ない。
XPだと逆にドライバがなかったから、サウンドデバイスから出力されていただけでは?
そもそもAPIとは何の関係もない。

561:デフォルトの名無しさん
07/11/27 21:48:06
>>559
確かに、MessageBeepは使えますが、自由にメロディを設定したいのでBeep関数が使いたいのです。

562:デフォルトの名無しさん
07/11/27 21:53:16
>>561
PlaySoundでwavを鳴らせばいいだろ

563:デフォルトの名無しさん
07/11/27 21:55:15
>>554
DDKを使って、カーネルモードのフィルタドライバを書いてオーディオドライバの
上側のAPI(のようなもの)をフックすることになると思います。

この「オーディオドライバ」ってのが色々あるのがXPまでのOSでの難点・・・
URLリンク(www.microsoft.com)
Vista からは UAA (Universal Audio 何とか) に統一されてるんだけど。

セキュアオーディオパスってのがあって、DRM処理された音源の再生時には
署名されていないフィルタドライバは割り込めなかったような気もする。

そうして僕の知るところ、これをやってる例は聞いたことがない。
オーディオカードの出力から入力へループバックする方が遙かに簡単だから。

特定のアプリが対象で、どんなAPIで鳴らしてるのか見当が付くなら、
単純なAPIフックで実装できるわけですが。

564:デフォルトの名無しさん
07/11/27 22:05:38
リダイレクトに相当するものを録音するだけ。
ドライバを作る必用もなければ、APIをフックする必用など微塵もない。

565:デフォルトの名無しさん
07/11/27 22:16:40
サウンドカード(デバイス)が対応してればそれが一番簡単でしょうね。


566:デフォルトの名無しさん
07/11/27 22:28:14
リアルタイムでエフェクトでもかけたいんでね?

567:デフォルトの名無しさん
07/11/27 22:31:56
用途が分からんがDirectShowでキャプチャで十分な希ガス

568:デフォルトの名無しさん
07/11/27 22:34:36
サウンドデバイスをフックしてDRM解除するソフトでも作りたいのだろ

569:デフォルトの名無しさん
07/11/27 22:40:14
>>566
お前は他人の話を聞かない奴だとよく言われるだろ。

570:sage
07/11/27 22:45:54
録音はwaveInXXXで実装できるが、何らかの音が鳴り始めた瞬間というのは、
ユーザーモードでは特定できないはず。
しかし、WAVEデバイス指定のmciSendCommandやwaveOutWriteをAPIフックしたとなれば、
それを期に録音を開始することで再生バイトを取得できるかもしれない。
これらの関数には、MM_MCINOTIFYのような再生終了の通知メッセージがあったから、
メッセージフックでそれを取得すれば録音終了のタイミングも図れるのではないだろうか。
デバイスオープンの関数が通知を指定していないのであれば、
その関数もフックして通知フラグを立ててしまえばいい。

571:デフォルトの名無しさん
07/11/27 23:03:00
今時waveOutってのもなぁ〜
DirectSoundかASIOだろ

572:デフォルトの名無しさん
07/11/27 23:07:37
>>570
そんな余計なことを考え無くったって受け取った音声データ自体をみれば、
音が鳴っているかどうかなんて判断できるだろ。

そもそも再生の開始のタイミングを受け取りたいなんてどこに書いてあるんだ?
録音終了のタイミングが知りたいなんてどこに書いてあるんだ?
再生バイトの取得が必用なんてどこに書いてあるんだ?
通知フラグを立てる必用があるなんてどこに書いてあるんだ?

573:デフォルトの名無しさん
07/11/27 23:14:22
>>571
DirectSoundはVistaでHALが廃止された過去の技術
ASIOは応答速度と引き替えにCPU負荷が上がる上、
ミキサーなどの機能制約がある使う場所を選ぶ技術

知っている用語を出したいんだろうが、頭が悪すぎる

574:デフォルトの名無しさん
07/11/27 23:26:40
VistaがDirectSoundのHAL捨てたのはCPUパワーが上がってきたのと、
一部に狼藉ドライバがあったからで、過去の技術と言うほどじゃない。
それを言うならwaveOutの古さってどうよ?

575:デフォルトの名無しさん
07/11/27 23:33:04
waveOutが古くないなんて誰も言っていないが、妄想が酷いんじゃないか?

576:デフォルトの名無しさん
07/11/27 23:36:38
>>575
横から悪いが、
あんたちょっと黙ってたほうがいい気がするよ。
誰にでも難癖つけてるようにしか見えない。

577:デフォルトの名無しさん
07/11/27 23:37:35
>>573
何を勘違いしてるのか知らんが、今時waveOut系を使ってるプレーヤーなんてほとんど無いから
waveOut系をフックしてもあまり意味無いだろって言ってるのだが。

578:550
07/11/27 23:42:01
なるほど、いろんな関数をフックしないといけないようですね。
だとすると、やはりフィルタドライバを作ったほうが抜本的な方法なのでしょうか。

579:デフォルトの名無しさん
07/11/27 23:43:55
>>577
デフォルトでASIO経由再生するプレイヤーの割合の方が遙かに少ないが、
いったい何を言ってるんだ?

580:デフォルトの名無しさん
07/11/27 23:44:09
>>578
だから何が目的なのかもっと具体的に書けよ

581:デフォルトの名無しさん
07/11/27 23:46:11
>>579
お前は人の揚げ足を取るのが趣味なのか?

582:デフォルトの名無しさん
07/11/27 23:48:02
お前ら勝手に盛り上がりすぎだろ

583:デフォルトの名無しさん
07/11/27 23:48:45
>>550
URLリンク(applian.com)


584:デフォルトの名無しさん
07/11/27 23:50:23
>>581
>今時waveOut系を使ってるプレーヤーなんてほとんど無いから
>waveOut系をフックしてもあまり意味無いだろって言ってるのだが。
といってASIOを挙げている時点で支離滅裂なんだが、
いったい何を考えているのか不思議でしょうがない。
そこに対する回答はないのか?

585:550
07/11/27 23:51:31
>>580
PC1で鳴っている音をLAN経由でPC2に送りたいんですよ。
PC1とPC2にはスピーカーとマイクが接続されていて、
サウンドデバイスは一つしかないと仮定します。

586:デフォルトの名無しさん
07/11/27 23:52:10
>>584
DirectSoundはどうした?
VistaでHALが廃止されたからって何が問題なんだ?

587:570
07/11/27 23:54:31
すまない。
自分が余計な事を言ってしまったがために話が盛り上がってしまった。
要は、waveInで登録したバッファの中身を解析すれば、音が鳴っているかどうかを判定できるということだったんだ。

588:550
07/11/27 23:54:48
PC1,PC2にそれぞれ一つのサウンドデバイス、という意味です。

589:デフォルトの名無しさん
07/11/27 23:54:58
>>585
そのPCにはリダイレクトに相当するものはないのか?

590:デフォルトの名無しさん
07/11/27 23:56:26
>>585
WindowsMediaEncoder をインストールするだけでいいよん

591:デフォルトの名無しさん
07/11/27 23:58:38
すでにあるものをわざわざ作る必要はなかろうもん

592:デフォルトの名無しさん
07/11/27 23:59:16
>>586
HALのサポートが期待できなければ、別の技術に置き換わっていくというだけの話。
で、DirectSoundの件に関しては答えたから、今度はASIOを挙げた理由を答えてくれよ。

593:550
07/11/28 00:00:48
>>589
その機能を使った場合、PC1に接続されているマイクは独立して使えるのでしょうか?

594:550
07/11/28 00:02:21
>>590
使用感はESounDのwindows版のようなものを想定しているのです。

595:デフォルトの名無しさん
07/11/28 00:02:34
>>593
マイクから音が拾いたければ、データの取得先をマイクに切り替えろよ。

596:550
07/11/28 00:04:07
GnomeのESounDはアプリケーションがESounDに合わせて作らないといけないところが違いますけれど。

597:デフォルトの名無しさん
07/11/28 00:04:16
>>592
あんたは勝手にwaveout使えばいいじゃん
DirectSoundやASIO使うやつにいちゃもんつけずにさ

598:デフォルトの名無しさん
07/11/28 00:05:01
盛り上がりすぎだw
俺も混ぜろバカチン共w

599:デフォルトの名無しさん
07/11/28 00:05:27
次回のテンプレにフックの話厳禁を入れておいた方がいいんじゃないか?
安易にフックに頼りすぎる上に、いつも話がろくな事にならない。

600:デフォルトの名無しさん
07/11/28 00:05:51
>>583 は無視ですかそうですか

601:デフォルトの名無しさん
07/11/28 00:06:20
>>592
>>570に対してwaveOutだけフックしても鳴ってる音全てをキャプチャできんよって言っただけだが
どうやらお前は570ではなくて、技術に拘った結果waveOutをマンセーしてるだけの変人だと分かったからもういいよ。

602:デフォルトの名無しさん
07/11/28 00:10:02
>>597
で、ASIOを挙げた理由は?

何も考えてなかったんなら後付で
>今時waveOut系を使ってるプレーヤーなんてほとんど無いから
>waveOut系をフックしてもあまり意味無いだろって言ってるのだが。
とか理由をでっち上げずに、正直に理由はないけどASIOと書きたかっただけだと言えばいいのに。

どうせ逃げ回るだけでASIOを挙げた理由を答えることも無いのは分かってるよ。
ごめんね、ちょっと苛めすぎたよ。

603:デフォルトの名無しさん
07/11/28 00:12:52
>>601
waveOutをマンセーしているとか、そう思いこみたいのは勝手だが、妄想にも程がある。
どこにそんなことが書いてあるんだ?

604:597
07/11/28 00:12:54
>>602
ASIOなんぞ挙げてませんよ?
今までのやり取りを見てて感じただけだ

605:デフォルトの名無しさん
07/11/28 00:13:06
>>602
は?今時のプレーヤなら大抵DirectSoundもASIOもサポートしてるだろ
その上で>>577>>601の意味で言ったのだが、何か問題でもあるのか?

606:550
07/11/28 00:15:30
>>600
ただいま検証しています。

607:デフォルトの名無しさん
07/11/28 00:17:03
>>605
実際の所、ASIOをサポートソフトはけっこう限られてくるよ。

608:デフォルトの名無しさん
07/11/28 00:17:42
もう誰が誰かすら分からんが、
さすがに「今時のプレーヤなら大抵ASIOもサポート」は無い

609:デフォルトの名無しさん
07/11/28 00:19:22
これからもASIO厨とwaveOut厨の喧嘩が続きそうだな

610:デフォルトの名無しさん
07/11/28 00:19:42
Windows Media PlayerでASIO使えるの?

611:デフォルトの名無しさん
07/11/28 00:22:23
少し夜風に当たって頭冷やしてこい

612:デフォルトの名無しさん
07/11/28 00:24:58
ASIOを舐めたらどんな味ぉ?

613:デフォルトの名無しさん
07/11/28 00:25:26
ASIO = Advanced Serial IO

614:550
07/11/28 00:26:33
>>600
音を送る側:クライアント
実際に音を鳴らす側:サーバ
というようにしたいわけです。
つまり、たくさんのクライアントに向けて音を送りたいわけではなく、
一つのサーバに向けて音を送りたいのです。

615:デフォルトの名無しさん
07/11/28 00:29:28
>>614
だから録音デバイスから普通に音を拾えよ
それを好きなだけ送れ
実際にやってみてそれでダメだったらまた来い

616:デフォルトの名無しさん
07/11/28 00:29:40
ASIOは入力用だっつーの

617:デフォルトの名無しさん
07/11/28 00:30:55
ふっくできるよ! できるよ!
って自分の技術に奇妙な自信を持ってるから、スレがカオスになるのではないかと予想

618:デフォルトの名無しさん
07/11/28 00:31:57
>>614
上にも出てるけどWindows Media エンコーダでできないか?

619:デフォルトの名無しさん
07/11/28 00:34:15
>>618
前にも思ったが、プログラミングのスレで既製品を進めてどうするんだと

620:デフォルトの名無しさん
07/11/28 00:34:53
>>616
ミキサーを通さないから音質が上がるということで、
出力用に愛用している人間は少数ながらいる。
検索すると音質が上がったと喜んでいる人間がたしかにいる。
しかし私には同じ音にしか聞こえない。

621:デフォルトの名無しさん
07/11/28 00:36:07
>>619
大抵はそれで済んでしまうことが多いから
まあ本人がそれでも0から作りたいっつーなら構わんが

622:デフォルトの名無しさん
07/11/28 00:36:53
>>620
ボリュームパスして大音量で再生されただけだろ
あほすぎる

623:550
07/11/28 00:38:47
>>618
>>614のモデルに合わせる使い方ができるでしょうか?

624:デフォルトの名無しさん
07/11/28 00:40:23
>>623
ここはプログラム板だから、ソフトの使い方は別の板へ逝け

625:デフォルトの名無しさん
07/11/28 00:43:04
サウンドカードのサウンドバッファが16bit以上をサポートしているなら音質は上がるかもしれない
128kbpsのmp3で満足するオレには分からんレベルだ

626:550
07/11/28 00:57:15
>>621
私も既製品で済むに越したことはないと思うのですが、
目的に合うものがないので作るしかないと思ったのです。

627:デフォルトの名無しさん
07/11/28 01:01:13
>>623
WindowsMediaEncoder
PortForwarder
sshd
これを組み合わせると可能

628:デフォルトの名無しさん
07/11/28 01:12:17
>私も既製品で済むに越したことはないと思うのですが、
ちょwwwwwww

ソフトウェア板でやってよwwwwwwwwwwwww
何のために100レスも消費してたんだwwwwwwwwwwwww

629:550
07/11/28 01:14:19
>>628
肝心なのは、直接目的に合うものが存在しないということですよ。

630:デフォルトの名無しさん
07/11/28 01:16:14
単に探し足りないだけ、解説を読み足りないだけだと思う

現に出来るだろ

631:デフォルトの名無しさん
07/11/28 01:17:40
>>627
SSHって必要か?

632:デフォルトの名無しさん
07/11/28 01:19:12
提示されたアプリについてまるで調べてないってのは分かるなあ〜
明らかに>>623なんてレス読んで脊髄反射で聞いてるよね。

633:デフォルトの名無しさん
07/11/28 01:27:07
要するに>>550はESounDみたいなサウンドサーバ/クライアントが作りたいんだろ
WindowsMediaEncoderだとストリーム配信みたいなことしかできないわな

634:デフォルトの名無しさん
07/11/28 02:10:45
>>629
多くのオーディオデバイスでは、リダイレクタ(ミキシング済みの音声出力を取り込める入力)が
使えるので、それを waveIn 等でとってくれば簡単に目的の処理が可能です。
(USB オーディオ等だと無いのが普通みたいだけど)

ESound のようなものを作るのなら遅延はたぶんあまり許容できないでしょうから、
Windows Media Encoder 等ではなくシーケンス番号付けて RTP で送るのが良いと思います。

>>593
リダイレクタを使う実装では PC1 の wave 入力を利用することになるので、PC1側のアプリでは
MICは利用できなくなります。PC1 に ASIO 対応の余分なオーディオデバイスを追加し、
それでPC1の(通常の)出力を取り込むなどできれば非常に簡単ですが、ハードの追加は
ダメなんでしょうか?

XP向けにフィルタドライバを書くのは恐らく非常に大変ですよ。

635:デフォルトの名無しさん
07/11/28 02:28:14
リモートデスクトップ接続、ってオーディオリダイレクタを
標準装備してるよね?

636:デフォルトの名無しさん
07/11/28 02:32:39
もうほっとけよ。
どうせWindowsMediaEncoderだって試してもいないだろうし。

637:デフォルトの名無しさん
07/11/28 03:34:50
>>636
WindowsMediaEncoderは役にたたんだろ。

638:デフォルトの名無しさん
07/11/28 03:34:58
単純な質問で悪いけど
ウィンドウを不可視状態で作成するのって、CreateWindowのウィンドウスタイル引数に
WS_OVERLAPPED ^ WS_VISIBLE でよかったっけ?
なんか見えるんだけど・・orz
「^」って排他的ウンタラだったよね?よね?

639:デフォルトの名無しさん
07/11/28 03:42:28
どうせShowWindow(hWnd,SH_SHOW);してるとかそういうオチ

640:デフォルトの名無しさん
07/11/28 03:46:20
WS_OVERLAPPEDはWS_VISIBLEを含んでない件

つまり
WS_OVERLAPPED & WS_VISIBLE → 偽
なので

WS_OVERLAPPED ^ WS_VISIBLE = WS_OVERLAPPED | WS_VISIBLE

641:デフォルトの名無しさん
07/11/28 06:17:14
すまん
>WS_OVERLAPPED ^ WS_VISIBLE = WS_OVERLAPPED | WS_VISIBLE
これわからん
こんなのあり?


642:デフォルトの名無しさん
07/11/28 06:23:04
0^1 = 1
1^1 = 0

643:デフォルトの名無しさん
07/11/28 06:39:07
>排他的ウンタラ

排他的論理和ですが何か?


きみのやりたいことはこっちではないかな?
WS_OVERLAPPED & ~WS_VISIBLE

644:デフォルトの名無しさん
07/11/28 06:39:59
>>641
わからんならWS_OVERLAPPEDだけ使え
故意に明示したいなら
WS_OVERLAPPED & ~WS_VISIBLE
こうじゃないか

645:デフォルトの名無しさん
07/11/28 06:40:39
かぶってしまった

646:デフォルトの名無しさん
07/11/28 06:47:23
珍子がかぶってる

647:デフォルトの名無しさん
07/11/28 07:18:54
もし最初から最後まで表示する気が無いなら、WS_OVERLAPPEDも
指定するだけ無駄だな。

648:デフォルトの名無しさん
07/11/28 09:31:58
TotalRecorderみたいなことがしたいのか?

649:デフォルトの名無しさん
07/11/28 09:58:31
>>546
デバッグ情報はデバッガで読み込めば良い

650:デフォルトの名無しさん
07/11/28 10:24:37
>>550は既存品がダメならH.323とそれに関係する資料見た方がよい
URLリンク(www.itu.int)

651:デフォルトの名無しさん
07/11/28 11:33:57
>>650
ESound みたいな使い方には既存のストリーミングサーバは
Windows Media Encoder は遅延が大きすぎて使えないってだけだろ。
VNC のアドオンでも作ってるんじゃねーの。

リモートデスクトップでのオーディオのリダイレクトみたいに、
フィルタドライバじゃなくてそれ専用の仮想デバイスを作っちゃう手もあるな。

652:デフォルトの名無しさん
07/11/28 12:00:48
>Windows Media Encoder は遅延が大きすぎて使えないってだけだろ。
だれもそんなことはいっていない。

>VNC のアドオンでも作ってるんじゃねーの。
だれもそんなことはいっていない。

>リモートデスクトップでのオーディオのリダイレクトみたいに、
>フィルタドライバじゃなくてそれ専用の仮想デバイスを作っちゃう手もあるな。
リモートデスクトップで確認してみれば自明だが、DirectSoundで音楽再生でもしようものなら音がとびまくる。

だれももいっていないことを勝手に想定したり、使い物にならない手段を提示したり、
いったい何がしたいんだ?

653:デフォルトの名無しさん
07/11/28 12:09:53
>>652
リモートデスクトップで音がとぶから仮想デバイスが使い物にならないだなんて飛躍しすぎだろ

654:デフォルトの名無しさん
07/11/28 12:28:02
>>652
質問者自身が ESound みたいなのを作りたいって言ってるジャンw
逆に>>650は質問のどこを見てプロトコルに関する質問だと思ったの?
学習困難児だった?

655:デフォルトの名無しさん
07/11/28 12:38:37
漏れが華麗に要件をまとめた

(1) ESounD のようなリダイレクタ
(2) 同時にMICも使いたい
(3) 取ってきた音は1つのサーバに送って、サーバで鳴らす

(2)があるから、入力を占拠する「音源ボードのリダイレクタ(+WME)」はダメ。
マイクロソフトの人間は仮想デバイスを使ったが、>>652が否定してるから
仮想デバイスはダメ。フィルタドライバは>>634が否定してるからダメ。

656:デフォルトの名無しさん
07/11/28 12:47:16
まだこのネタ続いてるのかよw
おまいらもういいだろww

657:デフォルトの名無しさん
07/11/28 12:54:35
質問者を置き去りにして外野が騒いでるのは滑稽だな
外野といってもあーだこーだ言ってるのは一人か


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

4223日前に更新/231 KB
担当:undef