Win32API質問箱 Build48

このエントリーをはてなブックマークに追加
653デフォルトの名無しさん
ShowWindowでもタスクトレイにアイコン化されたものを
元のサイズに戻せないんだけどどうすればいい?
654デフォルトの名無しさん:2007/01/06(土) 16:02:37
OpenIconじゃね?
655デフォルトの名無しさん:2007/01/06(土) 16:18:19
>>654
それでもうまくいかないです
別のアプリだからかな?
hideになってるフォームが表示されるだけで
実体はアイコン化されたままなので描画されないんです
656デフォルトの名無しさん:2007/01/06(土) 16:24:45
もしかしてDelphiアプリケーションか?
657デフォルトの名無しさん:2007/01/06(土) 16:25:37
タスクトレイじゃ無くてタスクバーじゃないの?
ShowWindowでいいはずだけど、パラメタ間違ってない?
658デフォルトの名無しさん:2007/01/06(土) 16:28:37
元に戻す操作をした時のWM_COMMANDとかをSPY++で調べてみりゃいんじゃね?
659デフォルトの名無しさん:2007/01/06(土) 16:39:04
>>656
そうです

>>657
タスクバーって最小化されてタブ化されているとこですよね?
そうじゃなくて、時計のところのタスクトレイにアイコン化されて
フォームはhideされている状態で、タスクバーにはタブ化されてません

>>658
それもやってみていたんです。
アイコン化されたものをクリックして元に戻したりしてみたんですが
wm_commandは送られてません
syscommandで元に戻すようにしてみたり
wm_activeしてみたりいろいろしたんですけど
660デフォルトの名無しさん:2007/01/06(土) 16:41:01
Delphiは隠しウィンドウがあるからごにょごにょ
661デフォルトの名無しさん:2007/01/06(土) 16:42:56
>>659
Delphiのウィンドウは透明のアプリケーションウィンドウの子ウィンドウだから、そっちにもメッセージ送らんといかん
662デフォルトの名無しさん:2007/01/06(土) 16:56:10
>>660
>>661
ありがとう
delphiは特殊だったんですね
調べて見ます
663デフォルトの名無しさん:2007/01/06(土) 17:24:53
つーかタスクトレイは最小化したウィンドウじゃないぜ?
なんか勘違いしてないか。
まあ通知用に非表示のウィンドウを1つ持たせるのが普通だけど
そういう決まりがあるわけじゃなし
664659:2007/01/06(土) 17:42:09
TApplicaitonってものだったんですね
この数日ずっと調べてたのにSW_Restoreであっさりいけました^^;
感謝感激

>>663
アイコンはアイコンで別で構造体を定義したものを追加してるだけなんですよね
で、メインフォームはHIDEされていると。
でも、非表示ウィンドウをメインフォームとは別に用意している場合があるってのが
知らなくて苦労しました
665デフォルトの名無しさん:2007/01/06(土) 18:18:21
分からない事があったので、質問させてもらいます。
ttp://www14.big.or.jp/~ken1/tech/tech9.html
void Blit(HDC from,HDC to,int x,int y,int width,int height,int fromx,int fromy,COLORREF tran)
:
mmono=CreateCompatibleDC(from);
bmono=CreateBitmap(width,height,1,1,NULL);
SelectObject(mmono,bmono);
SetBkColor(from,tran);
BitBlt(mmono,0,0,width,height,from,fromx,fromy,SRCCOPY);
ビットマップmmono作成してこれを表示するプログラムなんですが
640×2880のビットマップをfromyに0から480ずつ足していき、
アニメーションをさせたいのです。
しかし、0の値の時しか表示しません。
Blit(hTzk,hBuf,0,0,640,480,0,btStartY,RGB(255 , 0 , 255));
お願いします。
666デフォルトの名無しさん:2007/01/06(土) 18:27:59
事故解決しますた;
表示するとき作成したビットマップを超えたY領域指定した
スンマセン
667659:2007/01/06(土) 21:28:39
いけたと思ったのにいけてなかった
そのときはアイコン化されてなかったのか?

同じコードでやっても全然反応しない
TApplicationをRestoreするとタスクバーに表示されるだけで
アイコンは残ったまま
メインフォームをrestoreしてもフォームが表示されるだけで
アイコンは残ったまま

何が悪いんだろ
668デフォルトの名無しさん:2007/01/06(土) 21:34:26
>>667
タスクトレイのアイコンはフォームの最小化とは無関係だから。
669デフォルトの名無しさん:2007/01/06(土) 21:36:27
>>667
もともとやってることが邪道

外部から無理やりにリストアされた時にタスクアイコンを消去するように組まれてないんだろ。
670659:2007/01/06(土) 21:57:43
>>668
いやまあ、それはそうなんですけど
取り出さないと機能が戻らないんですよね
フォームが再描画されないってことです

>>669
そういう場合もあるんですか・・
ってなると、タスクトレイのツールバーからアイコン情報取得して
何かしらのイベント送って、正規の手順を踏んだように見せないとだめってことかなぁ・・
671デフォルトの名無しさん:2007/01/06(土) 22:08:49
>>670
そういうことじゃない。
タスクトレイのアイコンはフォームの最小化とは無関係ってのは
フォームをRestoreした時に自動的にトレイアイコンも消えるようにはなってないって事。
トレイアイコンを消すのは自分でやるの。
672デフォルトの名無しさん:2007/01/06(土) 22:23:40
自分で簡単なタスクトレイアプリ作ってみればわかると思うよ
673デフォルトの名無しさん:2007/01/07(日) 00:06:21
自分でタスクトレイアプリを作ったことが一度もないのに
他のアプリのトレイアイコンを操ろうとするなんておこがましいと思わんかね?
674659:2007/01/07(日) 00:27:36
もしかしてこういうことをいいたいんですか?

Shell_NotifyIcon(NIM_DELETE, NID)

アイコンの追加も削除の仕方も知ってるんですけど・・

フォームとアイコンは関係ないとか言ってますけど
そりゃ表示上は別々に機能するでしょうけど
内部で連動してる場合もあるわけで
アイコンを削除したらいいって単純なことじゃないんですけど
675デフォルトの名無しさん:2007/01/07(日) 00:31:17
いや、俺も流石にこれ以上は釣られないぞ
676デフォルトの名無しさん:2007/01/07(日) 00:32:21
>内部で連動してる場合もあるわけで
ありません。完全に別のものです。
677デフォルトの名無しさん:2007/01/07(日) 00:34:43
>>674
OS/Shell/Applicationの管轄がそれぞれどこからどこまでかもう一度勉強しなおしてきてくれ。
678659:2007/01/07(日) 00:39:30
>>676
では、アイコンは勝手に削除されるわけですね?
アプリが終了しようとしまいと関係なく独立しているわけだ。なるほどね

ここでレベルの低い人を相手にしてても仕方がないので
自分で調べますよ
679デフォルトの名無しさん:2007/01/07(日) 00:50:31
>>678
>アプリが終了しようとしまいと
いいえ、フォームとトレイアイコンの関連の話です。
680デフォルトの名無しさん:2007/01/07(日) 00:54:40
アプリが終了したら、プロセスが所有するリソースは基本的にOSが回収するってだけで。
フォームとトレイアイコンの関係とは全く別問題だよね?
681659:2007/01/07(日) 00:58:09
そんな屁理屈みたいなこと言って楽しいわけ?
表示上は別物だって何度も言ってるでしょ
682デフォルトの名無しさん:2007/01/07(日) 00:59:36
もう秋田
683659:2007/01/07(日) 00:59:44
煽りだけは一丁前だけど
全然解答だせないじゃないw
初心者に毛が生えたような知識でえらそうにするなよw
684デフォルトの名無しさん:2007/01/07(日) 00:59:52
MutexとかOSが回収しない物もあったような
685デフォルトの名無しさん:2007/01/07(日) 01:02:59
自分に利が無いと判断した時点でレスは全て無視しとけ
686デフォルトの名無しさん:2007/01/07(日) 01:04:13
>>678
アイコンを管理してるのはシェルだから、アプリケーションが落ちたからといってすぐに消えるわけじゃない。
687659:2007/01/07(日) 01:08:53
どうでもいいけど、アイコン化されたアプリを
元のサイズに戻して、機能も戻す方法は教えてくれないわけ?
688デフォルトの名無しさん:2007/01/07(日) 01:18:52
>687
どっちかってぇとDelphi/BDSスレに行ったほうがいいんじゃまいか?
ただそんな態度じゃ相手にしてもらえないような気もするが。
689デフォルトの名無しさん:2007/01/07(日) 01:23:40
NOTIFYICONDATA とWM_TRAYICONMESSAGEでいけると思うがね。
あとはテメーで調べろ。
690デフォルトの名無しさん:2007/01/07(日) 01:24:28
クリックしたときに送られるWM_COMMANDのIDとかがわからないならクリックのメッセージ送ればいいだろ・・・
691659:2007/01/07(日) 01:29:47
ほんと頭にくるね
こっちはわかり易く現状言ってるのにそれに揚げ足取るなんてな
フォームとアプリとアイコンが別物だってことぐらい知ってるわ

表現上わかり易く伝えるために、フォームは表示されるけど
内部的にはアイコン化された状態だって言ってるのに

「フォームが最小化してアイコンになるわけじゃない」
とかW
>>657
パラメータってなんだよWWパラメータってW
>>658
WM_COMMANDってwwメニュー操作じゃねーんだからなw

>>689
ありがとう
それで調べてみる

>>690
わからないじゃなくて送られてないの
あとさ、クリックイベント送るっつーことは
タスクトレイ、つまりtoolbarに対してグローバルメモリ割り当てて
情報取り出してメッセージ送らなきゃならないわけ
そこまで面倒なことしなくてもいいのか知りたいから質問しただけ
692デフォルトの名無しさん:2007/01/07(日) 01:34:13
さあて>>659が必死になってまいりました
693659:2007/01/07(日) 01:36:10
>>689
つか、それアイコンの構造体じゃねーか
そんなのわかってんだよ
自アプリのアイコンを削除したいわけじゃねーの

>>690
ボタン押すのと同じと思ってないか?
694デフォルトの名無しさん:2007/01/07(日) 01:37:47
つか間違った意見であっても"出してくれる人"に頭下げられない奴はダメな気がする
695デフォルトの名無しさん:2007/01/07(日) 01:40:55
自分でできないで人に頼ってるくせにこいつは何でこんなに偉そうなんだ?wwwwwww
696659:2007/01/07(日) 01:42:03
>>694
間違っていることを伝えられるのも2ちゃんねる
煽りや虚言にお礼言っててどうすんだよ・・

>>695
わからないならだまっとけ
697659:2007/01/07(日) 01:46:27
もう一度言う。自アプリのアイコンを削除したいわけじゃない
698デフォルトの名無しさん:2007/01/07(日) 01:50:20
こいつ最低だな。
現実世界でも、自分の思い通りの回答やらアドバイスしないと罵倒しまくる奴なんだろうな。
699695:2007/01/07(日) 01:50:55
よーしDQNな俺様が解決してやる
用件定義を言え>>655でいいのか?
700デフォルトの名無しさん:2007/01/07(日) 01:51:14
人間として最低。
701695:2007/01/07(日) 01:54:05
概要はタスクバーにあるアイコンを元のサイズに戻したいってわけか
Shell_NotifyIcon(...);
ShowWindow(ウィンドウハンドル, SW_SHOW);
でいいんでね?
702695:2007/01/07(日) 01:54:41
別アプリならハンドルは取得してるはずだよな?な?
703デフォルトの名無しさん:2007/01/07(日) 01:56:46
>ShowWindowでもタスクトレイにアイコン化されたものを
>元のサイズに戻せないんだけどどうすればいい?

