ShowWindowでもタスクトレイにアイコン化されたものを 元のサイズに戻せないんだけどどうすればいい?
OpenIconじゃね?
>>654 それでもうまくいかないです
別のアプリだからかな?
hideになってるフォームが表示されるだけで
実体はアイコン化されたままなので描画されないんです
もしかしてDelphiアプリケーションか?
タスクトレイじゃ無くてタスクバーじゃないの? ShowWindowでいいはずだけど、パラメタ間違ってない?
元に戻す操作をした時のWM_COMMANDとかをSPY++で調べてみりゃいんじゃね?
>>656 そうです
>>657 タスクバーって最小化されてタブ化されているとこですよね?
そうじゃなくて、時計のところのタスクトレイにアイコン化されて
フォームはhideされている状態で、タスクバーにはタブ化されてません
>>658 それもやってみていたんです。
アイコン化されたものをクリックして元に戻したりしてみたんですが
wm_commandは送られてません
syscommandで元に戻すようにしてみたり
wm_activeしてみたりいろいろしたんですけど
Delphiは隠しウィンドウがあるからごにょごにょ
>>659 Delphiのウィンドウは透明のアプリケーションウィンドウの子ウィンドウだから、そっちにもメッセージ送らんといかん
つーかタスクトレイは最小化したウィンドウじゃないぜ? なんか勘違いしてないか。 まあ通知用に非表示のウィンドウを1つ持たせるのが普通だけど そういう決まりがあるわけじゃなし
664 :
659 :2007/01/06(土) 17:42:09
TApplicaitonってものだったんですね
この数日ずっと調べてたのにSW_Restoreであっさりいけました^^;
感謝感激
>>663 アイコンはアイコンで別で構造体を定義したものを追加してるだけなんですよね
で、メインフォームはHIDEされていると。
でも、非表示ウィンドウをメインフォームとは別に用意している場合があるってのが
知らなくて苦労しました
分からない事があったので、質問させてもらいます。
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));
お願いします。
事故解決しますた; 表示するとき作成したビットマップを超えたY領域指定した スンマセン
667 :
659 :2007/01/06(土) 21:28:39
いけたと思ったのにいけてなかった そのときはアイコン化されてなかったのか? 同じコードでやっても全然反応しない TApplicationをRestoreするとタスクバーに表示されるだけで アイコンは残ったまま メインフォームをrestoreしてもフォームが表示されるだけで アイコンは残ったまま 何が悪いんだろ
>>667 タスクトレイのアイコンはフォームの最小化とは無関係だから。
>>667 もともとやってることが邪道
外部から無理やりにリストアされた時にタスクアイコンを消去するように組まれてないんだろ。
670 :
659 :2007/01/06(土) 21:57:43
>>668 いやまあ、それはそうなんですけど
取り出さないと機能が戻らないんですよね
フォームが再描画されないってことです
>>669 そういう場合もあるんですか・・
ってなると、タスクトレイのツールバーからアイコン情報取得して
何かしらのイベント送って、正規の手順を踏んだように見せないとだめってことかなぁ・・
>>670 そういうことじゃない。
タスクトレイのアイコンはフォームの最小化とは無関係ってのは
フォームをRestoreした時に自動的にトレイアイコンも消えるようにはなってないって事。
トレイアイコンを消すのは自分でやるの。
自分で簡単なタスクトレイアプリ作ってみればわかると思うよ
自分でタスクトレイアプリを作ったことが一度もないのに 他のアプリのトレイアイコンを操ろうとするなんておこがましいと思わんかね?
674 :
659 :2007/01/07(日) 00:27:36
もしかしてこういうことをいいたいんですか? Shell_NotifyIcon(NIM_DELETE, NID) アイコンの追加も削除の仕方も知ってるんですけど・・ フォームとアイコンは関係ないとか言ってますけど そりゃ表示上は別々に機能するでしょうけど 内部で連動してる場合もあるわけで アイコンを削除したらいいって単純なことじゃないんですけど
いや、俺も流石にこれ以上は釣られないぞ
>内部で連動してる場合もあるわけで ありません。完全に別のものです。
>>674 OS/Shell/Applicationの管轄がそれぞれどこからどこまでかもう一度勉強しなおしてきてくれ。
678 :
659 :2007/01/07(日) 00:39:30
>>676 では、アイコンは勝手に削除されるわけですね?
アプリが終了しようとしまいと関係なく独立しているわけだ。なるほどね
ここでレベルの低い人を相手にしてても仕方がないので
自分で調べますよ
>>678 >アプリが終了しようとしまいと
いいえ、フォームとトレイアイコンの関連の話です。
アプリが終了したら、プロセスが所有するリソースは基本的にOSが回収するってだけで。 フォームとトレイアイコンの関係とは全く別問題だよね?
681 :
659 :2007/01/07(日) 00:58:09
そんな屁理屈みたいなこと言って楽しいわけ? 表示上は別物だって何度も言ってるでしょ
もう秋田
683 :
659 :2007/01/07(日) 00:59:44
煽りだけは一丁前だけど 全然解答だせないじゃないw 初心者に毛が生えたような知識でえらそうにするなよw
MutexとかOSが回収しない物もあったような
自分に利が無いと判断した時点でレスは全て無視しとけ
>>678 アイコンを管理してるのはシェルだから、アプリケーションが落ちたからといってすぐに消えるわけじゃない。
687 :
659 :2007/01/07(日) 01:08:53
どうでもいいけど、アイコン化されたアプリを 元のサイズに戻して、機能も戻す方法は教えてくれないわけ?
>687 どっちかってぇとDelphi/BDSスレに行ったほうがいいんじゃまいか? ただそんな態度じゃ相手にしてもらえないような気もするが。
NOTIFYICONDATA とWM_TRAYICONMESSAGEでいけると思うがね。 あとはテメーで調べろ。
クリックしたときに送られるWM_COMMANDのIDとかがわからないならクリックのメッセージ送ればいいだろ・・・
691 :
659 :2007/01/07(日) 01:29:47
ほんと頭にくるね
こっちはわかり易く現状言ってるのにそれに揚げ足取るなんてな
フォームとアプリとアイコンが別物だってことぐらい知ってるわ
表現上わかり易く伝えるために、フォームは表示されるけど
内部的にはアイコン化された状態だって言ってるのに
「フォームが最小化してアイコンになるわけじゃない」
とかW
>>657 パラメータってなんだよWWパラメータってW
>>658 WM_COMMANDってwwメニュー操作じゃねーんだからなw
>>689 ありがとう
それで調べてみる
>>690 わからないじゃなくて送られてないの
あとさ、クリックイベント送るっつーことは
タスクトレイ、つまりtoolbarに対してグローバルメモリ割り当てて
情報取り出してメッセージ送らなきゃならないわけ
そこまで面倒なことしなくてもいいのか知りたいから質問しただけ
693 :
659 :2007/01/07(日) 01:36:10
>>689 つか、それアイコンの構造体じゃねーか
そんなのわかってんだよ
自アプリのアイコンを削除したいわけじゃねーの
>>690 ボタン押すのと同じと思ってないか?
つか間違った意見であっても"出してくれる人"に頭下げられない奴はダメな気がする
自分でできないで人に頼ってるくせにこいつは何でこんなに偉そうなんだ?wwwwwww
696 :
659 :2007/01/07(日) 01:42:03
>>694 間違っていることを伝えられるのも2ちゃんねる
煽りや虚言にお礼言っててどうすんだよ・・
>>695 わからないならだまっとけ
697 :
659 :2007/01/07(日) 01:46:27
もう一度言う。自アプリのアイコンを削除したいわけじゃない
こいつ最低だな。 現実世界でも、自分の思い通りの回答やらアドバイスしないと罵倒しまくる奴なんだろうな。
699 :
695 :2007/01/07(日) 01:50:55
よーしDQNな俺様が解決してやる
用件定義を言え
>>655 でいいのか?
人間として最低。
701 :
695 :2007/01/07(日) 01:54:05
概要はタスクバーにあるアイコンを元のサイズに戻したいってわけか Shell_NotifyIcon(...); ShowWindow(ウィンドウハンドル, SW_SHOW); でいいんでね?
702 :
695 :2007/01/07(日) 01:54:41
別アプリならハンドルは取得してるはずだよな?な?
>ShowWindowでもタスクトレイにアイコン化されたものを >元のサイズに戻せないんだけどどうすればいい? って事だろ。 ならば、WINDOWPOSあたりかな。
704 :
659 :2007/01/07(日) 01:58:41
>>699 そです。
>>702 取得済みです
でも、そのハンドルが正しいかはわかりません
一応spyでメインフォームだけでなく、関連するフォームの
すべてに対してSW_RESTOREを送ったけれどもだめでした
705 :
695 :2007/01/07(日) 02:01:03
タスクトレイを元に戻すのってまず最初にタスクトレイにある対象アイコンを削除してから 表示しないとダメなんじゃなかったっけ?NOTIFYICONDATA構造体で NOTIFYICONDATA notify; notify初期化 /* 削除 */ Shell_NotiffyIcon(NIM_DELETE, ¬ify); ShowWindow(対象ハンドル, SW_SHOW); でいけるんでね?
SPY++等で、対象のアプリがNOTIFYICONDATAのuCallbackMessageとuIDに設定した値を調べて、 対象のアプリのウィンドウに、SendMessageでwParamにuID、 lParamに対象のアプリが元のサイズにもどるマウス操作のメッセージを突っ込めばいいでない?
707 :
659 :2007/01/07(日) 02:08:49
>>705 それをやればいけるのはわかっているんですけど
他プロセスのnotifyを取得するには
そうなるとVirtualAllocExでメモリ確保してReadProcessMemoryで
自プロセスメモリにコピーしてとかやらないとだめですよね?
708 :
659 :2007/01/07(日) 02:11:42
>>706 私もそれは考えました
ただ、どうもそのメッセージを送っている相手のハンドルが違っているためか
上手く取得できません
アイコンを作成するときに、どのハンドルにそのコールバックmsgを送るか指定しますよね?
つまり、そのハンドルを持っているウィンドウが隠されてたり、わからなかったりすると
うまく取得できないですよね?
709 :
695 :2007/01/07(日) 02:11:43
OpenProcessとかでマップすればなんとかならないっけ? 少なくともReadProcessMemoryなんかめんどくさい事は少なくとも俺は絶対やらない(やりたくない)
馬鹿が知識もなしにとんちんかんなことをやろうとしてるのがわからんあいのか
711 :
659 :2007/01/07(日) 02:19:54
>>706 ちなみにuCallbackMessageとuIDのメッセージを送るのは
何を見ればわかりますか?
WM_APP
WM_ACTIVATEAPP
かなと思ったんですがどうも違うみたい
712 :
659 :2007/01/07(日) 02:21:44
>>710 バカの定義は知識がないことですか?
バカがバカと気づいていない、知識があると思い込んでいるのが
バカだと私は思いますよW
バカじゃないなら教えてくださいな
713 :
デフォルトの名無しさん :2007/01/07(日) 02:22:57
ShowWindowでもタスクトレイにアイコン化されたものを 元のサイズに戻せないんだけどどうすればいい?
今夜はいつもに増して乳臭い流れだな
715 :
695 :2007/01/07(日) 02:23:41
表示させる前提がタスクトレイのアイコン削除だから 頑張って削除できるようにしろとしかいいようがない。おじさん寝るよ
716 :
695 :2007/01/07(日) 02:24:45
バカの定義 バカがバカと気づいていない、知識があると思い込んでいる
718 :
659 :2007/01/07(日) 02:27:51
719 :
659 :2007/01/07(日) 02:29:49
>>715 ツールバー内の何番目のアイコンがどのプログラムかなんて
調べれたら、そりゃTB_DELETEで削除はできますけど
どのアイコンがどのプログラムかなんて調べようとしたら大変で・・・
とにかくお休みなさい。
ありがとうございました
720 :
695 :2007/01/07(日) 02:31:30
>>718 残念だがおじさん他プロセスのNOTIFYICONDATAの取得
なんてやったことないからわからない。
そうかマクロか。
689だが・・・書き忘れた事があって来たんだが・・よくわからん事になってるなぁ。 sleepかませないとうまくいかない事が多いよ。数値はマシンによって違ってくるケースもあるから そこら辺はてきとーに。漏れは100程度にしてるが。 元の大きさに戻らないって事だろ? って事はハンドルは取得出来てるって事だよな。
>>711 uCallbackMessageはクリックしたときに送られるメッセージの中から推測するしかないだろうね。
そのwParamがuID。lParamにはそのアイコン上のマウスメッセージが入ってる。
WM_MOUSEMOVEって送られてきたっけ
すまん途中で書きこんでしまった。
もしWM_MOUSEMOVE飛んでくるなら、タスクトレイ上でマウス動かしまくれば、
lParamにWM_MOUSEMOVEの値(0x0200)で大量にメッセージ来るからわかるはず…
メインウィンドウじゃないウィンドウに通知させてるかもしれないなら、
これでプロセスに属するウィンドウ調べてSPY++で補足とか。
http://www001.upp.so-net.ne.jp/yamashita/product/debug/ww.htm SPY++って単純にウィンドウの列挙で、どのプロセスかは開かないとわかんなかったよね?
いま、手元にSPY++ないんで見当はずれのこと言ってたらスマソ。
724 :
659 :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でない子ウィンドウは表示されないです。
本当にここは使えないインターネットですね
>>724 オメーそれ対象のアプリがどのタイミングでどのウィンドウに
どのメッセージを受けたときにどうやってタスクトレイから
アイコン消してるかがわからなきゃ一生無理じゃねーか
SPY系のツール使って普通に操作してタスクトレイから復元したときの
メッセージの流れ追うしか解決方法はない
隠しウィンドウが独自メッセージ送ってるかもしれんぞ?
>>724 そのアプリ所有のウィンドウね。フォームのウィンドウに通知させてるとは限らないよ。
メッセージはWM_*MOUSE*ではなくて、ユーザ定義のメッセージね。
WM_USER + xxxとかWM_APP + xxxとかなってると思う。
そのlParamにマウスメッセージが入ってる。
ツール上だと、WM_MOUSEMOVEみたいに表記されず単に数値だから注意。
WM_MOUSEMOVE飛んでくるようだから、
WinspectorSpyのProcessタブから、そのアプリのウィンドウ全部監視して、
タスクトレイのアイコン上でマウス動かせばわかると思うよ。
(クリックして元に戻すと、いろんなメッセージ飛ぶから戻さないこと)
728 :
659 :2007/01/07(日) 04:43:44
>>727 どうも参考になります
processタブ開いたことなかったけど、こっちのが使い易いですね
調べて見ます
ありがとう
729 :
659 :2007/01/07(日) 05:41:02
>>727 言われたとおりやってみたらばっちしでした^^
メッセージを送っているウィンドウは別にありまして
それを監視したらちゃんともとのサイズに戻りました
ほんとにありがとう
親切に教えるからつけあがるんだ
やさしいお兄さんお姉さんが答えてくれる かも
かわいい妹かもしれん
735 :
659 :2007/01/07(日) 11:02:33
終わったんで風俗逝ってきまつ
本当に本当に本当にこのスレは馬鹿豚どもの集まりだなwww 恥ずかしすぎて見てられないwwwww
737 :
デフォルトの名無しさん :2007/01/07(日) 11:05:20
教えてください UNIXのメッセージに相当するWinAPIは名前付パイプであっているでしょうか?
いいえ、名つきパイプはメッセージではありません。
740 :
デフォルトの名無しさん :2007/01/07(日) 13:09:57
>>729 何に何をしたら思ったとおりにうごいたのん? そして、どこにつまづいたといった反省点は?
同じ道を歩むかもしれない人の為に、詳しく報告すべきじゃない?
質問したからにはどう解決したのかちゃんと書こうよ。これだけ引っ掻き回したんだしさ。
まあ、待て 今ソープ中だ
特定のアプリに対してだけ何かしたかったんじゃないのかね これに汎用性のある手段は無いからな。 だったらそう書けばいいのに。 最近、単純な質問をして後から別プロセスだと情報小出しにするやつが多いが同じ人なのかね?
同じ人種なのは確かだ
スレ違いかもしれんがSFU使ってるやつっているか?
「かも」じゃない。
かと言ってUnix板とも違うし、 より妥当なところがあるなら案内してもらえるとありがたい。 で、SFU上では通常のWindows APIを呼ぶことってできるの?
普通にコンソールアプリとかWSHのスクリプト作って呼ぶだけじゃだめなの?
一般的にWM_PAINTメッセージでペイント描画を行うときに、何ms以内に処理を終えれば、もっさり感がないでしょうか?? もちろん、アプリケーションの種類によりますが、Notepadもどきのようなものを作っております。 よって、スクロールバーによるスクロールができればいいなと思っています。 まだ、実装していないのですが、スクロール時にWM_PAINTでの描画にもたつき、 スクロールがカクカクになるの嫌だなぁと思って、最大でも何ms以内に処理を終える目標を立てればいいのかなぁ考えています。
そんなもん実装する前から悩まんでもいいよ。 完成した後で、もっさりが問題になってからチューニングすればいい話だし。 そもそも応答時間なんて環境依存なんだから、目標なんて設定しようがない。
俺なら設計の段階で軽くテストしてモッサリ感がなさそうなのを確認してから作る。 設計ミス > 一応完成 > チューニング > 絶望ってのが一番凹む。
ダブルバッファリングして遅かったら描画処理の部分を疑う程度しかやらねぇ
752 :
659 :2007/01/07(日) 19:08:43
>>740 動画エンコ用のソフトを複数使っているので
その一連の作業を自アプリだけで行おうとしたのが目的です
別々に開いたり閉じたりするのも面倒なので
複数のアプリをボタンひとつで画面に整列させてやりたかったわけです
解決方法は怪しいフォームのプロセスを監視状態にして
タスクトレイのアイコンの上にマウスポインタを移動させて
MOVEイベントが送られているフォームを見つけて
アイコンをマウスクリックで元に戻し
そのときに出てきたWM_USERのパラメータで
SENDMESSAGEを送ってやった次第です
反省点はフォームに直接ShowWindowメッセージを送れば
アイコンが元に戻ると思い込んでたのが間違いでした
すべてのフォームにrestoreメッセージを送っても反応がなかったので
頭から省いてしまっていたわけです
実際にはクリックされたというメッセージを送らなければ
アイコン削除処理をしてくれなかったわけです
どうもありがとうございました
気持ちよかった?
>>748 です。わかりました。とりあえず、実装してみます。
今の実装では、WM_PAINT時にExtTextOutを何度も呼び出すつもりですが、ちょっとExtTextOutだけの
テストアプリを作り、試しに1000回呼び出す時間を計測したところ、それだけで50ms近くかかってたので、
うほぉ。っと思ってました。表示するテキストの内容にもよりますが、超最悪1万回とかいったらどうしよう
とか考えてた次第です。もちろん、ExtTextOutでの描画をまとめるのが筋ですが、
それをやると、ある問題が発生するので、どうぴよー。と思ってました。
とりあえず、先に実装してみます。
755 :
デフォルトの名無しさん :2007/01/07(日) 19:35:54
うほぉ。 どうぴよー。
仕事中ってそういう意味不明なワードが口を付くから困る
あん どゥ トろワ?
カトル!
やかん?
>>746 サブシステムが違うので無理です。POSIX APIとネイティブAPIしか呼べない。
ネイティブAPIもWin32サブシステムでの動作を前提にしてると
思わぬ落とし穴にはまるかもしれない
762 :
746 :2007/01/07(日) 21:31:47
>>754 速いテキストエディタを作った事のある俺が答えてやろう。
Unicodeを使え。文字列を描画する場合は、1文字ずつではなく極力まとめて描画しろ。
メモリの確保破棄は発生しないように設計する。
文字幅の計算系のAPIはとても遅いので、自前で位置を計算する場合は取得結果をキャッシュする。
オフスクリーン(ビットマップ)に描画イメージを作成してから、ディスプレイに転送するとフリッカーが発生せずにさらに速い。
文字入力したときなどは変化した部分だけ描画。とにかく更新の必要のない部分は描画を行わない。
まあ、基本だね。
HRESULTの値ってどう意味を持つのですか? それとHRESULTが含まれるコードによくS_OKとかくっついてることが多いのだけど BOOL値のTRUEような感じなんですかね? ざっくりとでいいですから解説オナガイシマス
765 :
デフォルトの名無しさん :2007/01/07(日) 23:32:09
ファイラーなどで、ファイルの一覧をListViewで表示しているものがありますが、 さらにファイルを右クリックすると、エクスプローラのコンテキストメニューが出てくる ようになってるソフトがありますが、あれはどのようにして実現しているのでしょうか?
ちなみに、「ファイラー」というのはWindows非標準のファイル管理ソフトやアーカイバのことを指したつもりです。
>>764 関数の成功判定をBOOLで返した場合、失敗してもFALSEしか戻せないので
何に失敗したかの情報を戻り値に含められない。
HRESULTはS_OK以上なら成功、S_OK未満なら失敗を表すための型で
何に失敗したかなどを意味する数値が色々defineされている。
HRESULTがS_OK以外にどんな値を返すかは関数次第。
単純に成否判定をしたい場合は
SUCCEEDEDマクロ(成功ならTRUE)かFAILEDマクロ(失敗ならTRUE)を使う。
あ、ちなみに失敗してもその後の実行に支障がなさそうな場合とかに 「S_OK以上の失敗コード(例えばS_FALSE)」を返してくる場合もあるんで FAILEDマクロだけで成否判定してると部分的な失敗とかを取りこぼすことがあるんで どんな値が返ってくるのかちゃんとドキュメント嫁。
>>763 >文字幅の計算系のAPIはとても遅いので、
横槍ですまぬが、具体的にはどの関数でしょうか?
すごく・・・興味あります。
>>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
>>770 GDIだとGetCharABCWidths, GDI+ならGdipMeasureString
>>772 >自分でHRESULT型の定数を作るときにはFACILITYを独自の値にする必要がある。
勝手に作っちゃダメよ。
>Status codes in facilities other than FACILITY_ITF can be defined only by Microsoft.
>>765 >>766 IContextMenu2, IShellFolder.GetUIObjectOfあたりを調べなはれ
>>763 >>754 です。Unicodeでダブルバッファリングはしてます。で、今巨大な横幅のデータを食わせてみたのですが、
やはり、横スクロールしていくと、だんだん、遅くなってきています。
横に5000文字あたりのところでついにはもっさり感が・・
今の実装は毎回横幅を取得してるので、右端の方にいけばいくほど、描画のための呼び出し回数が増えてるっぽいです。
おっしゃる通り、まとめてキャッシュする方向でいきます。今はテキストを強調表示のためパーサーにかけてるのですが、
パース後にキャッシュします。今の段階では描画より、幅の取得に手間取ってるっぽいので、
とりあえず、まとめずにキャッシュしてみます。それでも駄目ならまとめます。
ありがとうございました。
画面を3ペインくらいに区切りたいのですが、 何で検索すれば幸せになれますか?
nande ムダに 改行が 多いの
>>767 >>768 >>769 >>772 >>774 >>764 です
詳しい解説ありがとう
HRESULTの値の意味は関数が失敗した時の値を詳細に明示するものと理解しましたが
果たして、この関数の使い所はどういう場面でなのだろうかとふと、疑問に思いました
確かにデバッグ時、関数内のどこの処理が上手くいっていないのか等、分かるのは
便利だとは思うのですが、他にはどういう目的や場面で使われるものなのでしょうか?
文章を推敲していると、何故か文末に改行が増えるな。
>>780 失敗する理由が複数考えられるときは、区別できる値を返さんと、ユーザに通知もできんじゃろうが
>>782 >>780 です
やっぱりマネージドC++/CLIのtry、catch、throw見たいに例外処理とかエラーを表示するのが目的?
784 :
770 :2007/01/08(月) 01:42:31
>>783 確かにアンマネージドなC/C++より高水準の言語ではたいてい例外にマップされる
786 :
デフォルトの名無しさん :2007/01/08(月) 06:00:30
【ネガティブ派遣根性チェック】 3つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。 □偽装派遣先の社員の意見にはたとえ間違っていても反対しない □偽装派遣先から「いつまでもここで仕事してくださいね」と言われるようになりたい □自社に仕事を持ち帰れるように言われるとムカつく □自社で仕事なんてできるわけがない □派遣/受託の差異を指摘する人間はムカつく □偽装派遣先には仕事だけでなく自分のプライベートについても指示して欲しい □自分の月額金額を知らない □偽装派遣先社員より自分の生涯収入が低いのは当然だ □偽装派遣先に尻尾を振り、いつまでも一緒に仕事をすることが大切だ □今のプロジェクトが終わっても同じ偽装派遣先に常駐したい
全問正解したのでなにかください
つ VisualStudio .NET 2002
789 :
デフォルトの名無しさん :2007/01/08(月) 11:54:33
>>787 早く自分の会社へ帰れ!!
でないと人間腐るぞ!
え?えっ…? 何これ?デジャビュ?
標準のエディットボックスを右クリックして出てくるメニューに オリジナルのメニュー項目を追加するのってどうやればいいですか?
>>777 スクロールはBitBltかScrollWindowExを使用して更新領域を最小限に抑える。この方法で実装しないと遅いよ。
あと画面に表示されている行だけでも、位置情報をキャッシュするようにすれば再計算しなくていいので速くなる。
>>777 です。
あれから、パーサーで切り出されるトークンをフォントのスタイルと色が同じならある程度にまとめて、
それから幅を取得しにいったら、ついに前回の5000文字の壁を越えて、横方向に1万文字あたりでスクロールさせてももっさり感がなくなりました。
でも、やっぱ、幅を毎回取得してるので2万文字あたりでまたもっさり感が・・・やっぱ、キャッシュするしかなさそうですね。
はぁ。
>スクロールはBitBltかScrollWindowExを使用して更新領域を最小限に抑える。この方法で実装しないと遅いよ。
>あと画面に表示されている行だけでも、位置情報をキャッシュするようにすれば再計算しなくていいので速くなる
ScrollWindowExですか、使った事ありませんでした。スクロール時は毎回画面を再描画してるので。
調べてみます。ありがとうございます。
すみません、もしわかる方がいらっしゃったら教えてください。 CreateProcessで起動するプロセスに対して何らかの識別コードを付加したいのですがいい方法はないでしょうか? 例えば自分のプログラムからNotepad.exeを起動したときに、他のプロセスからも自分のプログラムから起動したことを知ることができるようにする「マーク」のようなものをつけたいのです。 起動するプログラムは既にバイナリイメージなのでソースレベルで手は加えられない制約がある状態で起動元のプログラムから何とか「紐付け」をしたいのです。 何か良い方法がありますでしょうか?
>>795 イメージなら、バイナリデータの一番最後に文字列加えても問題ない
それで認識すれば?
>>796 レス有難うございます。
起動するプログラムは任意に変わるのと、バイナリには手を加えられないのです。
今、考えてる方法は、STARTUP_INFOのReservedメンバに識別する値を入れ、後でPIDからそのプロセスのSTARTUP_INFOを取得して識別できないかとか、
プロセス起動前に環境ブロックに独自の環境変数を設定し、それを起動するプロセスに継承させたあとに、なんらかの方法で目的のプロセスの環境ブロックを読み出す(そうゆうAPIはないのでハッキングする)とかを考えています。
もっとスマートでよい方法がありそうなのですが…
>>797 データをテキストに書き込んで、別のプロセスで読み込めばいいだけじゃん
DLL injectしてPIDなどでユニークな共有メモリ作成してタグを作ったらどうだろうか
>>798 レス有難うございます。
起動元プログラムからデータをファイルやメモリを経由して他のプロセスから読み取る方法ですと、
例えば、もし起動したプログラムが終了してそのPIDが無効になった後に、新たに起動されたプログラムのPIDがユニークになる保証がないため、誤認識してしまう恐れがあります。
>>799 レス有難うございます。
CreateRemoteThreadなどで起動先のプロセス空間にDLLを注入にしてしまえばいいのですが、
識別用の32ビットのコードを知るためだけにDLLを注入するのはやや大変かと思ってすこし腰が引いています
でも、やっぱり起動先プロセスにDLLを打ち込まないと無理そうならやるしかないか…
>>797 起動したプログラムの保持と、その終了を監視する第3のプログラムを裏で動かしとけば?
>>801 レス有難うございます。ちょっと説明が長くなってもうしわけありません。
実はこの起動元プログラムとは、プロセス群を監視し、プロセスに異常終了した場合に再起動を行うプログラムなのです。
そしてこのプロセス監視プログラムはJobオブジェクトを作成し一連のプロセス群を一括管理していています。
今、問題となっているのは「もしこのプロセス監視プログラムが異常終了してしまった場合」に
プロセス監視プログラムを再立ち上げなおした後に、既に存在しているJobオブジェクト内で動作しているプロセスの一覧をチェックして、
プロセス監視プログラム内の情報と整合性をあわせる必要があるために各プロセスにユニークコードを埋め込んでおきたいのです。
レスを頂いた「その終了を監視する第3のプログラムを動かす」というのは対処方法としてはいいのですが、
もしその第3のプログラムにも異常が発生した場合には全く同じ問題がおきます。
本来、プロセス監視プログラムから起動されたプロセスを一意に識別さえできれば、
解決できる問題なのでその方向で解決したいと考えています。
監視プロセスを監視するプロセスを準備したり、2プロセスで監視など、多重化するほうがいいんでない?
>>802 >>799 の案だけど、DuplicateHandle使えばDLL injectしなくても共有メモリ放り込めるかも。
MSDN読んだだけで試してないけど。
オレも監視プロセスを複数にした方がいいと思う 2プロセスなら片方落ちても再起動した後でメッセージとかのプロセス間通信で同期とれるしな
複数プレイか!
>>803 ,805
レス有難うございます。
確かに多重化したほうが堅牢でいいのですが、本質的な問題が解決されてないことが気になります。
>>804 参考情報、有難うございます。
DLLを注入する方法は何通りかあるようなので、今後、解決策が見つからないようであれば試したいと思います。
>>807 PIDだけじゃ一意であることを保証できないのが問題なら、
プロセスの生成日時とかと併用じゃダメっすかね?
win32的にどう取得するのかわからんけど、
WMIのWin32_ProcessにCreationDateというのがあるみたいだ。
WMIのこともよくわからんけど。。。
まあ、これで理論上完全に保証できるかっていうと無理だけど。
809 :
801 :2007/01/09(火) 10:01:10
>>802 (1) 子プロセスを起動
(2) 子プロセスごとのユニークな名前でCreateFile(..,CREATE_NEW,..,FILE_FLAG_DELETE_ON_CLOSE...)
(3) DuplicateHandleで(2)のハンドルを子プロセスに継承
(4) 親側の元ハンドルは閉じる
これで、子プロセスが落ちると自動的にファイルが削除される。
ファイルの置き場所と命名規則を決めておけば、どのプロセスが生きているかわかる。
個人的な感想としては、
>もしその第3のプログラムにも異常が発生した場合には全く同じ問題がおきます。
まで問題となるような状況で”Windowsで(は)大丈夫?”と聞きたくなる。
mutex
>>809 レスどうも有難うございます。なるほど、これはいいかもしれないです!
今さっきまで、NtQueryInformationProcessで子プロセスのPEBのアドレスを取得し、
子プロセスのメモリ空間から環境ブロックをReadProcessMemoryする方法ができないかを考えていましたが、
FILE_FLAG_DELETE_ON_CLOSEの仕様を確認してよければCreateFileの方法のほうがずっとスマートなのでこちらの方法にしようかと思います。
809さん、本当に有難うございました。
Spec Fixまでまだ時間があるので他の方法も一応検討をしてみます。
>まで問題となるような状況で”Windowsで(は)大丈夫?”と聞きたくなる
色々しがらみがありまして…
フェイルオーバークラスタリングで別マシンでも並行稼動させるのと、
Jobでクォータ管理してOSへダメージが波及しないようにしようかと思います。
ち・ちんぽ
813 :
デフォルトの名無しさん :2007/01/09(火) 14:55:09
はじめまして。 僕は今チャットウィンドウを作っていて、 文字を打ち込むためのエディットボックスなどはCreateWindow関数を用いて作りました。 そのため、位置などは、数字を打ち込んで確かめて調整していかなければなりません。 もっと、視覚的にメインウィンドウをレイアウトしたいのですが、 この方法しかないのでしょうか? 親ウィンドウをリソースエディタでダイアログボックスとして作ってもいいのでしょうか? どなたか返答お願いします。
>>813 >親ウィンドウをリソースエディタでダイアログボックスとして作ってもいいのでしょうか?
それはあなたが作ってるアプリの仕様次第。好きにしたらいい。
>>813 最初にきちんときめちゃえばいいじゃん。
>>813 初心者はまず見た目から作ろうとするけど
まずは何をするのかを考え
それに必要なデータなどを格納するオブジェクトを宣言し
そして初めて外見を作っていく
こうするとスムーズにプログラミングできる
外見を作りながらやると、後で機能を増やしたいとか
仕様を変更したいとかなると面倒なことになり
また1から作り直すことになる
頭の中だけで考えず、ヘタでもいいので絵に描いたり
何ができるか箇条書きすることを薦める
>>813 ダイアログをメインウィンドウにしたアプリケーションを
俗に「ダイアログベースアプリケーション」と言って
Windowsではよく使われる手法。何の問題もないよ。
>>813 >そのため、位置などは、数字を打ち込んで確かめて調整していかなければなりません。
フォントが変わると(同じフォントでもOSが変わったりユーザー設定が変わったりすると)正しい
位置が変わる。だからプログラム中で固定値の指定はNG。
面倒だけどGetSystemMetrics()などで取得した値から計算で位置等を決めるように。
ダイアログをメインウィンドウにするのはOK。
文字変換で迷って伊いますBSTRの指すアドレスに文字列が入っているんだけど どのように取り出してMessageBoxで見ることが出来ますか? 教えてくださいオナガイシマス
今まで、レジストリ関係のソフトと、 画像処理系と、ゲームしか作ったことがないのですが、 httpを利用して、情報を取得したいと思ってます。 既存のwebページから読み込むということです。 そこら辺の知識は皆無なのですが、何で検索すれば、 大まかな概要と、手順を見つけることができますか。
823 :
デフォルトの名無しさん :2007/01/09(火) 18:05:19
>>827 環境によって出来合いのものを利用できたりするからな
>>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 );
このようにしたのですが結果が出ません(何も表示されません)
よろしくお願いします。
>>829 なぜpfooをMessageBoxに渡しているのだ?
>>822 多分InternetReadFileExとかで用が足りるんだろうけどな
BSTR=WideCharだってわかってるなら MessageBoxW使えばいいだけじゃないのか
833 :
826 :2007/01/09(火) 18:48:07
>>831 すまね。 WinINet の存在を知らなかった…
835 :
813です。 :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);
>>836 ImageList_AddIconの戻り値はイケてる?
>>836 おかしいとこ無いんでそのまんまコピペしたらちゃんと出たぞ?
アイコンの16x16にはちゃんと絵が入ってる?
>>820 Win32/64のBSTRは、単にWCHARへのポインタと見なして扱える(ただしその逆は真でない)。
>>832 の補足になるが、MessageBoxWは9xにも実装されているので、躊躇せず使える。
840 :
836 :2007/01/09(火) 23:15:26
>>837 戻り値は「-1」で失敗してることが分かりました。
でも、なぜ失敗しているんでしょうか??
>>840 アイテムを挿入するメモリ領域を確保してないから
842 :
837 :2007/01/09(火) 23:20:33
843 :
836 :2007/01/09(火) 23:25:51
>>837 僕の今読み込んでるアイコンは16x16の256色です。
ということは、
hImg = ImageList_Create(16 , 16 , ILC_COLOR8, 1 , 1);
↑この部分に問題があるのでしょうか?
844 :
836 :2007/01/09(火) 23:28:07
読み込んでるアイコンのプロパティを見たら ビットの深さが32になっていました。 どうしたらよいでしょうね?
>>840 IDI_ICON1のプロパティを確認。
めんどくさかったら、 ILC_COLOR8を
ILC_COLOR16か ILC_COLOR24か ILC_COLOR32か ILC_COLORDDBに変えてみて、
IDI_ICON1が何ビットフォーマットか調べてみる・・・などなど。
アイコンのツールは何を?
847 :
836 :2007/01/09(火) 23:33:38
>>846 アイコンのツールってなんでしょうか?
VCのリソースエディタで編集してましたが・・・
>>847 Visual Studio 2005を使っているのなら、
リソースエディタ上部、メニューより、
[イメージ(I)]→[現在のアイコン イメージタイプ(E)]で16x16、16色を選択。
なければ[新しいイメージ タイプ(W)]で追加。
849 :
836 :2007/01/09(火) 23:35:43
ILC_COLOR16か ILC_COLOR24か ILC_COLOR32か ILC_COLORDDB に変えてみましたが、全部ダメでした。 ImageList_AddIcon(hImg , LoadIcon(hInst , MAKEINTRESOURCE(IDI_ICON1))); ↑ここをデバッグボックスで表示されたら -1 になっています。 やはり、ここで失敗しているようです。
VCだったら、アイコン編集でイメージメニューに 現在のアイコンメニューの表示とか 新しいアイコンイメージの追加という項目があるだろ それいろいろいじってみ
ないとは思うが画像ファイルの拡張子を.ico に変えるだけじゃだめだぞ? (ウソだと思いたいがマジにいたから言っておくんだが)
852 :
836 :2007/01/09(火) 23:43:45
やはりダメです(>_<) どうやっても表示されません・・・。
853 :
836 :2007/01/09(火) 23:46:14
>>851 それは大丈夫です!
それから、16x16、16 色 にしっかりしてもダメみたいです・・・
おいおい、16色は ILC_COLOR4 だぜ?
IDI_ICON1 の宣言ミスとか?
ワロスw
858 :
836 :2007/01/09(火) 23:52:44
>>855 それもないようです!
IDI_ICON1 はもうすでにウィンドウのタイトルの方で使っていて
そちらの方ではアイコンが表示されています。
リストビューにだけ表示されません・・
HIMAGELIST型のhImgのスコープなどなど
860 :
836 :2007/01/09(火) 23:56:25
スコープってなんですか(@_@。 すいません・・・初心者で・・
リストビューに表示されないのが問題なんじゃなくて ImageList_AddIconが失敗するのが問題なんだろう? GetLastError() の値はどうよ。 アイコン全種類追加してしまえ
>>860 これをhInstが宣言されている近くに。
(
>>836 の関数から外に出すの)
static HIMAGELIST hImg = NULL;
863 :
836 :2007/01/10(水) 00:06:02
>>862 それでもだめです・・・
ちなみにGetLastError()とは・・・
googleを知らないんだろうか
GetLastError() 簡単に理解したいなら最後に出したエラーコード吐き出しみたいなものと認識してればいい 因みにFormatMessage使えばエラーコードのメッセージ吐き出してくれるよ
867 :
836 :2007/01/10(水) 00:09:24
アイコン全種類追加したらできました ありがとうございました
ウィンドウに貼り付けたエディットコントロールが 左右キーのイベントを拾ってくれないバグに悩んでます。 上下を押すと左右に移動するのですが・・・
スコープ 変数の寿命みたいなもの staticで宣言した変数なんかはまさに不死身 static=癌変数と思えばいい そのほかローカル変数、グローバル変数とかあるけどそれくらい自分で調べよう
870 :
836 :2007/01/10(水) 00:11:48
>>ALL すいませんね。 ご迷惑かけました。 出直してきます。 (できてませんけどw
COLOR4 = 4ビット = 16色 なのはわかってるのかなあ COLOR8 は256色な
というか変数スコープもしらないでwindowsプログラムに手を出してるのがすごい
>>872 いや、スコープって単語が何を意味しているのかを知らないだけかも?
僕ハッカー
GetLastErrorのFormatMessageぐらい晒してから逝って欲しかったな
879 :
868 :2007/01/10(水) 00:30:06
ダイアログ自体を子コントロールとして他のウィンドウに貼り付けるのって良くないかな?
>>879 メッセージの中継をするようになってればいいとおもうけど
>>797 もう見ていないと思うけど、STARTUPINFOの予約メンバについて調べてみた。
cbReserved2はlpReserved2の長さを指定している。
なので、lpReserved2に任意のデータ構造体を指定して、
cbReserved2にそのサイズを指定すれば、任意のデータを送れる。
まぁ、将来の仕様変更で使えなくなる可能性はあるが。
>>879 SetParentでそれっぽい事ができそうな気がする。
>>879 リソースエディタで チャイルドスタイルにして
CreateDialog(.... 親窓)
は良くやるな。
TABのフォーカス周りをちゃんとしようとすると、IsDialogMessage() 利かさなきゃいけないけど
884 :
882 :2007/01/10(水) 16:10:42
885 :
795 :2007/01/10(水) 19:51:07
>>884 レス、有難うございます。もしかしたらレスがつくかもと思ってまだ見てました
MSのCランタイムがランタイムでオープンしたファイルハンドルを子プロセスに継承させる情報を伝えるために、
プロセス初期化時にlpReserved2を使って細工をしているなので、このままでは大部分のプログラムで問題が起きそうですね。
とりあえずはcbReserved2を使えば良さそうなのと、ページの最後に説明されているように、
lpReserved2に渡すバッファの先頭をポインタサイズでnullにすることに取り決めておけば使えるようです。
cbReserved2もしくはlpReserved2のいずれを使ってもGetStartupInfoで取得できそうですが、
GetStartupInfoは自プロセスのみに使える方法なので、他のプロセスからSTARTUPINFOを覗くにはPEBをハックして引きづり出すか、
ターゲットのプロセスにDLLを注入してGetStartupInfoを実行させないと取得できないかもしれません。
やっぱりこのあたりに行き着いてしまうようです。
とはいえ、884さん、とても参考になる情報を有難うございました。
現在、PrintDlgで選択したプリンタと設定でメタファイルを印刷する処理を作っています。 そこでDEVMODE構造体のdmPaperWidthとdmPaperLengthが dmOrientationの設定によって入れ替えるプリンタと入れ替えないプリンタがあるのですが、 その入れ替える・入れ替えないを取得する方法はありませんか? DeviceCapabilitiesでDC_ORIENTATIONを指定すれば 取得できるかと思ったのですがどちらのプリンタも90が帰ってきました。 またdmFieldsも両方でDM_ORIENTATIONが設定されていました。 それと、dmPaperWidth、dmPaperLengthがdmOrientationの設定によって入れ替わらない場合、 メタファイルを90度回転させてから出力する必要があるのですが それはどのようにすればできますか? 以上2点、ぐぐるヒントでもいいので教えてください。
887 :
886 :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); }
>>887 して、pdv.dmOrientationは調べた?
>>886 プリンタでやったことないけど
SetWorldTransformでできないかなー
MIDIを再生したいのですが、どうすればいいんでしょうか? ググってもパッとしたものが見つからなかったもので…
ああ、MCIか。スマソ
細かい制御がしたいなら midiOutOpen()して midiOutShortMsg()とかすれば ほぼなんでも可能
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);
コントロールのIDってウィンドウの中でユニークであればOK? たとえば、WindowAの中にControlB1とControlB2があって、 ControlB2の中にControlCがあるとする。 ControlB1とControlCのコントロールIDが同じだとまずいですか?
>>894 同じIDが複数あっても、IDで識別できなくなるだけで仕様的にはかまわない。
アプリ次第。
thx。あとコントロールIDの値の範囲って#defineされてましたっけ?
うん
うう、ぐぐっても出てこないっす。ヘッダ見てもどれだか・・・教えてください。
USBハンドセット(HID)のボタン情報を取得したいんですが、情報がなくて困っています。 使っているのはP1-Kというものです。 SetupDiEnumDeviceInterfaces()で見つけてCreateFile()でハンドルを得て、 HidP_GetCaps()で得たサイズでReadFile()してますが、ブロックされて帰って来ません。 同様の方法でジョイスティックのボタン情報は取れるのですが、やり方が間違ってるんでしょうか。
900 :
886 :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 | |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ↑このようなウィンドウを作ったとして、リストボックスとエディットボックスの境界線を ユーザが移動できるようにするにはどうすればいいのでしょうか
境界線をドラッグで移動した分だけListとEditの位置とサイズを変更する。
境界線をドラッグしたら、リストボックスとエディットボックスのサイズを調整するようなプログラムを組む。
特定の操作をしたとき、 アプリケーションを終了させたいです。 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度クリックすると、メッセージボックスが表示されずに終了しました。 何が起こっているのかわからないので、説明してください。
>>901 LISTとEDITの間に幅のちんまい自作コントロールを貼り…
自作コントロール側: ドラッグ処理後、親にドラッグあったことを通達
親:通達をうけて、LIST/自作コントロール/EDIT を再配置
>>906 すいません、文章のミスです。左クリックの間違いです。
>>907 だったらそのコードだけではそんな文章のようにはならない。
メッセージボックスが出た場合は、閉じたら即PostQuitなのでそのまま終了する
まああちこちにPostQuitMessage置かないほうがいいと思うけどね。
WM_CLOSE投げとけ。
∧__∧ ( ・ω・) いやどす ハ∨/^ヽ ノ::[三ノ :.'、 i)、_;|*く; ノ |!: ::.".T~ ハ、___| """~""""""~"""~"""~"
>>909 誰w
>>908 ということは別の何かが原因ってことですか。
WM_CLOSE投げたら、思ったように終了しました。
なんでだろ。
ありがとうございます。
>>904 たぶん、その問題とは関係ないけど
MSDNそのまま読むと、
GetMessage関数って-1は失敗だけど、それ以外は成功じゃね?
その記述だと、-2以下が帰ってきたらダメな希ガス
(そんな値が帰ってくるかどうかシランがwww)
>>912 なら
!= -1 が正解なのか。
でも、MS以外のサンプルだと>0ってのも良く見る。
>>913 ちげーだろ、
0のときループから抜ける、-1のときエラー処理、それ以外のときループしなければならないんだから。
とりあえず、WM_QUIT を受け取ったら 0 が返るからループ終了。 これだけは外せないベ
でも実際エラー処理なんてする?
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);\ のように定義されております。 この原因は、プロセス外のウィンドウに対し、ポインタを用いたメッセージを使用することにあるのでしょうか? また、リストビューの選択状態を外部から変更できる、別の正しい方法があるのでしょうか? ご教授下さい。
>>918 >この原因は、プロセス外のウィンドウに対し、ポインタを用いたメッセージを
>使用することにあるのでしょうか?
その通りじゃね?
920 :
デフォルトの名無しさん :2007/01/11(木) 19:22:38
>>919 ご返事ありがとうございます。
EditのSETTEXT等は上手くいっていたため、違うのではと思っていました。
それでは、このような場合の対処としては、どのようにすればよいか、ご存知でしょうか?
前に検索してみたときは、9x時代の情報でVirtualAllocというのを少し目にした事があるのですが、
今もこれを使うものなのでしょうか?
>>921-922 ありがとうございます。
リンク先のサンプルソースを改変して、無事希望の動作が出来るようになりました。
VirtualAllocExを使用する方法、初めは面倒くさそうに思っていたのですが、意外と簡単に出来て良かったです。
1.ウィンドウハンドルから、対象のプロセスの仮想メモリ読み書き可能なハンドルを得る
2.自プロセスと対象プロセスで共有メモリを作成
3.ローカルの共有メモリを好きなように書き換え、
WriteProcessMemoryでグローバルな共有メモリに上書き
4.SendMessageで共有メモリを使用する
5.解放
このような動きですよね。
今回非常に助かりました。ご助言や適切な参考リンクに感謝いたします。
本当に、ありがとうございました。
926 :
デフォルトの名無しさん :2007/01/11(木) 21:05:41
>>926 メニューハンドラから呼んで読み込むんでないの?
読んだらビットマップにしておいて、WM_PAINTでBitBlt()すればいいと思うよ。
もちろん、あなたのプログラムの構造によっていろいろやりかたもあるだろうけど
>>882 > まぁ、将来の仕様変更で使えなくなる可能性はあるが。
CRTが使ってるからそのCRTがサポートされる限りは大丈夫だと思うけど
アプリが勝手に使えないという結論に変わりはないな
>>885 > lpReserved2に渡すバッファの先頭をポインタサイズでnullにすることに取り決めておけば使えるようです。
これやるとVista x64でおかしくなる可能性があるからやめてくれ
詳しくは12月のCygwin ml参照
コンパイラとかのコンソールアプリから、 出力をリダイレクトするにはパイプでよかったよね?
>>917 GetMessage のエラー処理は「する」のが基本
GetMessageのエラー処理とはreturn -1;しているだけという俺のコード。
>>931 正直、それだけで充分。
それをしてないプログラムもあったりするのが現実なんだよ。
933 :
795 :2007/01/12(金) 00:34:48
>>928 レスどうもです。
lpReserved2のほうはVista x64で問題がおきる可能性があるのですね。
実はlpReserved2を使うほうは諦めました。
そもそもバッファを用意してその先頭をポインタサイズでnullにする方法はトリッキーすぎるかもしれません。
今のところ、下記の3通りの方法を考えています
@STARTUPINFOの読み出し方法は別途考えることにしてcdReserved2のほうはまだ諦めていません。
Aプロセス初期化時にDLLを注入してプロセスを識別できるように細工する方法も考えています。
B809さんに教えていただいたFILE_FLAG_DELETE_ON_CLOSEでCreateFileの方法も考えています。
どれも一長一短あり、まだ検討中です。もっとスマートな方法があるといいのですが。
>802の、ジョブとプロセスの整合性を取る、 というのがよく分からん。ジョブオブジェクトが存続し続けるなら、 そのような整合性を取る必要はないのではないのか?
935 :
795 :2007/01/12(金) 00:52:28
>>934 Jobオブジェクトはその中で動作しているプロセス群を列挙する方法や識別する方法がないので、
もしJobオブジェクトを握っているアプリ(プロセス監視プログラム)が異常終了してしまうと、
再起動した際にJobオブジェクトは認識できても、その中で動いていたプロセスであるかはわかりません。
そこでプロセスのどこかにどのJobオブジェクトに属してたのかを識別する方法として何らかの情報を打ち込んでおきたいのです。
もしJobオブジェクトからその中で動いてるプロセス群を識別する方法があれば、
各プロセスに「紐付け」する必要はないのですが…
プロセスがpidファイルに書き残すのがいいんだろうけど 死んだときにそのファイルが一緒になくなるとは限らないのが問題なんだよね
937 :
デフォルトの名無しさん :2007/01/12(金) 00:56:57
若いの。オラが村では派遣の問題を口にしちゃなんねーだ お前さんはまだわけぇから言いたいこともあるべぇ だべな、派遣問題を口にすると怒る者がおるでよぉ 問題の指摘は駄目だっぺぇ 派遣のことは口にしちゃなんねぇ この村みたいな田舎で生きていくためにはよぉ 駄目のものを駄目と言ってはなんねえだめさ
誤爆乙
ヽ / /⌒\
/ヽヽ|/⌒\ii|\
/ /ヾゞ///\\|
|/ |;;;;;;|/ハ \|
|;;;;//⌒ヽ
|;/( ^ω^)
>>937 おっおっおっ誤爆乙枯ー
. |{ ∪ ∪
|;;ヾ.,____,ノ
|;;; |
|;;;;;|
|;;;;;|
IsProcessInJob とか QueryInformationJobObjectのJobObjectBasicProcessIdList は何らかの理由で使えない、という話なのかな?
941 :
795 :2007/01/12(金) 01:06:12
>>934 FILE_FLAG_DELETE_ON_CLOSEでCreateFileの方法ならプロセスの消滅とともにファイルも消えるので、
ファイル名かファイルにJobとProcessの関係を示す情報をもっておけば良さそうです。
>>940 「QueryInformationJobObjectのJobObjectBasicProcessIdList」!!!!
あれれ、QueryInformationJobObjectの情報問い合わせの系(7種)の中にPIDを列挙するものがありましたっけ!
もしかしたら、これ見落としてたかも… orz
今からよく調べてみます!
942 :
795 :2007/01/12(金) 01:16:04
おおお!これはまさに!今まで何を苦労してチェックしてきたんだ… orz
>>940 すばらしい!あなたは神!
もし知っていたらついで教えてください。(おしえてばかりですみません)
プロセスがハングアップしたことを検出する方法はありますか?
タスクマネージャなどで「応答なし」という状態になっているプロセスのことですが、
これを識別する方法はありますでしょうか?
たぶん、メッセージポンプを駆動してるスレッドがブロックされて、メッセージが一定時間ディスパッチされないアプリを見つけるのだろうと思うのです。
またCUIタイプのプロセス(Subsystem=CUI)でGUIでないプロセスがハングアップした場合はメッセージポンプの方法では判別できないと思います。
Windowsはどうやってプロセスがハングアップしたことを認識してるのだろう…
単に時間かかってるかどうかだろ ハングアップじゃなくてしばらく返事しないだけで応答なしになる
IsHungAppWindow(HWND)
というか、タスクマネージャの応答無しはトップレベルウインドウ限定だからね〜
946 :
795 :2007/01/12(金) 01:35:38
>>943 レスどうもです。確かに異常に重い処理をしてるアプリが動いていても「応答なし」となることがあります。
でもこれはメッセージをディスパッチしてないからだと思ってました。
>>944 レス有難うございます。こんな明快なAPIが存在してたなんて…
これでほぼ問題点を解決できました。
レスを下さった皆さん本当に有難うございました。
ちゃんと動いてて 実情としてはメッセージループに処理が戻ってこないだけ っていうときでも応答なし表示されるから よく分かってないユーザーがそれ見て そこでプロセスの終了したりして余計状況を悪くするんだお
他人の(一般的な・限定しない)コンソールアプリがハングしているかどうかを 見分けるって、チューリングマシンの停止問題に帰着しかねないよな。 ハートビートを定期的に出すような作りにするとか、単にタイムアウトを付けるとか、 アプリの特性にあわせたハング検出ルーチンを用意しないとね。
Outlookとか OutlookExpressとか M$のアプリにやたらとそれが多いような気がするのは 気のせいではあるまい
あと InternetExplorer とか Explorer (つまり shell) とか もうどこが安定した OS なのかと(ry
あれ 950 踏んでる・・・
952 :
795 :2007/01/12(金) 01:50:37
>>947 レス有難うございます。
確かにメッセージをディスパッチしてるスレッドを止めると応答なしとなることからも
単にスレッドが他の処理をやってて結果として応答なしとなってしまうようです。
>>948 レス有難うございます。
IsHungAppWindowのAPIはウィンドウハンドルをとることからもCUIのプロセスは判別が難しいかなと思いました。
やっぱり、そこまでするならクラスタリング用アプリのようにハートビートでロックしていないことを定期的に示すようにしないと無理そうです。
今回のプロセス監視プログラムは任意のアプリを監視する仕様なので残念ながらクラスタリング用の細工をプログラムにすることはできません。
もしかしたら、CUIアプリのスレッドが全てブロックされた状態になったことを検出してハングアップを検出できるかもしれませんが、
単にWaitしてブロック状態であることも考えられますのでこれもダメそうです。
またループしてた場合などは、ハングアップしたのか処理を継続してるのか判別がつかないので難しいと思います。
仮にデバッガープロセスであればインストラクション実行状況やアドレスを定期的に監視することもできますが、
それでもループ処理なのか無限ループなのかわかりません。
これは八方塞がりだと諦めています。
Jobとか使わずに、専用ユーザーつくって、runas ってのはだめなのかな? と、適当なことを書いとく・・・ どちらにしろ、すげークリティカルな相手みたいで大変だね・・・
954 :
デフォルトの名無しさん :2007/01/12(金) 16:06:28
ハリコの虎見てちんちんおっきおっき こ の 書 き 込 み を 見 た 人 は 三 年 後 に イ ン ポ に な り ま す 。 イ ン ポ に な っ て オ ナ ニ ー が 出 来 な く な る の が 嫌 な 人 は こ の 書 き 込 み と 同 じ 文 章 を 三 時 間 以 内 に 違 う ス レ に 五 回 以 上 コ ピ ペ し て く だ さ い 。 五 回 書 き 込 ま な か っ た 男 子 学 生 が 書 き 込み を 見 た 後 三 年 後 に イ ン ポに な り ま し た 。
∧_∧ n^) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ´Д`/ / < 先生!すでにインポな漏れはどうなるんでしょうか? / , / \_________________ | | , 、 i ____| | | | |__ ||\ (_/ \ ||\\ \ || \|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| || || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ‖ ||
USBデバイスが接続されたときに、 1.0と2.0のどちらで接続されたかどうかを判定したいのですが そのようなAPIはありますか? できればSHCNE_DISKEVENTSのタイミングで取りたいのですが。
>>958 なつけーソースw
その内容って、2000とXPで動作が異ならない?
確か文字数が・・・
大丈夫だよおまえら 2chなくならないから
てか、普通にAPI質問箱無くなると困るんだけどなー
ム板はないと困る俺は底辺なのかな('A`)
ところで
>>970 あたりの方はお願いします
だがこ、とわる!
>>962 少なくともAPI32は情報交換って言う意味で俺には必要('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`)('A`)('A`)
('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 が新スレたててくれたから、質問させてもらいます。
CreateProcess()で起動したInternet Explorer(IE1)からjavascriptのwindow.open()で
新しく、別ウィンドウのInternet Explorer(IE2)を開いてるのですが、IE2がアイドル状態に
なるまで自作プログラムの処理を待機させるにはどのようにすればよいでしょうか?
IE2はIE1と別プロセスではなく,同一プロセスの別スレッドで動いている状態です。
呼び出しの関係は↓のようになってます。
自作プログラム(コンソールアプリ) -> CreateProcess() -> IE1 -> window.open() -> IE2
while( IE2.Busy ){}
_(アンダーバー)の仮想キーコードを教えてください。 何処を調べても出てきません(;´Д`)ハァハァ
CreateFileMapping使うときに CreateFileでハンドル取得後 CreateFileMapping使うんですが 処理が終わった後 CloseHandleする時上記のAPIで取得したハンドル どちらともClose処理しなければならないのでしょうか?
>>974 YES。CreateFileは該当のファイルをオープンし、そのハンドルを返します。
つまり、このハンドルは開いたファイルに関する情報の構造体への
ポインタみたいな感じ(実際はちょっと違います)です。
CreateFileMappingはオープンしたファイルに関連付けられた
マッピングオブジェクト(メモリマッピングに必要になる色々な情報)
を作成、纏めてそのハンドルを返します。2つとも全く別物です。
片方が閉じられると連動してもう片方も閉じられるとか、そういう事はありません。
ちなみにメモリマップドファイルの蛇足として、
実際にファイルがメモリ上にロードされるのはMapViewOfFileが実行された時で、
メモリ上のファイルデータが実際のファイルに反映されるのは
UnmapViewOfFileが実行された時です。参考までに。
976 :
970 :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を使うってことでしょうか?
長文で申し訳ないですが、よろしくおねがいします。
>>975 参考になりました。ありがとうございます。
>>973 US配列だとshift+マイナスだったりしないかな
>>973 スキャンコードは仮想キーコードからMapVirtualKeyで変換したもの使わないとキーボードドライバによっては不具合出る。(US101ドライバとか)
>>973 >>972 どえす
おおきにアンダーバー0x2Eでビンゴでした、それからVKどわすれくん、重宝します。
埋め
埋
>>974 ハンドルを2つ管理するのが面倒だったらCreateFileMappingの後で
CreateFileから返ってきたハンドルは閉じてしまってかまわない
土里
十田 /土
>>987 ファイルマッピングハンドルは内部的にファイルハンドルへの参照も持つから
大丈夫なことは保証されてる。確かAdvanced Windowsにも出てた
>>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.
結局どっちでもいいんでね?
どうせATL::CHandle使うからどうでもいい。
うま
うま
まう
海
馬
ちんちん
かいかい
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。