1 :
デフォルトの名無しさん :
05/03/08 20:37:40
■注意
・質問する前にMSDNライブラリやPlatformSDKで検索しましょう
・日本語版MSDN Online Libraryは不完全です。英語版(
http://msdn.microsoft.com )の利用推奨
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
>1 乙 さっそく質問 PlgBlt関数を使って↑の形をした32×32ピクセルのbmpを回転させて下左右の矢印にしたいのですが ↓になるように回転させると _ |↓のように1ピクセルだけ黒くなってしまいます。 しかし←→になるように回転させると普通に回転できます。 point[3] = { {32,32} , {0,32} , {32,0} }; PlgBlt(32×32ピクセルのbmpと互換のあるhdc、point、矢印の画像のhdc、0、0、32、32、NULL、0、0) で実行しています。 何か間違ってますか?
リストビューでDeleteキーを押されたら選択されている行を削除するということを行いたいです。 ウィンドウプロシージャ関数でWM_KEYDOWNメッセージを捕まえようと思いましたが、 コラムが選択されている状態だとメッセージが送られてこないようです。 どうすればよいのでしょうか?
>>4 32*32なら、0-31だと思うんだが。
point[3] = {{31, 31}, {0, 31}, {31, 0}};
>6 _ それでも |↓ になっちゃうんですよ; 回転させた画像が(0,0)ではなく(1,1)から描画されてしまうんです;
>>5 多分WM_NOTIFYとLVN_KEYDOWN
>>8 様
解決しました。ありがとうございます。
おかげ様で、また一つ賢くなれました。
>>7 スマソ。確かにズレが生じるっぽいね。
point[3] = {{30, 30}, {-1, 30}, {30, -1}};
とかすれば一応は回避できるかな。。。
>10 それだと _↓_| こんなんなっちゃいます; でも調製すれば何とかなりそうです ありがとうございました
{{33, 33}, {0, 33}, {33, 0}} だったりして…
>>11 いろいろ試してみての結論を一応。
範囲は0-32でOKっぽい。
で、90°回転させる時のみ3頂点の座標xy全てを-1ずらす。
あ、90°じゃなくて180°ね。スマソ。
>>4 GDI系は、この辺りの作りが甘いよね。
他にもLineToとMoveToで線を描くとき
(10,10)-(90,90)と(90,90)-(10,10)では
微妙に線がズレたり…。
C:\DATA\起動A.exe ← クリエイトプロセスでない起動したプログラム ↑ このプログラムが起動状態にあるか 終了状態にあるか調べるAPIはありますか? それと終了するまで待つにはどうすれば良いでしょうか?
>このプログラムが起動状態にあるか >終了状態にあるか調べるAPIはありますか? プロセスの一覧とって判断 >それと終了するまで待つにはどうすれば良いでしょうか? WaitForSingleObject
前から思ってたんだけどここに質問してる人って 学生とか趣味プログラマで、専門で仕事してる人じゃないよね?
質問です。 beginthreadで実行したスレッドを待つんじゃなくて、即時停止させたいときはどうすればいいのですか?
>>20 一時停止でいいのならSuspendThread
危険な方法だけど強制終了させたいならTerminateThread
一番素直なのは、終了通知フラグを静的変数として用意しておいて 新規スレッド内でこまめにチェックすることだろうなぁ。 他に安全な終了方法なんてないだろ、ワーカースレッドの場合。
23 :
デフォルトの名無しさん :05/03/09 11:27:00
>>21 >>22 手軽で安全な方法は無いのですか。
残念です。
レス、Thx。
>>20 外部から停止させる安全なやり方は終了用のイベント用意して
WaitFor〜でシグナルを待つ方法。
WaitForで待てない他の方法でポーリングするのはお薦めできない。
>>17 CreateProcessじゃないならきっとShellExecuteだろう。
もしそうなら代わりにShellExecuteExを使えばプロセスハンドルが手に入れられる。
>>16 GDI系は、終点の座標は含まないからでは?
>>18 >>26 なるほど、EnumProcesses使えば良さそうですね
クリエイトプロセスが動かないので
sysytem()で起動していました
ShellExecute関数は知りませんでした
ShellExecute試してみたところ起動出来たので
こちらで起動状態取得してみようと思います
ありがとございました
CreateProcessが使えない理由は? systemもShellExecuteもCreateProcess呼んでるんだが。
>>29 いろいろサイトを見てみたら
起動プログラム指定のところがNULLになっているのを見つけて
CreateProcessでも起動出来るようになりました
一番目の因数をプログラムにしていたので、コマンドラインを
受け付けてくれないからでした
因数
>>25 質問内容を理解してないだろ?
最近、質問内容を勝手に変更してしまう輩が
Win32APIスレに沸いているのだが、ひょっとしてそのクチかな?
質問内容を理解してないだけでなく、
スレッドハンドルを同期オブジェクトに使えることさえ理解できてない気がする。
とにかくいろんな意味でズレた、面白い回答だなw、
>>25 。
>>34 前スレにいた、同期オブジェクト自作マニアだな(w
まぁ、元々このスレは電波な質問に正しい答えを返すエスパーの巣窟な訳で。
電波な答えは?
模範的・汎用的な質問に電波な答えをするのがこのスレの流儀。
>>20 の質問に対して
>>25 のように答えてこそ、2ちゃんねらの鑑。
>>34-39 悪いけどスレッドの終了待ちはイベントを使う方法が一般的。
>>22 みたいなWaitFor使わない方法は無駄。
>>35 スレッドハンドルは終了した時にシグナルになるので
主スレッドでは終了したことがわかるというだけ。
主スレッドから従スレッドの停止には使えない。
>>40 本人?そうじゃないこと祈るけど・・・。
もし本人ならかなり痛い。
>WaitFor使わない方法は無駄。
またひとつ伝説が生まれた。
>>40 君は、自分の発言を撤回できない可哀想な人なんだな。
同情するけど仕事上の仲間にしたくない。ごめんな。
>>40 イベントオブジェクトとWaitForをわざわざ使うメリットって
何かなあ…。と考えてみた。
副スレッドの処理が終了してていつ死んでも構わない状態、かつ
主スレッドの都合で、副スレッドが死ぬのはちょっと待ってほしい状態
という前提なら、それが当てはまるか。
>>20 からそこまで読み取れるとはまさにエスパー。
WaitForじゃなくてMsgWaitForでも前提条件がいろいろと。
おれもイベント使ってますが。 グローバル変数使いたくないからってのと、他にも同期しなきゃならん物があったりするので。 自作ゲームや使い捨てアプリならともかく、グローバル変数見て回るとかやりたくないよ。
スレッドの制御はいろいろあるわな。 どうなってもいいから有無を言わさず止めたいとか、 区切りのいいとこで止めたいとか。
>>44 同期オブジェクトはグローバル変数以上にグローバルだろ、と小一時間(ry
というか、いつの間にグローバル変数の話になったの?
>>46 それで、イベント使わないとすると
WaitForMultipleObjectの代わりでも作れと?
WaitForMultipleObjectsだった。すまんこ。
つーか静的変数でできると言う人って、 同期処理が複数必要になったらどうやってるの? Windowsでイベント待ち1個だけ(つまり親スレッドからの終了通知だけ)の状況って、 かなり限定的な気がするんだけど。 イベント作って待機が普通かと思ってたよ。 その辺考えるの面倒なんである初期からずっとイベント使ってる。
>>46 名無しの同期オブジェクトのどこがグローバルなのかと小一時間(ry
>>47 ,48
偏執的だね。病院に逝ったらどうか?
53 :
デフォルトの名無しさん :05/03/10 13:46:37
このスレも春なんですか?
>>53 本末転倒な発想をしてしまっていることに気づけないの?
間違いを認めることができないタイプなのかな。
>>54 それ以前に質問者は同期したいなどと一言も言っていない。
>>53 Windowsにうらみは無いよw。Windowsで飯食ってるし
稚拙だから付き合ってるだけ。今暇だし
ロートルポーリング厨とイベント同期原理主義派が自作自演してるだけ。
>>56 スレッド停止手順も同期処理の一部じゃないのか。
自分の理論を完成させるために質問内容を曲解させていく姿勢には感動した。
現在、同期原理主義派がやや優勢と見た。 ロートル派がんばれw
静的変数派のスレッドの使い方が知りたい
>>59 TerminateThreadは同期して無いが
>>61 ・同期オブジェクトを自作してWaitForXXX()を使いたい人と、
・OSが提供するスレッドハンドルで同期するなりなんなりしたらいいと考える人
の違い。
自分としては、前者の意図がわからない。
前者の脳内では、いつの間にか他の同期オブジェクトまで待つことになってる。
さらに前者は、子スレッドがWaitForXXX()でポーリングする羽目になることに気づいていない。
>>64 TerminateThreadは既に議論の対象外かと。
>>65 >・OSが提供するスレッドハンドルで同期するなりなんなりしたらいいと考える人
謎。
スレッドハンドルだけでどうやって同期すりゃいいのよ。
子スレッドを終了させたいって時に。
>さらに前者は、子スレッドがWaitForXXX()でポーリングする羽目になることに
どうせ後者も静的変数とやらでポーリングするんでしょ。
なんかロートル厨がアホの子に見えるんですが・・・。
今の話題って 1.スレッドに終了するように通知する 2.スレッドハンドルで終了を待機 3.待ちきれなくなったらTerminateThread の1.の段階でどうやってスレッドに通知するかって話題だろ?
ロートルポーリング厨は下請けゲームのべんちゃー会社なとこで数年働いたけど Windowsプログラミングの流れについていけなくなって最近無職になった38歳。 て感じか。 仕事探そうぜ。
>>65 論点を元に戻したのだが。
本格的に頭おかしいのかな、君は?
親スレッド側で子スレッド終了を同期したければすればいい。
子スレッド終了を無視したければ無視すればいい。
上記の目的を達するためだけに、CreateXXXX()で同期オブジェクトを自作する必要はない。
>>72 わかってないのは、君の方だ。
自覚がないのか?
前スレと同じ展開だな。 質問されてから早い段階でスマートな模範回答が出ているのに、 同期機構を自作したくてたまらない輩が無駄にスレを荒らす。
同期問題を解決したらノーベル賞?ものだ
主スレッド主体なら
>>21 副スレッド主体なら
>>22 そもそも
>>20 が安全にスレッドを停止させたいのかは不明。
80 :
デフォルトの名無しさん :05/03/10 14:46:34
>>25 は
>>22 の言う「静的変数」じゃなくて、イベント+タイムアウト0のWaitForSingleObjectで
状態変化を知らせた方がいいよ、ってかことを書いてるんだと思うな。
そのワーカスレッドが「特に何もしないアイドル状態」ってのを持ってるんなら、
漏れも
>>25 に同意。
そうではなくいつもぐるぐる回ってるんならIA64やらAlpha AXPなんか無視して静的変数を使う。
>>80 少なくとも20のスレッドにはアイドル状態なんてないと思う。
アイドル状態を持つには、何らかの通知手段が必要だと思うが、
その通知手段について質問しているわけだし。
あと、誰も書いてないけど、複数のスレッドに個別に通知をしたいなら
PostThreadMessageが便利。
イベントの状態情報はシグナルと非シグナルの1ビット情報。 わずか1ビット。たったの1ビット。今日日1ビット。 かたや、静的変数は何ビット情報かな?
>>82 オイイーー、
分かるが、それいったら、同期オブジェクトを作るための
システムリソースはもっと膨大だろうw
>>81 >あと、誰も書いてないけど、複数のスレッドに個別に通知をしたいなら
>PostThreadMessageが便利。
それは通知相手がUIスレッド限定。
>>80 イベント+タイムアウト0のWaitForSingleObjecをわざわざ使う
メリットが見いだせない。
別にそれでもいいんだけど、無駄。
汚名返上したい気持ちはわかるが、 謙虚になることも大切だよ。
>>82 こいつ何が言いたいんだ
メモリの領域が1ビットだとでも思ってるのか
変数でも0か1なら1ビットだろ
>>85 上司や同僚に volatile 厨やメモリモデル厨がいた時のための安全策ですよ。
ってのはおいといて、イベントにしとかないとスレッド側でオーバーラップドIOとか
何かでMsgWaitForMultipleObjectExとかが使えないから、ってのもある。
完全に計算だけみたいなワーカスレッドなら不要だろうけど。
>>88 本当に何が言いたいか理解できないの?
自作厨に見習って勝手に脳内で仕様変更してみる。
「子スレッドの途中終了処理を分岐させたくなったら・・・・?」
君はよく頑張った。
・・・もういいんだ。ゆっくりお休み。
そして、転職しよう。
>>89 まあ、なんだか異なる前提条件を想定してるってところで、
スレの伸びの原因になってるみたいですね。
変数派:
何も書いてないからスレッドと言えばワーカスレッドだろ。
カーネルオブジェクト使ったりしたらリソース食う。
イベント派:
条件が揃えば何かと便利に使えるシーンがある。
今時のWindowsで多少リソース無駄遣いしても気にすんな。
(言ってないけど想像)
最近の子供に、非同期IOを教えるのに苦労する、 リクエスト、ウエイトわかんないだって、氏ね
なんか盛り上がってマスネ まあケースバイケースって事で次逝ってみましょうか
>>89 終了通知(むしろ終了要求と言った方がよいか?)と同期を混同するのはもうやめれ。全く別のことだ。
一緒になってしまうのは、そいつの設計・実装が悪いだけ。
悪い設計の道連れになったからといって、ミイラがミイラ捕りになる必要はあるまい。
ミイラはおとなしくミイラに徹して棺で寝てろってこった。
>>94 同期処理等で待ち合わせが発生する可能性があるなら、
終了要求(の仕方)はそれらの同期処理を考慮した上で設計する必要がある。
とうわけで、どう設計しても多くの場合「全く別」にはならないと思うよ。
メンドクサイのは確かだけれども、避けられない。
同期オブジェクトなんか使わないでポーリングで全部済ませるなら別だけど。
お前らに質問。 Unicodeビルドで__TIMESTAMP__マクロを使う時、 _T(__TIMESTAMP__)がちゃんと機能する? 俺の環境だとタイムスタンプが更新されないのだが。 無論、リコンパイルして確認してる。 __TIMESTAMP__を普通にASCIIリソースとして組み込む分には大丈夫なのだが。 ようするに ○__TIMESTAMP__ ちゃんと更新される。 ×_T(__TIMESTAMP__) 更新されない。つか、一体いつの時刻なんだ?
>>97 _T マクロが定義されたヘッダファイルがプリコンパイルされた時刻だと思う。
>>96 しつこいようだが、要求通知と完了通知がごっちゃになってないか?
似て非なるものだ。
ごっちゃになってる。
機能が、ではなく言葉の定義が。
100 :
81 :05/03/10 16:38:00
>>84 ワーカスレッドもメッセージキュー持てるよ。
ACPもあるし
Asynchronus Procedure Callね
>>99 漏れは要求の通知の仕方についてしか書いてないと思うけど。
他の人もそうじゃない?
変数派とカーネルオブジェクト派がいるだけで。
意外と、勉強なるよ、教え方が間違っているなと反省、
goto文信者に近いものがあるな。
切り分けることができないと思い込んでいる。
てめえが自分で組み込んでおいて、絶対に同期が必要だと信じ込んでいるだけ。
相当に痛い。
>>84 ワーカースレッドがメッセージキューを持った時点でUIスレッドとみなされるのでは?
誰もワーカースレッドがUIスレッドに変化できないとは言ってない。
そもそもUIスレッドをいきなり作るAPIを知らないのですが。あるのでしたら是非教えてください。
>>106 gotoを否定するやつは嫌い。
エラーはすべてgotoにまとめてるw
WIN32だとどのスレッドにもメッセージキューは存在してるんじゃないか?
私はワーカスレッドのループ内でこげなことしとる。 int request = InterlockedExchange(requestCodeAddr, Accept); switch (request) { case DoQuit: return 0; } InterlockedExchange()はこの板のどっかで知った。
メッセージ処理機構は存在するんじゃない。自分で作るんだ。
>>106 俺はウィンドウを持たずにメッセジキューだけを持つスレッドを
UIスレッドとは呼ばないぞ。
>>109 UI関係のAPIや、GetMessage/PeekMessageを一度も呼んでいない
スレッドにはキューは存在しない。
その状態でPostThreadMessageを実行すると失敗する。
つくづく用語の定義が大事だな。
>>112 AfxBeginThread()でUIスレッドを開始できたと思うが、
あれってウィンドウあったっけ?中の人はどうやってるのかねぇ。
いや、それ以前にウィンドウとは一体な(ry
レベル低いな、ホント。 所詮2ちゃんねるだってのを痛感してる。 キモイ信者が大手を振って歩いてる所だな。
ぶっちゃけ、20はどこか行っちゃったから、もうこの話は終わりでいいよ。
フレームってのは最初に話題振った奴なんかどうでもいいんだよ。
UIスレッド ワーカースレッド 言葉自体はMFC用語なんだよね確か MFC使わないスレッドでも便宜上使い分けたりするけどね。 メッセージキュー = UIスレッド にはならないと思うよ。 GetMessageとかつかってても実際UI無しの場合もあるし COMコンポーネントの同期にも裏でこっそり使われてたような。
>>106 MSDNのPostThreadMessageを見れ
どちらかといえばメッセージループ主体のスレッドか否かって問題。
スマン、UIスレッドをいきなり作るAPIだったな orz
もう、俺なんぞ、スレッドの気分うかがいながらやるか、 スレッド殺すかどっちかだw
いい加減そのネタも飽きた
>>109 そんなことはない。
AdvancedWindowsによるとだね、
キューはスレッドに対してメッセージ処理関数が使われた時に
初めて作成されるとなっている。
AdvancedWindowsに限らず、ちゃんと日頃から参考書を読んでおくと
余計な調べ事も減るってものだよ。
>>126 かなり内側の話だね。一般プログラマが介入できる領域じゃないね。
ぶっちゃけ、( ´_ゝ`)フーンとしか言いようがない。
言葉の揚げ足取りに勤しむ者にとってはそれも重要だけどね。
物量に裏付けられた
>>126 の貫禄勝利。
・・・でも、ちょっと大人気ないよ。(´・ω・`)
Windowsプログラマ向けのトリビアネタなんだろうけどさ。
結構、勉強になるよ、いかに、楽する方法を客と請負業者に納得させるか
>>127 大人気ないのはおまえだろ。
一般書籍でしかも日本語訳までされて版数も重ねた古くからある定番本だというのに、
一般プログラマは介入できないってどうよ?
貧乏だと理由を付けても1日バイトすれば買える金額。
こんなとこ見てる暇を使って働いてこいよ。
PSDKのアップデートを知ってる人はいますか?もう直ぐ新しいのが 出るのなら、今インストールするのはやめておこうかと。
132 :
デフォルトの名無しさん :05/03/10 21:55:00
>>96 ワーカスレッドの代表みたいな通信系のスレッドを制御するとき、喪前は
while (true)
WSAAsyncSelect
WaitForMultipleObjects( { ↑のselectのイベント, 中断要求イベント ] )
if (中断要求なら) 中断...
通信処理
みたいにしろというんだろうけど、漏れは
while (true)
適当なtimeoutで適当に普通の select
if (中断要求フラグ) 中断...
if (!タイムアウト) 通信処理
で済ましてる。なぜなら、後者はシンプルで簡単だし、
上のように書く必要があるほど性能が要求される仕事なんかしたことないから。
>>132 selectはパイプがからんでくるとUnixのソケット知識が役に立たなくなる諸刃の剣。
じゃあWiatFor・・・()ならパイプを同期オブジェクトとして待てるんですかといえば、そうでもない。 要するに俺が言いたいのは、俺はただの冷やかしだということだ。
バークレイソケットインターフェース、有名ジャン
有名だがあまり綺麗ではない。XTIの方がよい
>>132 つまり仕事したことないんだね。
よくわかった。
ぷ、歴史を考えろ、ウニックスは最高、ウニクソを馬鹿にするやつは 滅びる、たぶん
ばーかばーか
他のスレッドのウィンドウにSendMessageを呼ぶと、 自スレッドにキューがない場合、キューは作られますか。 作られたとしたら、GetMessage/PeekMessageを呼ばない場合 自スレッドはどうなりますか。
それぐらい自分で試せ
>>140 釣りだとは思うが、議論のための議論はやめれ。
プログラミングの実用に関係あるかどうかをまず考えろ。
アドバンストなんか読まなくてもMSDNにこう書いてありますからー >スレッドが Win32 のユーザー関数または GDI 関数のいずれかを最初に呼び出した時点で、 >システムはそのスレッドのメッセージキューを作成します。
>141 スレッドがキューを持つかどうか、調べられません。 >142 キューに溜められるものがあると気持ち悪いので質問したのです。 >143 ワーカーからUIにPostMessageする手法はワーカーを変身させますか。
PostThreadMessageのmsdnを読んでから質問してください
2つの端末がケーブルでつながっていてActive Directory状態です。 端末A(kanri)から端末B(sagou)の中にあるプログラムで 端末B内のファイルを読み書きしようとしていますが、ハングして しまいます。端末B内のプログラムをネットワーク越しに動作させる にはどうすればよろしいでしょうか? 各端末ともIP等は振っていません。
>>146 誰の権限でマシンAから、Bのローカルプログラムを実行したのか書かないの?
すみません。 端末A(kanri)は端末B(sagou)で標準ユーザーで登録されています。 ファイルの読み書きをしようとすると落ちちゃうのですが・・・。
>145 ご親切感謝します。読んで、試しました。 スレッドがキューを持つかどうかは、これで調べることが出来ました。 また、ワーカーは、PostMessage/PostThreadMessageを呼ぶと変身しました。 残る疑問は、ワーカー側のキューは放置していいのか、です。おつきあいください。
クラス内でプロシージャ(コールバック関数)を宣言したところ 「overloaded-function から DLGPROCに変換できません」というエラーが出ました これはどうゆうことなのでしょうか
アドレスが取れない
その関数を static にすれば、多分通る。 詳細は thiscall __stdcall あたりでぐぐれ。
153 :
デフォルトの名無しさん :05/03/12 13:24:51
質問です、キーを一回押すメッセージを他窓に送るにはどうしたらいいですか? PostMessage(hWnd, WM_KEYDOWN, 0x41, ?????); PostMessage(hWnd, WM_KEYUP, 0x41, ?????); ここまではわかってるのですが、最後の引数の書き方が良くわかりません 0を入れてみたのですがダメでした 環境はXP+BCCです
Spy++で適当なアプリでキー入力してどんな値が入ってるか見てみたら?
155 :
デフォルトの名無しさん :05/03/12 14:29:21
MSDNに思いきり書いてあるわけだが。
WM_KEYDOWNメッセージ でぐぐるといっぱいでてくるなあ
ITリテラシー
森前首相はWIN32APIは知らないよ
作ったプログラムがやけに遅いと思ったら Sleep( 1000 ); なんてコードがいたるところに… 自分で書いた記憶もないし、いったいなんなんだ?
妖精さんの仕業じゃないの?
Sleep坊主の仕業だな
162 :
デフォルトの名無しさん :05/03/13 00:17:15
API(HTML含む)で質問です。 任意のURLをブラウザ(IE)で表示させるときに、ShellExecuteを使用しています。 ShellExecute(Handle, "open", URL, NULL, NULL, SW_SHOWNORMAL); 上記だと、リンクするたびに同じIEウインドウ上に表示されてしまいます。 これを別のウインドウに表示させる方法はありますか? 具体的にイメージしているのはHTMLのtargetタグのようなコントロールです。 よろしくお願い致します。
>>162 c:\Program Files\Internet Explorer\iexplore.exe
を直接起動した後、DDEでメッセージを送りなされ。
ShellExecuteEx
>>162 openじゃなくてopennewで起動させる。
行の長さを取得したいのですがどのapiを使えばいいか教えてくださいお願いします
GetLineLength
lstrlen
170 :
デフォルトの名無しさん :05/03/13 06:59:31
DIBで24ビットから8ビットとかにするときって自分で減色アルゴリズム組んで減色しないとできませんか?
GetDCの確保の手順がおかしい
いえ、自演じゃなくて真面目に質問をしているんですが、 何か気にさわりましたか?
>>175 だからDC確保周りがおかしいと思われるのでその辺りのソースを晒せ。
OPENFILENAME構造体のlpstrFileメンバにstaticな グローバル変数を指定してフルパスを保存してるのですが モーダルダイアログボックスを生成すると変数の中身がおかしくなってしまいます。 原因と解決策を教えてください。お願いします
>>177 素直にReleaseビルドして死を見届ける。
179 :
デフォルトの名無しさん :05/03/13 11:52:23
ダウンローダを作るのはえらく簡単なことに気がついた。
>>172 デバイスコンテキストはWM_PAINTの中で、
BeginPaint()で取得、EndPaint()で解放汁!
『猫でもわかる』を参考にテキストエディタを作っているのですが、 あえてグローバルにしたほうが良い変数ってありますか? 『猫でもわかる』だとやたらとグローバル変数が出てくるので。
HDC hDC=GetDC(m_hWnd); FillRect(m_hWnd,〜 これじゃ駄目なんですか。 必ず、WM_PAINTのBegin〜End間で描画ですか。 すいませんでした。
Windowsの描画システムについてもっと理解するんだ。 つっても適当な本が見当たらないけど。
>>184 すいません。
不甲斐ない自分です。
Invalidateを呼び出してイベントを送る場合、即座に描画することが出来ないと思うのですが、
アップデートイベントがくるまで描画を待たないといけなくなるので。
186 :
179 :05/03/13 12:22:01
簡単なんだけど分からないことがある。 InternetOpenUrl( or Others)で404errorを検出するにはどんなフラグを 設定すればいいのかな? 今は、第5引数のdwFlagsに INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_RAW_DATAを設定してます。 お願いします。
187 :
179 :05/03/13 12:23:45
>>186 追加
404errorでもInternetOpenUrlは成功しちゃう。
>>185 WM_PAINTメッセージはシステムでの優先順位がとっても低いから、
必要なら直接GetDCで描画するのもアリだよ。
WM_PAINT呼ぶためにInvalidateRectする必要はないと思う。
GetDCで確保したDCは使い終わったらとっととReleaseDCしろ。使いまわそうとか考えるな。
>>188 だとすると
GetDCで一回取得したハンドルを使って、
何回も描画すると、必ずバグのような表示になるのですが。
m_hDC=GetDC(m_hWnd);
なぜなのでしょうか?
ReleaseDCを逐次よばないといけないのでしょうか?
>>189 そうなんですか。
スクロール処理などで、何回も描画を繰り返す場合、一回スクロールするたびに、GetDC、ReleaseDCを呼び出すんですね。?
わかりました。
ありがとうございます。
192 :
デフォルトの名無しさん :05/03/13 12:48:50
>>185 >>アップデートイベントがくるまで描画を待たないといけなくなるので。
んなことない。
InvalidateRect()の後に
すぐ描画したければUpdateWindow()
描画をやめたければValidateRect()を呼ぶ。
再描画のことを考えると、WM_PAINTで処理するのが定石だと思うが。
>>182 自分の場合、1つのプロセスの中で値が変化せず、参照頻度の高いものはグローバル変数にしてる。
モジュールのハンドルとかプロセスヒープのハンドルとか。それら以外は基本的には使わないなあ。
自己解決しました。一応ご報告まで。
俺も自己解決したよ ここの住人はスキル無さ杉
スキルがモリモリあるような奴がこんなスレじーっと見とるわけなかろ?
原因がわかりました。 スクロールの際、 font=::CreateFontIndirect(&logfont); SelectObject(hdc,font); を度々呼び出していたので、途中でおかしくなってたようです。 これを外したら、直りました。 WindowUpdateも結構ですけど、GetDCで取り出して即特定の描画をするほうがやりやすいです。 どうもありがとうございました。
>>198 いや、描画はBegin〜End間でしたほうがいいよ。
そうしないと、何かしら不具合出ると思う。
そのへん、うまくコードを組んで。
デバイスコンテキストを「単なる描画時のおまじない」くらいにしか理解していないんだろ。 たのむからそんなテキストエディタ公開するなよ。
アプリケーションが自分ひとりで動いているんじゃないんだから、 ちゃっとルールは守っとけ。
初心者に無理いうな 育てはぐくむこと(後継者探し)も大切だ
スクロールするたびにフォント作ってたんじゃ、おかしくなるわな(w
WM_PAINTの中で更新リージョンを有効にしないと WM_PAINTメッセージがたまっていく そのため領域を有効にするにはBeginPaintかValidateRectを 呼ぶ必要があるってことですか この辺曖昧だったorz
とあるプログラムで、mciSendStringを使ってMIDIを再生させています。 このプログラムはWin98で作成したものなんですけど、Win95/98では正常に動作していました。 で、このプログラムをWin2000/XPで実行させたところ、とりあえず動作はするんですが、 MIDIをOpenするところで3〜5秒程度時間が掛かるようになってしまいました。 同じプログラムをWinXPでCompileしても状況は変わりません。 Compile の環境はVC++6.0です。 mciSendStringでOpenさせているところのCodeは、 ファイル名とエイリアスは適当ですが、下のような感じです。 mciSendString("open "a.mid" type sequencer alias a00 wait", NULL, 0, NULL); 何か御存知の方いらっしゃいましたら、教えて下さると嬉しいです。
ウィンドウズプログラミングしてる時点である程度頭イイと思われ。 そこら辺歩いてる雑草には、ウィンドウズプログラミングの「ウ」の字も理解できんぞ。 理解するだけの勉強もできんだろーし。
ワラタ
>>206 WM_PAINTはキューに溜まらないんじゃなかったっけ?
なんか優先度が他と違うと聞いた事がある。
記憶が曖昧でスマソ。
阿呆が馬鹿に回答するスレはここですか?
>>212 いえ、ストレスが溜まってるドカチンWinプログラマーのはけ口です。
>>211 WM_PAINTは更新リージョンが存在しメッセージキューが空の場合に生成される。
てことはBeginPaint〜EndPaint等で更新リージョンを無効化しない限りキューが空になるたび永遠に生成されつづけるってこった。
WinAPIでの質問です。 HWNDから取り出したHBITMAP bm_fと、ファイルのHBITMAP bmを比較したいのですが その比較の方法が分かりません。 BOOL chkimg(bm_f, bm, x, y)と言った感じで bm_fのx,y地点からbmが同一であるかを取得したいです。
>>215 メモリDCを作ってSelectObjectしてGetPixel
DDBからDIBに変換してファイルかメモリで直接比較した方が速いだろうけど 面倒ならGetPixelでもいいかもね。 ビットマップの比較なんてしたことないからわからんないけど、 色とかって一致する保障あるのかねえ。 ICMとかは影響しないのかな。
|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| || ○荒らしは放置が一番キライ。荒らしは常に誰かの反応を待っています。 || ○放置された荒らしは煽りや自作自演であなたのレスを誘います。 || ノセられてレスしたらその時点であなたの負け。 || ○反撃は荒らしの滋養にして栄養であり最も喜ぶことです。荒らしにエサを || 与えないで下さい。 Λ_Λ || ○枯死するまで孤独に暴れさせておいて \ (゚ー゚*) キホン。 || ゴミが溜まったら削除が一番です。 ⊂⊂ | ||___ ∧ ∧__∧ ∧__ ∧ ∧_ | ̄ ̄ ̄ ̄| ( ∧ ∧__ ( ∧ ∧__( ∧ ∧  ̄ ̄ ̄ 〜(_( ∧ ∧_ ( ∧ ∧_ ( ∧ ∧ は〜い、先生。 〜(_( ,,)〜(_( ,,)〜(_( ,,) 〜(___ノ 〜(___ノ 〜(___ノ
スマソ間違えた
気にするな
LoadLibrary()でexeファイルを指定できるわけだが、 これは何に利用するものなの? GetProcAddress()でexeファイルがエクスポートした関数も呼べるみたいだし。 ただし、標準C/C++ライブラリとかの初期化がうまくいってないみたいなので、 標準C/C++の関数を使うと処理が失敗しているみたいだ。 あとひとつ質問が。 exeが関数エクスポートできるけど、これは何に使うものなの?
アフォか?
>>222 アフォっぷりを論理的に説明して貰えないかな?
失敗するのはC/C++関数だけではなく普通のWin32APIも失敗するみたい。
デバッグでちゃんとexe内のエクスポート関数に対話的にステップインできるし。
>222ではないが、>223に質問。 dllとexeの違いは何と心得る?
>>224 質問返しは全く得るものがない。邪魔です。荒らさないでください。
中国の方でしょうか?日本的でない論理展開を感じます。
>>224 以外のどなたか、EXEが関数エクスポートできる理由を
ご存知の方いませんか?
exe単体でグローバルフックをかけるソフトを昔見たけど。それは そういうのをつかってたんじゃないかな。初期化できるようにする方法 もあるんだと思う。
>>221 ランタイムの初期化がうまくいかないのは、
EXEに積んであるのがDLL用のスタートアップじゃないからだろうね。
LoadLibraryはDllMainとかのDLL形式のエントリポイント呼び出すから。
おそらく、EXEのGetModuleHandleで返されたハンドルからGetProcAddressを
使うことでうまくいく様な気がする。
EXEのエクスポートテーブルはollydebugとかにも入ってるけど、
プラグイン用のインターフェースに使えるんじゃないかな。
>>227 の言うフックと関係あるのかは知らない。
今実験してみたけどGetModuleHandleで問題ないみたい。
前から、ちと疑問に思ってたんですが、 小さなexeの作り方は解っていますが、 メモリ使用量を小さくしたアプリはどう作られてるのか知ってる人いますか? ウィンドウを持ずに、10秒程度スリープするだけのexe作って、 プロセスヒープサイズを小さくしてもタスクマネージャで見た メモリ使用量が1M程度から下がりません。 System Idle Process見たいなメモリ使用量ってどうやって実現するのでしょうか・・・。
>>230 その1Mはたぶんスタックだ。
ぎりぎりまで減らせ。
>>228 ,229
GetModuleHandle()の引数には他の外部EXEを渡して試した?
なんか、テスト前提が違ってるような・・・。
235 :
デフォルトの名無しさん :05/03/14 14:44:35
EXE兼DLLってどうやって作るんだ? 自分自身がEXEとして起動したのかDLLとして起動したのかをどうやって判断するんだろう。
あらかじめLoadLibrary()で外部EXEを読み込んでおかないと、 GetModuleHandle()できないはずだし。 いや、それ以前に、LoadLibrary()の返すHMODULEと GetModuleHandle()の返すHMODULEは同じものだ。 ある意味、当たり前だけど。
プラグインでコールバック云々っていうからにはDLLがGetModuleHandle(NULL)して得たEXEのHMODULEからGetProcAddress()するってことじゃないのか?
>>237 それが意味のあることかどうか、よく考えてからレスしてくれ。
EXEが関数をエクスポーとしているのはDLLに機能提供するためじゃないか? あるアプリとそれ用のプラグインDLLとの間で、アプリからプラグインに対して、エクスポートした関数を使って 色々とやりとりしたりとか。
>>234-235 何か勘違いしてるね。
EXEにエクスポートテーブルがあるからといって、
そのEXEがそのままDLLの代わりになるなんてことはない。
>>228 はEXEの関数をDLL側に提供するって事。
DLLの仕組み的にEXEとの兼用はたぶん無理じゃないかな。
まさかとは思うが、単にコンパイラとリンカが exeの関数エクスポート生成の拒否を怠っているだけ、なんてこたーないよな?
>>240 >EXEの関数をDLL側に提供するって事。
あいかわらず曖昧。
EXEのエクスポート関数を他DLLファイルの内部で呼べるようにするという意味?
EXEの関数をDLLとして提供するという意味?
文章の"DLL側"とは何を意味するかをまずはっきりさせてもらいたい。
>β版とは違う話題で恐縮ですが、こちらで質問させていただきます。 > >プラグインSDKで利用できるAPIは、やはりメタセコ本体が起動していないと上手く動作しないのでしょうか? >つまり、例えばプラグインからではなく、単体のアプリから本体exeファイルをLoadLibrary()して、APIのみGetProcAddress()でインポートして呼び出すような事では、使用できないのかなということです。 > >一応簡単なテストプロで試してみた限りでは、エラーが発生してしまいました。 >もしかしたら使い方が悪かった可能性も残っているので、質問してみました。 > >ちょっと単独のMQOデータを扱うツールを作る場合、曲面化とかミラーリングのフリーズ機能が使えると助かるなぁと思ったもので。
なんか知らないけど痛いなあ・・
246 :
デフォルトの名無しさん :05/03/14 21:01:49
質問ですが、 MyApp.cpp void CMyApp::FuncA(){ m_hRgn==CreateRectRgn(5,5,100,100); } MyApp.h class CMyApp{ public: HRGN m_hRgn; }; FuncA()でリージョンを作成したあと、ウィンドウプロシージャ内で、 描画のために再利用をしようとしても、正常に描画されません。 ウィンドウプロシージャにかかわらず、一度作成した後、他の関数内で再利用すると、 そのリージョンが機能しません。 リージョンだけ特別な仕様なのでしょうか? 他のブラシ、ペンなどのオブジェクトはそのような異常なことは起きず、 どこでも再利用できます。 これはどうしてなのでしょうか?
247 :
246 :05/03/14 21:02:32
//オーバーライド可能なウィンドウプロシージャ LRESULT CXSWndBalloon::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hDC; switch (message) { case WM_COMMAND: (一部省略) case WM_PAINT: hDC = BeginPaint(hWnd, &ps); HBRUSH hOrange; hOrange=::CreateSolidBrush(RGB(250,124,134)); ::FillRgn(hDC,m_hRgn,hOrange); DeleteObject(hOrange); EndPaint(hWnd, &ps); break;
>>246 > m_hRgn==CreateRectRgn(5,5,100,100);
>
"=="は転記ミス?
>>246 m_hRgnはCMyAppのメンバではないのか?
CXSWndBalloon::WndProcの::FillRgn(hDC,m_hRgn,hOrange);で使ってるm_hRgnと何か関係があるのか?
.NETじゃないの?<EXE兼DLL
Build27より
756 名前: デフォルトの名無しさん 05/02/08 01:04:27
すみません教えてください
APP(A)からDLL(B)を呼び出しているのですが、DLL(B)からさらにDLL(C)をLoadLibrayでロードしています。
DLL(C)からDLL(B)の関数をGetProcAddress()で読んでいるのですが、DLL(C)はハードコーディングで
GetProcAddress(GetModuleHandle(NULL), "Foo")
みたいになっちゃっていてどうもAPP(A)の空間しか見れて無いらしくDLL(B)の関数がGetProcAddressできてません。
明示的にAPP(A)の関数の名前空間にDLL(B)に関数も含めるにはどうすればいいのでしょうか?
766 名前: デフォルトの名無しさん 05/02/08 14:14:47
>>756 APP(A)に"Foo"関数をエクスポートさせて(保障されてるかは知らない)
APP(A)の"Foo"からDLL(B)の関数を呼んでみてはどうだろか。
768 名前: デフォルトの名無しさん 05/02/08 15:12:06
>>756 >>766 と似たようなもんだけど、APP(A) で forwarder RVA で
DLL(B) の関数をエクスポートする。APP(A) の .def ファイルで、
EXPORTS
Foo = B.Foo
って書くのねん。(ファイル名が B.DLL の場合)
>>250 それは事実だが、今問題なのはLoadLibrary関数の仕様だろ?
>>252 メインへのクラスパスを含んだDLLが.NETのEXEだ
くらいなざっくりとした感覚でいいじゃん
世の中単純に行こうよ
なあ、ここってWin32APIのスレだよな?
m_hRgn==CreateRectRgn(5,5,100,100); は、 m_hRgn=CreateRectRgn(5,5,100,100);です。すいません。
256 :
デフォルトの名無しさん :05/03/14 22:25:27
>>254 ご安心下さい。
当機は操縦不能に陥っていますが管制塔との通信は繋がっております。
>>246 とりあえず、
FuncA()で生成したリージョンを含むサイズの矩形リージョンを
描画直前にCreateRectRgn()でつくって
CombineRgn()で合成してできたリージョンを使ってみるとか・・・
258 :
デフォルトの名無しさん :05/03/14 23:34:44
「リージョンは毎回作る必要があります」とドキュメントに書かれています
>>246 SetWindowRgn()が成功すると、システムはhRgnで指定したリージョンを所有する。その際、リージョンのコピーは作成されないので、
これ以降はこのリージョンハンドルに対して関数を呼び出すべきではない。
必要ならGetWindowRgn()でコピーを作成し、使用する。
ここって一人、キチガイが常駐してるよね。 なんとなく・・・
俺のこと?
よかった。そういう自覚は持ってるのね。
>>265 がキチガイ。
なんとなくというか、非常にわかりやすいと思うが。
268 :
デフォルトの名無しさん :05/03/15 08:03:15
hwnd = GetForegroundWindow (); で得たウィンドウを横スクロールしようと思って、 PostMessage (hwnd, WM_HSCROLL, MAKEWPARAM (SB_LINELEFT, 0), NULL); PostMessage (hwnd, WM_HSCROLL, MAKEWPARAM (SB_ENDSCROLL, 0), NULL); としてメモ帳などで試しても、スクロールしてくれませんでした。 どうすれば、スクロールするようになるんでしょうか?
269 :
デフォルトの名無しさん :05/03/15 08:12:36
PostMessageとSendMessageの違いを教えてください。 Send:そのウィンドウプロシージャがメッセージを処理し終わったら Post:メッセージをメッセージキューにポストして直ちに 制御を返す、と書いてあるんですが、よく分かりません。
>>269 そのまんまじゃん・・・
そのメッセージの処理に10秒かかるとしたら、
SendMessageの次の処理を実行するまで、10秒以上かかる。
PostMessageだとキューにポストしたら、すぐに次の処理に移る。
>>270 こんな感じですか?
マウスの左ボタンが押された
↓
PostMessage or SendMessage
↓
PostMessageなら、メッセージを送る
↓
そのコールバックを終わらせず、10秒while文などで待つ
↓
そのコールバックが終わる
↓
SendMessageなら、メッセージを送る
SendMessageはそのウィンドウのウィンドウプロシジャーをそのまま呼び出してる見たいな感じ 処理が終わるまで戻らない PostMessageはメッセージを送るだけで返ってくる、あとはOS任せ
>>271 ちゃうでしょ
関数A内で << SendMessage >> によりマウスの左ボタンが押されたというメッセージを送る
↓
WindowProcが送られたメッセージを処理
↓
メッセージの処理が終わり次第、関数Aに処理が戻る
(SendMessageで送ったメッセージの処理が終わるまで処理を返さない)
関数B内で << PostMessage >> によりマウスの左ボタンが押されたというメッセージを送る
↓
キューにメッセージを挿入し関数Bに処理が戻る
(キューにメッセージを挿入した時点ですぐに戻る)
↓
WindowProcが送られたメッセージを処理
(メッセージ処理のタイミングはキュー次第)
要するに、SendMessageは同期関数で、PostMessageは非同期関数
と言ったほうが解りやすいかな。
>>272 SendMessage:関数の再帰呼び出しみたいな感じ
PostMessage:単純なメッセージ送信
みたいな感じですか?
>>273 詳しくて分かりやすいです。何となく分かった気がします。
お答えくださった皆様、どうもありがとうございました。
PostThreadMessage()はあるが、SendThreadMessage()はない。 推して知るべし。
>>276 なるほど。
それはまだ使った事が無いですが、その仰る意味は何となく分かりました。
質問です。 Windowsのペイントにあるツールボックスやカラーボックスみたいに ウィンドウの画面端に来るとピタッとくっつくようなものを作りたいんですが、 これはウィンドウクラスやCreateWindowEx()のスタイルの設定で 作れるようなものなんでしょうか? それとも画面端に来ると自分でウィンドウサイズを変更して そのような動作をするようにしているんでしょうか? よろしくお願いします。m(__)m
>>278 それはMFCでないと実現できないと思う。
もしくは、Win32を使って独自にシステムを作るか。
MFCの場合、
・CControlBar
・CToolBar
・CDockBar
を用いて実現するみたいだけど。
この辺グーグルすれば見つかるはず。
>>276 お前は、
>>224 だろ。
何もわかってないくせに古老みたいな態度とってんじゃねーよ。
知識・経験の浅さがばれてんだよ。
自分でプログラムを走らせて確認せずに、
ドキュメント読んだだけで理解したと錯覚してるのは滑稽だぞ。
282 :
デフォルトの名無しさん :05/03/15 14:47:11
ちょっと特定のアプリケーションの話になってしまうのですが、現在EdMaxという メーラーで、メール本文の表示画面で選択された文字列を加工してファイルに 出力するプラグインを書いています。 プラグインのSDKで表示(ビュー)画面のウィンドウハンドルは取得できるのですが、 EM_GETSEL, EM_GETSELTEXT, EM_GETTEXTEX のどれを使っても正しく取得できません。 空文字列又は0が返ってしまいます。WM_GETTEXTでも空文字列になってしまいます。 ウィンドウハンドルはSpy++で確認した値と同じなので正しく取得できていると思うのですが、 これで選択文字列を取得するにはどのようにすればいいのでしょうか。 ↓こんな感じのコードです --- char buf[1024*64]; eda.GetStaticWindows(&phWnd, &phFolder, &phList, &phView, &phAttach); SendMessage(phView, EM_GETSELTEXT, 0, (LPARAM)buf); また、対象のウィンドウはRich Edit Controlだと思っているんですが、それを確認する方法 などはあるのでしょうか。
>>277 腐った
>>276 みたいな野郎に騙されるなよ。
別プロセス・別スレッドのウィンドウにもSendMessage()できる。
どうしてSpy++がウィンドウキャプション文字列を取得できるのか、考えてみろ。
技術の世界においては、
悠然と構えてる奴・詩歌的記述を好む奴は、ただの無能者だと思え。
>>282 >対象のウィンドウはRich Edit Controlだと思っているんですが、それを確認する方法などはあるのでしょうか。
Spy++ クラス名見ればわかるだろ。
>>283 SendMessage()とPostMessage()の違いの話じゃないのか?
>>284 ×Spy++ クラス名
○Spy++ でクラス名
orz
287 :
282 :05/03/15 15:03:07
どっかからのSendMessage処理中に その処理の中でまたSendMessageって呼んでも良いんですか?
>>288 再帰処理がいつから禁止になったの?脳内限定?
>>289 質問を質問で返すのはマナーに反します。
社会人になったらやってはいけませんよ。
>>288 いいけど、AとBが別スレッドの時
AからBへSendMessage
応答したBからAへSendMessage
するとデッドロックする。
それは恐ろしい。
SendMessage(SendMessageCallBack) ↓ ウィンドウプロシージャ直呼び出し・処理 ↓ ウィンドウプロシージャの処理終了したら ↓ 制御を返す(指定したコールバック関数を呼び出し、後処理) PostMessage ↓ メッセージキューに、メッセージを追加。 ↓ 追加後、即制御を返す。 →そのメッセージの順番がきたらOS側で処理 バス停で、皆が順番どおり並んでいる時、 ・礼儀を知らないじーさんが突然先頭に割り込む→SendMessage ・常識どおり、列の後ろに並ぶ普通の人→PostMessage
>>292 別に恐ろしいというほどでもないっしょ。
メッセージに応答しない(描画さえしない)糞アプリなぞ世の中に無数にあるじゃないか。
デッドロックが深刻な問題になるのはUIをもった可視アプリではなく、サービスなどの不可視アプリの話。
余談になるが、WindowsXPからは、
フリーズした糞アプリの可視ウィンドウの位置を強制移動できるようになってる。
XPを糞とみなす2000ユーザはこの密かな拡張をも軽視するのだろうがな。
>>293 残念ながら、たとえ話として不完全だ。
>バス停で、皆が順番どおり並んでいる時、
> ・礼儀を知らないじーさんが突然先頭に割り込む→SendMessage
> ・常識どおり、列の後ろに並ぶ普通の人→PostMessage
自分が運転手の立場ならそれでよいが、
自分が客の立場だった場合の意味が、間違ってさえいる。
post - 郵便受けに入れる普通の郵便 send - 中の人に直接渡す書留 という例えはどうか?
日曜日に困るな。
年中無休24時間営業
いや、普通にsdk/cでコード書けばできるから。
いや、むしろWin32よりMFCのほうが簡単なんだけど…。
WTLつかっとけ
自分で書くのは無理じゃね?似たようなのなら作れるだろうけど WTLには無いでしょ
DockコントロールあるクラスライブラリってMFCとVCL以外になにかあったっけ?
というか、ドッキングツールバーってかなり使いづらいけどね。 ドッキング機能を使いこなしたことはないな。 いらない。
wxWidgets にドッキングウィンドウライブラリが入ってますよ。
ビットマップからトリミング(スケーリングはしない)されたビットマップを作成するにはどうしたら良いでしょうか? 元のビットマップが上書きされるのは構いません。
名前
BilBlt ビルゲイツご用達のもの 通常はBitBltを使用する
311 :
デフォルトの名無しさん :05/03/15 17:19:46
>>294 >余談になるが、WindowsXPからは、
>フリーズした糞アプリの可視ウィンドウの位置を強制移動できるようになってる。
>XPを糞とみなす2000ユーザはこの密かな拡張をも軽視するのだろうがな。
なんとなく役に立ちそうに見えて実は全然無意味なんだよね
可視ウィンドウの位置を強制移動ができたからって、 なにかいいことでもあるの?
>>312 ログ検索中のかちゅ〜しゃのウィンドウを移動させられる
かちゅーしゃってログ検索するだけでフリーズするんだ(わらい
>>308 >>310 CreateBitmapで欲しい大きさの空Bitmap作って
そこにBitBlt(to_mdc,0,0,width,height,from_mdc,x,y)で上書きでよろしい?
SRCCOPY付け忘れた
ビットマップに上書きというより、メモリDCに上書きってことでしょ?
>>317 うう、違いがよくわかりません。
スクリーンショットの一部を書き出したかったのですがうまくいきません。
指定範囲が真っ黒に塗りつぶされるだけなのです。どうすればうまくいくのでしょうか?
HWND hDesktop = GetDesktopWindow();
HDC hdc = GetDC(hWnd);
HDC hDesktopDC = GetDC(hDesktop);
HDC mdc = CreateCompatibleDC(hDesktopDC);
HBITMAP hBitmap, hOldBitmap;
hBitmap = CreateCompatibleBitmap(mdc,1152,864);
hOldBitmap = (HBITMAP)SelectObject(mdc,hBitmap);
BitBlt(hdc,100,100,300,300,mdc,0,0,SRCCOPY);
SelectObject(mdc,hOldBitmap);
DeleteDC(mdc);
ReleaseDC(hWnd, hdc);
ReleaseDC(hDesktop, hDesktopDC);
UpdateWindow(hWnd);
スクリーンショットじゃなくてデスクトップの背景でした。
mdcに最初選択されているビットマップは2色ビットマップで それと互換のビットマップhbitmapを作れといったから hbitmapが2色だから だから、そこはmdcじゃなくてhdcかhdesktopdcにする
srcDCとdstDC逆じゃネ?
hbitmapのDeleteは?
>>320 出来ました。感動です。ありがとうございました。
そしてやはりスクリーンショットであってることを確認 orz
>>321 背景を窓に描く仕様ですので、あっとりました。
325 :
デフォルトの名無しさん :05/03/15 20:56:31
すごい初歩的なことですみませんが、フォルダの表示で詳細にすると 名前、サイズ、種類、更新日時と出ますよね。 このような感じで表示するのはどのAPIなんでしょうか? リストボックスかなと思っていろいろとやってみたんですが、なんか違うみたいです
リストビュウ
>>326 おお、ありがとうございます
listviewですね
プログラムWindows買ったのに載ってないっぽい・・・
OTL
コントロールを画像一覧にしてリンクしてないMSDNって何気に不便。 そういうサイトってあるのかな?
>291 ネタか。良い子はあどを読みましょう。
1行の文字数を取得したいのですがどのAPIを使えばいいか教えてください。お願いします
デスクトップで右クリックすると出てくる「最新の情報に更新」。 コレって、WinApiから呼び出せるんでしょうか? もしくはコレに近い関数があれば教えてください。
エディットコントロールです
任意のエディタ・ワープロ上で右クリックしたときに出る コンテキストメニューに独自の項目を追加したいのです。 こういうことはやっぱりシステムフックでMenuの生成や選択の メッセージをフックしてやるんですよね? 何か参考になるソースを探しています。
解決しました
どう解決したか書けよ
ワラタ
>>340 フィードバックしないなら聞くなよカス。
>>217 DIBだと広域検索の時何度もGetDIBitsして効率悪くない?
広域ならDDB、どんぴしゃならDIBとか?
>>337 ありがとうございます、と言いたいですが、
これはShell Extensionの話ですよね。
Explorerとかデスクトップの右クリックじゃないですか?
エディットコントロールとかのデフォルトのコンテキストメニューのハンドルは
どうやって取得したらいいんでしょうね。
HMENUが取れたらサブクラス化で項目追加もできそうな気が。。
>>344 サブクラスしてWM_INITPOPUPMENUでちょちょいとすればいいんじゃないの?
テキストエディタを作ってるんですが、以下のコードで大きなファイルを読み込んだときにエラーが出ます。 dwSize = GetFileSize( hFile, NULL ); hMem = GlobalAlloc( GHND, sizeof( char ) * dwSize + 1 ); lpszBuf = ( char * )GlobalLock( hMem ); 調べてみると、2行目のGlobalAllocは成功しているのに 3行目のGlobalLockからの戻り値はNULLです。 どうしてでしょう?
なんでいまどきハンドル経由なの?
9xでは数MB以上ならVirtualAlloc(Ex)使えと書いてある。 そうでなくともWin32ではHeapAllocを使えと書いてあるがな。
ウルセー俺の勝手だろ
352 :
デフォルトの名無しさん :05/03/16 21:25:46
if(SendMessage( hwnd_button, BM_GETSTATE, 0, 0) == BST_PUSHED) { MessageBox(NULL, "押されたよ", "メッセージボックス", MB_ICONERROR); } とやって、ボタンが押された時にメッセージボックスが出るようにしたのですが、うまく機能しません 何が原因なんでしょうか?
なぜに、WM_COMMANDをトラップして調べないのかが理解できない。 それと、上記コードがどこに書いてあるのかによっても現象は違ってくるんじゃないだろうか。
>>352 ステータスはビットが立ってるかどうかで調べる。
==じゃなくて&
>>352 ボタンが押されたらWM_COMMANDが送られてくるから普通そっちを見る。
ゲームを作る時、sendmessageを使った方がいいかなと思いましたが、 WM_COMMANDのほう使うことにします
EndPaintは、内部でDeleteDCもされているのでしょうか? それとも、別にEndPaintのあとに、DeleteDCもしないといけないのでしょうか?
すんません全角になってる部分があります。
したらいけん
DeleteDCは不要。こういう対応になるようにそれぞれ呼べば良い。 BeginPaint⇔EndPaint GetDC(Ex)⇔ReleaseDC CreateDC⇔DeleteDC
エラーが発生するのが稀でGetLastErrorが意味を成さないんですよ こういう場合だとVirtualAllocとHeapAlloc、どちらを使うべきですか?
どうでもいいことですが、sizeof( char )はいらないと思います。1バイトですから。 あと、GlobalAllocは使わない方向になったっぽいような。 HeapAllocで〜。
自作エディタなら作ったことあるなぁ。 選択処理(マウスでクリックドラッグして、その部分を強調する)に手こずったな。あぁなつかSEA。
>>364 そんなもんコンパイラが直すだろ
ソースの可読性を落としてどうする
sizeof(char)は何があろうと1なんだからわざわざ書くほうが可読性落ちるだろアホ
うるせーな がたがた細かいこと言うと禿げるぞ
370 :
346 :05/03/16 23:54:53
ありがとうございました
今週の標語 余計な突っ込みで無駄なリソース
GlobalAllocの引数に設定するのはバイト単位なんだから、sizeof(char)なんて書く必要はないと思うが。
sizeof(_TCHAR) なら意味あるけどな。
型情報と必要量を同時に記述したほうが可読性高いよ
Windows付属のメモ帳をあなどるなかれ。 メモ帳と同機能を「自作」するとなると、結構大変なんだよなw 完全自作だよ。
>>375 チラシの裏シミュレータにいちゃもんですか?
>>375 簡単だよ。EDIT_CLASSウィンドウ作ればいいだけ。
EDIT_CLASSと同等のものを作るのは初心者には結構骨だけど。
>>377 いや、そのEDITクラスを使わずに、さっき言ったように「完全自作」。
ノノノヽヽ (´・ω・`)从 優しくしてネ / y/⌒ヽ_ _/ ヽ/ i / 'ヽ と\ / イ\/'\  ̄ヽ と\__ノ ̄ ノ / -'"⌒'/ ヽ,_____/つ \___/-'
>>364 D&Dやクリップボードを使おうとすると
HGLOBALが手っ取り早い。
そんなことよりさ、ううわーなにを
>>381 MSDNもそれだけは仕方が無いと書いてある。
初歩的な質問で申し訳ないのですが質問があります。 DialogBox関数で作られた複数のダイアログがあります。 このダイアログ間で変数の受け渡しをやるにはどうすればいいのでしょうか?
>>384 「複数のダイアログ」は同一のプロセスでつくられたものなの?
DialogBoxParam 関数を使って変数を渡して、 EndDialog 関数の呼び出しで指定された戻り値で受け取る
>>385 言葉足らずですみません。
その通りで同一のプロセスで作られたものです。
>>386 調べてみたいと思います。
お二人ともありがとうございました。
シリアルキー解析集「ALTEA」
大好評発売中!
http://openuser10.auctions.yahoo.co.jp/jp/user/dancexxx1960? 市販SOFTやオンラインSOFTのパスワード集です。
オークション関係から画像・OS・表計算・CAD・・・・etc
国内・国外のあらゆる分野のSoftを解析済です。
これを初めて手にされた時には、驚愕される事でしょう。
そして・・・手当たり次第にインストールを始める筈ですw
パソコンをご使用の方なら、必ず!満足されると思います。
解析結果のデータベースには15,000点を越えるパスワードが入ってます。
このパスワード集から検索するだけで、登録や制限解除が出来てしまいます。
シェアウェアを購入して、正規登録したのと同じ状態になります。
余りにもデータが多すぎる為、辞書引のようなパスワード検索SOFTで提供します。
シェアウェア以外にもパッケージ版をVectorなどでオンライン販売してるSOFTにも
多数対応しています。これらをダウンロードして無期限に試用する事も可能です(^^;
WindowsXPやOfficeなどのCDキー(プロダクトキー)ジェネレーターを使えば複数のパソコンに
インストールする事も可能です。デスクトップとノートPCなど2台以上持ってる場合は特に有効ですね。
オンラインSOFTを購入した経験は有りますか?
ありとあらゆる分野の優れたSOFTが、数多くありますよね。
しかし、ほとんどが試用期間や機能制限をして、「気に入ったら購入してください」です。
もう少し使いたいが使用期限切れで、削除・・・再インストールを繰り返していませんか?
↑ここだけよんでいない 俺様用しおり
IEコンポーネントを使っています。 通常のナビゲーションはDocumentCompleteで検出できるのですが、 リロードはどんなイベントで検出できるのでしょうか?
いくつかのファイルからなるプロジェクトがあります。 NotePad.h 関数プロトタイプ・グローバル変数の宣言と初期化 WinMain.cpp WndProc.cpp functions.cpp のソースでグローバル変数を使用します。 すると、以下のようなエラーが出ます。いったいどうなっているんでしょう? NotePad error LNK2005: "char * szClassName" (?szClassName@@3PADA) は既に functions.obj で定義されています。
>>391 #ifndef __NOTEPAD_H
#define __NOTEPAD_H
//やりたいこと
#endif
>>391 Cレベルの基本的なことだけども(つまりスレ違い)、
複数のソースで使われるヘッダでグローバル変数の初期化しちゃダメ。
初期化じゃないや、定義
どうせexternだろ 他人様には関係ないものなら#ifndefでいいじゃん
>>395 ヘッダには宣言だけ書いて、ソースのどれか一箇所で実体を定義する。
つーかWin32APIには関係ないな。
1ミリビットも関係ないね。
分割可能なbitってなんかやだなぁ。
401 :
デフォルトの名無しさん :05/03/18 07:35:04
同じ拡張子に対して、エクスプローラなどで見たとき 任意のアイコンを表示させることはできるのでしょうか? ご存知の方がいたら教えてください。 .exeとか.lnkではなく、自分で作ったファイルの拡張子 に対して行いたいです。
タスクバーに出てくるアイコン(トレイアイコンではなく)を 動的に変更したいのですが、どうやったらいいのでしょう?
>>401 レジストリを操作。
HKEY_CLASSES_ROOT\<HKEY_CLASSES_ROOT\<拡張子>の規定>\DefaultIconの規定
にアイコンのパスを書き込む。
WM_SETICONメッセージかな
>>403 すいません。説明がおかしかったです。
ある拡張子に対して、固定のイメージではなく、ファイルごとに
違うアイコンにしたいのです。
引き続きよろしくお願いします。
407 :
デフォルトの名無しさん :05/03/18 13:31:00
wisdomに8ビットの各ピクセルの情報は、 パレットの参照番号を表していると書いてありました この8ビットの値を参照番号ではなくて、RGBの形に変換することは できないでしょうか
できるよ
409 :
407 :05/03/18 14:08:25
どうすればできるか教えてください お願いします
がんばればできるよ。
春厨ばっかり・・・ >409 BITMAPINFO構造体のRGBQUAD bmiColors[ 可変長配列 ]を見る。 8ビット色なら256個のRGBQUADが並んでいる。 色の深度はBITMAPINFOHEADER構造体のbiBitCountメンバ。
いっそのことシェルを自作すr
エロイな。
むしろ必要な数だけ拡張子を作るのが
>405 HKEY_CLASSES_ROOT\lnkfile\shellex\IconHandler とか見るとGUID書いてるから、COMとかその辺で出来そうな気はする。
>>407 411みたいな、てきとーな事ぬかす奴を信用しなければ、できるよ。
>401 各ファイルにアイコンイメージを持たせて DefaultIcon = %1 …だった気がしないでもない。 違うかも…
すまん、>417 のリンク先読んでなかった… そに書いてあったな…
Windowsプログラミングを本格的にやりたいのなら、 AdvancedWindows第4版は買っておいたほうがいいよ。
>>405 シェルエクステンションのアイコンハンドラ
>>421 頼むからスレを最後まで読んでからレスしてくれ。
すまん、>417 のリンク先読んでなかった… そに書いてあったな… なんてね。orz
>>405 IExtractIconを実装すればいいのでは?
コレがホントのマルチスレッド。
AdvancedWindowsは昔よんだんですが、 描画関係があんまり詳しくなかったと思うんですが、 それについては何を読めばいいですか?
Petzoldの上だか下だかわすれた。
429 :
デフォルトの名無しさん :05/03/19 11:24:07
430 :
デフォルトの名無しさん :05/03/19 13:46:28
他のプロセスから送信されたウィンドウメッセージの処理を拒否する 方法があれば教えてください。よろしくお願いします。 私はずっと WM_APP〜 を使えばこの要求は自動的に満たされると思っていたのですが、 どうやら WM_APP〜 は他のプロセスからも普通に送信することができるみたいで。 送信元を調べようにも、MSG構造体には送信元の情報は入っていないようですし…。
>>430 ありません。
自分で送信した分についてフラグでも持っておいて、
それが立ってなかったら処理しない様にするしかないのでは。
WindowMessageって8割くらいはシステムから送られてないか?
んで、おそらく
>>430 が無視したいメッセージつうのは
マクロソフトなどから送られるキーダウンとかなんじゃないかなぁ…
>>430 思考の切り替え。
>>431 が言うように他のプロセスを拒否するんじゃなくて自プロセスのみを処理する方向で考えてみては?
クリティカルセクションは他プロセスからしかアクセスできないことを利用するっててはどうよ。
クリティカルセクションのハンドルをlparamで渡すと。
>>432 WM_APP以降だけの話なら問題ない。
>>433 誤植
他プロセスからしか→他プロセスから
ありがとう。早速買ってみるよ。
レスをくださった皆様、どうもありがとうございます。
>>431 もしかしたらと思って質問したのですが、システムではそのような手段は用意されていないんですね。
>>432 他のプロセスのバグ、もしくは悪意により送信されたメッセージを拒否したいと思ったのです。
でも、確かに、システム以外がシステムメッセージを送信する可能性だってあるんですよね…。
>>433 すべての自作メッセージにクリティカルセクションのハンドルを渡すってのも、ちょっと…(笑)
でも、そういう発想はありませんでした。今後の参考にさせていただきます。
WPARAMにマジックナンバーでも埋めれば。
発想を変えて、どんなメッセージが来ようと正常動作するような つくりにすればいい。
すいません VisualStuido.net2003で、Tahomaフォントを選びたいのですが、 なぜか、Tahoma Boldしかえらべません。 これって仕様?
>>436 RegisterWindowMessageならどうだ?
登録文字列をユニーク(GUIDとか)にすれば
他プロセスが意図的に同じ文字列を使わない限り同じメッセージは来ないと思うが。
>>437 クリティカルセクションのハンドルを渡すのと同様、2つしかないパラメータのうちの
1つをそれで消費してしまうというのは、ちょっと厳しいものがありそうです。
>>438 パラメータの妥当性のチェックにかかるオーバーヘッドを気にして避けていたのですが、
それが最も現実的な対処法のような気がしてきました。
ただ、ポインタを必要としているときに面倒くさいことになりそうな気はしますが…。
>>440 それも、RegisterWindowMessage() を使わず、直接 0xC000〜 のメッセージが送信された
としたら、かち合う可能性がないとは言えないですよね。神経質過ぎるかもしれませんが…。
パラメータの一つを構造体のポインタにしとけばいい。事実上パラメータ数無制限だ。
それほどまでチェックを厳しくするなら、独自のメッセージ機構作った方が早いかもしれんね。
アイコンの話題が出たので、ヘーと思って試していたら、ExtractAssociatedIcon() を使うと、bmp ファイルも中身を見てくれるのを知り、便利と思ったのですが、 同じ 8 bit color bmp ファイルでも、その絵のアイコンを返してくれる場合と くれないで、default の(絵筆の) .bmp のアイコンの場合があります。 これは、こんなものということでしょうか、何か制約条件があるのでしょうか。
画像の大きさとか関係ないのかなあ 大きすぎるとか小さすぎるとか、4ビットとか2ビットのも出るのかな あと、bmpフォーマットに従ってないとか 昔、写真屋で減色すると一部まちがったフォーマットで吐き出したことがあったような
アイコンフォーマットに従ってないんだろうね
448 :
デフォルトの名無しさん :05/03/20 09:53:43
独自のデスクトップでアプリを動かせば 他アプリからのメッセージは届かないかも、 と、制限事項の多いことを言ってみる。
Win32のファイル操作APIを使うのと、 ANSI-C標準ライブラリのファイル操作関数を使うのとでは、なにがちがうの?
出来上がるバイナリ的には、Cランタイム使うか使わないか。 使い分けによる、移植性などのメリット、デメリットは↓よろすく。
おっと、スタティックリンクすれば、どっちもランタイム使わないか。あほすぎorz
>>449 標準ライブラリは機能が抽象化されてる。
環境に依存するような細かい操作はできない。
Win32APIを使えばOSが提供するサービスをフルに使えるが移植性は落ちる。
どーもです。 一応、CAnsiFileというクラスを作って、ANSI-CLibを用いたファイル操作クラスも作ろうと思います。 Win32APIを用いた自作クラスはすでに完成してます。
>>453 意気込んでるところ失礼だが、そんなものは全くいらんよ。
例外処理の使い方を覚えたほうがいい。goto文的使い方。
ええ、使わないクラスですが、勉強用に作るだけです。 このくらいなら数時間でできちゃうし。 例外処理も深く勉強したいです。 まだまだ発展途上です。
>>456 ありがとうございmす。
今からそれを熟読してみたいと思います。
458 :
デフォルトの名無しさん :05/03/20 15:59:31
別のプログラムに構造体(ポインタ)を渡す(送る)事は出来るのでしょうか。 出来るなら、やり方、またはヒントを教えてください。 CreateProcessで文字列、PostMessageで2つの整数の渡し方は 知っているのですが、構造体の渡し方が分かりません。
struct foo data; SendMessage(hwOthers,WM_APP,(WPARAM)0,(LPARAM)&data);
>>459 キャストして渡せばいいんですか。
渡し先のプログラムにも同じ構造体があれば、正しく動作するんですね。
ありがとうございました。
他のプログラムってのが別プロセスならポインタ送っても無駄。
>>461 勉強不足ですが、ポインタ(アドレス)って、パソコンで共通のものだと思うから、
構造体の始めの位置と、そのサイズが分かれば、渡せると考えていたんですが。
>>458 プロセス毎にアドレス空間が違うから他のプログラムにはそのまま渡せないよ。
WM_COPYDATAというメッセージで渡すのが安全。
COPYDATASTRUCT cds;
cds.dwData = 0; // 32bit値。識別用に使う
cds.cbData = sizeof(Struct); //データサイズ
cds.lpData = &Struct; // データアドレス
SendMessage(hTo, WM_COPYDATA, (WPARAM)hFrom, (LPARAM)&cds);
>>459 おっさんおっさん
それじゃダメだよ・・・
>>460 正しく動作しないよ。
他のプロセスから渡されたポインタは全て無効になるよ。
えー
>>462 >>464 WM_COPYDATA、すごく安全で使いやすそうです。
ありがとうございました。
>>466 このスレ住人の言う事は嘘も混ざってるから気をつけてね。
もしプロセスとかの詳細が知りたかったらAdvancedWindows読んだほうがいい。
今回みたくWM_COPYDATAとかキーワードがわかったらMSDNで検索する手もある。
>>467 ありがとうございます。
今までは、別のプログラムに何か渡すとか使い方はしなかったんですけど、
ファイル分割をすると便利なように、プログラムを機能毎に分割すると、
単体で起動して、小さい機能としても使えて便利な事が分かったんで、
質問をさせていただきました。その本を読んで勉強したいと思います。
CreateWindowExでWS_CHILDと親ウィンドウのハンドルを設定して、 親ウィンドウに子ウィンドウを貼り付けたのですが、 キーボードから文字を入力しても子ウィンドウにWM_CHARが来ないようなのですが、どうすれば解決できるでしょうか。 子ウィンドウの上でマウスをクリックするとWM_LBUTTONDOWNは来ます。
WM_CHARは親ウィンドウへ飛びます飛びます♪
>>470 親ウィンドウのメッセージをフックしたりしないとだめなのかな・・・
独立したボタンコントロールみたいなの(ボタンコントロールのオーナードローという意味じゃなくて)を実現するdllを作ろうと思ってるので・・・
ところでWindowsのエディットコントロールとかはどうやってるの?
>>472 そういうすごいもん作るんじゃないんだけど・・・
ただ絵が表示されててクリックしたら親ウィンドウにメッセージを送るだけのボタン。
なんだけど、Enterとか(A)とかの動作をさせるのにメッセージが取れなかっただけ。
誤解されそうな書き方スマソ。
たぶん、SetFocusで解決
ウィンドウの拡縮できる幅を制限したいのですが、 方法が思いつきません。どうすればいいでしょうか? 教えてください。
じゃねぇ、WM_GETMINMAXINFOだ。
>>468 そういう分割の仕方は中途半端でよろしくない。
メッセージの仕様を厳格に規格化するならともかく、
単に個別のプログラムにしても再利用しにくいし、
メッセージのやり取りが増えるとリソース消費量も大きくなる。
普通にDLL使うのが無難。
DLLなら一般的には呼び出し元と同一のメモリ空間で動く。
一般的には?
>>479 そういう風に作れば DLL が独自にメモリ空間を確保することもできなくはない。
>477 dクス
>>474 うまくいきました。
でも別のソフトのウィンドウをアクティブにしてから戻すとフォーカスが解除される模様。
当然といえば当然だけど親ウィンドウがアクティブになったらSetFocusを呼び出すにはどうしたらいい?
WM_ACTIVATE
>>446 ,
>>447 レスをありがとうございます。
画像処理のスレで聞いて、自分で ImageList へ追加する処理をやっていて、
bmp から直接 icon を返してくれるなら、そうしようと思ったのですが、
ImageList へ渡すところで ExtractAssociatedIcon() を使っても HICON
は default のものしか返って来ませんね。(bmp を縮めて ImageList へ
今は Add しています)
別にテスト用にメニューを作って、bmp ファイルを指定して、この API を
呼び、返って来た HICON を表示させると、bmp の絵が出ます。で、このとき
も絵が出るときと default icon の場合があります。デジカメの 2240x1780
でも jpeg -> bmp -> xpadie による 8 bit color 化のは出ます。
レタッチしたほぼ同サイズの 4 bit color のは出ません。
>>483 親に貼り付けた子ウィンドウには来ないみたい。
親で対処するしかないのか・・・
>>485 親でSetFocusすればいいんじゃねえの?
>>486 やっぱりそうしたほうがいいですか・・・
親もCで組みなおせばウィンドウメッセージ取れるし。
バルーンファイト面白いな 初めて遊んだけど感動した。
>>488 ファミコン?というかそれだったら板違い
>>490 親がアクティブでもSerFocusしない限り
子にはWM_KEYDOWNは来ないみたい
キーフォーカスの意味勉強しようね、ねっ?
493 :
デフォルトの名無しさん :05/03/20 21:19:57
質問です。 OS は Windows XP で、コンパイラは mingw-jp の gcc です。 コマンドプロンプトのウインドウの現在の縦サイズ(行数)をプログラムから得るには どうすればよろしいのでしょうか。 よろしくお願い致しますm(_ _)m
495 :
458 :05/03/21 00:27:12
>>464 のやり方は、いわゆる値渡しなんでしょうか。
同じような感じで、HBITMAPを渡そうと思っているんですけど、
値渡しだと重くなるんでダメだなと思いまして。
498 :
493 :05/03/21 00:33:42
>>494 実は、コマンドプロンプトで (Linux 環境にある) less コマンドを作りたいのです。
自分でウインドウを作る以外に方法はないのでしょうか?
>>495 ハンドルもそのままじゃ他プロセスに渡せない。
LinuxでWin32API
>>500 よく読め。
>>498 Linuxなんか持ち出さずとも、less一言で充分だろ。
で、素直にcygwinのless使えば?
一言多いな
503 :
デフォルトの名無しさん :05/03/21 01:32:43
>>495 ・ハンドルもポインタも32ビットでデータ量は同じだろ
・ていうかそれぐらいで速度低下するなら、設計を見なおすべき
・既に指摘あったけど、他プロセスに渡したら無効
・ビットマップデータ本体とか、でかいものを渡すなら、
ファイルマッピング使え
504 :
498 :05/03/21 02:33:30
>>501 確かにおっしゃる通りで、cygwin の less を使えばいいのですが、
自分で less コマンドを作ってみたいという純粋な技術的好奇心です。
無理なら諦めますし、可能なら作ってみたいと思います。
必要な情報はコマンドプロンプトウインドウの縦サイズ(行数)のみなので、
何か方法がありそうな気がするのですが・・・・・・
>>503 WM_COPYDATAはファイルマッピング使ってデータをプロセス間で渡しているわけだが。
>>493 GetConsoleScreenBufferInfo()?
試したこと無いから使えるかわかんないけど。
DLLでDLLプライベートなメモリ空間を確保する方法、教えて欲しい (どこを調べればいいのかも含めて)
DLLプライベートなメモリ空間 の定義からはじめようか。
480は共有メモリのこと言ってるんじゃないのか プライベートってどこから出てきたんだ?
DLL!弾持ってこーーーーーい!DLーーーL!
>>503 ありがとうございます。
仰っている感じを見ると、データ渡しっぽいです。
それに、ポインタとかプロセスとか、まだ僕のレベルに早すぎたようです。
AAが欲しいところだな。 実際に貼り付けるほどこのスレの住人は無粋じゃないけどな。
でも地位が一番低いWindows関連スレだ。
LPCTSTR str[] = {TEXT("アアア") ,TEXT("イイイ") } str[0]>str[1] ってやった場合コンパイラは何を基準に比較してるか教えてください
>>517 メモリ上の配置。コンパイラが恣意的に配置するので結果は予測不能。
メモリ上の配置ってアドレスで比較してるってこと? それならコンパイラが恣意的に決めてても特定のアドレスから 配列の要素が連続してることに変わりなくて必ず0番目の要素が最小になるってこと?
>>519 >517の例では"アアア"と"イイイ"がどこに配置されるかが、恣意的であると書いた。
また、str[0] > str[1]は要素同士の比較であるから、この場合はポインタ同士の比較になる。
配置が恣意的である以上、ポインタ同士を比較しても無意味。
>"アアア"と"イイイ"がどこに配置されるかが、恣意的である これが恣意的ならどうやって順番区別してるんですか? *str[0]>*str[1] ってやった場合コンパイラは何を基準に比較してるか教えてください
>>521 2つの文字列の1つめの要素(TCHAR型)で比較。
UnicodeとMBCSで評価結果が違う。
自作自演するなら30分はあけろ
自演する意味がどこにあって、自演だと思うお前の思考回路を疑う。 要は話に関係のないデブが横からしゃしゃり出てくんなってことだ。 わかったら黙っとけデブ
527 :
504 :2005/03/21(月) 14:24:32
529 :
523 :2005/03/21(月) 14:28:56
>517=>519=>521はとぼけてレスしている香具師がいなければ間違いないとして、 >518=>520だとは思うが、>522は違うかな? >524=>526として、もし=>517なら寒い限りだな。 >525はそうすると、=>522かな? #どうでもいいけど、>>が多いと書き込めないんだね。
>>504 自分でlessを作ってみようと思うのはいいが、それなら何故他人に頼る?
他人に聞かないとできないなら自分でやる意味ないと思うが。
仮に、コンソールの行数を得る手段がどうしても判らないなら、引き数で指定するようにでも作ってみればいいと思うが。
#つーか、行数だけ得られてもインタラクティブな操作もできないと思うが。
なにくだらない考察してんだこのデブは?
C言語質問スレがいいんじゃねえか?
>>504 WriteConsoleとかSetConsoleAttribiteなんとかみたいにコンソールいじるAPIがあるからMSDNでそのへん検索しなさい。
>>517 とりあえずおまえさんはポインタと配列の区別付けるとこからやり直してきなさい。
>>527 12時間前の自分と、572を書き込んだときの自分
成長しましたか?
画像表示のことで質問があります。 最初に、画像A,Bを、裏画面A,Bを作ってそれぞれ裏画面に表示させ、その裏画面A,Bの画像を裏画面Cに貼り付けて、裏画面Cを表画面に出すというプログラムを書きたいのですがどうやればいいのでしょうか?
Linuxのlessのソースでもみて該当するAPIがWindowsにあるか調べればいいんじゃないの?
>>536 裏画面A,B用のバッファを用意
それぞれのバッファにA,Bを展開
そして、裏画面C用のバッファを用意し、
裏画面A,Bを裏画面Cに展開して、裏画面Cを表画面に表示させればいいんじゃないの?
540 :
536 :2005/03/21(月) 18:12:14
>>538 裏画面バッファの用意は
win_hdc=GetDC(hwnd);
hdc = CreateCompatibleDC(win_hdc);
hbmp = CreateCompatibleBitmap(win_hdc,640,480);
SelectObject(hdc,hbmp);
みたいな感じで良いんですよね?
それをどう組み合わせて、いつBitBltで表示させればいいのですか?
>>536 裏画面て、メモリDCの事?
ABCについてそれぞれメモリDC作って、
ABをCに転送し終わったらCを画面に転送。
メモリDCについては
CreateCompatibleBitmap
CreateCompatibleDC
辺りで検索。
>>540 >それをどう組み合わせて、いつBitBltで表示させればいいのですか?
描画したいとき・・・。
普通はWM_PAINT。
猫でもわかる〜でも読んどけ。
543 :
536 :2005/03/21(月) 18:53:13
メモリDCだと思います。 ABをCに表示する際、毎回ABを読み込ませないとCに表示されないんです・・・ 最初に一度だけABを読み込ませて後はそれをCに転送しまとめて表に転送したいのですが・・・。 毎回画像を読み込ませなくて良いようにできますよね?
544 :
デフォルトの名無しさん :2005/03/21(月) 19:12:06
DLLで本体アプリケーションのウィンドウプロシージャをサブクラス化して、 DLLで追加したメニューだけオーナードローしたいのですが、WM_DRAWITEMと WM_MEASUREITEMで自分のだけ処理したら他で追加されたメニューが 描画されなくなってしまいました。 サブクラス化したウィンドウプロシージャで、自分が処理しなかったものは 本来の処理に任せるようなことはできるのでしょうか?
546 :
544 :2005/03/21(月) 19:21:32
DLLの中で本体のウィンドウプロシージャをフック(?)しています。 このとき switch で受け取らなかったメッセージは CallWindowProc() で元のウィンドウ プロシージャに送られて正しく処理されますが、caseに合致して処理を行った場合は return後にそのメッセージは処理されない…という認識は間違ってますでしょうか。 --- LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg){ case xxxx: // 処理 break; } return (CallWindowProc((WNDPROC)OriginalProc, hWnd, uMsg, wParam, lParam)); }
矩形やBitmapをアニメーションさせたいのですが、 WM_PAINT内にInvalidateRectで何度も再描画すると ちらつきが酷すぎてしまいます。 より良いの方法を教えてください。お願いします。
>>547 なんでWM_PAINT内で無効にすんのよ。
タイマーかなんかのタイミングにすべき。
あとWM_ERASEBKGND来たら何もせずに1返して背景描画を省略するとか、
上の質問じゃないけどメモリDCにあらかじめ描画内容を書いておいて、
WM_PAINT時にBitBlt一発で済むようにするとか。
>548 アイサー
Win32コマンドラインツールで利用出来る、昔のDOS版xargsのような 汎用のコマンドライン引数展開ルーチンはどこかにないでしょうか?
cygwin\bin\xargs
Ocamlに標準で付いているArgモジュールだったらものすごく簡単に書けるのになぁ。
>>550 Win32 APIのFindFirstFile & FindNextFile でワイルドカード展開できるよ。
555 ∈(・◎・)∋
テスト
C/C++室から移動。 HWND hWND = GetActiveWindow(); と書いても現在アクティブなウインドウハンドルが取得できないが、どうしてでしょう? (デバッガで見た) コンパイルは通ります
GetForegrounWindowと勘違い?
>>557 >The return value is the handle to the active window attached to the calling thread's message queue.
>Otherwise, the return value is NULL.
MSDNにはこう書いてある。
560 :
557 :2005/03/23(水) 00:32:11
それもやってみたけどだめだった。 詳しいソースはC/C++室にあるので見てほしい GUITHREADINFO もやってみたんだが。
>>560 >The foreground window can be NULL in certain circumstances, such as when a window is losing activation.
GetForegrounWindowがNULLを返す状況があるみたいだね。
デバッガではいつやっても hWNDのとこで、 エラーです: 式を評価できません と出るんですが。 NULLとは違う気がします。 vc自体ほとんど初めてなので他に書くことが足りないかも知れません。
違う気がしますって…NULLか調べろよ
564 :
557 :2005/03/23(水) 00:52:30
NULLではなかったです。以下がデバッグのウインドウです -hWND0x00b40330 {unused=??? }HWND__ * unusedCXX0030: エラーです : 式を評価できませんint
565 :
557 :2005/03/23(水) 00:57:04
すみません、さっきのは間違い デバッガ使わず呼び出してみたらNULLでした。
566 :
デフォルトの名無しさん :2005/03/23(水) 02:18:20
リストビューについての質問です。 チェックボックス付きリストビュー (LVS_EX_CHECKBOXES) を使用しているのですが、 四角の部分をクリックしないとチェックボックスが変化しません。 横の文字をクリックしてもチェックボックスが反応するようにするにはどうしたらいいでしょうか? WM_NOTIFY - NM_CLICK を拾ってみたのですが、 四角の場合も文字の場合もメッセージが来るので、うまく判別できませんでした。 ListView って情報が少ないような気がする・・・
クリックされた時に座標見て区別とか
>>566 比較的最近の実装であるにも関わらず、VC6にはFlexGridがバンドルされてたりしたので
仕様が中途半端なことと相俟って使い込む人が少ないからじゃないだろか。
CodeGuruに行くといろんな拡張を目にするが、微妙だったりやり過ぎだったりしてこれまた決め手に欠ける。
で、肝腎のチェックボックスの仕様だが、それで気が済まないなら自前でやるしかないと思われ。
569 :
557 :2005/03/23(水) 02:59:34
GetForegroundWindow でいけました。メモ帳のタイトル取れました。 しかしまたその後でうまく動かないです… その後の ImmGetContext で IMEがONでもOFFでも hIMCに常にNULLが返ってきます。 いろいろ探したサンプルソース全部こんな感じだったんだけどなぁ。 MSDNも見たけどNULLになる条件等の記述はなかったです。 HWND hWND = GetForegroundWindow(); HIMC hIMC = ImmGetContext(hWND); BOOL bRet = ImmGetOpenStatus(hIMC); ImmReleaseContext(hWND,hIMC);
>>569 おめーさん、GetForegroundWindowでもハンドル取れない
つってたじゃん。何で取れるようになった?
でさ、よく知らないんだけど、他プロセスのinput contextって
取得できるの?
GetLastErrorでアクセスできないとか返ってきてない?
リッチテキストボックスを使用してるんですが、キーワードの文字色を自動で変える処理をやってるんですが、 Rtfコードを弄るとカーソルが先頭に来てしまいます。 カーソル位置の保存・スクロール状態の保存ー>Rtf編集後適応 とやっても瞬間的なスクロールがぱぱっと出てしまって画面がちらついてしまいます。 他にはリッチテキストボックスのプロシージャ内で、WM_PAINTメッセージを処理中には停止したりしたんですが、 どうにもちらつきが直りません。 スクロールの動きというか状態を一時停止する事は出来るんでしょうか?
LockWindowUpdate?
実行しているPCのタイムゾーン名をロケール設定に依存せずに"JST"、"EST"などの形で取得できる方法はないのでしょうか? GetTimeZoneInformationを使用すると「東京 (標準時)」とか帰ってきますorz
たしか、環境変数TZを指定しないと、だめだったっぽい。 標準では、日本語版Windows2000/XPでは設定されていない。 このための、日本語版Windows2000/XP限定の仕様(バグ?)だったはず。 ためしに、環境変数にTZ=JST-9を設定してみることをオススメする。
575 :
デフォルトの名無しさん :2005/03/23(水) 14:48:50
waveファイルを再生するAPI教えて
>>575 wave api でぐぐる位の事はしたんだろうな。おい。
577 :
デフォルトの名無しさん :2005/03/23(水) 15:01:34
>>576 当たり前だろカスが、そんなレスいらねーよ
「waveファイルを再生するAPI」でぐぐれ。 そして二度と来るな。
アーカイバのC言語ソースって何処かに有るかな?
ああ。どっかにあるよ。
>580詳細キボンヌ
582 :
デフォルトの名無しさん :2005/03/23(水) 15:40:10
>575≠>580ジャネーノ?
>579か・・・
ム板全体ID表示にしてくんねぇかなぁ。
それは困る。自作自演ができない。
僕も困る。 まったく別の複数の質問をしたい時、次の日まで待たないといけない。
別に待たずに複数質問すりゃええやん。答える答えないは別にして。
自作自演はにちゃんの華
>>588 質問する時に、質問の要点が分かり難かったり、言葉使いが悪かったり、
質問側に不備があると答えてもらいにくくなるけど、
何回もの質問もそれに当たるかなと思って。
その質問や、それに似た質問に、一度答えてもらえないレッテルが貼られると、
マルチとか言われたりして、当分その関連の質問が出来なくなるから、
質問する時はかなり気を使う。
まぁ、質問の前に自分の調べた範囲と、 その結果現れた問題に対する質問を明記するのは最低限の礼儀だろう。 さらに、疑問が複数あるなら、 1回の書き込みでうまく伝わるようにまとめる事も必要だろう。 複数回一気に投稿すりゃ、そりゃ投稿者は楽だろうが、 それを見た方は必然的にやる気あんの?ってことになるべ。 それを踏まえた上でなら、1回の質問で解決しない物は、 1回提出>解決>次を提出 なんてのも、普通にやることだろ?それが出来てりゃ答える人は答えるだろうさ。 答えてもらえない奴は、何処かで手抜きしてんだよ。 教えてもらってハイ終了なんて甘い考えで聞くからそれが相手にも伝わるんだろうさ。 んなもん、ここに限らず社会に出りゃ当然のことだと思うがな。
592 :
デフォルトの名無しさん :2005/03/23(水) 20:16:07
複数のウィンドウを使うプログラムを作っています。 中心のウィンドウ以外には終了ボタンを付けたくないのですが、 終了ボタンの使えないウィンドウの作り方を教えてください。 最大化ボタンを使えなくする時は、^ WS_MAXIMIZEBOXで出来るのですが、 WS_CLOSEBOXみたいなのは無いようなので、分かりませんでした。 ^ WS_SYSMENUだと、全部のボタンが使えなくなってしまいますし。
EnableMenuItemをSC_CLOSEで。
594 :
592 :2005/03/23(水) 20:28:06
>>593 EnableMenuItem(GetSystemMenu(hWnd, FALSE), SC_CLOSE, MF_GRAYED);
こんな感じで使って出来ました。ありがとうございました。
595 :
550 :2005/03/23(水) 21:12:20
>>551-554 シンプルで公開されているのがないかと思ったのですが、結構無いもんですね。
自前でやってみます...
597 :
573 :2005/03/24(木) 01:26:08
結局、環境変数TZ設定して_tzset(); _tzname[0]でお茶を濁すことに決定しますた(´・ω・`) TZ=JST-9あってもGetTimeZoneInformationはしっかり日本語で返してくるようです‥‥
598 :
557 :2005/03/24(木) 02:02:31
GetLastError を ImmGetContext の直後に挟んでエラー情報を取得して表示してみたけどエラーは無かった… ImmGetOpenStatus の直後でも同じだった。 行き詰った…
メモ帳のウインドウプロシージャを交換するにはどうすればいいですか?
>>599 メモ帳のプロセスに進入し、
ウインドウプロシージャに該当する箇所を挿げ替える。
601 :
599 :2005/03/24(木) 02:29:16
>>600 すいません、そのための関数や構文がわからないのです。
603 :
599 :2005/03/24(木) 02:54:31
あい、入手してきます
>>603 そうか。
入手してきたら「DLLの〜」という章(AdvancedWindows改修第4版では22章)を読むんだ。
そこに他のプロセスに介入する手段が載っている。
プロセスへ進入できればメモ帳のウィンドウハンドルから
サブクラス化するなりの手段で完全に乗っ取る事ができるはずだ。
>>598 環境ないから試してないけど、
HWND hIme = ImmGetDefaultIMEWnd( hForeground );
LRESULT lr = SendMessage( WM_IME_CONTROL, IMC_GETOPENSTATUS, NULL );
こんなかんじでできそうという記述が、検索してたらちらほら見つかった。
606 :
557 :2005/03/24(木) 05:42:09
できた、!!!!!!
>>605 に感謝します。
IMC_GETOPENSTATUS ってぐぐっても7件しかヒットしないし、
MSDNに載ってないしこんなの見つけられない…
全ソースコードでも10行ぐらいのこのプログラムにすごく長期間苦しめられた。
Visual Basic .NET 2003 + WIN32API でシリアル通信するプログラムを作ってるのですが winXP上でコンパイルすれば、どのバージョンのWindowsからでも動くようになるのでしょうか。 それともコンパイラオプションなりで、ターゲットを明確にした方がよいのでしょうか。 writefileとかで簡単に出来るのは良いのですが、APIから下がどういう風に動いてるのかよくわからない・・・
MSDNにAPIが使えるOSのバージョンって書いてないんだっけ?
#define WINVER 0x0400 #define _WIN32_WINNT 0 #define _WIN32_WINDOWS 0 #define _WIN32_IE 0 #include <windows.h> #include <windowsx.h> いつもこうしている。
>>608 例えばwritefileだったらいろいろ書いてあるけど、ページの最後の方に、
>Windows NT/2000:Windows NT 3.1 以降
>Windows 95/98:Windows 95 以降
ってかいてありますね。ということは、NT系と9x系両方対応してるのかな?
初心者なので良く分からないんだけど、APIで書いた部分はネイティブコードだろうから、
コンパイルした時点でハード制御の動作は決まってしまいますよね?
ということはコンパイルした時のDLLにNT系と9x系両方のコードが入ってるのかな?よくわからん。
611 :
デフォルトの名無しさん :2005/03/24(木) 22:48:39
>>610 DLLってのは実行時に読み込まれる。
したがってコンパイル時にHやLIBに存在していた関数が
読み込んだDLLには存在していなかった、ということがありえる。
従って、Win2000以上などと限定された関数を含むプログラムを
WinMe以下にも対応させたければ、GetProcAddressを使って
関数が存在するかどうかを調べて、存在していなかったら関数を
呼ばないようにしないとならない。
>>611 なるほど。ということは使いたい関数が実行時に存在していれば、
そのOS上では動作するということですね。
実行時にDLLを呼び出して機械語に変換できる仕組みというのが
いまいち不思議ですが・・・
>>612 泥臭い事をするだけで不思議なことなんて何もないよ。
614 :
デフォルトの名無しさん :2005/03/24(木) 23:16:48
>>612 DLLはすでに機械語になったプログラムだ。
実行時リンクと言った方がわかりやすいかな
コンピュータって不思議。 ですか?
女って不思議。
619 :
デフォルトの名無しさん :2005/03/24(木) 23:32:04
ダイナミックリンキングという方法は理解にしくいものなのかなあ?
ageウザ
>>619 いや、おそらくスタティックリンクがどういうことかも分かってないと思われ
ageウザっていうやつがウザ という俺ウザ
>>619 抽象的には理解できるが具体的にどう動くように作られるかが分からないんだよ。
コンパイル時には一意の機械語にはなってないんだろ。
その後に機械語を呼び出して動くというのが信じられないわけ。
もう寝る。
>>623 コンパイル時もEXE側は〜というところにある関数を呼び出すと言うコードで一意になっている。
実行時に〜に関数のアドレスを埋めるのがダイナミックリンク。
とりあえずスレ違いの話題がずっと続いていることだけは確か
>>623 EXEファイルもロードされるまでは一意の機械語にはなっていない訳だが
628 :
デフォルトの名無しさん :2005/03/24(木) 23:52:22
「一意の機械語」ってどういう意味で使ってるんだ?
そのままメモリ上に置くだけで動くって意味だろ? comファイルならそうだが、exeはそうじゃない。
630 :
デフォルトの名無しさん :2005/03/24(木) 23:53:53
金物表現と論理表現のあるアセンブラ(w
リロケーションってやつか。
632 :
デフォルトの名無しさん :2005/03/25(金) 00:04:29
なるほどー。DLLやEXEが絶対アドレスで記述されていると考えているわけか。
633 :
デフォルトの名無しさん :2005/03/25(金) 01:45:27
デマンドページングだから相対アドレスの処理は現代のCPUにはないだろ。 むしろシンボルの解決とか。
DLLのロードってシンボルの解決そのものだから
シンボルの解決というよりシンボルをキーにしたIATの解決といった方が。
637 :
デフォルトの名無しさん :2005/03/25(金) 18:07:00
あるアプリケーション(たとえばOutlookなど)の子ウィンドウをEnumChildWindows()で 列挙した場合、その順番は常に一定なのでしょうか。MSDNを見ましたが、Zオーダーと いうのがいまひとつ分かりません。 アプリケーション(列挙される親ウィンドウ)側のファイルが変更することはありません。 試してみた限りでは一定なのですが、確証がないのでどなたか教えてください。 宜しくお願いします。
>>637 まず、Zオーダーについて勉強すればいい。
639 :
637 :2005/03/25(金) 18:48:30
Zオーダーがウィンドウの前後関係(?)のようなものであることは 理解したんですが、重なっていないときの扱いがどうなるのかが 分かりません。 たとえばエディットコントロールを複数CreateWindow()したときに 必ずあとに生成されたものがZオーダーで前に来ることが保証されて いるんでしょうか。
641 :
637 :2005/03/25(金) 19:30:35
>>640 ありがとうございました。
> When an application creates a window, the system puts it
> at the top of the z-order for windows of the same type.
ということで、生成された順番で上に重なっていくという認識で良いのですね。
もともとの質問に戻ってEnumChildWindows()で列挙される順番も同じになるかと
思ったのですが、よく考えるとアプリケーション側でウィンドウ生成の順番が一定
とは限らないのカ…orz
642 :
デフォルトの名無しさん :2005/03/25(金) 19:56:12
Windows が起動されたときの時刻を記録したいのですが、 どのような方法があるでしょうか? とりあえず、次のような方法があることは分かっています。 (1) レジストリの Run キーに時刻記録プログラムを指定する。 (2) 時刻記録プログラムをサービスとして実装する。 これらの他に方法はないでしょうか?
>>642 スタートアップに入れる。
見つかりにくい場所に隠したいのなら別だがw
>>643 そうなんです。見つかりにくいところに隠したいんです。
スタートアップに入れると、他のユーザーでログインされたときに、
検知できませんよね。
explorer.exeに寄生する
スタートアップじゃログインしない限り実行されないから、 OS起動時ではない。
>>647 explorer.exe尻に自分のプログラムをくっつけて、
explorer.exeの先頭に
jmp 時刻を記録の処理
時刻記録の処理:
処理
jmp ds:本来のアドレス
OSの復元機能等をオフにして、ウイルス扱いされないようにケアも必要
PEでそれやるくらいなら漏れならサービス作るな。 あるいはNW上の他の機械からpingでも打つか。
GetTickCountはWindowsが起動されてからの時間を返すわけだが。
うん知ってるよ。それで?
>>650 それで?話題がつながってないような。。
>>642 起動してしばらく経ってからでいいのなら、現在時刻からGetTickCountを差し引いた
時刻を記録するプログラムをスタートアップに入れる。
おそらく、これがもっとも正確にWindows(の時刻サービス)が起動した時刻を求められる。
>>653 話がずれてる。
起動時間も記録方法もわかっているはず…
> 643 名前:デフォルトの名無しさん[sage] 投稿日:2005/03/25(金) 20:05:30
>
>>642 > スタートアップに入れる。
> 見つかりにくい場所に隠したいのなら別だがw
>
> 644 名前:デフォルトの名無しさん[sage] 投稿日:2005/03/25(金) 20:08:21
>
>>643 > そうなんです。見つかりにくいところに隠したいんです。
> スタートアップに入れると、他のユーザーでログインされたときに、
> 検知できませんよね。
>>644 AllUsersのスタートアップに入れればいいじゃない。
>>644 どういう理由かは知らんが、
そういういけすかないアプリをインスコされる方はたまったもんじゃないな。
> Windows が起動されたときの時刻を記録したいのですが、 > (1) レジストリの Run キーに時刻記録プログラムを指定する。 > (2) 時刻記録プログラムをサービスとして実装する。 > これらの他に方法はないでしょうか? > 見つかりにくいところに隠したいんです。
>>648 そんなことしなくても
explorerに好きな時に進入してプロセスが起動した時刻調べりゃいいじゃん。
>>657 ドメインコントローラがあるならログインスクリプトを流すという手も。
661 :
644 :2005/03/25(金) 21:27:51
>>656 >どういう理由かは知らんが、
>そういういけすかないアプリをインスコされる方はたまったもんじゃないな。
他人のパソコンに仕込むんじゃなくて、
自分のパソコンが不正使用されていないかを確認したいんです。
>>659 できるだけ気づきにくいところに入れたいのと、
あと、できるだけ削除しにくいところに入れたい。
相手がシステムのことをよく知っていれば、
仕込んでも回避されてしまいますから。
タスクスケジューラの自動化か何かで 指定時刻に休止状態から復帰できるようにするにはどうしたらいいですか?
663 :
デフォルトの名無しさん :2005/03/25(金) 21:31:26
>>644 > できるだけ気づきにくいところに入れたいのと、
> あと、できるだけ削除しにくいところに入れたい。
> 相手がシステムのことをよく知っていれば、
> 仕込んでも回避されてしまいますから。
鼬ごっこになるだけ。648みたく何らかのカーネルプログラムに寄生するしかない。
未確認だが、OSのブートログの日付をみて判断すればいいじゃん。
諜報機関から身を守りたいんです。
もう一つ未確認だが、ページファイルを解析?する方法もある。
そうだね。 つーかイベントログみりゃいい話。
ブートローダーとかにパスワードをかければ良さそうな…
>666 未確認なのに方法もある、じゃねーだろこのチンカス
>鼬ごっこになるだけ 起動と同時にメール送信すれば。
おおかた会社でエロ画像でもダウソしてんだろw 大事なファイルなら暗号化しとけばいいじゃん。
>>671 書き換えをした時点で「不正使用されていないかを確認」する必要はなくなるよね
>>675 不正使用後に、元のブートローダに復元されたら?
677 :
644 :2005/03/25(金) 21:47:57
>>676 多分判らない。
鼬ごっこになってるぞ。それに、もう、プログラムでなくセキュリティ系…
まぁ、Win32APIには関係ない話になっていってるな。
ソフトじゃどうにもならない問題だと思う
たしかに鼬ごっこだが、何層にも防壁を入れておけば、 1回の起動という機会で破られることはないだろう。
つうか そこまでするような奴と共用しなければ良いと思うのは俺だけ?
Windowsのパスワード機構の何が不満なのか
AdvancedWindows買ってきた
LoadLibraryで読み込んだDLLは必ずFreeLibraryで開放しなくてはいけないのでしょうか? こちらのプログラムが終了したときに開放されているようなのですが・・・ これも、malloc,freeなどと同じようなものなのでしょうか?
687 :
デフォルトの名無しさん :2005/03/26(土) 01:07:27
イベントログに起動時刻残ってるのに・・・
688 :
デフォルトの名無しさん :2005/03/26(土) 01:18:06
Windowsプログラム初心者なのですが HICON(HANDLE)が指すデータポインタとサイズを取得するには どうしたらよいでしょうか? データをリードするときにハンドルをロックする必要があれば ロックする方法も教えてください。 データごとファイルに書き出したいのです。 よろしくおねがいします
>>688 .icoファイルを作りたいと言う意図なら、その方法では不可能だぞ?
>>688 まず、Handleとは何か?から勉強汁。
ちなみに、おそらく藻前が思い描いている方法では、
アイコンファイルは作れない。
693 :
688 :2005/03/26(土) 02:17:28
どちらかというと、icoファイルを読み込んで得たHICONのデータを 他のデータと一緒にファイルに書き出したいのです ご教授よろしくお願いします (API名だけでもヒントいただければ、がんばってみます)
>>693 >>690 そもそもHANDLE形式になっているのは、
HANDLE形式にすることによって、
内部で実際に扱っているデータを隠蔽する為。
あとはわかるな?
696 :
566 :2005/03/26(土) 02:35:12
>>567-568 遅くなりましたが回答ありがとうございました。
調べたら座標は取れたので 567 さんの方法を採用しましたが、他にも動きに不満があるので
568 さんのいう FlexGrid も調べてみます。
>>694 その論法は間違っている。
アイコンは無理だが、多くのGDIオブジェクトのハンドルからは
GetObject()で情報を取得することが出来る。
ユーザーがログオンおよびログオフしたときのイベントって、 ウィンドウやサービスから知ることはできますか?
できなけりゃWindowsなんぞ使わない。そんなOS無い
>>700 解ってて答えてるんだろうけど、質問スレで「できますか?」の質問に
「できる」「できない」で答えてるのは馬鹿に見えるよ。
へいへいわたしゃ馬鹿でいいです
なんだとー、<`八´> 謝罪と賠償するニダ
↑というわけで、おまいに馬鹿2号の称号を授ける
できるかもよ
できちゃった
やん
リッチエディット(2.0)でファイル以外にRTFを入出力するにはどうしたらいい? ファイルに保存とかファイルから読み込みとかはいっぱい見るけど応用の仕方がわからない・・・
716 :
699 :2005/03/26(土) 19:08:32
結局みなさん知らないのですね。 それならそうと言ってくださればいいのに。
「 ̄ `ヽ、 ______ L -‐ '´  ̄ `ヽ- 、 〉 / ヽ\ / // / / ヽヽ ヽ〈 ヽ、レ! { ム-t ハ li 、 i i }ト、 ハN | lヽ八l ヽjハVヽ、i j/ l ! /ハ. l ヽk== , r= 、ノルl lL」 ヽN、ハ l ┌‐┐ ゙l ノl l ヽトjヽ、 ヽ_ノ ノ//レ′ r777777777tノ` ー r ´フ/′ j´ニゝ l|ヽ _/`\ 〈 ‐ 知ってるが lト、 / 〃ゝ、 〈、ネ.. .lF V=="/ イl. ト |お前の態度が とニヽ二/ l ヽ.|l 〈ー- ! `ヽ. l |l気に入らない lトニ、_ノ ヾ、! |l__________l| \ ソ
>>714 >>ファイル以外にRTFを入出力する
という意味がわからないが、「猫でも分かる...」に、rtf format の使い方が
載っている。自分は、C のソースの表示などで、用語の色付けとか、検索結果
の該当用語の強調に使っている。色付き文字の画面を作って bmp で保存して
貼り付けに使うとか。(MSwordで作って Print Screen でも出来るが)
>>693 自分も HICON から辿れないか、調べましたが、行きつけませんでした。
また、HICON がもつデータは(説明によれば)RT_ICON と同じで、DIB に
mask bit が付加されたものだけのようで、.ico ファイルにするには、
更に2種類のブロックを追加しなければなりません。また、通常の .ico には
表示装置や表示環境に合うよう、複数の icon を持っていますので、これらを
全部揃えないと、補完された表示になって、汚くなります。
従って、HICON からではなく、元のデータの所在を探さざるを得なくなります。
exeとかから抽出しろと。
723 :
714 :2005/03/26(土) 20:52:00
ファイル以外にRTFを入出力する というのはディスク上のファイルを介さずにメモリ上(string,char[]とかに)にテキストを読み出せたらいいな、という意味 どこかにRTFの仕様ないかな・・・英語のやつがMSにあるのは知ってるけど日本語のやつが見つけられない。 誰か基本的な部分だけでも教えてほしい。文字のフォントや強調表示とか。
>>723 だからEM_STREAMOUT/EM_STREAMINだろ? 別にファイルに書き込まなきゃなんないなんて仕様があるわけじゃなし。
725 :
デフォルトの名無しさん :2005/03/26(土) 21:08:53
プログラムでパスワードを保存したいのですが、みなさんはどうしていますか? エンコードして単純にINI ファイルやレジストリに記録しておくのはちょっと心配ですよね。 何かよい方法はないものでしょうか。。。
つまりデコード出来る形でどこかに書いておきたいという事なのか?
暗号化
728 :
725 :2005/03/26(土) 21:22:42
具体的に言いますと、アプリからメール送信をしたいので、 SMTP サーバーへの認証情報を記録したいのです。 ですから、不可逆の暗号化はできなくて、 デコードできる形で記録したいです。
可逆の暗号化だな
その暗号化に使うパスワードをどこに保存すれば・・・
>>729 どういうのが安全でしょうか?
よく Crypt が使われますが、すぐに破られそうです。
実行バイナリにパスワードを入れておけば、 分かりにくいけど、デバッガで追跡されたら終わりだしな。 それから、オープンソースにできないという欠点もある。
notpasswordってファイル名にすれば スーパーハカーもスルーすると思う
そういやASMTPで送信されるパスワードって エンコードされてるけどおもいっきり可逆なんだよ だからディスク上に暗号化して置いてあっても トラフィック盗聴されればおしまい
自分の実行ファイルを書き換えて パスワードを保存するってのは。
737 :
725 :2005/03/26(土) 21:40:27
NTFS であれば、パスワードを記録したファイルに対して ファイルのプロパティで暗号化を施せば、 そのユーザー以外から見られることはなくなるので、安全ですね。 ただ、サービス プログラムなどの、特定のユーザーと 結びつかないプログラムでは、この方法は使えなさそうです。
そしてFATが使われているときにも使えない。
DllMain内でDLL_PROCESS_ATTACHがきた時にRegisterClassExをしようとしているのですが、 DllMainの引数で渡されるインスタンスハンドルを使うとRegisterClassExは成功しますが、 その後CreateWindowExが失敗します。(EXE側でWM_CREATEがきた時に。) GetModuleHandle(0);だと成功するのですが、これで解決させたくありません。 どんな原因が考えられるのでしょうか?
>>739 GetLastError() は何と言っている?
Windows 98です。 CreateWindowExにはGetLastErrorが使えない…… orz
これは関係ないのか? Windows 95/98/Me: All window classes registered by a dynamic-link library (DLL) are unregistered when the .dll is unloaded. Windows 95/98/Me: RegisterClassEx fails if the cbWndExtra or cbClsExtra member of the WNDCLASSEX structure contains more than 40 bytes.
98ではCreateWindowExは使えないが
>>741 >CreateWindowExにはGetLastErrorが使えない
そんなことどこに書いてある?
Windows98やMEでCreateWindowExを使うとバグが出て ウィンドウを2つ3つ作ったところでAPが落ちるらしい。 まあ素直にダイアログ作っとけってこった。
すなおに 9x は捨てろってこった。
そうだな、リソースなんて概念に縛られてるようじゃ今時やってられん
>>751 どうしてもそれが必要になった事があってAPを 2000とXPでテストして客先に、提出したのよ。 (一応98とかは、サポート外だった) そんでもって客の都合で、たまたまAPを98で動かしてみたら 落ちたって言うから、調べてみたらそいつが原因だったってわけ。
>>753 CreateWindowExなんて良く使うAPIでバグがあるんならもっと話題になってもいいようなもんだが
ググっても見つからんし、信用できんな。
>>753 そんな話は初めてだし普通にEx使って何の問題も出たことないよ。
別のところに問題あったのが偶然致命傷にならずに動いてて
最終的にExの部分で発現しただけでは?
2000系では落ちないけど9x系では落ちる……。 十中八九、>749のアプリケーションのバグだな。 だから俺はMeが手放せない。些細なバグでも落ちてくれる。
CreateWindowはCreateWindowExを呼び出すマクロだった気が
マクロになってるね。
>>723 EDITSTREAM の構造体の callback に ReadFile(), WriteFile() を普通は
書いていると思いますが、例えが、WriteFile() の代わりに、格納先のメモリ
に MoveMemory() して、メモリのポインタをそのバイト進めるという処理を
続ければ、メモリに書き出した内容が置かれます。(GlobalReAlloc() すれば
どんどん書けます)
rtf の仕様は、ヘルプで出てくるのを見た憶えがあります。
また、MSword があれば、拡張子を .rtf にして書き出せば、どんな風に出て
来るかわかるでしょう。同じ内容を .txt でも書き出せば、対比できます。
文字を着色するだけなら、色指定と文字の格納の方法だけわかれば、txt->rtf
は簡単なので、私はCのソースは、txt で読んで、rtf に変換して、画面へ
送りこんでいます。文字列が英字だけなら文字列はそのまま rtf に置かれます。
760 :
720 :2005/03/26(土) 23:42:11
>>693 ,
>>721 (続き)
アイコン・データの所在を例示すると、一般的なものは、Shell32.dll に多くあります。
今、win98 で見たら、大小 342 個(RT_ICON ベース)ありました。
RT_GROUPE_ICON が ico ファイルに対応していて、この中に要素のアイコンを示す index
があり、RT_ICON を参照するようになっています。
.bmp ファイルのアイコンは、ペイントにあり、MSword のは MSword, Excel のは
Excel にあります。以下同様。
で、.exe, .dll の中を見るには resource editor があれば容易だと思いますが、
VC++ のサンプルの PeFile にアクセス方法が載っています。MSN には、今や PeFile
はないようですが。
.ico ファイルに復元する個数が少ないなら、個々のアイコンの DIB には、
相対アドレスを参照する値はないので、バイナリ・エディタで、hex を切り出して、
自分で hex 編集して、バイナリに戻せば、.ico ファイルにできないことはないで
しょう。
(しかし、決まりきったアイコンを使うだけなら、ExtractIconEx(),
ExtractAssociatedIcon() などの API を使うのが、早道です。)
>>745 SetLastError(0xffffffff);
CreateWindowEx(〜);
GetLastError();とすると失敗するときはffffffff、成功するときには57が常に表示されます。
(その0x57をFomatMessageに通すと「パラメータが正しくありません。」となります)
ちなみにCreateWindowExに渡すインスタンスハンドルをEXEのものからDLLのモジュールハンドルに変えたらこれでも成功しました。
ただ、これだったらDLL内でGetModuleHandle(NULL);する方にします。
DLL内のクラスにはDLLのインスタンスハンドルを指定しろとMSDNには書いてあるのが気がかりですが。
762 :
720 :2005/03/27(日) 00:32:03
>>760 忘れたので。
Shell32.dll は Windows フォルダにあるままでは、使用中で読めないことが
あるので、コピーを作って、開きます。
嫌ならwindows使うな
>>761 C Magazineの2004年12月号 125ページをみるべし
>>761 ウィンドウクラスは、インスタンスハンドルとクラス名で特定される
ということを知ってるか?
>761 CreateWindowEx()をいつ呼んでいるのかが気になるのだが…
>>761 RegisterClassに渡すインスタンスは、プロシージャのアドレスを解決するためのものだから
DLLにプロシージャを書いてるならDLLのインスタンスハンドルを渡すべし。
CreateWindowは実際に動いているプログラムのインスタンスを渡すべし。
Win32のコントロールとかDLLに入っててもCreateWindowにはプログラムのインスタンスを
渡してるでしょ、それと同じ。
要するにGetModuleHandle(NULL)だなー。
768 :
デフォルトの名無しさん :2005/03/27(日) 06:53:59
漏れの古いプロジェクト見るとWinNT/2000/XP系用と Win98/Me系用でReleaseが分かれていた。 あたりまえといえばそうなんだが、確かソースは同じで コンパイルオプションかリンクオプションか何か変えないと Win98/Me系でCreateWindowExがまともに動かんかったと記憶してる。
>>768 自分の管理してるソースだろがw
知らない間に妖精さんが書いたとか言うなよ。
CreateWindowExそのものじゃなくて、顧問コントロールを使うときの
マクロ切り替えだったんじゃないの?
今、思いつくだけでもバルーンチップ。
>>767 > RegisterClassに渡すインスタンスは、プロシージャのアドレスを解決するためのものだから
> DLLにプロシージャを書いてるならDLLのインスタンスハンドルを渡すべし。
コレマジっすか?
>>770 ウソ。サブクラスするときにはインスタンスハンドルを渡さないだろ。
EXEとDLL、あるいは複数のDLLが同一のクラス名でRegisterWindow()
したときに(一般にそれらの作り手は別であるので、名前が被る可能性は
十分にある)、CreateWindow()で目的のクラスを確実に指定するには、
クラス名だけでなくインスタンス固有の値も一緒に指定する必要がある。
逆にいうと、インスタンスハンドルにはクラスを特定するための意味しかない。
実際、インスタンスとして無効な値を渡しても動くしな。
>>771 NT系ならCreateWindowのインスタンスハンドルは無視すると書いてある。
773 :
デフォルトの名無しさん :2005/03/27(日) 11:50:15
>>769 いや、妖精ではないが、何年も前のものなのでもう忘れた。
昨日の自分は明日の他人だ。
DLLをロード/アンロード/ロードしたりすると、 インスタンスハンドル変わる時があるから、 偶発的なバグになって苦労するよ
人に聞く前にMSDNぐらい見ようぜ。
>>776 すまん、古いのを見てた。
MSDNもわざわざ間違いを追記することないのにな。
MSDN見る前に人に聞こうぜ。そのほうが早いよ。
人に聞くまえにMSDN見ようぜ。そのほうが早いよ。
780 :
714 :2005/03/27(日) 14:42:48
>>759 thx.
コールバック関数にくるのはReadFile特注のデータじゃないのね。少しわかってきた。
RTF先頭の
{\rtf1\ansi\ansicpg932\deff0\deflang1033\deflangfe1041{\fonttbl{\f0\fswiss\fprq2\fcharset0 Tahoma;}}
とかいうヘッダみたいなのはそのまま使えばいいものなのかな?
781 :
714 :2005/03/27(日) 15:41:07
コンソールアプリでタイマを使いたい場合は、どの関数を用いればいいのでしょうか。 ある処理を一定の間隔で繰り返すようなプログラムを作りたいのですが・・・
>>782 コンソールアプリでって言うのはメッセージループもなし?だとしたら
タイマは使えないよ、WM_TIMERを処理できないわけだから。
SetTimerでHWNDにNULLを指定してlpTimerFuncに特定のコールバック関数を指定したら ウィンドウやWM_TIMERの受け皿がなくてもできるかもしれない。 と思ったけどMSDNに「WM_TIMER メッセージを処理する代わりに TimerProc 関数を使う場合も、呼び出し側スレッド内でメッセージをディスパッチ(転送)する必要があります。」 って書いてあるから多分無理。。。
マルチメディアタイマなら使えるんじゃない?
>>786 ありがとうございます。
これってコンソールから割と簡単に使えるものなんでしょうか。
Windowsのプログラミングにあまり詳しくないもので・・・
あまり実用例がないものならGUIに乗っけてつくろうかなと思います。
GUIアプリとしてスケルトンを作って、AllocConsoleでコンソールを開き、メインウィンドウを 不可視にしたうえでWM_TIMERを受け取るとか。
別に while(1){ func(); Sleep(1); } みたいにすれば良いと思うが。
>>788 なんか複雑そうですが、
timeGetTime()というのがコンソールから使えそうなので、これにしようと思います。
あとついでなのですが、コンソールではSleep関数は使えるのでしょうか。
コンソールってWindows上ではスレッドで動いてるのかな?
どうもWindowsは単純プログラマではわからんことが多い・・・
>>790 スレッドで動いてるって何だろう…何も特別なことをしなければ
シングルスレッドで動いてるよ。もちろんマルチスレッドにも出来る。
コンソールアプリだろうとGUIアプリだろうと同じ。
>>789 それも使う予定ですが、どうしても相対時間を測りたい部分があるので。
>>791 シングルスレッドというのは、windowsの他のプログラム(例えばWORDとか)と
基本的に同じってことでしょうか。
Windowsにしろ処理の流れは一本だから、どっかで無限ループなどに陥ったら
全体がとまってしまうのではないかと心配なんですけど。
マルチプロセス
MSWORDはマルチスレッドだが
796 :
デフォルトの名無しさん :2005/03/27(日) 17:40:12
DLLのプログラミングで自分自身のパスを知るにはどうしたら良いですか?
>>796 DllMain() に渡されるインスタンス ハンドルを、
GetModuleFileName() に指定する。
>>796 DllMainに渡されるモジュールハンドルをGetModuleFileNameでいいんじゃね?
DllMainって自分で書く機会ってあんまりないよね。
799 :
798 :2005/03/27(日) 17:51:56
800 :
796 :2005/03/27(日) 18:01:28
801 :
759 :2005/03/27(日) 18:36:01
>>780-781 何年も前にやったので、細部はよく憶えていないけど、いいみたい。
漢字(shift-JIS)は、自分は下記の format で、1バイト目、2バイト目を書き出している。
"\\\'%02x\\\'%02x" // 結果は、\'xx\'yy という形なる。
細かいことですが、unicode の漢字で、第1バイトと第2バイトとか逆転しているケースとか
あるようだけど、対応してません。(ソースを見たら、コメントに書いてあった)
HRESULTとLRESULTの違いってなんですか?
さあね
HRESULTはビットごとに意味があるよ
806 :
714 :2005/03/27(日) 20:19:49
>>801 日本語はそのエスケープであってるんだ。安心。
というわけでワードパッドで出力したファイルと照らし合わせて研究中。
いろいろありがとう。
>804-805 レスありがとうございます MSDNライブラリってこういうのも載ってるんですね 日本語のページ見難くて見つけられなかった;
>>807 日本語のページが見づらいのと英語のページで見つけられないってのは別物だぞ
俺だと日本語のページは見づらい以前に文字化けして読めない……。 どうしても英語のほうを読むしかない
encode
>>783 今日の自分は、
1)過去の自分が他人に見える
2)未来の自分からみると他人に見られる存在
っていう意味だろ?
812 :
809 :2005/03/28(月) 03:59:44
>>810 いや、エンコードは一通り試したつもりなんだ。
参考までに、他の人が正常に見れる場合の文字コードを教えてくれ
ただのShift JISだがもしかしてIEでしか見れないようにしているとかの罠があるんじゃないか?
便乗すると、漏れの場合は文字化けというか、左側のフレーム内が意味不明になります。 こんな感じ。これが普通? □MSDN ????? □???????? □???? ??? Embeaded ?? □.NET ?? 米国サイトなら普通に読めるんだけどね。
IEの言語設定は?
816 :
814 :2005/03/28(月) 09:45:59
日本語(自動設定)またはShift-JISです。 IEとFirefoxでエンコードをあれこれ試したけど、 右側部分はS-JISでないと文字化けするし、左側は設定に関係なく読めないみたいです。
IEのバージョンは? IE6ならWin98でも読めたがIE4だと化けるねー。
818 :
814 :2005/03/28(月) 09:58:48
OSはWin-XPで、IEは6.0.2900.2180.xpsp_sp2.rtm...なのにorz 米国サイトじゃないと出てこない情報もあるみたいだし、日本語版はあきらめました。
自動選択のチェックを外して、Shift_JISにするとどうなる? IEの自動設定はバグだらけなので、自社サイトも読めない可能性がある。
820 :
デフォルトの名無しさん :2005/03/28(月) 10:12:51
「フォントキャッシュの破損」なんかじゃないよね?
バグだらけという表現は適切ではないか。とにかく挙動はおかしい。
再インスコ
自分の作ってたプログラムで、CreateWindow の hinstance を指定する部分で、NULL を 指定していたことに今日気付きました。けど、普通に動いていました。 もし、NULL にしていたままだとして、どんなバグが出ると予想できますか? よろしければ、ご教授ください。
hInstanceの部分は2000/XPでは無視されたはず。 9xで不具合が出るかも知れんけど具体的には知らん。
なるほど、確かに自分は Windows2000 を使っております。 はじめて知りました。ありがとうございました!
リッチエディットにC++のstd::stringに入っているRTFを読ませようとして コールバック関数を組もうとしたんだけど、 具体的にどうしたらいいのかわからない(テキストの末尾に来たときの*pcbの処理とか、string.substr()とか) んで、誰かわかる人いない?
いる
bmpファイルの特定の範囲を読みこむ関数ってありますか? LoadImageで読みこんだイメージの特定の範囲をコピーでもいいんですが
複写の BitBlt(), 表示の SetDIBitsToDevice(), StretchBIBits() には 部分の指定が可能だが、読むときに一発てのはないんじゃない? bitmap data のところを、ま、1行ずつ読んで、対象外のところは読み飛ばす とか出来るが。
832 :
829 :2005/03/28(月) 19:07:23
あいうえお かきくけこ ↑こういうBMPファイルから「あ」とか「く」を取り出して表示したかったんですが こういうのはどうやってるんですか?
LoadImageしたHBITMAPをCompatibleDCにSelectDCして、 BitBltすれば解決とかそう言う話?
>>832 メモリデバイスコンテキストはわかりますか?
BMPファイルなんて単純な形式だから、 ファイルフォーマット調べて書き出せばいいんでない? 2時間もあれは出来ると思うけど。
837 :
デフォルトの名無しさん :2005/03/28(月) 21:14:27
質問です。DeleteObject(NULL)は安全ですか?
>>837 ヘルプ見ると
戻り値
関数が正常に終了した場合は、 TRUEを返します。
指定されたハンドルが有効でない場合や現在デバイス コンテキストに選択されている場合は、 FALSEを返します。
とあるが、はて
840 :
デフォルトの名無しさん :2005/03/28(月) 21:30:17
GetFileSizeで4Gバイト以上のファイルサイズを取得したいのですが、 なぜか下位DWORDが1バイト多く返ってきます。 この場合、どこが問題なのか教えてください。
841 :
840 :2005/03/28(月) 21:40:24
なんか、WinXPProSP2でファイルのプロパティを見ても1バイト多いです……
>834 CreateCompatibleDCでメモリに描画したりはなんとかできます あい かき というBMPファイルを読みこんでBitBltで描画しようとすると 「き」だけ描画することはできるんですが い き とか 「かき」 見たいになって 「あ、い、か」だけ描画することが出来ません; BitBlt(コピー先のデバイス、コピー先で描画したい座標X、同上Y、コピー先の幅、コピー先の高さ、コピー元のデバイス、 コピー元のx?、コピー元のy?、オプション)までは理解しているんですが?の部分がよくわかりません x、yで点を指定してそこからコピー元の画像をコピーするみたいなんですが これで「あ、い、か」は抽出できますか? 読みづらくてすみません;
843 :
840 :2005/03/28(月) 21:47:05
すみません、プログラム以前のイージーミスでした。忘れてください。
何でわざわざコピー元座標引数を無視するんだよ。
「あ」 の左上座標と縦横サイズがわかれば「あ」だけコピーできるでしょ
コピー元の座標引数って上記のコピー元のx?、コピー元のy? 以外にあるんですか?
複数回BitBltを実行するという発想がないような予感
>>848 Meadowやxyzzyでソースを書いて、clでコンパイルすれば解決。
>>848 何がやりたいのかいまいちよくわかりませんが。
VisualC++6.0とVisualC++.Netでは最初の選択画面が少し違うからそのせいで戸惑っているのかな?と思います。
メニューの
[ファイル] -> [新規作成] -> [プロジェクト]を選択
作るプロジェクトを択するダイアログがでるのでその左側から
[VisualC++ プロジェクト]のフォルダを開くと
Win32コンソールプロジェクト
Win32プロジェクト
がでるのでWin32プロジェクト選んで後は適当に。
IDE使いたくないならnmake.exeってのがあるので適当にMakefile書いてガンガレ
>847 あーそういう発想は無かったです; だめだ私orz
853 :
851 :2005/03/28(月) 22:31:40
ああ、
>>851 でWin32プロジェクト 選んだ後さらにダイアログが出る。
その左側の[アプリケーションの設定]っての選ぶと初期設定みたいのが選べるので
[空のプロジェクト]とかにチェックつけるとIDE用のプロジェクトやらソリューションだけの状態で
ソースは一切無しの状態になるっぽ
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
855 :
848 :2005/03/28(月) 22:55:06
みなさんありがとうございます。 空のプロジェクトを作ることが出来ました。 ですが、windows.hをインクルードするWinMainを使うサンプルが コンパイルできません。 とりあえずIDE ? の作ってくれる雛型を土台にいろいろいじっていこうと思います。 重ね重ねありがとうございました。
>>855 main()を使うようにコンパイルされてるんじゃない?
ならばコンパイラの設定や引数で指定してみれ。
LoadIcon関数は将来サポートされなくなる可能性があるので LoadImage関数を使うほうがいいと「猫」に書いてあったのですが本当ですか?
ディスプレイが32bitカラーモードのときに 32bitアイコンに含まれる16色や256色のアイコンを選んで 描画する方法を知りませんか?
862 :
デフォルトの名無しさん :2005/03/29(火) 02:17:59
知ってます
>>861 僕はそのやり方を知らないけど、質問する時は念のために、
「もし知っているならそのやり方を教えてください」も追加した方がいい。
864 :
861 :2005/03/29(火) 02:40:48
>>863 いえ、私は皆さんが方法を知っているかどうかを知りたかったのです。
865 :
861 :2005/03/29(火) 03:04:47
864は偽者です。
>>863 忠告ありがとうございます。
>>865 それで終わりかいっ!
実現方法は聞かないのかよw
ごめん、wと!は逆の方がしっくりくるので脳内変換よろ
868 :
861 :2005/03/29(火) 03:57:21
>>866 いや揚げ足を取られやすい質問の仕方だっただけで
こちらの意図は伝わってると思ったので…
ちなみに32bitアイコンのリソースを直接読みこんで
つまりアイコンファイルのフォーマットを解析して
ビットマップ情報から表示みたいな方法ではなく
もっとスマートな描画方法があるのなら教えてほしいのです。
>>868 explorer のような tree view でファイルを表示するのを、自分もやっていて
最近知ったのですが、tree view に付ける ImageList の生成のときに 16x16 に
するか、32x32 にするか、指定できますね。32x32 にすると tree view の行の
高さは高くなります。color depth も指定できます。
普通は、4 bit color のを使うか、8 bit color のを使うかは、モニタの指定に
従い、判別されるようです。該当するものがないときは、近いものが選ばれたり、
他のものから生成されるようです(ぼやけた絵になりますが)。
HICON を作るときや DrawIconEx() でも、サイズは指定しますが、depth は書く
必要がないのは、OS に任せろと言っているのか、サイズとdepthは、略リンクして
いるので、それに従うということではないかと想像しています。
古い MSDN サンプルに aniEdit, imagedit というのがあり、これ以降、新しい
資料がなさそうなので、ご覧になるといいかと思います。
871 :
デフォルトの名無しさん :2005/03/29(火) 13:33:15
DefaltGateway,DNSServerを取得できる関数ってないですか? IPアドレスとサブネットマスク、MACアドレスなどは取得できる関数はあったのですが。
Win32_NetworkAdapterConfigurationクラスにあったような・・・
874 :
861 :2005/03/29(火) 18:43:12
>>870 貴重なサンプルについて教えて頂いてありがとうございます。
仰る通り、何ビットのアイコンをロードするかはOSが判断しているようです。
MSDN で LookupIconIdFromDirectory の解説を見ると、
LoadIcon も LoadImage も現在の表示デバイスに合ったものを検索するとあります。
で、調べていて気がついたのですが、LoadImage のオプションで LR_VGACOLOR フラグを立てれば
16色に指定することだけはできるようです。でもその他の色数は指定できません。
結局、リソースから直接読み出す方法を試していたところ、以外と簡単にできてしまいました。
FindResource, LoadResource, LockResource, CreateIconFromResourceEx を使用する方法で
>>722 のリンク先に完全なサンプルがあります。
DrawTextは、char型のポインタを指定しますが、 wchar_t(ワイド文字)に対応した文字列描画関数はありますか? 無いとしたら、ワイド文字をマルチバイト文字へ変換させてから描画しないといけないのでしょうか? よろしくお願いいたします。
>>875 MSDNより。
int DrawText(
HDC hDC, // handle to DC
LPCTSTR lpString, // text to draw
int nCount, // text length
LPRECT lpRect, // formatting dimensions
UINT uFormat // text-drawing options
);
LPCTSTR だが…?
877 :
875 :2005/03/29(火) 22:43:19
>>876 「error C2664: 'DrawTextA' : 2 番目の引数を 'wchar_t *' から 'LPCSTR' に変換できません。」
LPCSTRとなってしまいます。
ソースコードでは、
::DrawText(m_hDC,pString,length,pRect,uFormat);
とDrawTextと指定してるんですが。。。
DrawTextA?
#define UNICODE もしくは #define _UNICODE 直接wchar_t版使いたいなら、DrawTextWを呼べ。
すみませんお聞きしたいのですが HBITMAPを開放するのでDeleteObjectを読んでたのですが MSDNによると 戻り値 ・指定したハンドルが有効でない場合、またはデバイスコンテキストでそのオブジェクトが選択されている場合は、0 が返ります。 解説 ・デバイスコンテキストで選択されている描画オブジェクト(ペンまたはブラシ)は削除しないでください。 とありますが、SelectObjectで選択されていても0以外の値を返すのですがHBITMAPの場合問題無いのでしょうか?
普通は使い終わったらSelectObjectで選択解除してからDeleteObjectする おそらくWindowsプログラミングの常識じゃないか? SelectObjectしたまんま開放なんてありえない。
881 :
デフォルトの名無しさん :2005/03/30(水) 02:27:33
>>877 // winuser.h
int DrawTextA(HDC hDC, LPCSTR lpString, int nCount, LPRECT lpRect, UINT uFormat);
int DrawTextW(HDC hDC, LPCWSTR lpString, int nCount, LPRECT lpRect, UINT uFormat);
#ifdef UNICODE
#define DrawText DrawTextW
#else
#define DrawText DrawTextA
#endif
882 :
デフォルトの名無しさん :2005/03/30(水) 05:29:10
DDBビットマップの、透過表示に使う、マスク画像の作り方についての質問です。 今は、GetPixelで色を調べながら、SetPixelで描画みたいにしているのですが、 BitBltのラスタオペレーションの組み合わせで、うまい事出来ないでしょうか。 出来るなら、やり方を教えてください。
883 :
デフォルトの名無しさん :2005/03/30(水) 09:09:58
プロセス間で、共有メモリを使ってBSTR型の文字列をやり取りする方法ないでしょうか? 文字列のサイズを気にせずにプロセス間で受け渡ししたいのですが・・・ やり方まで教えていただけると嬉しいです
>>883 「やり取り」というものの詳細がいまひとつわからんが
メモリマップトファイルとかは調べた?
>>883 ウィンドウ間ならWM_COPYDATAで楽に出来る。
>>883 ひょっとしたらWM_SETTEXTだけでOKだったりして
888 そう鴨
889 :
882 :2005/03/30(水) 13:55:39
890 :
883 :2005/03/30(水) 14:31:56
>>884 すみません。
もうちょっと詳しく状況書かないといけませんでしたね。。
「やり取り」というのは、共有メモリを使って他プロセスにBSTR型の文字列を渡したり受け取ったりしたい、という意味です。
今まで、CreateFileMappingとMapViewOfFile使ってchar*で文字列の受け渡ししてました。
これをBSTRでやりたい・・という魂胆です
とりあえず、BSTRのポインタだけ渡すのは明らかにダメだったので、実体全部を・・などと考えているんですが・・
ここでのプロセスで動かしてるのは両方コンソールアプリ型のWin32サービスです。
いい方法ないでしょうか。。
>>886 >>887 即レスありがとうございます。説明不足でした。
コンソール型のWin32サービスなので、ウィンドウメッセージは×なのです。
すみません。
BSTRサーバーでも作れば?
>>890 えーと、FileMappingではいけない理由は?
893 :
デフォルトの名無しさん :2005/03/30(水) 15:13:25
#include "stdafx.h" int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { static char* moji; // TODO: この位置にコードを記述してください。 for(int i=0; i<10; i++) { wsprintf(moji,"ループ%d回目です。",i+1); MessageBox(NULL,mojip,"ループ",MB_OK); } return 0; } wsprintfを使用してループ回数を毎度表示するプログラムを組みたいのですが、コンパイルは通るもののこれを実行するとエラーで終了させられてしまいます。 char配列にすれば問題なく作動するのですがstatic char*で動かすにはどうすればよいのでしょうか。
894 :
893 :2005/03/30(水) 15:14:55
書き忘れました、static char*にかぎらずchar*のように配列ではなくポインタを使用したいのです。 よろしくおねがいします。
>>893 メモリを確保しろ
というか、Cの基礎をやり直して来い
×:MessageBox(NULL,mojip,"ループ",MB_OK); ○:MessageBox(NULL,moji,"ループ",MB_OK); です。何度もスミマセン。
>>893 たぶん君の頭だとVB使ったほうがいいよ。
>>894 ポインタがなにも指してないからダメですよ
static char* moji = "ほげほげ";
とかやるとか、ちゃんと実体のあるものを指すようにしましょう
ポインタとか話すのは素人、値とか参照、名前といえれば高級言語の エキスパートといえる
901 :
デフォルトの名無しさん :2005/03/30(水) 16:34:34
LPSTRやらHANDLEやら、Win32で定義されてるのは沢山あると思うんですが、 それの内容一覧とかありませんか?
>>901 PlatformSDKのヘッダーファイル
903 :
デフォルトの名無しさん :2005/03/30(水) 16:38:34
904 :
デフォルトの名無しさん :2005/03/30(水) 16:40:51
>>902 すいません、PlatformSDKのヘッダーファイルってwinbase.hとかですか?
>>893 char* moji;
moji = (char*)malloc(256);
:
wsprintf(moji,"ループ%d回目です。",i+1);
MessageBox(NULL, moji ,"ループ",MB_OK);
:
free(moji);
908 :
890 :2005/03/30(水) 17:04:26
883です。
>>891 BSTRサーバ!!
なるほど。確かにこれなら・・。
こういう選択肢もあるんですね!
共有メモリに固執するあまり、考えてもいませんでした。
選択肢の1つとして、検討してみます。
ありがとうございます!
>>892 すみません、FileMappingにこだわる理由、書いてませんでしたね。。
依頼主からの要望なんです。
「なんとか共有メモリ使ってBSTRを渡すようにできないか」、と。
できない理由はいろいろ試してみていくつか挙がってきてるのですが、
それを解決する方法がどこかにあるんじゃないか・・と。
すみません質問させてください。 シフトを5回連続で押した際に発生する固定キー機能の ダイアログを出ないようにしたいために以下のようなコードを書いたのですが 動作時に、「無効になったはずです。」のメッセージは出せるのですが その後にシフトを5回連続で押すと、やっぱりダイアログがでてしまいます。 これで良さそうな気がするのですが、何か見落としでもあるのでしょうか? 何かありましたら、宜しくお願いします。
910 :
909 :2005/03/30(水) 17:11:42
STICKYKEYS StickKeys; //STICKKEYS 構造体の初期化 StickKeys.cbSize= sizeof(STICKYKEYS); StickKeys.dwFlags= 0; //固定キー機能の値を取得するユーザプロファイル更新のために SPIF_UPDATEINIFILE を指定 if(SystemParametersInfo(SPI_GETSTICKYKEYS,sizeof(STICKYKEYS),&StickKeys,SPIF_UPDATEINIFILE) != 0) { } else{ /*失敗*/ return FALSE;} //現在5回シフトで、固定キーダイアログ発生が有効 if(StickKeys.dwFlags & SKF_HOTKEYACTIVE) { MessageBox(NULL,"なので、でないようにしたいです。","",MB_OK); StickKeys.dwFlags &= !SKF_HOTKEYACTIVE; if(StickKeys.dwFlags & SKF_HOTKEYACTIVE) {} else { MessageBox(NULL,"5回シフト押下でダイアログがでないようになったはず。","",MB_OK);} }
ネタか?
912 :
909 :2005/03/30(水) 17:22:03
>>911 すみません本気で書いてるつもりっす…。
何故そんなこと言われるのかも解らん状態です。><
913 :
デフォルトの名無しさん :2005/03/30(水) 17:24:47
>>912 911のような奴を相手にしないこと
この板にふさわしくないバカはほっとけ
つうか、ネタだろ、longhornのネタかw
SPI_SET*の存在についてよく考えて見ろ。
つーか、BSTRならCOMだろ。OutProcなCOMなら、マーシャリングは 共有メモリなんでねーのか。
917 :
909 :2005/03/30(水) 18:30:16
>>915 うおーーーーーーーーーーーーー!!俺馬鹿だ(爆
有難うございます。
なんで皆がネタかと言ってたか解りました。
お騒がせしてすみませんでした。
918 :
デフォルトの名無しさん :2005/03/30(水) 18:45:37
>>906 ありがとうございます!まさにそれです!
>>908 char型に変換して渡す。
受け側でBSTRに戻す。
>>919 charにしなくてもwchar_tで渡せばいいじゃん。
こんばんわ char mb[]="@niftyでインターネット Version 5.00について"; wchar_t wc[100000]; を mbstowcs(wc,mb,100000); を使いワイド文字に変換したのですが、 次のように文字化けがおきます。 何に問題があるのでしょうか? "@nifty?A?C???^?[?l?b?g Version 5.00?E?A?¢?A";
cのライブラリ関数の質問はスレ違い。たぶんlocale関連の問題。 mbstowcsに拘らずにマルチバイト文字列からワイド文字列への変換がしたいだけなら、 Win32API のMultiByteToWideCharでちゃんとコードページを指定してやればOK。
setlocale
>>898 文字列リテラルは書き換え出来ない(C/C++の規格では)
マスクされたビットマップ画像を扱いたいのですが、 猫でも〜のMaskBltだと95/98じゃ動作しないようなので 95/98でも使えるマスク画像はできないか (特定の色を透過色として透かす方法などがあれば) 教えてください。お願いします。
GDI+使う手もあるけどね。 あれは95じゃ駄目か?
DirectDraw使う手もあるナ
930 :
デフォルトの名無しさん :2005/03/31(木) 01:07:18
OS再起動時にあるファイルの削除をしたいのですが、 何のAPIを使えば良いですか?
WinAPIで発生するエラーの処理はどの程度行えばよいのでしょうか。 ほとんどの関数が何らかの形で(NULLであったり定数であったり) エラーを返すと思うのですが、やはり全てを考慮すべきなのでしょうか。 それとも、他の方のソースとの比較や経験則から、 エラーがほとんど発生しないような部分は割り切ってしまったほうが いいですか? 自分は学生です。 仕事などで使うような重要なプログラムを作っているわけではありません。 頻繁に使用する部分を、自分なりに使いやすいようにまとめている最中です。
935 :
デフォルトの名無しさん :2005/03/31(木) 02:06:47
ListViewで アイコン一覧とコメント(名称) のリストを作成したく LV_ITEM item; item.mask= LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; ・ ・ という感じでリストビューを表示したのはよいのですが、 項目が増えると、右にスクロール(水平スクロールバーが表示される)してしまいます。 下に項目が増えていく(垂直スクロールバーのみが表示される)ように設定するには どうすればよいのでしょうか。教えてください
また厨房か バカとか使うからすぐ分かるよな 明日から学校いけ
938 :
504 :2005/03/31(木) 05:29:55
超亀レス失礼します。
>>530 それは尤もなのですが・・・・・
>>534 コンソールを操作するAPIがちゃんとあるんですね。
貴重なアドバイスをどうもありがとう御座いましたm(_ _)m
>>537 Linuxのlessのソースを見たらコンソールを操作する関数があったのですが、
include ファイルも環境依存のものだったので、結局あまり参考になりませんでしたorz
UNIXのソースなんか読んでも参考にならんよ
>>934 さー?人それぞれケースバイケースだけど。
エラーは一応全部orほとんどハンドリングしておいて、大した
エラー時処理は入れないぐらいでいいんじゃない?
メッセージボックス出すとか。
デバッグに役立てる意味で。
横レスですが、
>>908 のBSTRサーバって何ぞや?
ぐぐったけどわからなかった。誰か教えてん。
942 :
908 :2005/03/31(木) 08:55:45
>>919 >>920 ありがとうございます。
やっぱり、FileMappingではそれしかなさそうですね。
BSTRをWCHARとDWORDに分解して、受け側で再構築させてみます。
まぁ、BSTRで渡す意味あるのってツッこまれたら、それまで、ですが。。
>>941 BSTRを受け渡しするだけのCOMサーバのことと理解してます。(誤解だったりして)
この場合、アウトプロセスになるのかな・・
この辺、自分もそんなに詳しくないので。。
これなら出来そうだ・・っていうイメージぐらいしか分かりませんが^^;;
BUTTON のフォントサイズはどうやって変更するんですか?
>>942 DLLに共有セクションを持たせることもできるな
945 :
942 :2005/03/31(木) 13:05:25
>>916 遅レスすみません。
ごもっともです。
確かに、アウトプロセスCOMなら、
共有メモリ使ってるのと似たような使い方考えられますね。
BSTR型とCOMを切り離して考えてたところが急所でした。。
>>944 なるほど!
COMまでいかなくても、DLLの共有セクションって手段もあるんですね。
共有メモリからDLL、COMという発想がでてきませんでした。
FileMappingでは限界と感じてるので、
DLLかCOMではどうか・・と、そっちの方向に振ってみる事にします。
アドバイスくれたみなさん、有難うございました!
946 :
934 :2005/03/31(木) 13:15:25
>>940 そうですね。
どうしても読みにくくなる部分以外は
とりあえずメッセージボックス入れるようにしていきます。
こだわりすぎで読みにくくなったりしたら元の木阿弥ですしね。
丁寧な回答ありがとうございました。
DeleteDC( hmemdc ) DeleteObject( hobj ) とかって、オブジェクトを削除する前に、(メモリ)デバイスコンテキスト から削除(解放)する必要があると学びました。 その手順を教えているサイトはあるのですが、それはなぜか説明されている ところを見つけることが出来ません。 ご存知のかたいらっしゃいますか?
949 :
デフォルトの名無しさん :2005/03/31(木) 20:52:49 BE:88200847-###
CClientDCを使うんだ!
950 :
デフォルトの名無しさん :2005/03/31(木) 21:05:02
>>948 探せばすぐ見つかると思うが。
基本は、
hNew = CreateXXXX();
hOld = SelectObject(hdc,hNew);
/* ここで描画 */
SelectObject(hdc,hOld);
DeleteObject(hNew);
ずれたこというな
952 :
926 :2005/03/31(木) 21:44:32
>927 既出スマソ。サンクス
>>948 SelectObjectしたものをきちんと戻してあるなら破棄する順番に関係はない。
ただ、作成した順・逆順で破棄するなど規則性があった方がわかりやすい。
メッセージループのデッドタイムを使って処理をしてるとき、 ウィンドウのキャプションバーをマウスで押下してると処理が止まるから てっきり何かメッセージが連続で発生してるもんだと思ったら、 DispatchMessage()でループが止まってた…。 なのにWM_TIMERとかWM_MOVEとかでプロシジャはしっかり呼ばれてる。 なんで???わけわかんねーorz
>>954 そういう一部のメッセージはメッセージループを通らず直接ウィンドウプロシージャへ送られる。
ちなみに自分からそういう風にメッセージを送りたければSendMessage()を使う。
PostMessage()だとメッセージループ経由になる。
956 :
デフォルトの名無しさん :2005/03/31(木) 23:43:51
難しい話してるなぁ…僕はいつになったらこの人達みたいになれるんだろう
>>956 めっちゃ簡単ですやん。
やればできる子ですやん。
>>955 おお!そうかそういうことなのか…。
返答thxです。
いや、何か連続でメッセージが送られてるなら
そのメッセージ取得中は別に自前の処理関数呼べばいいかな
と思ってたんだけどそれだとどうやら無理っぽいっすね…。
なんとか処理止めずにいけないものでしょうか…(´・ω・`)
デッドタイム使うのやめてスレッド作ったらどう?
960 :
958 :2005/04/01(金) 00:06:01
時代はやはりマルチスレッドなのか…。 いまだに抵抗あるんですけど挑戦してみます!(`・ω・´) ノ
質問です。 実行されているアプリの実行時のカレントディレクトリ(作業ディレクトリ)を知るには どうすればいいでしょうか? 例えば C:\program files\program\program.exe を D:\Work から実行した、または、 C:\program files\program\program.exe のショートカットを D:\Work作成して実行した といったケースで、実行中のprgram.exeを特定し、そこから D:\Work を導き出すことは 出来ないでしょうか? なお、GUIアプリを対象にするつもりなのでWindowハンドルを元にプログラムを特定する つもりです。
>>955 DefWindowProc内でメッセージループが回ってんじゃね?
MessageBoxみたいに。
Longhornの発売がまた延期(2008年初頭)になるそうで。 これぞMicrosoftクオリティ。
964 :
961 :皇紀2665/04/01(金) 02:21:53
Processを特定できればSTARTUPINFOという型の情報を持っていてそれで判るみたいですね。 もう少し調べてみます。自己完結失礼。
実行ファイルはGetModuleFileName使って、 作業ディレクトリGetCurrentDirectory使えば。
Advanced WindowsのLastMsgBoxInfoサンプルを参考にして、ExitProcessをフックするプログラムを書いてみたんですが、 フックできるexeと出来ないexeがあります。 画像ビューアのirfanviewと、Windows2000/XPのCMD.exeはフック出来ませんでした。 あと、explorer.exeのCreateProcessもフックできませんでした。 どうしてなんでしょうか。 (フックできているかどうかは、OutputDebugStringで確認しています) 環境は、Windows2000 VC++6です。
967 :
デフォルトの名無しさん :皇紀2665/04/01(金) 11:55:48
WHND m_whandle; m_whandle = GetActiveWindow(); if(m_whandle==NULL) AfxMessageBox("NULLっぽい",MB_ICONSTOP); ってな感じで、アクティブなウィンドウのハンドルを取得しようとしてるんですが、そのプログラム(自分)以外のウィンドウをアクティブにするとNULLが返ってきます。 どなたかお助け願います。
>>967 GetForegroundWindow
969 :
デフォルトの名無しさん :皇紀2665/04/01(金) 12:42:55
>>968 GetActiveWindowをGetForegroundWindowに変えたところ、ダイアログが出なくなったのでうまく行くかと思ったのですが、GetWindowTextで確認するとやはり何も変わっていないようです。
char buf[100];
WHND m_whandle;
m_whandle = GetForegroundWindow();
if(m_whandle!=NULL){
GetWindowText(m_whandle, buf, 1000);
MessageBox(NULL, buf, "DoGetForegroundWindow", MB_ICONSTOP);
}
突っ込んで良いのか・・・・? >>char buf[100]; >>GetWindowText(m_whandle, buf, 1000);
あと、WHNDってのも無い。
972 :
デフォルトの名無しさん :皇紀2665/04/01(金) 12:59:24
その場で書き足したんでミスってました、すまんす。 ソースは1000とHWNDになってます。
GetWindowText 指定されたウィンドウのタイトルバーのテキストをバッファへコピーします。指定されたウィンドウがコントロールの場合は、コントロールのテキストをコピーします。ただし、他のアプリケーションのコントロールのテキストを取得することはできません。 に気づいてしまいました。 他のアプリケーションは取得も無理ですか?具体的にはアクティブなウィンドウに張り付きたいのです。
>>973 GetForegroundWindowがコントロールを返すことは多分滅多にないんじゃないかな。
ホントだ・・・ダメダメじゃん、自分・・・orz
977 :
966 :皇紀2665/04/01(金) 14:31:42
別人です。 APIフックで悩んでおります。
次スレまだー?
979 :
デフォルトの名無しさん :皇紀2665/04/01(金) 16:55:19
Net meeting SDKに関する質問は ココでいいですか?
>>966 たぶんそのサンプルはIATしか変更してないからだね。
いくらロードされたモジュール毎にIATを変更して回っても、
直接ExitProcAddressに飛んでる場合には対応できない。
プロセスにロードされたExitProcAddress関数のコードそのものを
書き換えるのが確実。
タイミングが悪いと書き換え中に呼ばれたりするから
SuspendThreadかなんかで停止中に書き換える。
例えば、ExitProcAddressの頭を
jmp MyHook
みたいなコードに書き換えて、用が済んだら書き換えた箇所を元に戻して、
jmp ExitProcAddress
する。
ExitProcAddressじゃなくてExitProcessだね。
GetWindowTextは他のアプリからでも取得できたんじゃなかったっけ。 Win3.1とかからの互換性のためとかいって、 対象ウインドウのメッセージループが回ってなくても大丈夫だとか 聞いたことがあったけど。
>>984 その辺の話はAdvancedWindowsに載ってるね。
WM_COPYDATA関連の章で。
>>984 WM_GETTEXTを素で送るとWindowsがよろしくやってくれるんだが
GetWindowTextを使うとはねられる。
SendMessageとはやり方が違うのかもね>GetWindowText
ReadFileは一文字ずつ読み込めるのでしょうか? カンマで区切られたtxtデータを読み込んで カンマまできたら、そこまでの文字を読み込みたいのですが、 どうすればいいでしょうか?
>>989 先ず日本語を勉強しろ。
>カンマで区切られたtxtデータを読み込んで
>カンマまできたら、そこまでの文字を読み込みたいのですが
読み込んだ後に読み込みたいって矛盾してるように読めるぞ。
991 :
966 :int 2ch =05/04/01(金) 21:38:11
>>981 なるほど。
回答ありがとうございました。
その方法でやってみます。
>>989 効率は悪いだろうけどSetFilePointerと組み合わせれば出来るかもね。
>>989 ファイルサイズがそこまで大きくなければ、メモリ上に一度全て
読み込んでしまえ。無駄に感じる気持ちは解る。はじめの頃は。
つーか、そういうときぐらい素直にC/C++の標準ライブラリとか使ってやれよ。
995 :
989 :int 2ch =05/04/01(金) 21:59:49
スマソ。正直学力が足りなかった
996 :
デフォルトの名無しさん :int 2ch =05/04/01(金) 22:10:55
↓スレスト
997 :
♥ :int 2ch =05/04/01(金) 22:16:25
998 :
デフォルトの名無しさん :int 2ch =05/04/01(金) 22:18:55 BE:12600522-###
999でスレスト ↓
ならぬツイスト _/ ̄
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。