って事だろ。
ならば、WINDOWPOSあたりかな。

704659:2007/01/07(日) 01:58:41
>>699
そです。

>>702
取得済みです
でも、そのハンドルが正しいかはわかりません
一応spyでメインフォームだけでなく、関連するフォームの
すべてに対してSW_RESTOREを送ったけれどもだめでした
705695:2007/01/07(日) 02:01:03
タスクトレイを元に戻すのってまず最初にタスクトレイにある対象アイコンを削除してから
表示しないとダメなんじゃなかったっけ?NOTIFYICONDATA構造体で

NOTIFYICONDATA notify;

notify初期化

/* 削除 */
Shell_NotiffyIcon(NIM_DELETE, ¬ify);
ShowWindow(対象ハンドル, SW_SHOW);



でいけるんでね?
706デフォルトの名無しさん:2007/01/07(日) 02:02:57
SPY++等で、対象のアプリがNOTIFYICONDATAのuCallbackMessageとuIDに設定した値を調べて、
対象のアプリのウィンドウに、SendMessageでwParamにuID、
lParamに対象のアプリが元のサイズにもどるマウス操作のメッセージを突っ込めばいいでない?
707659:2007/01/07(日) 02:08:49
>>705
それをやればいけるのはわかっているんですけど
他プロセスのnotifyを取得するには
そうなるとVirtualAllocExでメモリ確保してReadProcessMemoryで
自プロセスメモリにコピーしてとかやらないとだめですよね?
708659:2007/01/07(日) 02:11:42
>>706
私もそれは考えました
ただ、どうもそのメッセージを送っている相手のハンドルが違っているためか
上手く取得できません
アイコンを作成するときに、どのハンドルにそのコールバックmsgを送るか指定しますよね?
つまり、そのハンドルを持っているウィンドウが隠されてたり、わからなかったりすると
うまく取得できないですよね?
709695:2007/01/07(日) 02:11:43
OpenProcessとかでマップすればなんとかならないっけ?
少なくともReadProcessMemoryなんかめんどくさい事は少なくとも俺は絶対やらない(やりたくない)
710デフォルトの名無しさん:2007/01/07(日) 02:17:59
馬鹿が知識もなしにとんちんかんなことをやろうとしてるのがわからんあいのか
711659:2007/01/07(日) 02:19:54
>>706
ちなみにuCallbackMessageとuIDのメッセージを送るのは
何を見ればわかりますか?
WM_APP
WM_ACTIVATEAPP
かなと思ったんですがどうも違うみたい
712659:2007/01/07(日) 02:21:44
>>710
バカの定義は知識がないことですか?
バカがバカと気づいていない、知識があると思い込んでいるのが
バカだと私は思いますよW
バカじゃないなら教えてくださいな
713デフォルトの名無しさん:2007/01/07(日) 02:22:57
ShowWindowでもタスクトレイにアイコン化されたものを
元のサイズに戻せないんだけどどうすればいい?
714デフォルトの名無しさん:2007/01/07(日) 02:23:36
今夜はいつもに増して乳臭い流れだな
715695:2007/01/07(日) 02:23:41
表示させる前提がタスクトレイのアイコン削除だから
頑張って削除できるようにしろとしかいいようがない。おじさん寝るよ
716695:2007/01/07(日) 02:24:45
>>712
後できればcapslockを解除汁
717デフォルトの名無しさん:2007/01/07(日) 02:26:27
バカの定義
バカがバカと気づいていない、知識があると思い込んでいる
718659:2007/01/07(日) 02:27:51
>>715
>>699

>>716
今マクロ記述してたから・・
719659:2007/01/07(日) 02:29:49
>>715
ツールバー内の何番目のアイコンがどのプログラムかなんて
調べれたら、そりゃTB_DELETEで削除はできますけど
どのアイコンがどのプログラムかなんて調べようとしたら大変で・・・

とにかくお休みなさい。
ありがとうございました
720695:2007/01/07(日) 02:31:30
>>718
残念だがおじさん他プロセスのNOTIFYICONDATAの取得
なんてやったことないからわからない。

そうかマクロか。

721デフォルトの名無しさん:2007/01/07(日) 02:50:45
689だが・・・書き忘れた事があって来たんだが・・よくわからん事になってるなぁ。

sleepかませないとうまくいかない事が多いよ。数値はマシンによって違ってくるケースもあるから
そこら辺はてきとーに。漏れは100程度にしてるが。

元の大きさに戻らないって事だろ?
って事はハンドルは取得出来てるって事だよな。
722デフォルトの名無しさん:2007/01/07(日) 02:51:56
>>711
uCallbackMessageはクリックしたときに送られるメッセージの中から推測するしかないだろうね。
そのwParamがuID。lParamにはそのアイコン上のマウスメッセージが入ってる。

WM_MOUSEMOVEって送られてきたっけ
723デフォルトの名無しさん:2007/01/07(日) 02:59:37
すまん途中で書きこんでしまった。

もしWM_MOUSEMOVE飛んでくるなら、タスクトレイ上でマウス動かしまくれば、
lParamにWM_MOUSEMOVEの値(0x0200)で大量にメッセージ来るからわかるはず…

メインウィンドウじゃないウィンドウに通知させてるかもしれないなら、
これでプロセスに属するウィンドウ調べてSPY++で補足とか。
http://www001.upp.so-net.ne.jp/yamashita/product/debug/ww.htm

SPY++って単純にウィンドウの列挙で、どのプロセスかは開かないとわかんなかったよね?
いま、手元にSPY++ないんで見当はずれのこと言ってたらスマソ。
724659:2007/01/07(日) 03:28:28
>>721
フォーム自体は元のサイズに戻るし表示もされるけど
そのアプリが描画する処理をしてくれないんです
たとえば、そのフォームのステータスバーの時間が止まったままになってるとか
で、アイコンを直接クリックすれば、描画が始まるという具合です

sleep?どのsleepの意味ですか?




>>722
監視するのはそのアプリのハンドルでいいんですよね?
タスクトレイのツールバーや、その中のアイコンボタンってことじゃないですよね?
アプリに対してはWM_*MOUSE*関連のものは一切送られてないです
WM_APP AM_ACTIVATEAPPとか、でもこれはアクティブになるウィンドウと
非アクティブに送られるものだから違うだろうし
あとは描画させるためのWM_ERASEBKGNDやらサイズ変更を促すものやら
SHOWWINDOWも送られてくるけどuIDらしきものがないんです

>>723
> lParamにWM_MOUSEMOVEの値(0x0200)で大量にメッセージ来るからわかるはず…
送られてきてないです
> メインウィンドウじゃないウィンドウに通知させてるかもしれないなら、
> これでプロセスに属するウィンドウ調べてSPY++で補足とか。
> http://www001.upp.so-net.ne.jp/yamashita/product/debug/ww.htm
ありがとう、調べて見ます
> SPY++って単純にウィンドウの列挙で、どのプロセスかは開かないとわかんなかったよね?
私はSPY++じゃなくて、WispectorSpyを使ってます
これはvisibleでない子ウィンドウは表示されないです。
725デフォルトの名無しさん:2007/01/07(日) 03:57:28
本当にここは使えないインターネットですね
726デフォルトの名無しさん:2007/01/07(日) 04:01:40
>>724
オメーそれ対象のアプリがどのタイミングでどのウィンドウに
どのメッセージを受けたときにどうやってタスクトレイから
アイコン消してるかがわからなきゃ一生無理じゃねーか

SPY系のツール使って普通に操作してタスクトレイから復元したときの
メッセージの流れ追うしか解決方法はない
隠しウィンドウが独自メッセージ送ってるかもしれんぞ?
727デフォルトの名無しさん:2007/01/07(日) 04:15:45
>>724
そのアプリ所有のウィンドウね。フォームのウィンドウに通知させてるとは限らないよ。
メッセージはWM_*MOUSE*ではなくて、ユーザ定義のメッセージね。
WM_USER + xxxとかWM_APP + xxxとかなってると思う。
そのlParamにマウスメッセージが入ってる。
ツール上だと、WM_MOUSEMOVEみたいに表記されず単に数値だから注意。


WM_MOUSEMOVE飛んでくるようだから、
WinspectorSpyのProcessタブから、そのアプリのウィンドウ全部監視して、
タスクトレイのアイコン上でマウス動かせばわかると思うよ。
(クリックして元に戻すと、いろんなメッセージ飛ぶから戻さないこと)
728659:2007/01/07(日) 04:43:44
>>727
どうも参考になります
processタブ開いたことなかったけど、こっちのが使い易いですね
調べて見ます
ありがとう
729659:2007/01/07(日) 05:41:02
>>727
言われたとおりやってみたらばっちしでした^^
メッセージを送っているウィンドウは別にありまして
それを監視したらちゃんともとのサイズに戻りました
ほんとにありがとう
730デフォルトの名無しさん:2007/01/07(日) 08:09:49
さあここで一番最初のレスを振り返ってみよう
>>660-661
731デフォルトの名無しさん:2007/01/07(日) 09:08:42
親切に教えるからつけあがるんだ
732デフォルトの名無しさん:2007/01/07(日) 09:11:50
やさしいお兄さんお姉さんが答えてくれる かも
733デフォルトの名無しさん:2007/01/07(日) 09:27:50
かわいい妹かもしれん
734デフォルトの名無しさん:2007/01/07(日) 10:36:34
>>730
ナイスつっこみ!!!
735659:2007/01/07(日) 11:02:33
終わったんで風俗逝ってきまつ
736デフォルトの名無しさん:2007/01/07(日) 11:02:42
本当に本当に本当にこのスレは馬鹿豚どもの集まりだなwww
恥ずかしすぎて見てられないwwwww
737デフォルトの名無しさん:2007/01/07(日) 11:05:20
>>736
キモイよ。
738デフォルトの名無しさん:2007/01/07(日) 11:34:10
教えてください
UNIXのメッセージに相当するWinAPIは名前付パイプであっているでしょうか?
739デフォルトの名無しさん:2007/01/07(日) 12:03:13
いいえ、名つきパイプはメッセージではありません。
740デフォルトの名無しさん:2007/01/07(日) 13:09:57
>>729
何に何をしたら思ったとおりにうごいたのん? そして、どこにつまづいたといった反省点は?
同じ道を歩むかもしれない人の為に、詳しく報告すべきじゃない?
質問したからにはどう解決したのかちゃんと書こうよ。これだけ引っ掻き回したんだしさ。
741デフォルトの名無しさん:2007/01/07(日) 13:25:31
まあ、待て
今ソープ中だ
742デフォルトの名無しさん:2007/01/07(日) 14:14:57
特定のアプリに対してだけ何かしたかったんじゃないのかね
これに汎用性のある手段は無いからな。
だったらそう書けばいいのに。

最近、単純な質問をして後から別プロセスだと情報小出しにするやつが多いが同じ人なのかね?
743デフォルトの名無しさん:2007/01/07(日) 14:20:14
同じ人種なのは確かだ
744デフォルトの名無しさん:2007/01/07(日) 15:42:24
スレ違いかもしれんがSFU使ってるやつっているか?
745デフォルトの名無しさん:2007/01/07(日) 16:17:17
「かも」じゃない。
746デフォルトの名無しさん:2007/01/07(日) 16:25:05
かと言ってUnix板とも違うし、
より妥当なところがあるなら案内してもらえるとありがたい。

