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


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

Win32API 質問箱 Build7
251 名前:デフォルトの名無しさん :02/11/27 11:02
>>247
ローマ字入力で「ディ」が出せなかったものと思われ
最近の記事ではちゃんとエディットになってる(w

252 名前:デフォルトの名無しさん :02/11/27 12:22
>>250
( ゚д゚) ポカーン

253 名前:デフォルトの名無しさん :02/11/27 14:12
ツールバーのボタンのそれぞれを好きな寸法にしたいのですが、
どんな方法があるのでしょうか。

254 名前:デフォルトの名無しさん :02/11/27 14:18
TBSTYLE_AUTOSIZE でできました・・・。

255 名前:悲しい :02/11/27 20:06
デスクトップに文字列表示できないかと思って
以下のコード書いたんですがうまくいかないんです。
なぜうまくいかないんだ。
よかったらどなたか教えてくれませんか?

HWND hDesktop;
HDC hDC;
RECT rectDraw;
const char str[] = "Desktop!";

hDesktop = ::GetDesktopWindow();
hDC = ::GetDC(hDesktop);
::GetClientRect(hDesktop, &rectDraw);

::DrawText(hDC, str, strlen(str), &rectDraw, DT_CENTER);
::ReleaseDC(hDesktop, hDC);


256 名前:悲しい :02/11/27 20:07
何にも表示されないんです・・・。


257 名前:デフォルトの名無しさん :02/11/27 20:51
CString* をchar* に代入するには いかそ?

258 名前:デフォルトの名無しさん :02/11/27 20:55
>>257
コンパイルでUNICODE定義していないなら、

CString *aaa;

aaa になんか値が入る。

char* p = (char*)(*aaa);

259 名前:デフォルトの名無しさん :02/11/27 21:26
>>255
試してないが、
CreateDC("DISPLAY",NULL,NULL,NULL);
でどうだ?

260 名前:うれしい :02/11/27 22:27
>>259
うまくいった!
感謝!
あなた神です。


261 名前:デフォルトの名無しさん :02/11/27 22:49
>>259
それだと「デスクトップ」じゃなくて画面全体じゃないか?
っていっても、260で喜んでるので、そういうものが欲しかったのか。
普通デスクトップって言ったら、Explorerの画面全体を覆ってる
リストビューのこと指すと思うんだがなあ。

262 名前:デフォルトの名無しさん :02/11/27 22:56
>>261
(゚Д゚)ハァ?

263 名前:デフォルトの名無しさん :02/11/27 22:59
>>261
窓でのデスクトップの定義について
小2週間くらい勉強してこい

264 名前:デフォルトの名無しさん :02/11/27 23:07
>>262-263
(゚Д゚)ハァ?

265 名前:デフォルトの名無しさん :02/11/27 23:08
( ゚д゚)ポカーン

266 名前:デフォルトの名無しさん :02/11/27 23:11
>>261-264
俺にもわかるように説明してくれ


267 名前:デフォルトの名無しさん :02/11/27 23:16
>>266
(゚Д゚)ハァ?


268 名前:デフォルトの名無しさん :02/11/27 23:24
>>266
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/desktops.asp
これでも読め

269 名前:デフォルトの名無しさん :02/11/27 23:28
>>261
「Explorerの画面全体を覆ってるリストビュー」って
どれのこと?
・・・あーそういうことだったのか! やっとわかった!


270 名前:デフォルトの名無しさん :02/11/27 23:31
>>269
(゚Д゚)ハァ?

271 名前:デフォルトの名無しさん :02/11/27 23:41
・・・で、真の厨房は誰だったんだ?


272 名前:デフォルトの名無しさん :02/11/27 23:43
( ゚д゚)ポカーン

273 名前:デフォルトの名無しさん :02/11/27 23:44
270


274 名前:デフォルトの名無しさん :02/11/27 23:47
つれた!!

275 名前:260 :02/11/27 23:50
>>261
その「Explorerの画面全体を覆ってるリストビュー」って
どうやって取得できるんですか?
よかったら教えてもらえませんか。


276 名前:デフォルトの名無しさん :02/11/27 23:51
>>271
261です。
「Explorerの画面全体を覆ってるリストビュー」がデスクトップか否かに関わらずアホだから。

277 名前:デフォルトの名無しさん :02/11/27 23:53
>>275
FindWindowとかでProgram Managerを検索して、
その子ウインドウでクラスがSysListView32になっている奴を捜すんじゃないの?

278 名前:デフォルトの名無しさん :02/11/27 23:53
>>275
やったことないけどGetWindow(GetDesktopWindow(),GW_CHILD);
とかで取れないか?

279 名前:デフォルトの名無しさん :02/11/28 00:13
>>278
それは安全か?

280 名前:デフォルトの名無しさん :02/11/28 00:13
だめなんだなー
それじゃー

281 名前:デフォルトの名無しさん :02/11/28 00:23
今Spyで見てみたら、

デスクトップ
 +ProgramManager
    + SHELDLL_DefView
       + SysListView     ←これ

だった。

282 名前:名無し@沢村 :02/11/28 00:32
皆々様方〜、ツールバーだが、ツールバーにビットマップを標示すると、
色が表示されずにグレーになったり、使ってるうちにだんだんイロがあせてきたりするんだが、
これはどうやったら直せるのですか?
ちなみに画面のプロパティの詳細は256色です。

283 名前:デフォルトの名無しさん :02/11/28 00:34
>>282
モニタを買い換えろ。

284 名前:デフォルトの名無しさん :02/11/28 01:09
また沢村かよ・・・

285 名前:デフォルトの名無しさん :02/11/28 09:38
>>283
Macじゃあるまいしモニタを買い換えても意味ないだろ。
ビデオカードを買い換えないと。とかマジレスしてしまうテスト

286 名前:デフォルトの名無しさん :02/11/28 12:41
WinMain() の中から直接 DialogBox() をコールしてダイアログボックスを
表示するアプリを作っているのですが、キーボードイベントをうまく扱え
ません。
ネットで調べてみると、どうも「ダイアログボックスには WM_KEYDOWN
イベントが飛んでこない」ようです。
「ウインドウのサブクラス化」も試みてみたのですがうまくいきませんでした。
やはり、親ウインドウがないダイアログボックスではキーボードイベントを
扱うことは出来ないのでしょうか?

287 名前:デフォルトの名無しさん :02/11/28 12:57
>>286
できるけど、どーしたいん?

288 名前:デフォルトの名無しさん :02/11/28 13:19
>>286
SetWindowsHookEx()

289 名前:286 :02/11/28 13:27
>>288
そのものずばりでした。ありがとうございます。

290 名前:デフォルトの名無しさん :02/11/28 14:55
>>287 が可哀相に思えるのは俺だけか?

291 名前:287 :02/11/28 15:17
>>290
いいのいいの。

292 名前:デフォルトの名無しさん :02/11/28 15:59
今タイムタグ付き歌詞ファイルを読み込んで色を変えながら表示していく
("[00:01:00]あ[00:02:00]い[00:03:00]うえお\n"のような文字列を読んで解析)
プログラムを作っています。
内部では
struct
{
 int msec;
 char *text;
 int mode; // 0なら一行分、1なら色を変える部分のみのテキスト
} * dataのようなものを作って持たせています。
上の例だと
data->msec==1000,data->mode==0,data->text=="あいうえお"
(data+1)->msec==2000,(data+1)->mode=1,(data+1)->text="あい"
(data+1)->msec==3000,(data+1)->mode=1,(data+1)->text="あいうえお"

DrawTextかTextOutだけでうまいことやれる方法はないですかね。
mode=0のものを書いた後にTextOutすると後から書いた領域がちょっとだけ大きくなって
先に書いたものが消えちゃうんです。
BitBltで透過転送してたら重くて使い物にならなかった。

293 名前:224=245 :02/11/28 17:35
解決しますた。

リソースにmanifestを含める場合、manifestのリソースIDを必ず1にしないと
いけなかったのですな。
VS.netだったからそのへんは適当にやってくれるもんだと思ってた・・・鬱

manifestを外部ファイルにしても反映されなかったんだけど、それはmanifest
のファイル名が間違っているという単純ミス。逝ってきます。
exe_no_namae.manifest じゃなくて exe_no_namae.exe.manifest なのね。

ってなわけで今はちゃんとXPのビジュアルスタイルでダイアログが表示されてまする。

294 名前:デフォルトの名無しさん :02/11/28 17:44
なんだそんなことか。

295 名前:デフォルトの名無しさん :02/11/28 18:06
でも勉強になったよ。ありがとう。

296 名前:289 :02/11/28 18:48
続きです・・・

Win2k では WM_ACTIVATEAPP でフックを呼ばないと、他のアプリでの入力後、
フックが切れることがある。が、Win9x でそれをやると100%クラッシュする!!
今回は OS の判定ルーチンを入れて対応しましたが・・・(Win9x では
WM_INITDIALOG でフックを呼ぶようにした)
このような経験された方いらっしゃいます?

297 名前:名無し@沢村 :02/11/28 19:25
皆々様方〜、いろいろありあとうございました、皆々様方〜!
私はここでコールバックタイマーを使用しろとか、複数トラックのデータをマージしてひとつのデータにまとめろとか、いろいろなアドバイスをいただきました。
でもはっきりいってそんな面倒なことはしたくなかったんです…。
はっきりいって手抜きに近い楽なやりかたで複数トラックをちゃんと演奏する方法を見つけたかったんです。
でもついにその方法が見つかったんです!!
その完璧なルーチンをここに乗せますから、皆様方も楽にmidiシーケンサーをつくるときの参考にしてください、皆々様方〜!

for(i=0;i<=i_Sum_Track[i_longest_Track];i++)
{for(l=0;l<16;l++)
{t[l]=0;
if(CodeCount[l]!=0)
{for(jj[l]=0;jj[l]<Onpu_Index[l];jj[l]++)
{kk[l]=jj[l]*8;
if(i==t[l] )
{
_Multi_Time[l]= timeGetTime();
midiOutShortMsg(hMidiOut, 0xC0+l+ ((i_gattuki[l]) * 0x100));
midiOutShortMsg(hMidiOut, 0x0000B0+l+ ((7) * 0x100)+((possrider[l]) * 0x10000));
midiOutShortMsg(hMidiOut, 0x0000B0+l+ ((8) * 0x100)+((possrider_b[l]) * 0x10000));
midiOutShortMsg(hMidiOut, 0x0000B0+l+ ((10) * 0x100)+((possrider_s[l]) * 0x10000));
midiOutShortMsg(hMidiOut, (DataCode[l][kk[l]]) + (DataCode[l][kk[l]+1] * 0x100)+(DataCode[l][kk[l]+2] * 0x10000)); // Note On}
t[l]+=DataCode[l][kk[l]+3];
if(i==t[l] ) { while (Play_Tempo(DataCode[l][kk[l]+3])>=timeGetTime()-_Multi_Time[l]);
midiOutShortMsg(hMidiOut,(DataCode[l][kk[l]+4])+ (DataCode[l][kk[l]+5] * 0x100)+(DataCode[l][kk[l]+6] * 0x10000)); // Note Off } }} }}


298 名前:デフォルトの名無しさん :02/11/28 19:29
おいお前ら!
visual stdio .NET買ったんですけど
付属のヘルプにすべてのAPIの日本語の解説はあるのですか?

299 名前:デフォルトの名無しさん :02/11/28 21:44
>>298
全てはない。
重要と思われるウィンドウメッセージの説明も英語だから注意しれ(w
というか、その為のこのスレか?

300 名前:275 :02/11/28 21:44
>>277
ありがとう。
あんたが正しかったよ。
マジで感謝。


301 名前:デフォルトの名無しさん :02/11/28 21:52
windows.hとかのヘッダファイルはどこで最新のものをダウンロードできますか?
microsoftのサイトだとは思うんですが、なかなか見つかりません。

302 名前:デフォルトの名無しさん :02/11/28 21:58
>>301
↓ココダヨ
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/

303 名前:301 :02/11/28 22:06
>>302
ありがとうございます

304 名前:デフォルトの名無しさん :02/11/28 22:36
ウィンドウのリサイズを左右のみに限定したい。

限定する事自体は WM_GETMINMAXINFO ですぐにできたんですが、
ウィンドウの角にマウスカーソルを持っていった時にマウスカーソルが
斜め矢印になってしまうのを抑制する事はできないんでしょうか?

305 名前:304 :02/11/28 22:38
>>304
ごめん。自己解決。 WM_NCHITTEST でした。

306 名前:デフォルトの名無しさん :02/11/28 23:53
ウインドウに標準のスクロールバーをつけて(WS_VSCROLL)それを処理するコードも書いたんですが、
ずっとマウスを押してもスクロールバーが一回しか動きません。
ダイアログで同じことをするとちゃんとずっと動くんですが、、、
ウインドウを作るときになんか追加の設定とかが必要なのでしょうか?


307 名前:デフォルトの名無しさん :02/11/29 00:10
>>306
コードを晒せ。

308 名前:デフォルトの名無しさん :02/11/29 00:23
Shellに詳しい方教えてください。

SHGetDesktopFolder()でデスクトップフォルダ(IShellFolder)を取得し、
ParseDisplayNameメソッドでpwszDisplayNameにPathではなくURLを指定しても
ITEMIDLISTが作成可能です。こいつのAttributeを調べてみると、
SFGAO_BROWSABLE が立っています。説明をみると、Folderではないが、
CreateViewObjectメソッドのみ実装されたIShellFolderインターフェース
が取得可能ということ。そこで、こいつの親FolderであるIEフォルダ
(IShellFolder)を作成後、BindToObjectメソッドを使い、問題の
IShellFolderを取得しました。さらにCreateViewObjectメソッドで
オブジェクト(IShellView)も作成することができました。
が、このオブジェクトの正体は何なんでしょうか?
Folderでないためか、CreateViewWindowメソッドは失敗してしまいます。
別のView関連のインターフェースが実装されているのでしょうか?
作成できるということは何らかの使い道があると思うんですが、
MSDNを調べてみてもわかりません。よろしくお願いします。

309 名前:名無し@沢村 :02/11/29 00:53
>>306
ぶぁっはははははーーーっ!!
スクロールバーもまともにつけられない奴がこの世にいたのか!?
ぶぁっはははははーーーっ!!
ぶぁっはははははーーーっ!!

310 名前:デフォルトの名無しさん :02/11/29 01:07
>>308
IEコンポじゃないの?

311 名前:でむぱ :02/11/29 01:14
こんにちは、Win32API厨です。
sprintf,memcpyなどは必ずwsprintf,MoveMemoryにするよう
自らはもちろん、周りの連中にも布教しており、Cランタイム関数撲滅に精を注いでおります。
が、悔しいことにmemcmpとatoiだけ同等のAPIが見つからず、泣く泣くCランタイム関数を使わざるを得ません。
こんな私めにWin32APIでこれらと同等の関数があれば、ぜひぜひ教えてくださいまし..


312 名前:デフォルトの名無しさん :02/11/29 01:21
まざるとうざいから、特別な理由がない限りCランタイムのにしてくれよ

313 名前:デフォルトの名無しさん :02/11/29 01:24
>>311
memcmp() -> CompareMemory()
atoi() -> AsciiToInteger()

314 名前:デフォルトの名無しさん :02/11/29 01:26
MoveMemoryってmemmoveのdefineだけど。

315 名前:デフォルトの名無しさん :02/11/29 01:39
ZeroMemoryもmemsetに...

316 名前:デフォルトの名無しさん :02/11/29 01:39
SecureZeroMemoryって、最近のMSDNのいい話と悪い話みたいな
タイトルの記事見るまでマジで意味分からなかった。

317 名前:デフォルトの名無しさん :02/11/29 01:41
memcmpやmemsetは通常インラインに展開されるんだから
Cランタイム撲滅には関係ないと思うんだけど

318 名前:デフォルトの名無しさん :02/11/29 01:51
>311
wsprintfは、"The maximum size of the buffer is 1024 bytes. "
な制限があって、昔はまった、、、
今はsnprintf使てます

319 名前:デフォルトの名無しさん :02/11/29 01:52
>316 ↓これですか?
ttp://www.xinada.ne.jp/~handa/tech/#m07

320 名前:デフォルトの名無しさん :02/11/29 02:28
見つけた。
http://www.microsoft.com/japan/msdn/columns/secure/secure10102002.asp
単なるインライン関数なんだから .NET Server でしか
使えないわけないんだがMSDNライブラリのRequirementsは
いったいなんなんだ?

321 名前:デフォルトの名無しさん :02/11/29 03:30
みんな沢村をまるで相手にしてないのがワラタ

322 名前:でむぱ=311 :02/11/29 18:00
>>313 両方ともMSDNにもないっすよぉ...
>>314,315,317 VBのAPIビューアからだとKernel32.dll の各エクスポート関数
(Rtlなになに)を呼んでいるのに、VC++はなぜにmemmove,...にしてしまうんだろ!?
悔しぃ…。
ちなみに、#defineでRtlEqualMemory !memcmp(s,t,l) なんてのもあるんですね。
(WINBASE.H,WINNT.H)
>>318 私もはまりますた。が、懲りずにlstrcatで合成してwsprintfを使っています。
確か書式の指定方法もsprintfと微妙に違うんですよね...


323 名前:デフォルトの名無しさん :02/11/29 18:25
GlobalAllocと通常のmallocの違いがわからないんだけど…

324 名前:デフォルトの名無しさん :02/11/29 18:59
GlobalAlloc は API
malloc は C 標準関数
大違い

325 名前:デフォルトの名無しさん :02/11/29 19:07
malloc() はプロセスヒープからメモリを割り当てる。
HeapAlloc(GetProcessHeap()) とほぼ同じだが、free() は HeapFree() と違って
ヒープにメモリ領域を返さず、次に呼ばれる malloc() のために取っておく。

GlobalAlloc() はグローバルヒープ (システムヒープ) からメモリを割り当てる。
クリップボードのデータ等、共有の目的で使用する。
共有メモリのためアドレスが定まっておらず、その領域を使うには GlobalLock() で
固定する必要があるが、固定したままだと他のプロセスから使用できない。
Windows 9x では 4 MB 未満のメモリブロックを想定して設計されているので、
それ以上は代わりに VirtualAlloc() を使えとある。

326 名前:デフォルトの名無しさん :02/11/29 19:54
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/comparing_memory_allocation_methods.asp
これってGlobalAlloc、LocalAlloc、HeapAlloc(GetProcessHeap)は全部同じってことじゃないの?

327 名前:デフォルトの名無しさん :02/11/29 22:01
使ってみてから言ってる?

(Win32 では) GlobalAlloc() と LocalAlloc() は全く一緒。
しかし GlobalAlloc() と HeapAlloc(GetProcessHeap) は、HGLOBAL を得る事が
できるかどうかという点で違う。
使い方というか用途もそれぞれ全く違う。
Microsoft が同じだと述べているのは、プロセス内において作業領域としてメモリを
確保した時の事について。

328 名前:326 :02/11/29 22:35
漏れが言いたかったのは
「malloc、GlobalAlloc、HeapAlloc(GetProcessAlloc)は確保される場所は同じなんだろ」
ということなんだが…

329 名前:デフォルトの名無しさん :02/11/29 22:46
mallocがどこからメモリを取ってくるかは処理系依存。
VirtualAllocから取ってきて、独自分配しても合法

330 名前:デフォルトの名無しさん :02/11/29 22:49
そういう話をしたいなら、ヒープもスタックもテキストも全部同じメモリの上に
載ってますが、と返してあげるけど。

で、同じだから何だって?
326 の URL にはそんな事全く書いてないし、仮にそうだとしてもそれを知ってて
何か役に立つの?

想像だけど、GlobalAlloc() はグローバルヒープをプロセス空間にマッピング
するためにプロセスヒープを割り当ててるだけで、HeapAlloc(GetProcessAlloc)
と同じように使ってくださいという趣旨ではないんじゃないの?

malloc() は 325 の通りだから HeapAlloc(GetProcessAlloc) よりも速い事も
あれば無駄なオーバーヘッドな事もある。
(重箱の隅をつつけば、326 は malloc() について何も訴えていない)

331 名前:デフォルトの名無しさん :02/11/29 23:23
>328
> 「malloc、GlobalAlloc、HeapAlloc(GetProcessAlloc)は確保される場所は同じなんだろ」
そりゃ x86 プロテクトモードだと、メモリ空間は 32bit フラットだからな。

ただ、ユーザが 32bit フラットなメモリ空間に直にアクセスするのは

1. プログラム書くのが大変
2. OS がリソース配分できなくなる

という問題があるので、まっとーな OS では途中に何階層か用意して、適宜メモリを
切り出して割り当てるようになってる。GlobalAlloc や malloc は、その「階層」の厚み
や中身が違う。

混ぜると core 吐きます。

332 名前:デフォルトの名無しさん :02/11/30 00:00
GlobalAllocはWin16との互換性のためにあるから
なるべく使うなといいつつHGLOBALを要求するAPI
(クリップボード関係とか)がある現状をどうにかしてくれ>MS

333 名前:326 :02/11/30 00:08
漏れはヒープはプロセス固有のものであり、
ヒープにシステムヒープとかプロセスヒープとかいう違いはないと思ってた。
んで、使われ方は違うがGlobalAllocもHeapAllocも同じヒープ上に確保されると思ってた。
調べてみたが
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dngenlib/html/msdn_heapmm.asp
にあるように、ヒープには最低1個のデフォルトヒープと呼ばれるヒープが存在しており、
GlobalAllocとHeapAlloc(GetProcessHeap)は両方ともデフォルトヒープ上に確保される。
ちなみに328のmallocはLocalAllocの間違いっす。

334 名前:デフォルトの名無しさん :02/11/30 00:26
ヒープは複数持てるよ。mallocとかが使うのはデフォルトヒープ。
独自のヒープでメモリを管理して漏れを防いでもいいかも。

335 名前:デフォルトの名無しさん :02/11/30 02:13
>>332
HGROBAL は、クリップボードにデータ渡すのに丁度いいからじゃないか?
API 名がいまいちそぐわないのは気になるけど。

>>333
だからさ、レイヤーというものを理解してくれよ。
http://msdn.microsoft.com/library/en-us/dngenlib/html/heapmm_1.gif
この図を見て、「Local、Global Memory API」 の中で何か特別な事をやっている
とは思わないのか?
>>330-331 に書いてある事をちゃんと理解したか?

>>334
>>329

336 名前:デフォルトの名無しさん :02/11/30 02:31
>>334
なるほど、まとめて解放してくれるんですか。便利かもしれませんね。

ふと思ったのですが、malloc/free/new/deleteが実際に使うヒープは
同じでないとまずいですよね。VC同士ならイイんでしょうけど...

337 名前:デフォルトの名無しさん :02/11/30 02:34
>>336
マズい可能性がある。
理由はそれだけではないが、ライブラリが確保したリソースはそのライブラリに
解放させるのが定石。

338 名前:デフォルトの名無しさん :02/11/30 04:29
>>335
Global〜が廃止されてるCEではさりげなくSetClipboardDataの
引数なんかもHLOCALに変更されてるんだよな。
ま、Win32sを除けばHLOCAL==HGLOBALなわけだが

339 名前:でむぱ :02/11/30 15:28
関係ないが、なぜヒープというのかみんな知らないんだろうな(w
>>334
new して free(),malloc()して delete してみればいいんじゃないの?
確かしいたけアボーンされたと思うけど。


340 名前:デフォルトの名無しさん :02/11/30 15:34
まあ普通に考えれば「そんなアドレス管理してまへんがな」となるわな

341 名前:デフォルトの名無しさん :02/11/30 15:46
>340
世の中、そういうタチの良い malloc/free ばかりでもなく。無条件で、与えられた
アドレスは「malloc によって割り当てられたはず、したがって直前に管理データ
があるはず」とか信じてる free() も存在する。

(管理データ壊して遠からず core を吐くけど、いつ誰がどこで管理データを
壊したのかは分からない_

342 名前:デフォルトの名無しさん :02/11/30 15:50
ん?gnuのはモードを切り替えられたような・・・
vcもそうだったと思う

343 名前:デフォルトの名無しさん :02/12/01 03:29
CreateProcessとかで、コンソールアプリを起動して
その終了を確実に待つのは、
WaitForSingleObject(pf.hProcess, INFINITE);
ではだめなんですが、どーしたらいいですか?
CreateProcessの第2引数に、"cmd.exe /c xxx.exe"
としています。

344 名前:デフォルトの名無しさん :02/12/01 07:45
cmd.exeの終了を待ったってそりゃダメだ

345 名前:デフォルトの名無しさん :02/12/01 07:57
"cmd.exe /c "
何の効果があるんだ?

346 名前:しぃ豆 ◆FTP/Z/SD72 :02/12/01 08:26
>>345
コマンドプロンプトで cmd.exe /? と入れれば出てくる。

347 名前:デフォルトの名無しさん :02/12/01 09:01
そうじゃなくて、直接 "xxx.exe" でいいんじゃないかという話なのだが。

348 名前:真面目に質問 :02/12/01 09:38
すいません、WinSock2で困っています。

ネットワークプログラミングの勉強をしている初心者なのですが、今、VisualC++6を使っていますが。
以下のとおり入力したらエラーがでました。

#include <winsock2.h>

.
.
.


WSADATA wsaData;
WSAStartup(2,&wsaData);

(エラー)
リンク中...
Network.obj : error LNK2001: 外部シンボル "__imp__WSACleanup@0" は未解決です
Network.obj : error LNK2001: 外部シンボル "__imp__WSAStartup@8" は未解決です
Debug/Network.exe : fatal error LNK1120: 外部参照 2 が未解決です。
link.exe の実行エラー
Network.exe - エラー 3、警告 0

なぜ、エラーが出るのでしょうか???教えていただけませんか?
すいません、初歩的な質問で・・・。

349 名前:デフォルトの名無しさん :02/12/01 09:43
>>348
wsock32.libをリンクしてないんじゃない?

350 名前:真面目に質問 :02/12/01 09:45
>>349
ws2_32.lib をインポートすると言うことでしょうか?
インポートはどうすればいいのですか?

351 名前:デフォルトの名無しさん :02/12/01 09:50
>>350
それくらい自分で調べろよ。
プログラマとしての適性が無いばかりか、人間としての最低限の能力だろ。

352 名前:真面目に質問 :02/12/01 10:05
>>349
ws2_32.lib をインポートすると言うことでしょうか?
インポートはどうすればいいのですか?

353 名前:真面目に質問 :02/12/01 10:07
>>351
すいませんでした。
解決しました。

プロジェクト→設定→リンクタブ内で、ws2_32.libを追加しました。

まことにすいませんでした。失礼な質問をして・・・。

354 名前:デフォルトの名無しさん :02/12/01 13:33
>>347
それでも、けっかは同じでした。
コンソールアプリは、終了をまってはくれません。

355 名前:デフォルトの名無しさん :02/12/01 13:35
終わったことを知りたいのではなくて?

356 名前:sage :02/12/01 14:59
StrechBlt() を使うとページ違反が頻発するのですが、
これはそういうものなのでしょうか?
特に拡大Bltするとページ違反が何百Kにもなるので不安です。

357 名前:デフォルトの名無しさん :02/12/01 15:12
メモリをオンデマンドで確保してる、とか。

358 名前:デフォルトの名無しさん :02/12/01 16:39
>>354
ちゃんと待つけど。お前のプログラムがへぼいんだろ

359 名前:デフォルトの名無しさん :02/12/01 18:11
> コンソールアプリは、終了をまってはくれません。

何のことを指しているんだ?

360 名前:デフォルトの名無しさん :02/12/02 00:02
StretchBltは全てのデバイスに対して使えるわけではない。

361 名前:デフォルトの名無しさん :02/12/02 00:18
使えるデバイスかどうか判定する方法も書いてくれるとさらに親切だな
ちなみにGetDeviceCapsを使うわけだが

362 名前:356 :02/12/02 00:56
>>360,361
なるほど、StretchBlt()にはそんな落とし穴が・・・
見た目正常に動いていたので謎でした。
どうもありがとうございます。助かりました。

363 名前:デフォルトの名無しさん :02/12/02 08:37
タイトルバーのないウィンドウってどうやって作るんですか?
これでもタイトルバーは付いちゃいますよね。

hWnd = CreateWindow(szWindowClass, szTitle, NULL, // ←スタイルにNULL指定
CW_USEDEFAULT, CW_USEDEFAULT, 256, 256, NULL, NULL, hInstance, NULL);

364 名前:bloom :02/12/02 08:52

http://www.agemasukudasai.com/bloom/

365 名前:デフォルトの名無しさん :02/12/02 09:08
WS_POPUP

366 名前:363 :02/12/02 09:32
>>365
できました、ありがとう


367 名前:デフォルトの名無しさん :02/12/02 10:49
個人的に、StretchBlt はデバイス未対応だったら GDI がエミュレートすべきだと
思うのだがどうよ?

368 名前:デフォルトの名無しさん :02/12/02 11:09
>>343
コンソールアプリの終了を待ちたい、ということだろうが、ちゃんとできてるぞ。
ちなみに、cmd.exeを通して呼ぶのではないが、その必要性は感じない。
コンソール「アプリ」なんだからな。

とりあえず、コードを晒せや。
CreateProcessとWaitForSingleObjectの引数が重要だ。


369 名前:デフォルトの名無しさん :02/12/02 14:00
>>367
GDI? デバドラでは内科医

370 名前:デフォルトの名無しさん :02/12/02 14:06
>>369
デバイスドライバがエミュレートするならば、デバイス未対応とは言わない。
GetDeviceCaps() に応答するのはハードウェアではなくデバイスドライバ。

つーか、367 はユーザープログラムにいちいち GetDeviceCaps() させるような
作りは間違っているという話じゃないのか?

371 名前:デフォルトの名無しさん :02/12/02 15:38
>>370
未対応つーともっと凶悪なの見たことあるぞ
RC_STRETCHBLTが真になるのにStretchBltがずっこけるプリンタとか

372 名前:age :02/12/02 15:39
age

373 名前:デフォルトの名無しさん :02/12/02 15:45
それは、ドライバの製作元に爆弾を投下していい話じゃないのか?

374 名前:356 :02/12/02 20:08
で、独り言というか報告ですが、
BeginPaint()で取ったHDCにもRC_STRETCHBLTが
効いてないようでした。StretchDIBits()もダメ。
BitBlt()はOKですが・・・。
結局DirectDrawのBlt()で拡大したら、ページ違反が
出なかったのでこれでいこうかと思います。

375 名前:  :02/12/03 11:51
StretchBltは、失敗してしかも GetLastError が 0 ということってママあるよね。
一度に描画するピクセル数を減らすとかすればよいのかな。

376 名前:デフォルトの名無しさん :02/12/03 13:38
別スレッドで昨日から質問させてもらっていたのですが、答えが得られません
でした。教えて頂けそうな所を探していた所、専門的なこのスレッドを
見つけましたので、ここで質問させていただきます。
C言語でコンソールにsetpixel関数での描画の仕方がわかりません。
別にウインドウを開いてやるのは、やり方だけはわかるのですが
コンソールのほうに応用はできません。下に書いた感じだと思うのですが。
お教えお願いします。
#include <windows.h>
int main(void)
{
HWND hWnd;
HDC hDC;
hWnd=?
hDC=GetDC(hWnd);//描画準備
SetPixel(hDC,100,100,RGB(255,255,255));//描画
ReleaseDC(hWnd,hDC);//描画終了
return 0;
}

377 名前:デフォルトの名無しさん :02/12/03 13:41
>>376
FindWindowはエロいからちょっとおすすめできない


378 名前:デフォルトの名無しさん :02/12/03 14:31
つーかコンソールにピクセル描こうとかいう発想そのものがキチガイじみてる

379 名前:デフォルトの名無しさん :02/12/03 14:34
0xA800,0xB000,0xB800,0xE000
のセグメントからいじれ


380 名前:デフォルトの名無しさん :02/12/03 14:59
>>379
スレ違い
しかもいまどきそれで絵が書ける機種(PC-9800シリーズ
なわけだが)がどれだけあるんだ?

381 名前:デフォルトの名無しさん :02/12/03 16:10
379はネタだろ。
哀れな376をからかうための。
だいたい>>376よ、
お前はWindowsプログラミングの基礎がわかってないぞ。
出直してこいや。


382 名前:デフォルトの名無しさん :02/12/03 16:38
>>380
イタタ

383 名前:デフォルトの名無しさん :02/12/03 17:59
1つのクライアント領域に2つ以上のタブコントロールを配置する事って可能ですか?
タブが2つ以上じゃなくて、タブコントロール自体を2個以上配置したいのですが。
やはり、タブコントロールごとに子ウインドウを作って、その上にタブコントロールを
置くしかないんでしょうか?

384 名前:デフォルトの名無しさん :02/12/03 18:33
>>383
すきなだけ配置すればよいと思うのだが出来なかったか?

385 名前:デフォルトの名無しさん :02/12/03 18:37
>>384
タブが選択されたときの全てのWM_NOTIFYが全部同じ親ウィンドウに行ってしまうので
判別ができないんですよ。

386 名前:デフォルトの名無しさん :02/12/03 18:40
NMHDR::hwndFrom
はどうなった。

387 名前:デフォルトの名無しさん :02/12/03 18:45
>>383
Delphi使えばこんなくだらないことではまらなくてすみますよ。

388 名前:デフォルトの名無しさん :02/12/03 21:16
>>387
スレ違いは芯でくれ

389 名前:デフォルトの名無しさん :02/12/03 21:44
>>383
これ見ても意味分からなかったらDelphi/VBでも使っとけ。

WM_NOTIFY:
{
NMHDR* nmhdr=(NMHDR*)lParam;

switch (nmhdr->idFrom) {
case IDC_TABCTRL1:break;
case IDC_TABCTRL2:break;
}

}

390 名前:デフォルトの名無しさん :02/12/04 00:43
あるウインドウAが子ウインドウを3つくらい持ってるんだが(自力で位置調整して表示してる)
WM_SIZEでウインドウAのサイズを変えたときに子ウインドウの位置・サイズもMoveWindowで
かえてるんだけど、ドラッグしてサイズ変更してるときとかはウインドウがちらついてしょうがない。
MFCで作られたやつはサイズ変更してもほとんどちらつきは無いけど、こういうのってどうやって
SDKレベルで実装すればいいんですか?

391 名前:デフォルトの名無しさん :02/12/04 00:45
WM_ERASEBKGND?

392 名前:デフォルトの名無しさん :02/12/04 01:04
>>392
サンクス。試してみます。

393 名前:392 :02/12/04 01:05
あ、>>391ね。

394 名前:デフォルトの名無しさん :02/12/04 03:55
某ネットゲーのDirectXフルウィンドウ表示を、
通常のソフトの様に表示させようと思って、
色々試したのですが、SetWindowLong SetWindowPos等を
使ってみたりしても、変更できず、色々探したのですが、
あまり有益な情報が出てこなかったので、どなたか、
何かヒントでもあれば、教えて下さい。

395 名前:デフォルトの名無しさん :02/12/04 05:18
>>394
デバイスリセットしないと無理だよ?
第一ソフト側で切り替えられないなら
フルスクリーン依存の処理ばっかりだろうし。

396 名前:デフォルトの名無しさん :02/12/04 05:36
VMWareつかう(w

397 名前:デフォルトの名無しさん :02/12/04 10:11
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpsCmdLine, int nCmdShow)
{
MSG msg;

if (!hPrevInstance) {
if (!InitApp(hInstance))
return FALSE;
}
if (!InitInstance(hInstance, nCmdShow)) {
return FALSE;
}
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

上記のプログラムをビルドすると
「error C2275: 'MSG' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。」
となってしまうのですが、なぜでしょうか?
ファイル名を「prog.cpp」にするとビルド出来るのですが「prog.c」にするとエラーになってしまうのですが。

398 名前:デフォルトの名無しさん :02/12/04 10:11
システムのタスクバーやOfficeツールバーのように画面の一部分を占有するためには
どのAPIを使えばいいのでしょうか?

399 名前:デフォルトの名無しさん :02/12/04 10:18
>>397
行番号見てるか?

400 名前:デフォルトの名無しさん :02/12/04 10:39
LAN間でソケット通信をしたいと思っているのですが、
どのようなAPIを使えばいいのでしょうか?


401 名前:デフォルトの名無しさん :02/12/04 12:50
>>398
AppBarでぐぐる
>>400
WinSock

402 名前:398 :02/12/04 13:15
>>401
あんがと。良い検索のキーワードが思いつかなかったよ。

403 名前:デフォルトの名無しさん :02/12/04 18:08
だれかBrowser Componentのhostingで、

<!--[if gte IE 5 ]>
<link rel="stylesheet" type="text/css" href="style.css">
<![endif]-->

の IEのバージョンを詐称するやり方知りませんか?


IMarkupTextFrags や IMarkupPointer あたりを使うのかと思いきや、
どっからこのInterfaceを取得してよいのかわからん・・・

404 名前:デフォルトの名無しさん :02/12/04 18:55
>>402
「Windows ソケット通信」でボロボロ出てきたけど?

405 名前:デフォルトの名無しさん :02/12/04 18:59
>>404
ほー、「Windows ソケット通信」でAppBarについて出てくるのか。

406 名前:404 :02/12/04 19:12
  _, ,_
( ´_ゝ`) すまなかった

407 名前:デフォルトの名無しさん :02/12/04 19:15
>396
VMWare って DirectX 動いたっけ?

408 名前:デフォルトの名無しさん :02/12/04 19:22
>>407
こちらをどーぞ。
http://www.networld.co.jp/products/vmware/faq/ws_video-sound.htm

あぁVMwareほしい・・・。高い・・・。

409 名前:デフォルトの名無しさん :02/12/04 20:42
WinSockで質問ですが、以下のソースでconnectするとエラーになるのですが、
何が原因かwかったら教えていただきたいのですが・・

bool __fastcall TWinSock::Open( void )
{
  WORD vr = MAKEWORD(1, 1);
  WSADATA wd;
  // 初期化
  if( ::WSAStartup( vr, &wd ) ) return false;
  // ソケット作成
  if( (SocketHandle = ::socket( PF_INET, SOCK_STREAM, 0 )) == INVALID_SOCKET ){
    ::WSACleanup( );
    return false;
  }
  // 接続
  struct sockaddr_in sa;
  sa.sin_family = AF_INET;
  sa.sin_addr.s_addr = inet_addr("192.168.1.22");
  sa.sin_port = htons(1);
  ::ZeroMemory( sa.sin_zero, sizeof( sa.sin_zero ) );
  if( ::connect( SocketHandle, (struct sockaddr *)&sa, sizeof( sa ) ) == SOCKET_ERROR ){
    Close( );
    return false;
  }
  return true;
}


410 名前:デフォルトの名無しさん :02/12/04 21:16
プログラム的に特におかしいところはないが。
つか、ちゃんと相手はいるのか?

411 名前:デフォルトの名無しさん :02/12/04 22:15
> エラーになるのですが

どんなエラーか書かんかい。

412 名前:390 :02/12/04 23:59
>>391
出来ました。ありがとんございますた。

413 名前:デフォルトの名無しさん :02/12/05 17:31
>>410
相手はいます。
>>411
ああ、すみません。これからエラー内容を調べます

414 名前:デフォルトの名無しさん :02/12/05 18:00
CPUの使用率を知りたいです。
っちゅーても、ただの使用率じゃなく、指定した優先順位以上のプロセスの使用率。
たとえば、distributed.net に参加してたりすると常に100%近いですが、タスクマネージャで見ると基本優先度は「低」ですよね。これを引いた値を知りたいんです。
通常のプロセスの動作に影響を与えるCPU負荷を取得する方法を探してます。

415 名前:デフォルトの名無しさん :02/12/05 18:10
>>414
(゚Д゚)ハァ? 何を引くの?
優先度はタスクスケジュールのパラメータで
CPU使用率とは直接関係ないと思うのだが?

416 名前:414 :02/12/05 18:33
>>415
全タスクの内、指定した基本優先度以上のタスクのCPU使用率を知りたいんです。(最初からそう書け?)
ソースのイメージでは以下のような感じ。
CPU使用率 = 0;
for(i = 0; i < タスク数; i++){
 if(タスク[i].基本優先度 >= 通常){
  CPU使用率 += タスク[i];
 }
}


417 名前:デフォルトの名無しさん :02/12/05 19:42
エクスプローラーでカット&ペーストを使ったファイルやフォルダの
移動って、同一ドライブなら(コピーが発生せずに)一瞬で終わって
しまいますが、どういう仕組みなんでしょうか?
あれと同じ事をプログラムから行いたいんですが・・。


418 名前:デフォルトの名無しさん :02/12/05 19:51
>>417
MoveFile()

419 名前:417 :02/12/05 20:15
ありがとうございます。
やってみます。

420 名前:デフォルトの名無しさん :02/12/06 10:09
>>409
192.168.1.22の1番のポートにつないでるけど、
ちゃんとそっちでaccept呼んでる?

421 名前:デフォルトの名無しさん :02/12/06 12:32
エラーをちゃんと言ってくるまで放置でいいだろ
ノートンを窓から投げ捨てろに3port

422 名前:デフォルトの名無しさん :02/12/06 16:53
HRGN = CreateRectRgn(...);
SetWindowRgn(handle, HRGN, 1);

この HRGN はすぐに DeleteObject してしまっても良いのでしょうか?
MSDN には
The operating system does not make a copy of the region.
Thus, you should not make any further function calls with this region handle. In particular, do not close this region handle.
とありますが、ネットでサンプルを検索してみると削除してしまっている人が結構いますので・・・
英語に自信がないのでもしかしたら解釈が間違っているのかと・・・


423 名前:デフォルトの名無しさん :02/12/06 17:05
>>422
日本語MSDNより(SetWindowRgn)

SetWindowRgn 関数が成功すると、オペレーティングシステムは、
パラメータ hRgn で指定したリージョンを所有します。
リージョンのコピーは作りません。
したがって、以後、このハンドルを使用したり解放したりしないようにしてください。

ということで俺は律儀に保有してるよ。

424 名前:422 :02/12/06 17:18
どうもです
削除してもちゃんと動いているように見えるので調べてみて混乱したわけですが
わたしも残す事にします
423さんありがとうございました


425 名前:デフォルトの名無しさん :02/12/06 18:27
>422 氏と似た内容ですが、
SetClipboardData( CF_TEXT, hmemText );
の hmemText は解放して良いのでしょうか?

MSDN には
"The application can read the data, but must not free the handle or leave it locked until the CloseClipboard function is called."
と書かれているので解放できそうなのですが
ネットでサンプルを探すとたいていは「解放してはダメ」と注意書きがしてあります。
これはいったいどういうことなのでしょうか?

426 名前:デフォルトの名無しさん :02/12/06 18:32
>must not free the handle
ほう、「開放できそう」、ね

427 名前:デフォルトの名無しさん :02/12/06 18:37
until the CloseClipboard function is called.
とも書いてあるわけだが。

428 名前:デフォルトの名無しさん :02/12/06 18:37
>426
until the CloseClipboard function is called

429 名前:デフォルトの名無しさん :02/12/06 18:42
>ほう、「開放できそう」、ね
英語見る限り別に解放しても問題ないじゃんか
CloseClipboard()呼んだ後なら...

430 名前:デフォルトの名無しさん :02/12/06 19:31
CloseClipboard、GlobalFreeした時は何とも無くて、
アプリケーションが終了する時にメモリエラーが発生するに100モナー。

日本語版から:
SetClipboardData を呼び出した後で、システムは、hMem パラメータで指定されたオブジェクトを所有します。
アプリケーションはデータを読み取れますが、CloseClipboard 関数を呼び出すまでは、
そのハンドルを解放することや、ロックし続けることを避けなければなりません。
(CloseClipboard を呼び出した後も、アプリケーションはそのデータにアクセスできます。)
hMem パラメータがメモリオブジェクトを指している場合、そのオブジェクトは、
GMEM_MOVEABLE フラグを指定して GlobalAlloc 関数で割り当てたものでなければなりません。


431 名前:デフォルトの名無しさん :02/12/06 19:33
MSDNのサンプルでも解放はしてないみたいだけど...

解放(GlobalFree)って、すなわちクリップボードの破棄になる?
っていうかクリップボードを明示的に破棄したい場合ってどうするの?

432 名前:430 :02/12/06 19:36
EmptyClipboard()を使う。


433 名前:431 :02/12/06 19:45
>>432 あ、確かに。

434 名前:デフォルトの名無しさん :02/12/06 20:31
今思うに、CloseClipboardした後アプリが死んでも、
クリップボードのデータは残るから、GlobalFree
してもいいんじゃないかな。

435 名前:デフォルトの名無しさん :02/12/06 21:36
(´-`).。oO(どこにのこるんだ

436 名前:デフォルトの名無しさん :02/12/06 21:44
GetClipboardData の場合は破棄しちゃまずいけど、
SetClipboardData の場合は問題ないんじゃない?
俺はエラー起こったことないけど…

437 名前:デフォルトの名無しさん :02/12/06 22:42
サンプルが解放を禁じている歴史的背景とおぼしきものがここに。
ttp://www.hidecnet.ne.jp/~sinzan/tips/win/win_tip04.htm

今の MSDN の記述からすれば解放はできそう。


438 名前:デフォルトの名無しさん :02/12/06 23:58
マウス使ったお絵かきプログラムで、取得したマウスの座標の
・ストローク(一本の線)の数
・一本のストロークに含まれる座標点(x,y座標)
・一本のストロークに含まれる座標点の数
を変数に保存しておきたいのですが、

typedef struct{
 int PCount;//ストロークの座標点の個数
 POINT SPoint[1000]//ストロークの座標点;//1000個決め打ち
} SPOINT;

typedef struct{
 int SCount;//ストロークの数
 SPOINT Stroke[1000];//同様に1000個決め打ち・・・
} STROKE,*PSTROKE;

STROKE a;

今はこんな感じの構造体作ってやってますが、もっと良い方法はないものかと思いまして。
特に構造体の確保やストロークの座標点などは動的にメモリに確保する方が良さそうですが。
Win32SDK+VisulaCで開発しています。

439 名前:デフォルトの名無しさん :02/12/07 00:23
自分ならこう。

typedef struct _STROKEPOINT{
 list<POINT> list_point//ストロークの座標点の履歴
} STROKEPOINT;

typedef struct _STROKE{
 list<STROKEPOINT> list_strokePoint;//STROKEPOINTの履歴
} STROKE,*PSTROKE;


440 名前:デフォルトの名無しさん :02/12/07 00:25
>>438
std::vector/list

441 名前:デフォルトの名無しさん :02/12/07 07:09
>>438
一応突っ込んどく。

びじゅらC

442 名前:デフォルトの名無しさん :02/12/07 16:26
お、なんかmodula-2みたいだ。

443 名前:デフォルトの名無しさん :02/12/07 19:19
動的確保するなら、

typedef struct{
 int PCount;//ストロークの座標点の個数
 POINT* SPoint;//ストロークの座標点;//1000個決め打ち
} SPOINT;

typedef struct{
 int SCount;//ストロークの数
 SPOINT* Stroke;//同様に1000個決め打ち・・・
} STROKE,*PSTROKE;

にしてmallocとかで確保すりゃ良いんじゃないの?
そもそもなんで固定長にしたんだ?
ただ、>>439みたくリスト構造にして管理する方がベターかもな。

444 名前:デフォルトの名無しさん :02/12/07 19:22
std::vector の方がずっといいと思う。

445 名前:443 :02/12/07 19:22
おっとsage忘れた。
ところで>>438はC(not C++)使いだよね?

446 名前:デフォルトの名無しさん :02/12/07 19:25
>>444
まあ、相手はマウスだからな(w
メモリコピーのコストもそれ程気にならないだろう。

447 名前:デフォルトの名無しさん :02/12/07 19:33
メモリコピーのコストがイヤなら std::list
いずれにせよ、コンテナが使えるような状況で自分でリスト構造を書こうとするのは
漏れはイヤだったらイヤだ。

448 名前:名無し@沢村 :02/12/07 20:54
皆々様方〜、教えてくださらんか〜♪
それはmidiファイルの読み込みだが、自分で保存したmidiファイルは難なく読み込めるわけよ。
だが、他のmidiシーケンサーで作ったmidiファイルは、ちゃんと読み込めるものと、読み込んで鳴らすとチンドン屋みたいな音になってしまうものとが出てくるわけよ。
ま、ほとんどのmidiファイルはチンドン屋みたいになってしまって、ちゃんと読み込めるものはほんの少しだわな…。
皆々様方〜、私はこの原因を分析した結果原因らしきものを突き止めたわけよ。
それはノートノンやオフのステータスバイトってあるだろ?90や80よ。
それを省略して本来90407F7Fみたいにするところを407F7Fと省略するだろ?
で続けて書くと90407F7F407F7Fになるわな…。
それでデルタタイムというのもあるだろ?
デルタタイムは1バイトから4バイトまでの可変長になっていて、1バイトだったら、例えば90407F7Fになるが、もし4バイト
だったら、例えば90407F7F407F7Fになるだろ?
そうすると90407F7Fに続く407F7Fがステータスバイトが省略されてのノートオンのメッセージなのか、デルタタイムなのか区別がつかんわけよ。
どちらも7F以下で同じだしな…。
皆々様方〜、90407F7Fに続く407F7Fがステータスバイトが省略されてのノートオンのメッセージなのか、デルタタイムなのか区別する方法を教えてくださらんか〜皆々様方〜♪
ぜひお願いします♪
私はいま最後の壁にぶち当たっているのですよ!!!


449 名前:デフォルトの名無しさん :02/12/07 21:11
>>448
ノイズ多過ぎ

450 名前:デフォルトの名無しさん :02/12/07 21:19
>>424
NT系だと無害そうに見えるが9xで破局する

451 名前:デフォルトの名無しさん :02/12/07 22:20
>>448
APIと関係ない。

452 名前:デフォルトの名無しさん :02/12/07 22:37
>>沢村
お前マジでうざいよ
寒いんだよ。


453 名前:デフォルトの名無しさん :02/12/07 23:49
>>448
スレ違いだとは思うけど・・・それと、その口調やめれ。んで、だな。
デルタタイムはすべてのメッセージの前に付く。
デルタタイムの後に、ランニングステータスバイトが、あるか、ない。
その後に、ノートの音階とかベロシティが来る。
その後は、またデルタタイムが来て、その後にランニングステータスバイトがあるかもしれないしないかもしれなくて、その後に音階とかベロシティが来る。
んで、またデルタタイムが来て、・・・って感じ。デルタタイムはすべてのメッセージの前に必ずある。わかった?

454 名前:438 :02/12/08 01:01
みなさまレスありがとうございます。
私はC++は使ったことがなかったのでそのような方法は気が付きませんでした。
もっと勉強しなければ・・・。


455 名前:デフォルトの名無しさん :02/12/08 01:15
つかC++の標準リストクラス使うのもいいけど、リスト構造を全く知らないんなら
まずは自力でリスト作って理解したほうがいいと思うのだが。

456 名前:デフォルトの名無しさん :02/12/08 05:28
つーか、「沢村」 は定型の荒らしコピペだから、みんな以降無視してくれよ。

457 名前:デフォルトの名無しさん :02/12/08 12:43
>>455
禿同
表面だけ学んでも、ねぇ。

458 名前:438 :02/12/08 19:00
リスト構造は一応理解しています&プログラムも作りました。

459 名前:デフォルトの名無しさん :02/12/09 20:44
済みません、教えてください。

メニューが出ていた場合に、その矩形領域を取得するにはどうしたら良いのでしょう?

クライアント領域に表示している画面イメージを取得しているのですが、他のアプリ
のウィンドウがその上にある場合には、その部分のイメージを取得したくないので
クライアント領域をクリップして、子ウィンドウのクリッピング領域をCombinRgnでOR
をとった上でイメージを取得しているのですが、
メニューに隠れた領域が、隠れた領域が、真っ黒になってしまいます。

トップレベルのウィンドウの子ウィンドウのクリップ領域もORをとってみたのですが、
症状は変わりません。そもそも、メニューからウィンドウハンドルが取れるのか
どうかも知らないヘタレです。

出来れば、くオーナードロウなどには手を出したり、メニューを出す部分に手を加えたくありません。
よろすくおながいすます。

460 名前:デフォルトの名無しさん :02/12/09 20:50
>>459
隠れた領域は実際に何も描かれてないのだから無理。

461 名前:デフォルトの名無しさん :02/12/09 21:25
言葉が足りず済みません。
メニューに関しては、メニューに隠れた部分が真っ黒になるのではなく、
メニューのイメージを含んで取得したいのです。

462 名前:デフォルトの名無しさん :02/12/09 22:57
>459
ポップアップメニューのウィンドウクラスは "#32768" なので
HWND hwndMenu = FindWindow( "#32768", NULL );
とやればメニューのウィンドウハンドルは取れるかも。

ただ、普通に
> クライアント領域に表示している画面イメージを取得
したのなら
> メニューに隠れた領域が、隠れた領域が、真っ黒
にはならずにメニューが取得されるはず。

具体的に何がやりたくて、どう実装してみたのかが知りたい。

463 名前:デフォルトの名無しさん :02/12/10 08:30
HHOOK hHookMouse = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseProc, DLLLocal::hInstance, NULL);
HHOOK hHookMessage = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)CallWndProc, DLLLocal::hInstance, NULL);

これで、MouseProc にはちゃんと制御が行って、CallWndProc には制御が全く来ないという
状況なのですが、原因わかる人いますか?
ちなみに、SetWindowsHookEx() そのものは両方とも成功しているっぽいです。

464 名前:ヘタレ459 :02/12/10 11:12
>>462
ありがd。
昨日帰り道で同じ事を思いついて、今朝着てやって見たところ、思ったとおりに出来ました。
やりたいことは、あるウィンドウのクライアント領域のイメージを取りたい。
ただし、他のアプリケーションのウィンドウと重なっている部分は除く。
ただし、自分のメニューで隠れている部分は、メニューのイメージを表示する。
できあがったのは、こんな↓感じです。なにかおかしな点、改善点があったら何でもWelcome。
(つづく)

465 名前:ヘタレ459 :02/12/10 11:13
BOOL CALLBACK EnumChildWindowsProc(HWND hWnd, LPARAM lParam)
{
  HRGNclipRgn = (HRGN)lParam;
  HRGNrgn = ::CreateRectRgn(0, 0, 0, 0);
  HDCDC = ::GetWindowDC(hWnd);
  ::GetRandomRgn(DC, rgn, SYSRGN);
  ::CombineRgn(clipRgn, clipRgn, rgn, RGN_OR);
  (void)::DeleteDC(DC);
  (void)::DeleteObject(rgn);
  return TRUE;
}
  ...
  clipRgn = ::CreateRectRgn(0, 0, 0, 0);
  ::GetRandomRgn(DC, clipRgn, SYSRGN);
  ::EnumChildWindows(m_hWnd, EnumChildWindowsProc, (LPARAM)clipRgn);
  hWndMenu = ::FindWindow(_T("#32768"), NULL);
  if (menuWnd != NULL) {
    ::GetWindowThreadProcessId(menuWnd, &pid);
    if (pid == GetCurrentProcessId()) {
      HDC DC = ::GetWindowDC(menuWnd);
      HRGN rgn = ::CreateRectRgn(0, 0, 0, 0);
      ::GetRandomRgn(DC, rgn, SYSRGN);
      ::CombineRgn(clipRgn, clipRgn, rgn, RGN_OR);
      (void)::DeleteDC(DC);
      (void)::DeleteObject(rgn);
    }
  }
  ::GetDCOrgEx(DC, &org);
  (void)::OffsetRgn(clipRgn, -org.x, -org.y);
  ...


466 名前:デフォルトの名無しさん :02/12/10 15:09
>>463
CallNextHookEx()してないとか。

467 名前:463 :02/12/10 18:06
>>466
レスありがと。

でも、CallWndProc が呼ばれてないので CallNextHookEx() しようがないんですが・・・。
それとも、別の常駐プロセスがポカしてる可能性もあるって事ですか?
他にフックしてそうなプロセスがあるわけでもないのですが・・・。

ちなみに、WH_CALLWNDPROC の代わりに WH_CALLWNDPROCRET や WH_GETMESSAGE
を指定しても同様でした。

468 名前:デフォルトの名無しさん :02/12/10 19:24
IEで、アドレスに
http://
telnet://
ftp://
などとやった場合、そのプロトコルに応じた処理を行うけれど、
自分でそれを実装する場合にはどうすればいいの?

例えば、
xyz://
とやりたいんだけれど

469 名前:デフォルトの名無しさん :02/12/10 19:31
HKEY_CLASSES_ROOT\http

のマネをすりゃいいんじゃないの?
よく知らないけど。

470 名前:デフォルトの名無しさん :02/12/10 19:35
>>469
早速のレスthx!
ちょっと見てみたけれど、例えばftpみたいに結果を改めてブラウザに表示するには
どうすればいいんだろう?

471 名前:デフォルトの名無しさん :02/12/10 19:35
Pluggable Protocol Handler

472 名前:デフォルトの名無しさん :02/12/10 19:40
>>471
ありがとう。調べてみる。

473 名前:デフォルトの名無しさん :02/12/11 02:34
背景に画像を設置したエディタを作りたいのですが、方法が分かりません。教えてください。

ちなみに、今の私の現状は、EDITで作って、CTL_COLOREDITメッセージで、文字の背景を透過にしてから、画像のブラシを返したところ、画像が更新されず、昔書いた文字が消えなかった。
行き詰ったので、RICHEDITに乗り換えてみたところ、文字の背景の透過自体を受け付けてくれない気がする。さらに、画像のブラシを返すような関数が今のところ見つからないという状況です。

474 名前:デフォルトの名無しさん :02/12/11 03:15
起動中のプログラムにフックしてその中で呼ばれているAPIのかわりに
自作関数を呼ぶようにすることは可能ですか?

 



475 名前:デフォルトの名無しさん :02/12/11 04:18
>>474
可能。

476 名前:デフォルトの名無しさん :02/12/11 08:47
> でも、CallWndProc が呼ばれてないので CallNextHookEx() しようがないんですが・・・。
MouseProcで。なに寝ぼけてるんだ?

477 名前:デフォルトの名無しさん :02/12/11 11:31
>>473
その目的に近い動作をしているアプリをSpy++

478 名前:デフォルトの名無しさん :02/12/11 14:16
>>473

CreateBrushIndirectとかで作ったブラシを
WM_CTLCOLOREDITの戻り値として使いたいってこと?

479 名前:474 :02/12/11 15:21
>>475
いい検索キーワード紹介してください

480 名前:デフォルトの名無しさん :02/12/11 15:30
"apiフック"

481 名前:463 :02/12/11 17:17
>>476
MouseProc でならちゃんとしてるよ。

寝ぼけてると言われても、そう取れるレスじゃん・・・。

482 名前:474 :02/12/11 17:42
>>480
ありがとう
ttp://www.users.gr.jp/ml/archive/delphi/51202.asp
こんなのみつけたので
作ってみます

483 名前:名無し@沢村 :02/12/11 22:34
銀行のATMにアクセスするプログラムの書き方

//ネットワークに流れるデータを受信する
recive(data);
//データがATMのときは
if(data==ATM)
//1億円を自分の口座に振り替える。
sendmoney(100000000)from(anybank)to(mybank);


484 名前:473 :02/12/12 03:04
>478
説明が悪かったですね。WM_CTLCOLOREDITで、返り値にブラシは返せましたし、画像は表示されました。
文字の背景を透過させることで、画像の上に文字も載せられました。
でも、一度表示された文字が消えないという問題が出ました。
例えば「nnnn」という文字書いて、ウインドウをスクロールさせると、
nnnn
nnnn
nnnn
nnnn
という風にディスプレイには表示されてしまうのです。
とはいえ、文字データ自体が増えている訳ではないので、画面の更新さえすれば何とかなると思ったのです。
しかし、WM_PAINTで画面全体をBITMAP画像で更新するという方法も試したのですが、昔に書いた文字が消えてしまうという問題が出てきました。
昔書いた文字データを、記憶はしているようなのですが、古いデータはWM_PAINTでの画面の更新には反応しないという仕様のようです。

RICHEDITも今ひとつ見通しが立ちません。
もしかすると、全て自作の関数で作るべきなのかもしれないと考えているところなのですが、
どの様な方法で実現できるのか、アドヴァイスをいただけませんでしょうか?

485 名前:デフォルトの名無しさん :02/12/12 03:37
WM_SCROLLでInvalidRect(NULL)すれ。

486 名前:484 :02/12/12 06:59
>485
それも一度試したのですが、結局WM_PAINTが呼ばれるだけですよね。
たぶん、EDITの文字の更新はWM_PAINTを通してないと思うんです。
昔書いた文字が何故か更新されないという問題が結局残るんですが。

487 名前:478 :02/12/12 12:11
>>486
自分もEDITをサブクラスして、
入力補完もどきを作ってみた事があるが、
どうやらGetDCして書き換えてるみたい。

>>文字の背景を透過させることで、画像の上に文字も載せられました。
SetBkMode使ったの?
だったら、EDITクラスの関知しないところだから、
自前で更新してやるしかない。

嫌な方法だけど、RedrawWindowとかMoveWindowは試した?

488 名前:486 :02/12/12 14:29
RedrawWindow,MoveWindowは試してなかった。
今夜にでもやってみます。

でも実はEDITクラスでは多種の文字の色とかを混在できないっぽいので、
最近はRICHEDITに走ろうとしてるんです。
 でも、RICHEDITにはSetBkModeが通用しない様なんですが、無理なんでしょうか?
それとも、通知メッセージのマスクがかかっているって、「猫でもわかる・・・」にあったんですが、
それに引っ掛かっているんでしょうか?

489 名前:486 :02/12/13 03:35
MoveWindowで何とか表示は出来るようです。
ちなみに、ソースと実行ファイル(色々試した跡があって、ソースは見にくいです。)↓
http://longhair-k.hp.infoseek.co.jp/data_html/text/Program/KoumeEditer/KE_001.exe

まだスクロールには弱い。
スクロールでの描写はまだやった事ないので調べてみます。

490 名前:478 :02/12/13 13:28
RichEditには詳しくないので、解決方法があるかもしれないが、
過去自分もEDITクラスで色々やったが、意味不明な挙動が多々あった。
悪い事は言わないからやめとけ。

自前でクラス作った方が話が早い。
ただし、バッファ管理、描画処理等プログラミングの醍醐味満載だけどな。

491 名前:デフォルトの名無しさん :02/12/13 13:32
WM_GETTEXT と WM_SETTEXT に自前で応答するにはどうしたらいいの?
外部プロセスからのが捕捉できないんだけど・・・。

492 名前:478 :02/12/13 13:49
呼び出し側でGetWindowTextを使ってる限り無理。


493 名前:491 :02/12/13 13:50
いや、SendMessage() なんスけど・・・。
それでも結局 Get/SetWindowText() と一緒という事でつか?

494 名前:478 :02/12/13 15:17
SendMessageならプロシージャは呼ばれるはず。
Spy++で呼ばれるウィンドウのメッセージ見てみて。

まさかメッセージループで捕まえようとはしてないよね?

495 名前:478 :02/12/13 15:26
> まさかメッセージループで捕まえようとはしてないよね?

Σ(゚д゚lll)ガーン
そーしてまつた・・・。
どうするの? フック?
MSDN には何も書いてないみたいだけど・・・。
Spy++ で見ると、「自分の知らないところ」 が応答しているように見えまつ。

496 名前:478 :02/12/13 15:48
MSDNライブラリ日本語版のSendMessageより:

指定されたウィンドウが、呼び出し側スレッドが作成したものであった場合、
そのウィンドウのウィンドウプロシージャがサブルーチンとして即座に呼び出されます。
指定されたウィンドウが、他のスレッドが作成したものであった場合、
システムはそのスレッドへの切り替えを行い、
次に適切なウィンドウプロシージャを呼び出します。
複数のスレッド間で送信されたメッセージが処理されるのは、
受信側スレッドがメッセージ取得コードを実行したときだけです。
送信側スレッドは、受信側スレッドがメッセージの処理を終えるまで、
ブロックされます(待機状態になります)。


だから、自前のクラスでなかったらサブクラス化しれ。


497 名前:491 :02/12/13 16:04
495 は自分の番号間違えますた・・・。

>>496
ごめんなさい、メッセージループとウィンドウプロシージャを混同してました。
自分で RegisterClassEx() したウィンドウなんですけど、ウィンドウプロシージャに
他プロセスからのメッセージが飛んでこないです。
(自プロセスからのメッセージは捕まえられまつ)
なのに、他プロセスから WM_SETTEXT すると Spy++ で見れるウィンドウテキストが
変化するので、「自分の知らないところが応答しているように見える」 状態なんです
けど・・・。

498 名前:478 :02/12/13 16:18
Spy++では該当ウィンドウにWM_SETTEXTは送られてるよう?

(知ってるとは思うけど・・・
ウィンドウリストの該当ウィンドウ上で右クリック->メッセージ)

499 名前:デフォルトの名無しさん :02/12/13 16:55
>>498
何か、OS 再起動したらちゃんと動いてくれるようになったよ・・・。
振り回してごめんなさい。
しかし、再起動で直るって事は、どっかメモリ壊してるんだろうか・・・、、

Spy++ のメッセージウィンドウでもちゃんと WM_GET/SETTEXT の S と R が
確認できますた。

でも、外プロセスからでもテキストの取得をちゃんとできるのに、Spy++ に表示
されてるウィンドウテキストが "" のままだけど、これはいいのかなあ?

500 名前:478 :02/12/13 18:03
たぶんGetWindowText使ってるんでしょ。


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