で、SFU上では通常のWindows APIを呼ぶことってできるの?
747デフォルトの名無しさん:2007/01/07(日) 16:30:13
普通にコンソールアプリとかWSHのスクリプト作って呼ぶだけじゃだめなの?
748デフォルトの名無しさん:2007/01/07(日) 16:37:00
一般的にWM_PAINTメッセージでペイント描画を行うときに、何ms以内に処理を終えれば、もっさり感がないでしょうか??
もちろん、アプリケーションの種類によりますが、Notepadもどきのようなものを作っております。
よって、スクロールバーによるスクロールができればいいなと思っています。
まだ、実装していないのですが、スクロール時にWM_PAINTでの描画にもたつき、
スクロールがカクカクになるの嫌だなぁと思って、最大でも何ms以内に処理を終える目標を立てればいいのかなぁ考えています。

749デフォルトの名無しさん:2007/01/07(日) 16:55:07
そんなもん実装する前から悩まんでもいいよ。
完成した後で、もっさりが問題になってからチューニングすればいい話だし。
そもそも応答時間なんて環境依存なんだから、目標なんて設定しようがない。
750デフォルトの名無しさん:2007/01/07(日) 18:13:37
俺なら設計の段階で軽くテストしてモッサリ感がなさそうなのを確認してから作る。
設計ミス > 一応完成 > チューニング > 絶望ってのが一番凹む。
751デフォルトの名無しさん:2007/01/07(日) 18:25:07
ダブルバッファリングして遅かったら描画処理の部分を疑う程度しかやらねぇ
752659:2007/01/07(日) 19:08:43
>>740
動画エンコ用のソフトを複数使っているので
その一連の作業を自アプリだけで行おうとしたのが目的です
別々に開いたり閉じたりするのも面倒なので
複数のアプリをボタンひとつで画面に整列させてやりたかったわけです

解決方法は怪しいフォームのプロセスを監視状態にして
タスクトレイのアイコンの上にマウスポインタを移動させて
MOVEイベントが送られているフォームを見つけて
アイコンをマウスクリックで元に戻し
そのときに出てきたWM_USERのパラメータで
SENDMESSAGEを送ってやった次第です

反省点はフォームに直接ShowWindowメッセージを送れば
アイコンが元に戻ると思い込んでたのが間違いでした
すべてのフォームにrestoreメッセージを送っても反応がなかったので
頭から省いてしまっていたわけです

実際にはクリックされたというメッセージを送らなければ
アイコン削除処理をしてくれなかったわけです

どうもありがとうございました
753デフォルトの名無しさん:2007/01/07(日) 19:15:47
気持ちよかった?
754デフォルトの名無しさん:2007/01/07(日) 19:24:27
>>748です。わかりました。とりあえず、実装してみます。
今の実装では、WM_PAINT時にExtTextOutを何度も呼び出すつもりですが、ちょっとExtTextOutだけの
テストアプリを作り、試しに1000回呼び出す時間を計測したところ、それだけで50ms近くかかってたので、
うほぉ。っと思ってました。表示するテキストの内容にもよりますが、超最悪1万回とかいったらどうしよう
とか考えてた次第です。もちろん、ExtTextOutでの描画をまとめるのが筋ですが、
それをやると、ある問題が発生するので、どうぴよー。と思ってました。
とりあえず、先に実装してみます。
755デフォルトの名無しさん:2007/01/07(日) 19:35:54
うほぉ。
どうぴよー。
756デフォルトの名無しさん:2007/01/07(日) 19:40:13
仕事中ってそういう意味不明なワードが口を付くから困る
757デフォルトの名無しさん:2007/01/07(日) 19:44:49
あん

 どゥ

トろワ?
758デフォルトの名無しさん:2007/01/07(日) 19:59:42
カトル!
759デフォルトの名無しさん:2007/01/07(日) 20:06:49
やかん?
760デフォルトの名無しさん:2007/01/07(日) 20:22:17
>>757-759
warata
761デフォルトの名無しさん:2007/01/07(日) 21:28:16
>>746
サブシステムが違うので無理です。POSIX APIとネイティブAPIしか呼べない。
ネイティブAPIもWin32サブシステムでの動作を前提にしてると
思わぬ落とし穴にはまるかもしれない
762746:2007/01/07(日) 21:31:47
>>761
thx
763デフォルトの名無しさん:2007/01/07(日) 21:34:58
>>754
速いテキストエディタを作った事のある俺が答えてやろう。
Unicodeを使え。文字列を描画する場合は、1文字ずつではなく極力まとめて描画しろ。
メモリの確保破棄は発生しないように設計する。
文字幅の計算系のAPIはとても遅いので、自前で位置を計算する場合は取得結果をキャッシュする。
オフスクリーン(ビットマップ)に描画イメージを作成してから、ディスプレイに転送するとフリッカーが発生せずにさらに速い。
文字入力したときなどは変化した部分だけ描画。とにかく更新の必要のない部分は描画を行わない。

まあ、基本だね。
764デフォルトの名無しさん:2007/01/07(日) 22:38:50
HRESULTの値ってどう意味を持つのですか?
それとHRESULTが含まれるコードによくS_OKとかくっついてることが多いのだけど
BOOL値のTRUEような感じなんですかね?
ざっくりとでいいですから解説オナガイシマス
765デフォルトの名無しさん:2007/01/07(日) 23:32:09
ファイラーなどで、ファイルの一覧をListViewで表示しているものがありますが、
さらにファイルを右クリックすると、エクスプローラのコンテキストメニューが出てくる
ようになってるソフトがありますが、あれはどのようにして実現しているのでしょうか?
766デフォルトの名無しさん:2007/01/07(日) 23:33:06
ちなみに、「ファイラー」というのはWindows非標準のファイル管理ソフトやアーカイバのことを指したつもりです。
767デフォルトの名無しさん:2007/01/07(日) 23:49:03
>>764
関数の成功判定をBOOLで返した場合、失敗してもFALSEしか戻せないので
何に失敗したかの情報を戻り値に含められない。

HRESULTはS_OK以上なら成功、S_OK未満なら失敗を表すための型で
何に失敗したかなどを意味する数値が色々defineされている。
HRESULTがS_OK以外にどんな値を返すかは関数次第。

単純に成否判定をしたい場合は
SUCCEEDEDマクロ(成功ならTRUE)かFAILEDマクロ(失敗ならTRUE)を使う。
768デフォルトの名無しさん:2007/01/07(日) 23:51:13
769デフォルトの名無しさん:2007/01/07(日) 23:53:48
あ、ちなみに失敗してもその後の実行に支障がなさそうな場合とかに
「S_OK以上の失敗コード(例えばS_FALSE)」を返してくる場合もあるんで
FAILEDマクロだけで成否判定してると部分的な失敗とかを取りこぼすことがあるんで
どんな値が返ってくるのかちゃんとドキュメント嫁。
770デフォルトの名無しさん:2007/01/07(日) 23:58:44
>>763
>文字幅の計算系のAPIはとても遅いので、
横槍ですまぬが、具体的にはどの関数でしょうか?
すごく・・・興味あります。
771デフォルトの名無しさん:2007/01/08(月) 00:04:35
>>765
Shell API
772デフォルトの名無しさん:2007/01/08(月) 00:05:37
>>764
http://msdn2.microsoft.com/en-us/ms690088.aspx
HRESULTの値はようするに最上位ビットが立っていれば失敗、そうでなければ成功を表す。
あとは予約部分、Microsoft定義かどうか、種類 (FACILITY)、コードの部分に分けられる。
(機会は滅多に無いだろうけど)自分でHRESULT型の定数を作るときにはFACILITYを独自の値にする必要がある。

HRESULT型の定数の名前は、失敗の場合基本的にナントカ_E_カントカという形式だが、一般的なものはE_カントカという形式。
と言っても実際はE_カントカばかり目にする気がする。
(ナントカには種類名が入る: OLE_E_WRONGCOMPOBJとか)
もっともFAILED/SUCEEDEDマクロを主に使うので定数を直に使うこと自体少ないと思う。
成功の場合はS_ナントカ。標準ではS_OK以外にもS_FALSE(メソッドの呼出は成功したけど……)というのがある。

あとHRESULTなどをいじるマクロ。
http://msdn2.microsoft.com/en-us/ms528334.aspx
773デフォルトの名無しさん:2007/01/08(月) 00:09:12
>>770
GDIだとGetCharABCWidths, GDI+ならGdipMeasureString
774デフォルトの名無しさん:2007/01/08(月) 00:28:20
>>772
>自分でHRESULT型の定数を作るときにはFACILITYを独自の値にする必要がある。
勝手に作っちゃダメよ。
>Status codes in facilities other than FACILITY_ITF can be defined only by Microsoft.
775デフォルトの名無しさん:2007/01/08(月) 00:39:37
>>765
>>766
IContextMenu2, IShellFolder.GetUIObjectOfあたりを調べなはれ
776デフォルトの名無しさん:2007/01/08(月) 00:42:54
>>771
>>775
ありがとうございます、その辺を調べてみます。
777デフォルトの名無しさん:2007/01/08(月) 00:51:41
>>763
>>754です。Unicodeでダブルバッファリングはしてます。で、今巨大な横幅のデータを食わせてみたのですが、
やはり、横スクロールしていくと、だんだん、遅くなってきています。
横に5000文字あたりのところでついにはもっさり感が・・
今の実装は毎回横幅を取得してるので、右端の方にいけばいくほど、描画のための呼び出し回数が増えてるっぽいです。
おっしゃる通り、まとめてキャッシュする方向でいきます。今はテキストを強調表示のためパーサーにかけてるのですが、
パース後にキャッシュします。今の段階では描画より、幅の取得に手間取ってるっぽいので、
とりあえず、まとめずにキャッシュしてみます。それでも駄目ならまとめます。
ありがとうございました。





778デフォルトの名無しさん:2007/01/08(月) 00:54:09
画面を3ペインくらいに区切りたいのですが、
何で検索すれば幸せになれますか?
779デフォルトの名無しさん:2007/01/08(月) 00:54:28
nande ムダに 改行が 多いの
780デフォルトの名無しさん:2007/01/08(月) 01:01:30
>>767>>768>>769>>772>>774
>>764です
詳しい解説ありがとう
HRESULTの値の意味は関数が失敗した時の値を詳細に明示するものと理解しましたが
果たして、この関数の使い所はどういう場面でなのだろうかとふと、疑問に思いました
確かにデバッグ時、関数内のどこの処理が上手くいっていないのか等、分かるのは
便利だとは思うのですが、他にはどういう目的や場面で使われるものなのでしょうか?
781デフォルトの名無しさん:2007/01/08(月) 01:02:00
文章を推敲していると、何故か文末に改行が増えるな。
782デフォルトの名無しさん:2007/01/08(月) 01:13:12
>>780
失敗する理由が複数考えられるときは、区別できる値を返さんと、ユーザに通知もできんじゃろうが
783デフォルトの名無しさん:2007/01/08(月) 01:29:39
>>782
>>780です
やっぱりマネージドC++/CLIのtry、catch、throw見たいに例外処理とかエラーを表示するのが目的?
784770:2007/01/08(月) 01:42:31
>>773
さんくすこ
785デフォルトの名無しさん:2007/01/08(月) 04:20:34
>>783
確かにアンマネージドなC/C++より高水準の言語ではたいてい例外にマップされる
786デフォルトの名無しさん:2007/01/08(月) 06:00:30
【ネガティブ派遣根性チェック】

3つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。

□偽装派遣先の社員の意見にはたとえ間違っていても反対しない
□偽装派遣先から「いつまでもここで仕事してくださいね」と言われるようになりたい
□自社に仕事を持ち帰れるように言われるとムカつく
□自社で仕事なんてできるわけがない
□派遣/受託の差異を指摘する人間はムカつく
□偽装派遣先には仕事だけでなく自分のプライベートについても指示して欲しい
□自分の月額金額を知らない
□偽装派遣先社員より自分の生涯収入が低いのは当然だ
□偽装派遣先に尻尾を振り、いつまでも一緒に仕事をすることが大切だ
□今のプロジェクトが終わっても同じ偽装派遣先に常駐したい
787デフォルトの名無しさん:2007/01/08(月) 10:02:52
全問正解したのでなにかください
788デフォルトの名無しさん:2007/01/08(月) 10:20:59
つ VisualStudio .NET 2002
789デフォルトの名無しさん:2007/01/08(月) 11:54:33
>>787
早く自分の会社へ帰れ!!
でないと人間腐るぞ!
790デフォルトの名無しさん:2007/01/08(月) 13:09:05
え?えっ…?
何これ?デジャビュ?
791デフォルトの名無しさん:2007/01/08(月) 13:58:21
792デフォルトの名無しさん:2007/01/08(月) 16:33:56
標準のエディットボックスを右クリックして出てくるメニューに
オリジナルのメニュー項目を追加するのってどうやればいいですか?
793デフォルトの名無しさん:2007/01/08(月) 16:53:17
>>777
スクロールはBitBltかScrollWindowExを使用して更新領域を最小限に抑える。この方法で実装しないと遅いよ。
あと画面に表示されている行だけでも、位置情報をキャッシュするようにすれば再計算しなくていいので速くなる。
794デフォルトの名無しさん:2007/01/08(月) 18:27:22
>>777です。
あれから、パーサーで切り出されるトークンをフォントのスタイルと色が同じならある程度にまとめて、
それから幅を取得しにいったら、ついに前回の5000文字の壁を越えて、横方向に1万文字あたりでスクロールさせてももっさり感がなくなりました。
でも、やっぱ、幅を毎回取得してるので2万文字あたりでまたもっさり感が・・・やっぱ、キャッシュするしかなさそうですね。
はぁ。

>スクロールはBitBltかScrollWindowExを使用して更新領域を最小限に抑える。この方法で実装しないと遅いよ。
>あと画面に表示されている行だけでも、位置情報をキャッシュするようにすれば再計算しなくていいので速くなる
ScrollWindowExですか、使った事ありませんでした。スクロール時は毎回画面を再描画してるので。
調べてみます。ありがとうございます。
795デフォルトの名無しさん:2007/01/08(月) 22:52:05
すみません、もしわかる方がいらっしゃったら教えてください。
CreateProcessで起動するプロセスに対して何らかの識別コードを付加したいのですがいい方法はないでしょうか?
例えば自分のプログラムからNotepad.exeを起動したときに、他のプロセスからも自分のプログラムから起動したことを知ることができるようにする「マーク」のようなものをつけたいのです。
起動するプログラムは既にバイナリイメージなのでソースレベルで手は加えられない制約がある状態で起動元のプログラムから何とか「紐付け」をしたいのです。
何か良い方法がありますでしょうか?
796デフォルトの名無しさん:2007/01/08(月) 22:56:54
>>795
イメージなら、バイナリデータの一番最後に文字列加えても問題ない
それで認識すれば?
797デフォルトの名無しさん:2007/01/08(月) 23:01:29
>>796
レス有難うございます。
起動するプログラムは任意に変わるのと、バイナリには手を加えられないのです。
今、考えてる方法は、STARTUP_INFOのReservedメンバに識別する値を入れ、後でPIDからそのプロセスのSTARTUP_INFOを取得して識別できないかとか、
プロセス起動前に環境ブロックに独自の環境変数を設定し、それを起動するプロセスに継承させたあとに、なんらかの方法で目的のプロセスの環境ブロックを読み出す(そうゆうAPIはないのでハッキングする)とかを考えています。
もっとスマートでよい方法がありそうなのですが…
798デフォルトの名無しさん:2007/01/08(月) 23:14:23
>>797
データをテキストに書き込んで、別のプロセスで読み込めばいいだけじゃん
799デフォルトの名無しさん:2007/01/08(月) 23:16:33
DLL injectしてPIDなどでユニークな共有メモリ作成してタグを作ったらどうだろうか
800デフォルトの名無しさん:2007/01/08(月) 23:24:11
>>798
レス有難うございます。
起動元プログラムからデータをファイルやメモリを経由して他のプロセスから読み取る方法ですと、
例えば、もし起動したプログラムが終了してそのPIDが無効になった後に、新たに起動されたプログラムのPIDがユニークになる保証がないため、誤認識してしまう恐れがあります。
>>799
レス有難うございます。
CreateRemoteThreadなどで起動先のプロセス空間にDLLを注入にしてしまえばいいのですが、
識別用の32ビットのコードを知るためだけにDLLを注入するのはやや大変かと思ってすこし腰が引いています
でも、やっぱり起動先プロセスにDLLを打ち込まないと無理そうならやるしかないか…

801デフォルトの名無しさん:2007/01/08(月) 23:36:34
>>797
起動したプログラムの保持と、その終了を監視する第3のプログラムを裏で動かしとけば?
802デフォルトの名無しさん:2007/01/08(月) 23:50:33
>>801
レス有難うございます。ちょっと説明が長くなってもうしわけありません。

実はこの起動元プログラムとは、プロセス群を監視し、プロセスに異常終了した場合に再起動を行うプログラムなのです。
そしてこのプロセス監視プログラムはJobオブジェクトを作成し一連のプロセス群を一括管理していています。

今、問題となっているのは「もしこのプロセス監視プログラムが異常終了してしまった場合」に
プロセス監視プログラムを再立ち上げなおした後に、既に存在しているJobオブジェクト内で動作しているプロセスの一覧をチェックして、
プロセス監視プログラム内の情報と整合性をあわせる必要があるために各プロセスにユニークコードを埋め込んでおきたいのです。

レスを頂いた「その終了を監視する第3のプログラムを動かす」というのは対処方法としてはいいのですが、
もしその第3のプログラムにも異常が発生した場合には全く同じ問題がおきます。
本来、プロセス監視プログラムから起動されたプロセスを一意に識別さえできれば、
解決できる問題なのでその方向で解決したいと考えています。
803デフォルトの名無しさん:2007/01/09(火) 00:28:05
監視プロセスを監視するプロセスを準備したり、2プロセスで監視など、多重化するほうがいいんでない?
804デフォルトの名無しさん:2007/01/09(火) 00:35:44
>>802
>>799の案だけど、DuplicateHandle使えばDLL injectしなくても共有メモリ放り込めるかも。
MSDN読んだだけで試してないけど。
805デフォルトの名無しさん:2007/01/09(火) 00:36:32
オレも監視プロセスを複数にした方がいいと思う
2プロセスなら片方落ちても再起動した後でメッセージとかのプロセス間通信で同期とれるしな
806デフォルトの名無しさん:2007/01/09(火) 00:38:46
複数プレイか!
807デフォルトの名無しさん:2007/01/09(火) 00:44:16
>>803,805
レス有難うございます。
確かに多重化したほうが堅牢でいいのですが、本質的な問題が解決されてないことが気になります。
>>804
参考情報、有難うございます。
DLLを注入する方法は何通りかあるようなので、今後、解決策が見つからないようであれば試したいと思います。
808デフォルトの名無しさん:2007/01/09(火) 03:05:13
>>807
PIDだけじゃ一意であることを保証できないのが問題なら、
プロセスの生成日時とかと併用じゃダメっすかね?

win32的にどう取得するのかわからんけど、
WMIのWin32_ProcessにCreationDateというのがあるみたいだ。
WMIのこともよくわからんけど。。。

まあ、これで理論上完全に保証できるかっていうと無理だけど。
809801:2007/01/09(火) 10:01:10
>>802
(1) 子プロセスを起動
(2) 子プロセスごとのユニークな名前でCreateFile(..,CREATE_NEW,..,FILE_FLAG_DELETE_ON_CLOSE...)
(3) DuplicateHandleで(2)のハンドルを子プロセスに継承
(4) 親側の元ハンドルは閉じる
これで、子プロセスが落ちると自動的にファイルが削除される。
ファイルの置き場所と命名規則を決めておけば、どのプロセスが生きているかわかる。

個人的な感想としては、
>もしその第3のプログラムにも異常が発生した場合には全く同じ問題がおきます。
まで問題となるような状況で”Windowsで(は)大丈夫?”と聞きたくなる。

810デフォルトの名無しさん:2007/01/09(火) 10:32:31
mutex
811デフォルトの名無しさん:2007/01/09(火) 10:41:32
>>809
レスどうも有難うございます。なるほど、これはいいかもしれないです!
今さっきまで、NtQueryInformationProcessで子プロセスのPEBのアドレスを取得し、
子プロセスのメモリ空間から環境ブロックをReadProcessMemoryする方法ができないかを考えていましたが、
FILE_FLAG_DELETE_ON_CLOSEの仕様を確認してよければCreateFileの方法のほうがずっとスマートなのでこちらの方法にしようかと思います。
809さん、本当に有難うございました。
Spec Fixまでまだ時間があるので他の方法も一応検討をしてみます。

>まで問題となるような状況で”Windowsで(は)大丈夫?”と聞きたくなる
色々しがらみがありまして…
フェイルオーバークラスタリングで別マシンでも並行稼動させるのと、
Jobでクォータ管理してOSへダメージが波及しないようにしようかと思います。
812デフォルトの名無しさん:2007/01/09(火) 12:53:40
ち・ちんぽ
813デフォルトの名無しさん:2007/01/09(火) 14:55:09
はじめまして。
僕は今チャットウィンドウを作っていて、
文字を打ち込むためのエディットボックスなどはCreateWindow関数を用いて作りました。
そのため、位置などは、数字を打ち込んで確かめて調整していかなければなりません。

もっと、視覚的にメインウィンドウをレイアウトしたいのですが、
この方法しかないのでしょうか?
親ウィンドウをリソースエディタでダイアログボックスとして作ってもいいのでしょうか?
どなたか返答お願いします。
814デフォルトの名無しさん:2007/01/09(火) 14:57:46
>>813
素直にIDEの付いてる言語にしなさい
815デフォルトの名無しさん:2007/01/09(火) 15:02:24
>>813
>親ウィンドウをリソースエディタでダイアログボックスとして作ってもいいのでしょうか?
それはあなたが作ってるアプリの仕様次第。好きにしたらいい。
816デフォルトの名無しさん:2007/01/09(火) 15:19:31
>>813
最初にきちんときめちゃえばいいじゃん。
817デフォルトの名無しさん:2007/01/09(火) 15:27:55
>>813
初心者はまず見た目から作ろうとするけど
まずは何をするのかを考え
それに必要なデータなどを格納するオブジェクトを宣言し
そして初めて外見を作っていく
こうするとスムーズにプログラミングできる
外見を作りながらやると、後で機能を増やしたいとか
仕様を変更したいとかなると面倒なことになり
また1から作り直すことになる

頭の中だけで考えず、ヘタでもいいので絵に描いたり
何ができるか箇条書きすることを薦める
818デフォルトの名無しさん:2007/01/09(火) 15:31:03
>>813
ダイアログをメインウィンドウにしたアプリケーションを
俗に「ダイアログベースアプリケーション」と言って
Windowsではよく使われる手法。何の問題もないよ。
819デフォルトの名無しさん:2007/01/09(火) 15:42:32
>>813
>そのため、位置などは、数字を打ち込んで確かめて調整していかなければなりません。
フォントが変わると(同じフォントでもOSが変わったりユーザー設定が変わったりすると)正しい
位置が変わる。だからプログラム中で固定値の指定はNG。
面倒だけどGetSystemMetrics()などで取得した値から計算で位置等を決めるように。

ダイアログをメインウィンドウにするのはOK。
820デフォルトの名無しさん:2007/01/09(火) 18:03:28
文字変換で迷って伊いますBSTRの指すアドレスに文字列が入っているんだけど
どのように取り出してMessageBoxで見ることが出来ますか?
教えてくださいオナガイシマス
821デフォルトの名無しさん:2007/01/09(火) 18:04:34
>>813の人気に嫉妬
822デフォルトの名無しさん:2007/01/09(火) 18:04:41
今まで、レジストリ関係のソフトと、
画像処理系と、ゲームしか作ったことがないのですが、
httpを利用して、情報を取得したいと思ってます。
既存のwebページから読み込むということです。
そこら辺の知識は皆無なのですが、何で検索すれば、
大まかな概要と、手順を見つけることができますか。
823デフォルトの名無しさん:2007/01/09(火) 18:05:19
>>821
の嫉妬心に嫉妬
824デフォルトの名無しさん:2007/01/09(火) 18:09:14
>>820
ググれ
825デフォルトの名無しさん:2007/01/09(火) 18:09:35
>>822
開発環境くらい書けボケ
あとスレ違い
826デフォルトの名無しさん:2007/01/09(火) 18:12:56
>>822
RFC2616だな。 ttp://www.studyinghttp.net/
APIスレ というのであれば WinSock
827デフォルトの名無しさん:2007/01/09(火) 18:25:40
>>825
開発環境関係あるんですか。
VC2005EEです。

>>826
ありがとうございます。
828デフォルトの名無しさん:2007/01/09(火) 18:31:03
>>827
環境によって出来合いのものを利用できたりするからな
829デフォルトの名無しさん:2007/01/09(火) 18:37:17
>>820です
3日具具って
BSTR pfoo;
char choge[ 256 ];
::ZeroMemory( choge, 256 );
int n = WideCharToMultiByte( CP_ACP, 0, pfoo, SysStringLen( pfoo ), choge, sizeof( choge ) - 1, 0, 0 );
MessageBox( NULL , ( LPTSTR )pfoo, "Kitty on your lap.", MB_OK | MB_TOPMOST );
このようにしたのですが結果が出ません(何も表示されません)
よろしくお願いします。
830デフォルトの名無しさん:2007/01/09(火) 18:43:27
>>829
なぜpfooをMessageBoxに渡しているのだ?
831デフォルトの名無しさん:2007/01/09(火) 18:45:36
>>822
多分InternetReadFileExとかで用が足りるんだろうけどな
832デフォルトの名無しさん:2007/01/09(火) 18:45:40
BSTR=WideCharだってわかってるなら
MessageBoxW使えばいいだけじゃないのか
833826:2007/01/09(火) 18:48:07
>>831
すまね。 WinINet の存在を知らなかった…
834デフォルトの名無しさん:2007/01/09(火) 18:52:43
>>831
たぶんこれで足ります。
835813です。:2007/01/09(火) 22:33:44
いろいろ言ってくれて助かりました。
ありがとうございます。
836デフォルトの名無しさん:2007/01/09(火) 22:45:42
WinAPI32の初心者です。
リストビューにアイコンを表示したいのですが、
どうもうまくいきません(1日中やってました)
実行しますと、アイコンが表示される場所が空白になっています。
アイコンのサイズもしっかり確認しました。
ソースはこちらです↓

LV_COLUMN lvcol;
LV_ITEM item = {0};
HIMAGELIST hImg;

hList = CreateWindowEx(WS_EX_CLIENTEDGE , WC_LISTVIEW, "",
WS_CHILD | WS_VISIBLE | LVS_REPORT, 400, 50, 140, 300,
hWnd, (HMENU)IDC_EDIT3, hInst, NULL);
//コモンコントロールの初期化
InitCommonControls();
//イメージリストを作成
hImg = ImageList_Create(16 , 16 , ILC_COLOR8, 1 , 1);
//イメージリストにアイコンを追加
ImageList_AddIcon(hImg , LoadIcon(hInst , MAKEINTRESOURCE(IDI_ICON1)));
ListView_SetImageList(hList , hImg , LVSIL_SMALL);
lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT ;
lvcol.fmt = LVCFMT_LEFT;
lvcol.cx = 100;
lvcol.pszText = "Member";
lvcol.iSubItem = 0;
ListView_InsertColumn(hList, 0, &lvcol);
item.mask = LVIF_TEXT | LVIF_IMAGE ;
item.pszText = "dud";
item.iImage = 0;
ListView_InsertItem(hList, &item);
837デフォルトの名無しさん:2007/01/09(火) 23:06:44
>>836
ImageList_AddIconの戻り値はイケてる?
838デフォルトの名無しさん:2007/01/09(火) 23:07:14
>>836

おかしいとこ無いんでそのまんまコピペしたらちゃんと出たぞ?
アイコンの16x16にはちゃんと絵が入ってる?
839デフォルトの名無しさん:2007/01/09(火) 23:07:28
>>820
Win32/64のBSTRは、単にWCHARへのポインタと見なして扱える(ただしその逆は真でない)。
>>832の補足になるが、MessageBoxWは9xにも実装されているので、躊躇せず使える。
840836:2007/01/09(火) 23:15:26
>>837
戻り値は「-1」で失敗してることが分かりました。
でも、なぜ失敗しているんでしょうか??
841デフォルトの名無しさん:2007/01/09(火) 23:18:25
>>840
アイテムを挿入するメモリ領域を確保してないから
842837:2007/01/09(火) 23:20:33
>>840
>>838が真実。
8ビットフォーマットのアイコンがナイんじゃない?
843836:2007/01/09(火) 23:25:51
>>837
僕の今読み込んでるアイコンは16x16の256色です。
ということは、
hImg = ImageList_Create(16 , 16 , ILC_COLOR8, 1 , 1);
↑この部分に問題があるのでしょうか?
844836:2007/01/09(火) 23:28:07
読み込んでるアイコンのプロパティを見たら
ビットの深さが32になっていました。
どうしたらよいでしょうね?
845デフォルトの名無しさん:2007/01/09(火) 23:29:01
>>840
IDI_ICON1のプロパティを確認。
めんどくさかったら、 ILC_COLOR8を
ILC_COLOR16か ILC_COLOR24か ILC_COLOR32か ILC_COLORDDBに変えてみて、
IDI_ICON1が何ビットフォーマットか調べてみる・・・などなど。
846デフォルトの名無しさん:2007/01/09(火) 23:32:06
アイコンのツールは何を?
847836:2007/01/09(火) 23:33:38
>>846
アイコンのツールってなんでしょうか?
VCのリソースエディタで編集してましたが・・・
848デフォルトの名無しさん:2007/01/09(火) 23:35:28
>>847
Visual Studio 2005を使っているのなら、
リソースエディタ上部、メニューより、
[イメージ(I)]→[現在のアイコン イメージタイプ(E)]で16x16、16色を選択。

なければ[新しいイメージ タイプ(W)]で追加。
849836:2007/01/09(火) 23:35:43
ILC_COLOR16か ILC_COLOR24か ILC_COLOR32か ILC_COLORDDB
に変えてみましたが、全部ダメでした。

ImageList_AddIcon(hImg , LoadIcon(hInst , MAKEINTRESOURCE(IDI_ICON1)));
↑ここをデバッグボックスで表示されたら -1 になっています。
やはり、ここで失敗しているようです。
850デフォルトの名無しさん:2007/01/09(火) 23:36:39
VCだったら、アイコン編集でイメージメニューに
現在のアイコンメニューの表示とか
新しいアイコンイメージの追加という項目があるだろ
それいろいろいじってみ
851デフォルトの名無しさん:2007/01/09(火) 23:42:58
ないとは思うが画像ファイルの拡張子を.ico に変えるだけじゃだめだぞ?
(ウソだと思いたいがマジにいたから言っておくんだが)
852836:2007/01/09(火) 23:43:45
やはりダメです(>_<)
どうやっても表示されません・・・。
853836:2007/01/09(火) 23:46:14
>>851
それは大丈夫です!
それから、16x16、16 色 にしっかりしてもダメみたいです・・・
854デフォルトの名無しさん:2007/01/09(火) 23:49:02
おいおい、16色は ILC_COLOR4 だぜ?
855デフォルトの名無しさん:2007/01/09(火) 23:50:05
IDI_ICON1 の宣言ミスとか?
856デフォルトの名無しさん:2007/01/09(火) 23:51:04
ワロスw
857デフォルトの名無しさん:2007/01/09(火) 23:52:33
>>854
おまえあたまいいな
858836:2007/01/09(火) 23:52:44
>>855
それもないようです!
IDI_ICON1 はもうすでにウィンドウのタイトルの方で使っていて
そちらの方ではアイコンが表示されています。

リストビューにだけ表示されません・・
859デフォルトの名無しさん:2007/01/09(火) 23:55:33
HIMAGELIST型のhImgのスコープなどなど
860836:2007/01/09(火) 23:56:25
スコープってなんですか(@_@。
すいません・・・初心者で・・
861デフォルトの名無しさん:2007/01/09(火) 23:56:50
リストビューに表示されないのが問題なんじゃなくて
ImageList_AddIconが失敗するのが問題なんだろう?
GetLastError() の値はどうよ。

アイコン全種類追加してしまえ
862デフォルトの名無しさん:2007/01/10(水) 00:00:00
>>860
これをhInstが宣言されている近くに。
>>836の関数から外に出すの)

static HIMAGELIST hImg = NULL;
863836:2007/01/10(水) 00:06:02
>>862
それでもだめです・・・
ちなみにGetLastError()とは・・・
864デフォルトの名無しさん:2007/01/10(水) 00:06:46
googleを知らないんだろうか
865デフォルトの名無しさん:2007/01/10(水) 00:07:02
866デフォルトの名無しさん:2007/01/10(水) 00:08:01
GetLastError()
簡単に理解したいなら最後に出したエラーコード吐き出しみたいなものと認識してればいい
因みにFormatMessage使えばエラーコードのメッセージ吐き出してくれるよ
867836:2007/01/10(水) 00:09:24
アイコン全種類追加したらできました
ありがとうございました
868デフォルトの名無しさん:2007/01/10(水) 00:10:00
ウィンドウに貼り付けたエディットコントロールが
左右キーのイベントを拾ってくれないバグに悩んでます。
上下を押すと左右に移動するのですが・・・
869デフォルトの名無しさん:2007/01/10(水) 00:11:34
スコープ
変数の寿命みたいなもの
staticで宣言した変数なんかはまさに不死身
static=癌変数と思えばいい
そのほかローカル変数、グローバル変数とかあるけどそれくらい自分で調べよう
870836:2007/01/10(水) 00:11:48
>>ALL
すいませんね。
ご迷惑かけました。
出直してきます。
(できてませんけどw
871デフォルトの名無しさん:2007/01/10(水) 00:13:01
COLOR4 = 4ビット = 16色 なのはわかってるのかなあ
COLOR8 は256色な
872デフォルトの名無しさん:2007/01/10(水) 00:13:01
というか変数スコープもしらないでwindowsプログラムに手を出してるのがすごい
873デフォルトの名無しさん:2007/01/10(水) 00:13:03
>>867
ちゃんと、原因究明しろよw
874デフォルトの名無しさん:2007/01/10(水) 00:14:36
>>854が見事にスルーされてて藁った
875デフォルトの名無しさん:2007/01/10(水) 00:14:47
>>872
いや、スコープって単語が何を意味しているのかを知らないだけかも?
876デフォルトの名無しさん:2007/01/10(水) 00:15:29
僕ハッカー
877デフォルトの名無しさん:2007/01/10(水) 00:19:08
GetLastErrorのFormatMessageぐらい晒してから逝って欲しかったな
878デフォルトの名無しさん:2007/01/10(水) 00:19:48
>>836の人気に嫉妬
879868:2007/01/10(水) 00:30:06
ダイアログ自体を子コントロールとして他のウィンドウに貼り付けるのって良くないかな?
880デフォルトの名無しさん:2007/01/10(水) 01:13:37
>>878の嫉妬心に嫉妬
881デフォルトの名無しさん:2007/01/10(水) 09:49:56
>>879
メッセージの中継をするようになってればいいとおもうけど
882デフォルトの名無しさん:2007/01/10(水) 15:43:23
>>797
もう見ていないと思うけど、STARTUPINFOの予約メンバについて調べてみた。

cbReserved2はlpReserved2の長さを指定している。
なので、lpReserved2に任意のデータ構造体を指定して、
cbReserved2にそのサイズを指定すれば、任意のデータを送れる。

まぁ、将来の仕様変更で使えなくなる可能性はあるが。

>>879
SetParentでそれっぽい事ができそうな気がする。
883デフォルトの名無しさん:2007/01/10(水) 15:46:57
>>879
リソースエディタで チャイルドスタイルにして
CreateDialog(.... 親窓)
は良くやるな。

TABのフォーカス周りをちゃんとしようとすると、IsDialogMessage() 利かさなきゃいけないけど
884882:2007/01/10(水) 16:10:42
うお、URLを忘れてた。
ttp://www.catch22.net/tuts/undoc01.asp

lpReservedは別の用途にあるので、固有のIDを付けるという用途なら
lpReserved2を使った方が良いかと。
885795:2007/01/10(水) 19:51:07
>>884
レス、有難うございます。もしかしたらレスがつくかもと思ってまだ見てました
MSのCランタイムがランタイムでオープンしたファイルハンドルを子プロセスに継承させる情報を伝えるために、
プロセス初期化時にlpReserved2を使って細工をしているなので、このままでは大部分のプログラムで問題が起きそうですね。
とりあえずはcbReserved2を使えば良さそうなのと、ページの最後に説明されているように、
lpReserved2に渡すバッファの先頭をポインタサイズでnullにすることに取り決めておけば使えるようです。

cbReserved2もしくはlpReserved2のいずれを使ってもGetStartupInfoで取得できそうですが、
GetStartupInfoは自プロセスのみに使える方法なので、他のプロセスからSTARTUPINFOを覗くにはPEBをハックして引きづり出すか、
ターゲットのプロセスにDLLを注入してGetStartupInfoを実行させないと取得できないかもしれません。
やっぱりこのあたりに行き着いてしまうようです。

とはいえ、884さん、とても参考になる情報を有難うございました。
886デフォルトの名無しさん:2007/01/10(水) 20:22:12
現在、PrintDlgで選択したプリンタと設定でメタファイルを印刷する処理を作っています。

そこでDEVMODE構造体のdmPaperWidthとdmPaperLengthが
dmOrientationの設定によって入れ替えるプリンタと入れ替えないプリンタがあるのですが、
その入れ替える・入れ替えないを取得する方法はありませんか?

DeviceCapabilitiesでDC_ORIENTATIONを指定すれば
取得できるかと思ったのですがどちらのプリンタも90が帰ってきました。
またdmFieldsも両方でDM_ORIENTATIONが設定されていました。

それと、dmPaperWidth、dmPaperLengthがdmOrientationの設定によって入れ替わらない場合、
メタファイルを90度回転させてから出力する必要があるのですが
それはどのようにすればできますか?

以上2点、ぐぐるヒントでもいいので教えてください。
887886:2007/01/10(水) 20:23:36
現在使用しているソースです。(変数の宣言や初期化は行数節約のために省略しています)

//A4横方向を設定
if(PrintDlg(&printdlg))
{
  pdv = (DEVMODE)GlobalLock(printdlg.hDevMode);

  rect.Bottom = pdv.dmPaperLength; // ※2100と2970のどちらかになる
  rect.Right = pdv.dmPaperWidth;  // ※2970と2100のどちらかになる

  StartDoc(&docinfo);
  StartPage(printdlg.hDC);

  hEMF = GetEnhMetaFile((LPCTSTR)metafile);

  PlayEnhMetaFile(printdlg.hDC, hEMF, &rect);

  DeleteEnhMetaFile(hEMF);

  EndPage(printdlg.hDC);
  EndDoc(printdlg.hDC);

  GlobalUnlock(printdlg.hDevMode);
  GlobalFree(printdlg.hDevMode);
  GlobalFree(printdlg.hDevNames);
}
888デフォルトの名無しさん:2007/01/10(水) 21:25:46
>>887
して、pdv.dmOrientationは調べた?
889デフォルトの名無しさん:2007/01/10(水) 21:26:20
>>886
プリンタでやったことないけど
SetWorldTransformでできないかなー
890デフォルトの名無しさん:2007/01/10(水) 21:38:51
MIDIを再生したいのですが、どうすればいいんでしょうか?
ググってもパッとしたものが見つからなかったもので…
891デフォルトの名無しさん:2007/01/10(水) 21:42:22
ああ、MCIか。スマソ
892デフォルトの名無しさん:2007/01/10(水) 21:58:47
細かい制御がしたいなら
midiOutOpen()して
midiOutShortMsg()とかすれば
ほぼなんでも可能
893デフォルトの名無しさん:2007/01/10(水) 22:03:09
mciならこんな感じかも。
ダメソースだからちゃんと評価する処理にえんこうしてね。

MCI_OPEN_PARMS mciOpenParms;
MCI_STATUS_PARMS mciStatusParms;
MCI_PLAY_PARMS mciPlayParms;


mciOpenParms.lpstrDeviceType = "sequencer";
mciOpenParms.lpstrElementName = ファイル名;
::mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);

mciStatusParms.dwItem = MCI_SEQ_STATUS_PORT;
::mciSendCommand(mciOpenParms.wDeviceID, MCI_STATUS,MCI_STATUS_ITEM,(DWORD)(LPVOID)&mciStatusParms);

mciPlayParms.dwCallback = (DWORD)親ウィンドウ;
::mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID) &mciPlayParms);

894デフォルトの名無しさん:2007/01/11(木) 00:21:46
コントロールのIDってウィンドウの中でユニークであればOK?
たとえば、WindowAの中にControlB1とControlB2があって、
ControlB2の中にControlCがあるとする。
ControlB1とControlCのコントロールIDが同じだとまずいですか?
895デフォルトの名無しさん:2007/01/11(木) 00:27:28
>>894
同じIDが複数あっても、IDで識別できなくなるだけで仕様的にはかまわない。
アプリ次第。
896デフォルトの名無しさん:2007/01/11(木) 01:00:55
thx。あとコントロールIDの値の範囲って#defineされてましたっけ?
897デフォルトの名無しさん:2007/01/11(木) 01:06:39
うん
898デフォルトの名無しさん:2007/01/11(木) 01:19:24
うう、ぐぐっても出てこないっす。ヘッダ見てもどれだか・・・教えてください。
899デフォルトの名無しさん:2007/01/11(木) 02:19:32
USBハンドセット(HID)のボタン情報を取得したいんですが、情報がなくて困っています。
使っているのはP1-Kというものです。
SetupDiEnumDeviceInterfaces()で見つけてCreateFile()でハンドルを得て、
HidP_GetCaps()で得たサイズでReadFile()してますが、ブロックされて帰って来ません。
同様の方法でジョイスティックのボタン情報は取れるのですが、やり方が間違ってるんでしょうか。
900886:2007/01/11(木) 09:24:03
遅レス失礼、886です。

>>888
dmOrientationを確認しましたが、どちらの場合も正しく設定されていました。
(縦方向ならDMORIENT_PORTRAIT、横方向ならDMORIENT_LANDSCAPE)

>>889
XFORM構造体を上手く設定できれば使えそうですね。ありがとうございました。
901デフォルトの名無しさん:2007/01/11(木) 13:05:46
_____________
|_________−□×|
|L |         |
|I | EDIT     |
|S |         |
|T |         |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
↑このようなウィンドウを作ったとして、リストボックスとエディットボックスの境界線を
ユーザが移動できるようにするにはどうすればいいのでしょうか
902デフォルトの名無しさん:2007/01/11(木) 13:09:49
境界線をドラッグで移動した分だけListとEditの位置とサイズを変更する。
903デフォルトの名無しさん:2007/01/11(木) 13:10:18
境界線をドラッグしたら、リストボックスとエディットボックスのサイズを調整するようなプログラムを組む。
904デフォルトの名無しさん:2007/01/11(木) 14:08:37
特定の操作をしたとき、
アプリケーションを終了させたいです。

WindowProcedureを自分で作って、MSGの値によって、
PostQuitMessage()を呼ぶ。
メッセージループを GetMessage(...)>0 のとき繰り返すようにする。

のようにしていますが例えば
switch(msg){
case WM_LBUTTONDOWN:
PostQuitMessage(0);
return 0;
}
としても、右ボタンクリックで終了しません。
そこで、ちゃんと実行されているのか確認しようと思って、
switch(msg){
case WM_LBUTTONDOWN:
MessageBox(hWnd, TEXT("test"), TEXT("test"), NULL);
PostQuitMessage(0);
return 0;
}
としたら、1回クリックするとメッセージボックスが表示されて
もう1度クリックすると、メッセージボックスが表示されずに終了しました。

何が起こっているのかわからないので、説明してください。
905デフォルトの名無しさん:2007/01/11(木) 14:14:33
>>901
LISTとEDITの間に幅のちんまい自作コントロールを貼り…
自作コントロール側: ドラッグ処理後、親にドラッグあったことを通達
親:通達をうけて、LIST/自作コントロール/EDIT を再配置
906デフォルトの名無しさん:2007/01/11(木) 14:32:47
>>904
LBUTTONだから左クリックでは?
907デフォルトの名無しさん:2007/01/11(木) 14:40:17
>>906
すいません、文章のミスです。左クリックの間違いです。
908デフォルトの名無しさん:2007/01/11(木) 14:43:54
>>907
だったらそのコードだけではそんな文章のようにはならない。
メッセージボックスが出た場合は、閉じたら即PostQuitなのでそのまま終了する

まああちこちにPostQuitMessage置かないほうがいいと思うけどね。
WM_CLOSE投げとけ。
909デフォルトの名無しさん:2007/01/11(木) 14:48:22
     ∧__∧
    ( ・ω・)   いやどす
    ハ∨/^ヽ
   ノ::[三ノ :.'、
   i)、_;|*く;  ノ
     |!: ::.".T~
     ハ、___|
"""~""""""~"""~"""~"
910デフォルトの名無しさん:2007/01/11(木) 15:11:19
>>909
誰w
>>908
ということは別の何かが原因ってことですか。
WM_CLOSE投げたら、思ったように終了しました。
なんでだろ。
ありがとうございます。
911デフォルトの名無しさん:2007/01/11(木) 16:02:36
>>901
MFCかVCLのソース嫁
912デフォルトの名無しさん:2007/01/11(木) 17:40:02
>>904
たぶん、その問題とは関係ないけど

MSDNそのまま読むと、
GetMessage関数って-1は失敗だけど、それ以外は成功じゃね?

その記述だと、-2以下が帰ってきたらダメな希ガス
(そんな値が帰ってくるかどうかシランがwww)
913デフォルトの名無しさん:2007/01/11(木) 17:44:08
>>912
なら
!= -1 が正解なのか。
でも、MS以外のサンプルだと>0ってのも良く見る。
914デフォルトの名無しさん:2007/01/11(木) 17:51:12
>>913
ちげーだろ、
0のときループから抜ける、-1のときエラー処理、それ以外のときループしなければならないんだから。
915デフォルトの名無しさん:2007/01/11(木) 17:53:15
>>914
さーせん・
916デフォルトの名無しさん:2007/01/11(木) 17:53:56
とりあえず、WM_QUIT を受け取ったら 0 が返るからループ終了。

これだけは外せないベ
917デフォルトの名無しさん:2007/01/11(木) 17:57:34
でも実際エラー処理なんてする?
918デフォルトの名無しさん:2007/01/11(木) 19:02:42
質問です。VC7を使っています。
外部のプロセスのウィンドウに存在する、
SysListView32コントロールの選択状態を変更したく、
以下のマクロを用いて実行してみたのですが、
どうも反応がありません。

ListView_SetItemState(対象ウィンドウ,アイテム番号,LVIS_SELECTED,LVIS_SELECTED);

なおこのマクロは、

LV_ITEM _ms_lvi;\
_ms_lvi.stateMask = mask;\
_ms_lvi.state = data;\
SNDMSG((hwndLV), LVM_SETITEMSTATE, (WPARAM)(i), (LPARAM)(LV_ITEM *)&_ms_lvi);\

のように定義されております。
この原因は、プロセス外のウィンドウに対し、ポインタを用いたメッセージを使用することにあるのでしょうか?
また、リストビューの選択状態を外部から変更できる、別の正しい方法があるのでしょうか?
ご教授下さい。
919デフォルトの名無しさん:2007/01/11(木) 19:10:49
>>918
>この原因は、プロセス外のウィンドウに対し、ポインタを用いたメッセージを
>使用することにあるのでしょうか?

その通りじゃね?
920デフォルトの名無しさん:2007/01/11(木) 19:22:38
>>919
ご返事ありがとうございます。
EditのSETTEXT等は上手くいっていたため、違うのではと思っていました。
それでは、このような場合の対処としては、どのようにすればよいか、ご存知でしょうか?
前に検索してみたときは、9x時代の情報でVirtualAllocというのを少し目にした事があるのですが、
今もこれを使うものなのでしょうか?
921デフォルトの名無しさん:2007/01/11(木) 19:32:24
>>920
共有メモリにすればいいんじゃね?
922デフォルトの名無しさん:2007/01/11(木) 19:36:22
>920
NTではVirtualAllocEx、9xではメモリマップドファイルを使う。
ttp://techtips.belution.com/ja/vc/0001/
923デフォルトの名無しさん:2007/01/11(木) 20:03:14
>>921-922
ありがとうございます。
リンク先のサンプルソースを改変して、無事希望の動作が出来るようになりました。
VirtualAllocExを使用する方法、初めは面倒くさそうに思っていたのですが、意外と簡単に出来て良かったです。

1.ウィンドウハンドルから、対象のプロセスの仮想メモリ読み書き可能なハンドルを得る
2.自プロセスと対象プロセスで共有メモリを作成
3.ローカルの共有メモリを好きなように書き換え、
 WriteProcessMemoryでグローバルな共有メモリに上書き
4.SendMessageで共有メモリを使用する
5.解放

このような動きですよね。
今回非常に助かりました。ご助言や適切な参考リンクに感謝いたします。
本当に、ありがとうございました。
924デフォルトの名無しさん:2007/01/11(木) 20:26:13
>>922
繋がらないです。
925デフォルトの名無しさん:2007/01/11(木) 20:27:39
>>924
ふーん
926デフォルトの名無しさん:2007/01/11(木) 21:05:41
http://wisdom.sakura.ne.jp/system/winapi/win32/win22.html

ここを参考に画像を描画するプログラムを作りたくて、画像ファイルを別の関数で読み込んだんですが、
どのタイミングで読み込みの関数を呼び出せばいいのかわかりません。
927デフォルトの名無しさん:2007/01/11(木) 21:22:18
>>926
メニューハンドラから呼んで読み込むんでないの?
読んだらビットマップにしておいて、WM_PAINTでBitBlt()すればいいと思うよ。
もちろん、あなたのプログラムの構造によっていろいろやりかたもあるだろうけど
928デフォルトの名無しさん:2007/01/11(木) 22:48:13
>>882
> まぁ、将来の仕様変更で使えなくなる可能性はあるが。
CRTが使ってるからそのCRTがサポートされる限りは大丈夫だと思うけど
アプリが勝手に使えないという結論に変わりはないな
>>885
> lpReserved2に渡すバッファの先頭をポインタサイズでnullにすることに取り決めておけば使えるようです。
これやるとVista x64でおかしくなる可能性があるからやめてくれ
詳しくは12月のCygwin ml参照
929デフォルトの名無しさん:2007/01/11(木) 22:48:15
コンパイラとかのコンソールアプリから、
出力をリダイレクトするにはパイプでよかったよね?
930デフォルトの名無しさん:2007/01/11(木) 23:02:29
>>917
GetMessage のエラー処理は「する」のが基本
931デフォルトの名無しさん:2007/01/11(木) 23:09:40
GetMessageのエラー処理とはreturn -1;しているだけという俺のコード。
932デフォルトの名無しさん:2007/01/12(金) 00:08:06
>>931
正直、それだけで充分。
それをしてないプログラムもあったりするのが現実なんだよ。
933795:2007/01/12(金) 00:34:48
>>928
レスどうもです。
lpReserved2のほうはVista x64で問題がおきる可能性があるのですね。
実はlpReserved2を使うほうは諦めました。
そもそもバッファを用意してその先頭をポインタサイズでnullにする方法はトリッキーすぎるかもしれません。

今のところ、下記の3通りの方法を考えています
@STARTUPINFOの読み出し方法は別途考えることにしてcdReserved2のほうはまだ諦めていません。
Aプロセス初期化時にDLLを注入してプロセスを識別できるように細工する方法も考えています。
B809さんに教えていただいたFILE_FLAG_DELETE_ON_CLOSEでCreateFileの方法も考えています。

どれも一長一短あり、まだ検討中です。もっとスマートな方法があるといいのですが。
934デフォルトの名無しさん:2007/01/12(金) 00:44:31
>802の、ジョブとプロセスの整合性を取る、
というのがよく分からん。ジョブオブジェクトが存続し続けるなら、
そのような整合性を取る必要はないのではないのか?
935795:2007/01/12(金) 00:52:28
>>934
Jobオブジェクトはその中で動作しているプロセス群を列挙する方法や識別する方法がないので、
もしJobオブジェクトを握っているアプリ(プロセス監視プログラム)が異常終了してしまうと、
再起動した際にJobオブジェクトは認識できても、その中で動いていたプロセスであるかはわかりません。
そこでプロセスのどこかにどのJobオブジェクトに属してたのかを識別する方法として何らかの情報を打ち込んでおきたいのです。

もしJobオブジェクトからその中で動いてるプロセス群を識別する方法があれば、
各プロセスに「紐付け」する必要はないのですが…
936デフォルトの名無しさん:2007/01/12(金) 00:55:44
プロセスがpidファイルに書き残すのがいいんだろうけど
死んだときにそのファイルが一緒になくなるとは限らないのが問題なんだよね
937デフォルトの名無しさん:2007/01/12(金) 00:56:57
若いの。オラが村では派遣の問題を口にしちゃなんねーだ
お前さんはまだわけぇから言いたいこともあるべぇ
だべな、派遣問題を口にすると怒る者がおるでよぉ
問題の指摘は駄目だっぺぇ
派遣のことは口にしちゃなんねぇ
この村みたいな田舎で生きていくためにはよぉ
駄目のものを駄目と言ってはなんねえだめさ
938デフォルトの名無しさん:2007/01/12(金) 00:57:47
誤爆乙
939デフォルトの名無しさん:2007/01/12(金) 00:59:16
          ヽ / /⌒\
         /ヽヽ|/⌒\ii|\
       / /ヾゞ///\\|
       |/   |;;;;;;|/ハ \|
             |;;;;//⌒ヽ
             |;/( ^ω^) >>937 おっおっおっ誤爆乙枯ー
.           |{ ∪  ∪
             |;;ヾ.,____,ノ
             |;;; |
             |;;;;;|
             |;;;;;|
940デフォルトの名無しさん:2007/01/12(金) 01:00:48
IsProcessInJob
とか
QueryInformationJobObjectのJobObjectBasicProcessIdList
は何らかの理由で使えない、という話なのかな?
941795:2007/01/12(金) 01:06:12
>>934
FILE_FLAG_DELETE_ON_CLOSEでCreateFileの方法ならプロセスの消滅とともにファイルも消えるので、
ファイル名かファイルにJobとProcessの関係を示す情報をもっておけば良さそうです。

>>940
「QueryInformationJobObjectのJobObjectBasicProcessIdList」!!!!
あれれ、QueryInformationJobObjectの情報問い合わせの系(7種)の中にPIDを列挙するものがありましたっけ!
もしかしたら、これ見落としてたかも… orz
今からよく調べてみます!
942795:2007/01/12(金) 01:16:04
おおお!これはまさに!今まで何を苦労してチェックしてきたんだ… orz

>>940
すばらしい!あなたは神!

もし知っていたらついで教えてください。(おしえてばかりですみません)
プロセスがハングアップしたことを検出する方法はありますか?
タスクマネージャなどで「応答なし」という状態になっているプロセスのことですが、
これを識別する方法はありますでしょうか?

たぶん、メッセージポンプを駆動してるスレッドがブロックされて、メッセージが一定時間ディスパッチされないアプリを見つけるのだろうと思うのです。
またCUIタイプのプロセス(Subsystem=CUI)でGUIでないプロセスがハングアップした場合はメッセージポンプの方法では判別できないと思います。
Windowsはどうやってプロセスがハングアップしたことを認識してるのだろう…
943デフォルトの名無しさん:2007/01/12(金) 01:26:09
単に時間かかってるかどうかだろ
ハングアップじゃなくてしばらく返事しないだけで応答なしになる
944デフォルトの名無しさん:2007/01/12(金) 01:27:04
IsHungAppWindow(HWND)
945デフォルトの名無しさん:2007/01/12(金) 01:29:47
というか、タスクマネージャの応答無しはトップレベルウインドウ限定だからね〜
946795:2007/01/12(金) 01:35:38
>>943
レスどうもです。確かに異常に重い処理をしてるアプリが動いていても「応答なし」となることがあります。
でもこれはメッセージをディスパッチしてないからだと思ってました。

>>944
レス有難うございます。こんな明快なAPIが存在してたなんて…

これでほぼ問題点を解決できました。
レスを下さった皆さん本当に有難うございました。
947デフォルトの名無しさん:2007/01/12(金) 01:36:36
ちゃんと動いてて
実情としてはメッセージループに処理が戻ってこないだけ
っていうときでも応答なし表示されるから

よく分かってないユーザーがそれ見て
そこでプロセスの終了したりして余計状況を悪くするんだお

948デフォルトの名無しさん:2007/01/12(金) 01:36:45
他人の(一般的な・限定しない)コンソールアプリがハングしているかどうかを
見分けるって、チューリングマシンの停止問題に帰着しかねないよな。
ハートビートを定期的に出すような作りにするとか、単にタイムアウトを付けるとか、
アプリの特性にあわせたハング検出ルーチンを用意しないとね。
949デフォルトの名無しさん:2007/01/12(金) 01:44:34
Outlookとか
OutlookExpressとか
M$のアプリにやたらとそれが多いような気がするのは
気のせいではあるまい
950デフォルトの名無しさん:2007/01/12(金) 01:46:33
あと
InternetExplorer とか
Explorer (つまり shell) とか
もうどこが安定した OS なのかと(ry
951デフォルトの名無しさん:2007/01/12(金) 01:47:32
あれ 950 踏んでる・・・
952795:2007/01/12(金) 01:50:37
>>947
レス有難うございます。
確かにメッセージをディスパッチしてるスレッドを止めると応答なしとなることからも
単にスレッドが他の処理をやってて結果として応答なしとなってしまうようです。

>>948
レス有難うございます。
IsHungAppWindowのAPIはウィンドウハンドルをとることからもCUIのプロセスは判別が難しいかなと思いました。
やっぱり、そこまでするならクラスタリング用アプリのようにハートビートでロックしていないことを定期的に示すようにしないと無理そうです。
今回のプロセス監視プログラムは任意のアプリを監視する仕様なので残念ながらクラスタリング用の細工をプログラムにすることはできません。

もしかしたら、CUIアプリのスレッドが全てブロックされた状態になったことを検出してハングアップを検出できるかもしれませんが、
単にWaitしてブロック状態であることも考えられますのでこれもダメそうです。

またループしてた場合などは、ハングアップしたのか処理を継続してるのか判別がつかないので難しいと思います。
仮にデバッガープロセスであればインストラクション実行状況やアドレスを定期的に監視することもできますが、
それでもループ処理なのか無限ループなのかわかりません。
これは八方塞がりだと諦めています。
953デフォルトの名無しさん:2007/01/12(金) 07:43:42
Jobとか使わずに、専用ユーザーつくって、runas ってのはだめなのかな?
と、適当なことを書いとく・・・

どちらにしろ、すげークリティカルな相手みたいで大変だね・・・
954デフォルトの名無しさん:2007/01/12(金) 16:06:28
ハリコの虎見てちんちんおっきおっき


こ の 書 き 込 み を 見 た 人 は 三 年 後 に イ ン ポ に な り ま す 。

イ ン ポ に な っ て オ ナ ニ ー が 出 来 な く な る の が 嫌 な 人 は
こ の 書 き 込 み と 同 じ 文 章 を 三 時 間 以 内 に
違 う ス レ に 五 回 以 上 コ ピ ペ し て く だ さ い 。

五 回 書 き 込 ま な か っ た 男 子 学 生 が
書 き 込み を 見 た 後 三 年 後 に イ ン ポに な り ま し た 。


955デフォルトの名無しさん:2007/01/12(金) 17:55:35
        ∧_∧ n^)   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       ( ´Д`/ /  <  先生!すでにインポな漏れはどうなるんでしょうか?
      / ,    /     \_________________
        | | , 、 i
 ____| |  | | |__
 ||\   (_/         \
 ||\\            \
 ||  \|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||
 ||   || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||
     ‖               ||
956デフォルトの名無しさん:2007/01/12(金) 18:40:37
USBデバイスが接続されたときに、
1.0と2.0のどちらで接続されたかどうかを判定したいのですが
そのようなAPIはありますか?
できればSHCNE_DISKEVENTSのタイミングで取りたいのですが。
957デフォルトの名無しさん:2007/01/12(金) 18:54:18
958デフォルトの名無しさん:2007/01/12(金) 18:58:04
SetupDi を使用してハードウェア機器を列挙する方法
http://support.microsoft.com/kb/259695/ja
959デフォルトの名無しさん:2007/01/12(金) 20:21:19
>>958
なつけーソースw
その内容って、2000とXPで動作が異ならない?

確か文字数が・・・
960デフォルトの名無しさん:2007/01/13(土) 21:47:06
大丈夫だよおまえら
2chなくならないから
961デフォルトの名無しさん:2007/01/13(土) 21:51:30
てか、普通にAPI質問箱無くなると困るんだけどなー
962デフォルトの名無しさん:2007/01/14(日) 00:45:10
ム板はないと困る俺は底辺なのかな('A`)

ところで>>970あたりの方はお願いします
963デフォルトの名無しさん:2007/01/14(日) 00:53:02
だがこ、とわる!
964デフォルトの名無しさん:2007/01/14(日) 01:54:57
>>962
少なくともAPI32は情報交換って言う意味で俺には必要('A`)
965デフォルトの名無しさん:2007/01/14(日) 01:58:52
('A`)←しね
966デフォルトの名無しさん:2007/01/14(日) 02:05:50
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
967デフォルトの名無しさん:2007/01/14(日) 02:09:18
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('0`)('0`)('0`)('0`)('0`)('0`)('0`)('A`)
('A`)('A`)('0`)('A`)('A`)('0`)('A`)('A`)('A`)
('A`)('A`)('0`)('0`)('A`)('0`)('A`)('A`)('A`)
('A`)('0`)('A`)('0`)('A`)('0`)('0`)('0`)('A`)
('A`)('0`)('0`)('0`)('A`)('0`)('A`)('A`)('A`)
('0`)('A`)('A`)('0`)('A`)('0`)('A`)('A`)('A`)
('0`)('A`)('0`)('A`)('A`)('0`)('A`)('A`)('0`)
('0`)('A`)('0`)('A`)('A`)('0`)('A`)('A`)('0`)
('A`)('0`)('A`)('A`)('A`)('0`)('A`)('A`)('0`)
('0`)('A`)('A`)('A`)('A`)('A`)('0`)('0`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
968デフォルトの名無しさん:2007/01/14(日) 02:27:05

次スレ

Win32API質問箱 Build49
http://pc10.2ch.net/test/read.cgi/tech/1168708801/
969デフォルトの名無しさん:2007/01/14(日) 02:36:45


>>967は「死」って出るのか
よくやるなぁ
970デフォルトの名無しさん:2007/01/14(日) 03:45:51
>>968が新スレたててくれたから、質問させてもらいます。

CreateProcess()で起動したInternet Explorer(IE1)からjavascriptのwindow.open()で
新しく、別ウィンドウのInternet Explorer(IE2)を開いてるのですが、IE2がアイドル状態に
なるまで自作プログラムの処理を待機させるにはどのようにすればよいでしょうか?
IE2はIE1と別プロセスではなく,同一プロセスの別スレッドで動いている状態です。

呼び出しの関係は↓のようになってます。
自作プログラム(コンソールアプリ) -> CreateProcess() -> IE1 -> window.open() -> IE2
971デフォルトの名無しさん:2007/01/14(日) 10:07:51
while( IE2.Busy ){}
972デフォルトの名無しさん:2007/01/14(日) 10:22:06
_(アンダーバー)の仮想キーコードを教えてください。
何処を調べても出てきません(;´Д`)ハァハァ
973デフォルトの名無しさん:2007/01/14(日) 11:13:20
>>972
アンダーバーってSHIFT+バックスラッシュキーじゃないの?
少なくとも俺のIME+キーボードではそうなんだけど。
バックスラッシュキーならキーコード無しの0xE2
あとGetAsyncKeyStateとか使う場合はこれが何気に便利なんだぜ
ttp://www.vector.co.jp/soft/winnt/util/se074436.html
974デフォルトの名無しさん:2007/01/14(日) 11:17:18
CreateFileMapping使うときに
CreateFileでハンドル取得後
CreateFileMapping使うんですが
処理が終わった後
CloseHandleする時上記のAPIで取得したハンドル
どちらともClose処理しなければならないのでしょうか?
975デフォルトの名無しさん:2007/01/14(日) 11:43:19
>>974
YES。CreateFileは該当のファイルをオープンし、そのハンドルを返します。
つまり、このハンドルは開いたファイルに関する情報の構造体への
ポインタみたいな感じ(実際はちょっと違います)です。
CreateFileMappingはオープンしたファイルに関連付けられた
マッピングオブジェクト(メモリマッピングに必要になる色々な情報)
を作成、纏めてそのハンドルを返します。2つとも全く別物です。
片方が閉じられると連動してもう片方も閉じられるとか、そういう事はありません。

ちなみにメモリマップドファイルの蛇足として、
実際にファイルがメモリ上にロードされるのはMapViewOfFileが実行された時で、
メモリ上のファイルデータが実際のファイルに反映されるのは
UnmapViewOfFileが実行された時です。参考までに。
976970:2007/01/14(日) 11:57:03
970です。
すいません、環境を書くの忘れてました。VC6.0でMFCは使ってません。
Win32APIのみで作成しています。あと、質問内容の書き方も悪かったので、
下に改めて書き直します。

1.自作プログラムからIE1を起動(CreateProcessでHTMLファイルを
  IE1の引数として起動させてます。自作プログラムとIE1は別プロセス)
2.IE1に読み込まれたHTMLファイル内のjavascriptのwindow.openで
  新たにIEのウィンドウ(IE2)を開く(IE1とIE2は同一プロセス)

この状態で、自作プログラムからIE2の状態を監視して,IE2がアイドル状態に
なるまで,自作プログラムの処理を待機させたいのです。

>>971氏の方法はIE1内でwindow.openではなくてCreateObjectを使うってことでしょうか?

長文で申し訳ないですが、よろしくおねがいします。
977デフォルトの名無しさん:2007/01/14(日) 11:59:57
>>975
参考になりました。ありがとうございます。
978デフォルトの名無しさん:2007/01/14(日) 13:37:46
>>973
US配列だとshift+マイナスだったりしないかな
979デフォルトの名無しさん:2007/01/14(日) 13:47:34
>>973
スキャンコードは仮想キーコードからMapVirtualKeyで変換したもの使わないとキーボードドライバによっては不具合出る。(US101ドライバとか)
980デフォルトの名無しさん:2007/01/14(日) 14:45:42
>>973
>>972どえす
おおきにアンダーバー0x2Eでビンゴでした、それからVKどわすれくん、重宝します。
981デフォルトの名無しさん:2007/01/14(日) 15:33:28
埋め
982デフォルトの名無しさん:2007/01/14(日) 21:10:52
983デフォルトの名無しさん:2007/01/14(日) 21:16:51
>>974
ハンドルを2つ管理するのが面倒だったらCreateFileMappingの後で
CreateFileから返ってきたハンドルは閉じてしまってかまわない
984デフォルトの名無しさん:2007/01/14(日) 21:17:01
土里
985デフォルトの名無しさん:2007/01/14(日) 21:20:19
埋める前に次スレ立てろよ…と思ったらもう立ってたのか
http://pc10.2ch.net/test/read.cgi/tech/1168708801/l50
986デフォルトの名無しさん:2007/01/14(日) 21:27:46
十田
/土
987デフォルトの名無しさん:2007/01/14(日) 22:24:13
>>983
それって大丈夫なのか?
988デフォルトの名無しさん:2007/01/14(日) 22:47:02
>>987
大丈夫じゃない。
ttp://msdn2.microsoft.com/en-gb/library/aa366542.aspx
>In addition, the file handle should remain open until the process no longer needs the file mapping object.
989デフォルトの名無しさん:2007/01/14(日) 22:47:20
>>987
ファイルマッピングハンドルは内部的にファイルハンドルへの参照も持つから
大丈夫なことは保証されてる。確かAdvanced Windowsにも出てた
990デフォルトの名無しさん:2007/01/14(日) 22:49:28
>>988
その直前にある分を無視するなよ。排他アクセスを保証したい場合は、だろ。
> To ensure that other processes cannot write to the portion of the file that
> is mapped, you should open the file with exclusive access.
991デフォルトの名無しさん:2007/01/14(日) 23:19:14
結局どっちでもいいんでね?
992デフォルトの名無しさん:2007/01/14(日) 23:46:09
どうせATL::CHandle使うからどうでもいい。
993デフォルトの名無しさん:2007/01/14(日) 23:48:38
うま
994デフォルトの名無しさん:2007/01/14(日) 23:51:23
うま
995デフォルトの名無しさん:2007/01/14(日) 23:53:10
まう
996デフォルトの名無しさん:2007/01/14(日) 23:54:18
997デフォルトの名無しさん:2007/01/14(日) 23:55:06
998デフォルトの名無しさん:2007/01/15(月) 00:02:07
ちんちん
999デフォルトの名無しさん:2007/01/15(月) 00:03:22
かいかい
1000デフォルトの名無しさん:2007/01/15(月) 00:03:41
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。