スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは
>>2-10 くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(
http://msdn2.microsoft.com/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
4
>>7 ドトネトなんてインスコしたくないしXP迄のAPIが使えれば十分なので
Microsoft Platform SDK for Windows Server 2003 R2を使ってる俺が来ましたよ
あっそ
11 :
デフォルトの名無しさん :2008/01/05(土) 16:25:05
最近のMSのヘルプは.NET製だった気がする
>>8 >>5 にもWindows SDKとは別にPlatform SDKを載せているジャマイカ
waveOutResetをコンソールアプリから任意のタイミングで実行するとそこでフリーズしてしまうんですが dousureba.
>>14 waveOutResetを呼ばない
サウンドデバイスを無効にする
ハードウェアアク(ryを最低に落としてみる
ドライバを別のバージョンに入れ替えてみる
DirectSoundに乗り換える
20 :
デフォルトの名無しさん :2008/01/05(土) 19:26:39
>>1 乙。
前スレの
>>996 ありがとうございました。デフォルトでインストールされてるんですね。
「アプリケーションの構成が正しくない」とかで動かないXPマシンが
あったのですが、じゃあそのマシンが何かおかしいんですね・・・。
>>20 MFCのランタイムはバージョンが非常に多い。
デフォルトでインストールされてるのはその中の一部。
動かないのはインストーラーが悪い
>>16 >>17 死ね。
>>18 気持ち悪い。失せろ。
>>19 waveOutResetを呼ばないと適切にCloseできないみたいです。
DirectSoundは使用できません。
デバッガに乗せて実行してみたんですが、waveOutResetで「デッドロックの可能性がある」とのメッセージと共に
waveOutResetの行で止まってしまったままそれ以上追跡できません。
コールバック関数内でwaveOutWriteを実行しているんですが、もしかしたらこれが不具合の原因かもしれません。
しかしwaveOutOpen時にCALLBACK_WINDOWを指定したうえで
ウィンドウプロシージャ内でwaveOutWriteを実行し巧く動いている例もあり、何が明確な原因なのか分からない状態です。
ウィンドウプロシージャで処理したらうまく動くのか!?そうなのか!?赦さんぞマイクロソフト!
死ね
誤爆先でも即レスが付いててわろたw
>>22 レスから見るに知っているような気もするが、
コールバック関数内でのI呼び出し可能なAPIは制限されている。
SetEvent/PostThreadMessageあたりは使えるから、
それを利用してコールバック関数外から呼ぶように修正。
>>20 どうしても調べたいなら、面倒くさいけど、
dependency walker ってのがあるから、それで使用されるdllを調べて、
動くマシンと動かないマシンのdllのバージョンを比べてみればいんじゃね?
作ったソフトが作ったPC(XPx64:VisualStudio2005インストール済み)ではちゃんと起動 するのに、他のPC(Vista32bit:VisualC++インストール済み)でも(XP32it:何もインストールしてない) でも起動させようとしても何も表示されずエラーもでずプロセスにも残ってないんだけどなんで?… VistaのVisualC++の方のPCにプロジェクトファイル全部コピーしてコンパイルさせても エラーはでないでコンパイル成功するのに何も表示されない… 今までこんなこと無かったんでかなり戸惑ってます。どんな原因が考えられますか?
>>28 デバッガで動かしてみても、何も起こらないのか。
あらたなDLLヘルだな
ありがとう ブレイクポイントつけて調べた結果WNDCLASSEXのアイコンの設定がおかしかったことに気づいた
>>28 >どんな原因が考えられますか?
スタックの戻りアドレスぶち壊して、いきなり消滅するパターンに似てるな
>>28 64bit版のプログラムが32bit版Windowsで動くわけねーじゃん。
34 :
デフォルトの名無しさん :2008/01/06(日) 02:42:00
>>21 ,
>>27 ありがとうございます。が、私が作ったインストーラなんですorz
作った側の責任としてどのマシンでも動くようにしないと駄目だろう、ということで
MSのサイト見ながら四苦八苦していろいろパッキングしてみたら、動くには
動いたんですが、ファイルサイズがバカでかくなってしまい・・・しかも警告出てるし・・・
この辺の仕組みを詳しく知っておかなければ、、と痛感してたんです。
で、そもそもMFCだと動かなくて当たり前なのか?と思いまして質問に至りました。
(微妙にスレ違いになってしまってすみません)
>>26 良さげなソフトをありがとうございます!難しそう・・・!
35 :
デフォルトの名無しさん :2008/01/06(日) 02:43:49
//ウィンドウハンドルが格納された配列の中で、一番最初のWS_VISIBLEスタイルを持つハンドルを見つける // c は配列のデータ数(カウンタ) // wh[] はウィンドウハンドルが格納されている配列 for ( i = 0 ; i < c ; i++ ) { if ( IsWindowVisible( wh[ i ] ) != 0 ) { break; } } 例えばですが、この IsWindowVisiblef ( ) を実行するとメモリを消費します。 繰り返すと、少しずつですが、どんどん消費します。 他のWindows32APIでも同様にメモリ消費するものがたくさんあります。 こういったWindows32APIで消費したメモリを解放する方法はありますでしょうか? よろしくご教授お願いします。
>>34 MFCでDLLの心配するくらいならスタティックリンクしてしまったほうがいいかも
38 :
35 :2008/01/06(日) 02:55:05
言葉足らずで済みません。
メモリ消費するのはキャッシュだと思われます。
wh[ ]の内容が同一であればメモリ消費しません。
>>37 そうですか。
ありがとうございます。
どうやってメモリをどんどん消費しているってことを突き止めたのか聞きたかったんだが……まいっか
40 :
35 :2008/01/06(日) 03:02:29
>>39 ありがとうございます。
私はBorland Cを使っていまして、VC++がありませんので、ツール類を使っておりません。
ですので、
void SP(int i){//デバッグ用一時停止(キー入力により再開)
Beep(3000,500);
while(1){
if(GetAsyncKeyState(i))break;
Sleep(10);
}
}
というような関数を用意して、
処理1
SP(VK_CONTROL);
処理2
SP(VK_ESCAPE);
処理3
というブレークポイントを儲け、タスクマネージャとにらめっこしながら、どこでメモリ消費しているのか突き止めました。
>>40 タスクマネージャでメモリの消費って……
それって、本当に分かるものなのか? タスクマネージャの「メモリ使用量」ってとこ読んでるんだったら、
別に何の問題でもない可能性が高いと思うんだが……
42 :
35 :2008/01/06(日) 03:25:03
>>41 そうなのですか。
メモリ使用量が増えることは何の問題もなかったのですか。
確かにキャッシュ的なものだと思われましたので、メモリが切迫したときに自動的に解放されるかも?
という思いはしておりましたが。
自分の書いたコードにおいては、きちんとメモリ管理し、動的ヒープも確保したら確実に解放し、バッファオーバーフローなどに関しても徹底して検証しました。
ところが、動作させているうちにある処理をさせた時に少し(4KB〜12KB程度ですが)ずつ確実にメモリ消費(=メモリ使用量が増えている)していくことがわかり、その場所を突き止めました。
するとその全てがWindows32APIだったので、Windows32APIで確保したメモリを解放する術がなければ、動作させ続ければ結局のところメモリリークを起こしているのと同じことになってしまいます。
まさか、Windows32APIでそのようなことは放置されていないだろうと思い、色々調べたのですが、答えがわからず、質問させていただきました。
問題がないのなら、いらぬ心配をした私が馬鹿でした。
どうもありがとうございました。
なんとなくお年を召してそうな文章
44 :
41 :2008/01/06(日) 03:31:51
>>42 より正確に言うと、メモリ使用量が増え続けるだけでは問題とは断定できないという事。
ちなみに、
>他のWindows32APIでも同様にメモリ消費するものがたくさんあります。
と書いてあるが、当然APIによっては使い方を間違うと本当に問題となるメモリ消費を起こすものがある。
その点はMSDN読みながら注意する事だな。
逆に老成した若者のような
46 :
35 :2008/01/06(日) 03:36:44
>>43 はい。老兵です。
すみません。
>>44 はい。
わかりました。
注意したいと思います。
ありがとうございました。
ところで、SetProcessWorkingSetSizeではWindows32APIの使用するメモリエリアを限定できないのでしょうか?
甘えついでにお願いいたします。
実際、OSがリークしているケースはある。 だがそうだとしたら手のうちようがないので気にしても仕方がない。
SetProcessWorkingSetSizeで指定できるのはあくまで目安なんで厳密なコントロールはできない OS側がさせてくれない
49 :
35 :2008/01/06(日) 03:55:53
>>47 はい。
気にしないようにします。
>>48 やっぱりそうなのですね。
良くわかりました。
皆さん、本当にありがとうございました。
失礼します。
>>46 はっきりとはいえないけど、ちょっとずつ増えるってのは
やはりメモリリークだと思いますよ。
自分の経験でもタスクマネージャ見ててちびちび増えて
いくのは良く調べると何かの開放し忘れなことがほとんど。
ただタスクマネージャの数字はそれが表示されるタイミング
があてにならないので、ほんとうにちびちび増えていくこと
しか分からない。
もうちょっと自分のコード調べてみたらどうでしょうかね?
(予想では何かしらのハンドルのクローズし忘れくさいと
思いますが…)
アイコンとか読み込むたびにキャッシュされるからハンドル開放したって増えるよ
少しスレ違いですが、Windows 1.0〜3.xのSDKはもう入手できないですか?
Borland Suiteに含まれてたりしない?
リークかどうかを判断するのはソースがないと判断できないけど、 「ソースは徹底して検証した。原因がAPIっぽい? 」 ってのなら、リークは無いと判断していいと思うんだ ちなみにタスクマネージャで言うところのメモリ使用量を減らしたいということであれば、 SetProcessWorkingSetSize に -1 -1 を渡せば一時的にスリムアップできる 意味の無いことだけど
プログラム起因のリークはツールで検出するだろうしなあ
リークの疑惑のあるAPIを繰り返し呼び出して、本当に際限なく何百メガもメモリの使用量が増えるんであれば原因を調査すれば良いんじゃないか。 そうでなく、数Mぐらいで頭打ちになるなら、そういうもんだということじゃないか。
リーク疑惑のあるAPIがHeapAllocとかだったらウケる。
昔 CreateWindow() が 4byte リークするって時期があったな。 とっくに直ってるだろうけど。
ごめん、まだ直してなかったわ
おいらも、タスクマネージャ見て、「あれ、どっかリークしてる?」とか思ったこともあったけど、
PlatformSDK付属のvadumpとかで調べてみると、単にAPI呼び出しでDLLのコードが
メモリに載ったとかの、くだらねー原因だったことがあるな。
そいえばnyaruruセンセもワーキングセットについて色々書いてるネ
http://d.hatena.ne.jp/NyaRuRu/20051022
>>46 You should better use Performance meter.
>>35 メモリだけじゃなくてタスクマネージャで
ハンドルリーク起こしてないかみてみれば?
俺はリークチェックの時ハンドルの数が増え続けてないか
必ず見るようにしてるが。
タスクマネージャは「メモリ使用量」と「仮想メモリ サイズ」の項目も重要
CreateProcessで起動した子プロセスと、呼び出しもとの親プロセスの 関係を切れないでしょうか? プロセスエクスプローラなどで見てもツリー状にならないようにしたいんです。 何か良い方法あればお願いします。
Windowsで親・子プロセスとの関係で何ができるか、って あんまし何にも出来ないんだけどね。 どーしても気になるなら、ダブルフォークみたいな仕組みを考えてあげれば。 孫を生む子供をたてて、子供はすぐに殺してしまう。cmd.exe辺りを仲介にするのが 楽だろうけどね。
67 :
65 :2008/01/07(月) 08:43:14
>>66 >ダブルフォーク
ありがとうございます。
基本的にAPIで親子関係のツリーをどうこうは出来ないんですね。
Vistaだと、管理者昇格プロセスからプロセス起動すると自動的に管理者権限にならない? そのへんは気をつけたいところかもしれない
69 :
デフォルトの名無しさん :2008/01/07(月) 20:20:42
ダイアログに貼付けたタブコントロールにダイアログを貼付けたいのですが、 出来ますかね?
タブコントロールの中にダイアログがある図を想像した
文字を表示するとき下の色と文字色が近くて見えにくいことがあります。 下の色の逆を文字色にするなどしたいのですがそのような関数はあるのでしょうか?
ある
>>73 逆の色っていうのはどういう色を言う?赤の反対は青?白?
補色じゃないかな?水色だね?XORでいいよ
RGB(128,128,128)の色で困りそうだな
2回掛けると元に戻るという条件の場合変化がない色が必ず存在するということが 数学的に証明されていたような
あれ?たとえば色空間を2bitとして、0,1,2,3を逆転して、3,2,1,0とすれば、 変化がない色は存在しないよな。似てる色ではあるけど。 まあ、下にマット敷くとか、文字を縁取るとかも対策ではあるな
>>74 教えてもらえませんか?
逆の色というのは
>>76 さんので合ってると思います。
赤の反対は緑だったはずです。
>>81 赤の反対はシアンだぜ。緑の反対はマゼンタだぜ。
補色ってRGBの各要素が8bitなら255から引けば出せるんじゃないの?
そりゃバックグラウンドが白固定ならな
(128,128,128)(127,127,127)を肉眼で区別出来るひとがいたら紙
バックグラウンドは関係ないよ
下の色と演算するんだろうが、元の話は で、下が255なら引き算でもXORと同じ結果になるだけだ
+64&255
APIにするまでもない処理だな
ペンにXORを指定すればすむんだな。
つまんないから次
ありがとうございました。
CEでシャットダウン・サスペンド遷移を検知する方法ってありますか?
色相環とか補色とか、なつかしいな。 逆の色とかイミフww
っ 反対色
色相は輝度には言及されていないし 単に各色255から引けば良いっていうもんでもない
99 :
デフォルトの名無しさん :2008/01/08(火) 07:57:05
明けましておめでとうございます。 年が明けて来てみれば、いつの間にか新スレ61番になってますね。 挨拶はさておき、久々に質問させていただきます。 ウィンドウのクライアント領域を、四つの等しい大きさの子ウィンドウでそれぞれ描画を担当させます。 ウィンドウに終始有効なDCを保持させたい場合、ウィンドウクラスの登録時にCS_OWNDCをスタイルに設定すれば、 例えばWM_CREATEでhdcを取得しておくと、その後の他のメッセージ処理で、毎回取得する必要はないと思います。 同じ性質の子ウィンドウを複数作る場合は、基本的にクラスの登録は一度だけで、その同じスタイルを元に CreateWindowを複数回呼び出して、子ウィンドウのクローンを作っていく、という手順になると思うのですが、 子ウィンドウクラス登録時にCS_OWNDCを指定しても、これでは各子ウィンドウに独自のDCを割り当てることはできないんじゃないかと・・ 子ウィンドウ・クラスの登録に wndclass.style = CS_OWNDC; として、 CreateWindow(---)を複数回呼び出し、 ウィンドウ・プロシージャのWM_CREATEで hdc_own = GetDC(hwnd); とした場合、どうなるんでしょう? 描画はOpenGLを使って、3Dオブジェクトをバラバラに動かすというものです。
API関数を見ていると、構造体を引数として渡す時、 引数を変更する関数でなくても構造体のポインタを渡していることが多いみたいですが、 これは構造体を丸々渡すよりポインタを渡して関数内で必要な情報だけ引っ張り出した方が 処理が早かったりメモリを食わなかったりするから、って理由でいいんでしょうか?
まぁそんなとこ。 構造体の大きさがバージョンによって変わる可能性がある、という理由もあるかも。
構造体って配列とか文字列みたいにそのものが渡せないからポインタで渡すしかないんじゃないのか。
>>103 そんな事はない。そのものを渡す事は出来る。
struct asdf{
int x, y, z;
};
asdf function(){
asdf a;
a.x = 0;
a.y = 1;
a.z = 2;
return asdf;
}
何冊か本を読んでいたところ、ウィンドウプロシージャのswitch文でメッセージごとに分岐した後、 最後break;で抜けている本とreturn 0;を返している本がありました。 前者はどのメッセージもデフォルトウィンドウプロシージャに送られ、 後者は自分で処理した奴は送られない、という違いはわかるのですが、 一般的にはどちらのやり方が多いのでしょうか。
breakのさきにreturn 0があるだろ
>>106 答えになってないけど
メッセージクラッカを使った方が後々困らない気がします
>>106 前者もswitchのdefaultでDefWindowProcを呼んでいるので、他のcaseでbreakしても、
そこからDefWindowProcが呼ばれることは結局ないというオチだと思う。
俺としては各case毎にreturnを置くほうを勧める。
いつも0を返すとは限らず、何か他の値を返すこともあるので、
ほかがbreakで、そこだけreturnでは見た目が揃わないため。
>>106 自分で処理した後デフォルトプロシージャにも処理させるかどうかはケースバイケース。
どっちが一般的とかは無い。
APIの前に言語仕様を勉強しろ
>>106 基本的に処理したメッセージでもbreakしてDefWindowProcしておいた方が
WM_CONTEXTMENUなんかで余計なバグを生み出しにくい
つーかこれ、フリーソフトや市販ソフトでもバグってる物を見かけるから困る
Windows2000のregedit.exeとか
使えねぇよw
宣伝乙^^
>for VB Programmer くせー!
それを入れるなら併せてpinvoke.netも入れるべき。 ただ、俺は要らないと思うけどな。 せいぜい、それぞれVBとか.NET、C#のスレにでも置いておけばいいのでは、というくらい。
むしろこのスレ的には猫をはずせよ! みたいな声があってもいい
どうみても ピンぼけ.netにしか略
指定のソフトだけの音を拾って出力したいんだけど、どんな風にプログラム書けばいい? おおまかな流れだけでいいんで教えてください
>>121 確かこの話題で前スレか前々スレが荒れたよなw
>>121 まず録音をする方法をググるんだ。
その上で、プログラムを書くか決めろ。
最初にWindowsのAPIができたころは構造体渡しは無理だったよ
マイク出力にラジカセを繋ぐ ↓ 録音ボタンを押す ↓ 「おかあちゃんちょっと黙っててーな、声が入ってもうたやん」と言う。
あるあ......ある?
d とりあえず結構面倒なんだなw ちょっとネットの海をさまよってくる
DirectSoundとwaveOut系APIをフックする、というあたりでなかったっけ。
それなら余裕だな
>>125 ネットにつないだまま動画とってて、メッセの音が入ったことある
しかしマイク出力というのが謎であることに書いた本人が今気づいた。
132 :
デフォルトの名無しさん :2008/01/09(水) 15:00:34
SHFileOperation について教えてください。 これの .pFrom 引数に設定するものとして、ファイルもフォルダもOKとなっていましたが 仮に同名のものでファイルとフォルダの両方があった場合、そのどちらを使って操作して くれるかは決まっているでしょうか、その場合はファイルの方でしょうか、フォルダ側の方 でしょうか?よろしくお願いします。
有り得ない
134 :
132 :2008/01/09(水) 15:05:44
>>132 追記
FOF_FILESONLY を指定してファイルだけにすると、フォルダ名として存在するものが
あった場合でもそれは含まずに行う、ということなのでしょうか?
その場合は、逆に、ファイルは含まずにフォルダだけを操作したい場合はどのように
指定できるでしょう?すみませんがご指導をお願いします。
135 :
132 :2008/01/09(水) 15:07:36
>>133 ファイルもフォルダもどちらも操作してくれるということはないということでしょうか?
試せば分かる。設問自体が無意味な事に。
何冊か本を読んだところ画像処理はBMPの事しか書かれてなかったのですが、 jpgやgifを処理するのは圧縮の関係とかですごい上級者向けのことだったりするんでしょうか?
ぐぐればすぐに見つかると思うが 圧縮ファイル形式は離散コサイン変換のような数学の知識が必要 簡単ではない しかも一口にjpegといってもいくつかあるので すべてに対応するのは現実的に難しい
139 :
132 :2008/01/09(水) 15:34:18
>>136 やってみました、わかりました!
ファイルとフォルダと別のものであっても同名とすることはできない
ようになっているのですね、ファイルシステムが。
助かりました、ありがとうございました!!
上級者向けではないが初心者向けではないな どうせライブラリか何かでBMPに変換しないと画像処理なんてできん
なんでスレ違いなのに明後日の方向のレスをつけるのだろう……
142 :
140 :2008/01/09(水) 15:46:35
明後日の方向ではないと思うんだが
世の中にはBI_PNGなんてのを入れたDIBファイルなんてのがあってな・・・ APIはあれを読めるんだろうか?
Vistaのアイコンファイル形式ではPNGデータが入れられるようになったが、 あれはパックDIB(ヘッダ+生ビット列)の代わりにPNGデータが入ってるだけなんで BI_PNGとはちと違うな。
>>143 APIは対応してるけどメモリDCに送ってもGDI_ERRORになるらしい
プリンタとか用だってさ
音量調節が出来ない音を出すアプリケーションの音量をいじりたいんですが 何か良い知恵無いですか? WINMMを使ってる事までは分かったんですが そっから先が、いくら調べても、全体の音量を変えるものばかりで 特定のアプリが発してる音量をコントロールする手段なんてのが無いんですが。 WINMMを乗っ取るとか、仮想サウンドデバイスを作って、とか 技術が無いのに実現が難しい事ばっかり思いつきます。 もっとこう簡単にいかないですかね?
Vistaならプロセスごとに、ユーザがいじれるが。 あれプログラマからもいじれるようになっているんだろうか。
>>147 ありがとうございます。
が、これは全体の音量を変化させるものみたいっす。
特定のアプリの音量だけを変化させたいんですよ。
>>148 そう、正にそれです。
Vistaでいじれるかどうか分かりませんが
同じ事をXPで実現出来ないかなぁと。
対象のアプリが使用しているハンドルを捕まえて
そのハンドルに対して別アプリから音量を下げるメッセージ投げたら反応しますかね?
ハンドルの捕まえ方なんて知りませんけど...orz
OSをVistaに変える。以上。
>>149 Vista以外では、まっとうな方法では不可能だと思われ。
何らかの方法でPCMデータを横取りして、計算して全サンプルの音量を変
えるしかない。
>>150 まぁ一番簡単なのはそれですよね。
>>151 PCMデータ横取りですか…
ラッパーを作れって事ですか。
難しそうですね。
とりあえず、真っ当な手段では無理っぽいって事ですね。
ありがとうございました。
DirectSound使ってるアプリケーションならできんでもないが、 waveOutに直流ししてるのは無理だな
なんで?
まずANSIでやると、日本語関係の値について、長さの不足がぞろぞろ出てくる。 UNICODE版では出てこないから、値についてはANSI版がおかしいのは自明。 けど、UNICODE版でも、キー長さはいくつか不可解なキーは残るナー。
パスは?
自分のPC(WinXP SP2)だと、ANSI/Unicode共に普通にO.K.になるぞ。 Usersグループだからか?
REG_SZ型以外のものもTCHARの数で数えたらおかしくなるに決まってるだろ
>158 ALL_ACCESSでHKLMを見ようとしてるうえ、オープン時のエラーは黙殺だから。、 ほとんどレジストリを開いてないはず。
一部のシェアウェアなんかが文字列の途中に\0を含むようなキーを わざと登録して不正使用対策してるそうだが
質問です あるウィンドウの子ウィンドウを別のスレッドで作成しようと思っているのですが、 そもそも、こういう使い方ってWindows的に許されてる使い方なんでしょうかね? 実際に試してみると出来ることはできるのだけれど、 どうも怪しすぎる使い方な気がしてならないのですが…
やめとけ。
>>162 できるけど、いろいろ面倒だからやめたほうがいい。
>>163 多分やめることになりそうです。
大変そうなんで…
>>164 面倒な点ってどんなことですかね?
俺が普段と違うなと思ったのが
子ウィンドウのメッセージループを回す時に
親ウィンドウのメッセージループが回ってないと止まる
ってことくらいですかね…
(メッセージの取得かディスパッチのどちらで時間食ってるかは調べてませんでしたが)
他にもまだ色々ありそうですが…
メッセージが微妙に届かなかったりするw
たしかに名前の長さに0が返ってくるのは異常だな。
いろいろ変えながら試してみたけどうまくいかんなぁ。
なんじゃこりゃ?
>>158 KEY_ALL_ACCESS を KEY_READ に置換して試してみ。
デュアルコアCPUのPCでどんだけ重い処理させてもCPU使用率50%ぐらいまでしか いかないんだけど、マルチスレッドで書いたら100%ぐらいまでCPU使ってくれる?
うん
ありがとう。今から書き直してみる
横からすまんがコア0とコア1が50%ずつ使われるのはなんでなんだろう。
一つのスレッドを二つのCPUで取り合いをするから
175 :
デフォルトの名無しさん :2008/01/10(木) 11:53:47
拡張子から関連づけられたexe名を知るにはどうしたらいいでしょう?
レジストリを見る
178 :
デフォルトの名無しさん :2008/01/10(木) 14:29:33
C#スレから誘導受けてこちらに来ました、よろしくお願いします!! レジストり内の 「拡張子」 の項目に Shellnewで新規作成できるファイルを追加しよう と思うのですが、テンプレートファイルを複数用意しておいて、それらすべてを一つの拡張子 に割り付けて複数のファイルから選択できるようにしたいと思ったのですが、これは可能でしょうか? 何卒よろしくお願いします。
ShellNewキーにCommand値を書くといいかもしんない
180 :
デフォルトの名無しさん :2008/01/10(木) 15:42:25
>>179 ShellNewキー Command値 でググってみたのですが、どうすればよいか
わかりません。ヒントがありましたら教えてください。
ShellNew CommandでぐぐってみたらShellNew内のエントリの解説に Command = 新規作成時にウィザードを使いたい場合など、実行するファイル名を指定します。 と書いてあった。 つまり、テンプレートファイルを選択させるウィザード風のexeを作成しておいて Commandにそのexeファイル名を指定するってことじゃないか?
>>155 ソースコード的におかしなところは見つからないね。
API のバグじゃないかな。
列挙が目的なら RegQueryInfoKey の返却値にたよらず最低でもある程度のバッファを確保するようにすればいいと思う。
maxlen_of_valuename = max(255, maxlen_of_valuename);
maxlen_of_subkeyname = max(255, maxlen_of_subkeyname);
のようにすれば 9x についてはほぼ安全。
NTも滅多なことにはならないはず。
>>174 キャッシュを無駄にしちゃうから、できれば同じぷろせっさにスレッドを割り当てて欲しいものだ。
NT4は片方のプロセッサが100%になったおぼえがある。NT4で同じプロセッサに割り当てられるように変更されたはずだったけど、いつから戻ったんだろう?発熱対策か?
184 :
デフォルトの名無しさん :2008/01/10(木) 18:54:04
>>181 なるほど!!プログラムを使って別途表示するということですね、わかりました。
そのような感じで検討します!!ありがとうございました!!
質問 ディレクトリエントリを再構成(ソート)するようなAPIない? やっぱりクラスタ単位で読み込んで自分でしないと駄目?
>>173 はHTみたいな論理プロセッサ環境だからだよ
純粋に2ソケットなら100%100%になる。
coreduoも50%50%だったかな?
>>186 |
|
|
|
/V\ ,J
/◎;;;,;,,,,ヽ
_ ム::::(;;゚Д゚)::| ジー
ヽツ.(ノ::::::::::.:::::.:..|)
ヾソ:::::::::::::::::.:ノ
` ー U'"U'
あれw まちがってたかww すまんね
>>183 SetThreadAffinityMask
190 :
185 :2008/01/10(木) 21:46:33
うええー 汚いVFATだなあ これ読むの???
ワロタ
>>185 あるディレクトリのエントリを任意の順に並び変える方法として、
一旦、同ドライブの別のフォルダにファイルを移動して、
そこから並べたい順にファイルを戻していくという手は使えない?
エントリがファイル名順に格納されるNTFSなんかでは使えないけど。
ファイルサイズがあらかじめ想定できる状況じゃないと現実的じゃない気がする
ああ、同ドライブって同じボリュームの意味ね
>>191-197 情報ありがとう
とりあえずMoveFileでやってみる
移動すればエントリが書き換わる事に気付かない俺って('A`)
>>185 UMSSortっていうエントリをソートするソフトがある。
フォルダ作ってその中にファイルをすべて移動、ソートしたい順に書き戻してる。
200 :
デフォルトの名無しさん :2008/01/11(金) 09:05:32
初心者ですが質問です。 マウスの少し上にウィンドウを表示して GetCursorPosでマウスの座標を取得しながら MoveWindowでマウスの動きに合わせてウィンドウを移動させています。 ですが、実行してグリグリ動かしていると、 しばらくしたらウィンドウが動かなくなってしまいます。 これはなぜなんでしょうか?よろしくお願いします。 ちなみにVisualStudioでデバッグ開始して実行したら何も起きないんですが exeファイルから実行するとこのエラーがでます。
そういう場合は大抵初期化漏れだと俺は信じてる
202 :
200 :2008/01/11(金) 09:37:01
>>201 初期化漏れっていうのは調べてみたんですが
変数を初期化してないものがあるってことでいいんでしょうか?
でもやっている処理としたらこのぐらいしかないんですけど・・・
↓↓
switch (msg) {
case WM_PAINT:
POINT po;
while(1){
GetCursorPos(&po);
MoveWindow( hwnd , po.x-250 , po.y-150 , 300 , 300 , TRUE );
}
return 0;
}
203 :
200 :2008/01/11(金) 09:40:56
間違えました。正しくはこうしてます。 POINT po; switch (msg) { case WM_PAINT: while(1){ GetCursorPos(&po); MoveWindow( hwnd , po.x-250 , po.y-150 , 300 , 300 , TRUE ); } return 0; }
その処理をWM_PAINTでやる理由は? WM_PAINTからいつまでたっても戻らないから、システムが応答無しと判断して おかしなことになってるんじゃね?
>>203 すごい恐ろしいことやってるなw
突っ込みどころが多すぎるが、とりあえず
WM_PAINT で描画以外をやるな。
WM_PAINT でDefWindowProc呼ばないなら BeginPaint EndPaintは必須。
この辺から。
____ / \ / _ノ ヽ、_ \ / o゚⌒ ⌒゚o \ 今日もまた、WM_PAINTで | (__人__) | ウィンドウ移動する \ ` ⌒´ / 仕事が始まるお…
209 :
200 :2008/01/11(金) 12:27:24
回答ありがとうございます。 基礎から出直してきます…
SetWindowsHookExでmouse messageをフックしてみたら?
211 :
デフォルトの名無しさん :2008/01/11(金) 16:09:31
非クライアント領域でのマウスの移動を検出するにはどうしたらいいんでしょうか? WM_NCMOUSEMOVEがそうだと思うんですが WM_MOUSEMOVEと同じようにしか働かないんですが・・・
同じならいいじゃん。 どうしたいのか、現状どうなって困ってるかを書いたらいいと思うよ
クライアント領域の外でマウスが動いたときにいろいろ処理をしたいんですが WM_MOUSEMOVEとかWM_NCMOUSEMOVEだと、 クライアント領域の中をマウスが移動したときにしか反応してくれないんで どうしたらいいのかな〜と。
マウスをキャプチャーしてやる。 具体的にはSetCaptureとReleaseCapture WM_NCMOUSEMOVEは「ウィンドウの非クライアント領域」でマウスが動いた時に来るメッセージ。 タイトルバーの上とかスクロールバーの上とか。
>>214 WM_NCMOUSEMOVEはやっぱだめなんですね〜。
キャプチャーですか。
やってみます。ありがとうございます。
>>215 NC領域というのがいったいどこなのか調べてみ。
217 :
183 :2008/01/11(金) 18:49:48
>>186 なるほど、言われてみればその通りな気がする。今使ってるのはHTとduoだから。
quadを買ったので、4コア25%になるのか、2コアが50%に分散させるのか確認が楽しみ。
んなアホな。Core2duoは、ちゃんと100%と0%になるぞ。1スレッドしか動かしていない状況なら。
スレッドの使い方にもよるしね。 連休中、いろんなパターンで検証してみようかなあ せっかく4コアなのに動画エンコ以外は全部100%にならんしなー
>>219 ビジーループの関数を、4スレッド走らせるだけで実現できるぞ。
すみません ふらっとC#スレから誘導されてきました お聞きしたいのですが ブラウザ(IE)上に表示されたテキストボックスからテキスト取得ってできるんですかね? サイトはJAVAアプレットで書かれているものです 参考サイト、ググるキーワードなどあればご教示下さい 宜しくお願いします
IEのブラウザ画面に出るコントロールは、ウィンドウを持っていなくて自前描画だった希ガス
パスワード横取りはやめましょう
224 :
デフォルトの名無しさん :2008/01/11(金) 20:56:51
>>221 HTML中だったらDOMを辿っていく方法が使えるけど、
アプレット内のテキストはわからない。
>>207 ワロス
DefWindowProcのことかと思ったら少し上のコードのことかw
>>220 1スレッドで複数のコアにまたがるようなのは?
Windowsのタスクバーとかサイドバーみたいに画面の端を占有して 他のウィンドウと重ならないようにしたいんですが、 どうやるんでしょうか?
AppBarでぐぐるといいかも
233 :
231 :2008/01/12(土) 00:35:57
>>232 見つかりました。ありがとうございます。
234 :
178 :2008/01/12(土) 02:19:27
レジストリの ShellNew の件でもう一度お尋ねしますがよろしくお願いします。 レジストリエディタで、 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\ShellNew の中の項目が、Explorerで右クリック時の「新規作成」で表示される各項目として 並んでいるものでしたが、 これの各「データ」に対応する実際のソフトウエアを探す場合、 たとえば、Excel2003 の場合ですと、 HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Excell という場所を見つけて見てみると、そこにあるデータが該当することがわかりました。 たとえばこのような一致するデータを探して行って、どこかにあるExcelの拡張子が .xls であることを突き止めてから、それをHKEY_CLASSES_ROOTからさが仕出して、 というように見つけていくのでしょうか? その場合、具体的にどのように追跡してそこまで到達することができるか教えて いただけないでしょうか?
逆っしょ HKEY_CLASSES_ROOT HKEY_CURRENT_USER\Software\Classes から探すンしょ
236 :
178 :2008/01/12(土) 02:49:56
>>235 さっそくどうもです。
調べてみましたところ、Explorerで右クリック時の「新規作成」で表示される各項目
として並んでいるものが、レジストリエディタでは
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\ShellNew
の中の項目に対応しているのでした。
そこで、実際にこの新規作成と同じことをする場合には、やはりこの場所を先に
見てそのリストをつくり、そこからなんらかのルートで対応する拡張子を捜し、
それを
HKEY_CLASSES_ROOT
から探してやって、そこで見つけたShellNewでテンプレートファイルを持ってくる
ということかと思われました。
とすると、この流れの中の、「ソフトウエアの使っている拡張子を知る」ということ
ができなければならないかと思いました。
ではまた明日にでも教えてください。何卒よろしくお願いします!!
>>236 その 〜\Discardable\PostSetup\ShellNew キーは、削除しても正常に動くっぽいよ。
つまり、新規作成リストを作るのにそのキーは見てないってことだ。
HKEY_CLASSES_ROOT の拡張子キー全部から ShellNew をリストアップしてるんじゃない?
>>230 「1スレッドで複数のコアにまたがるようなの」を定義してください。
普通は、二つのコアに跨る為には2スレッド必要ですから。
# 勿論、その2スレッドが両方ともユーザアプリのスレッドとは限らないわけだが。
ファイバーって何でしょうか?プラットホームSDKは3個ほどのAPIの説明だけでよくわかりません。 それを読んだ限りだと、プログラムカウンタとスタックを保存して切り替えたりするぐらいの機能にしか感じられないんのですが、合ってるでしょうか。 ファイバーの再開が別のスレッドだとまずいですよね?
242 :
178 :2008/01/12(土) 10:53:16
>>237 うわー、夜中なのに考えてくださってすみませんでした、ありがとうございます!
>HKEY_CLASSES_ROOT の拡張子キー全部からShellNewをリストアップしてるんじゃない?
あーそうだったんですか、ということはExplorerの右クリックのコンテキストメニュー
が出る直前であのたくさんの拡張子キーを全部見てまとめているということなのでしょうか!
びっくりです、それとあと一つですが、あの拡張子キーには、たとえば、Excelの場合などでは
.xls のほかに .xlt とかもあり、それにも ShellNew があったりしてました。
そういうのは新規作成メニューに出てきていなかったのでなんらかのリストがどこかに
あるのではとも思ったのでした。
もしかしてレジストリのどこかに他にまだそのリストが存在しているのでしょうか・・・?
>>230 スレッド操作意識しないで全コア使い切りたいならOpenMPでいいんじゃないの?
>>211 マウスがどうの言わなくてもお前のやりたことは
SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, MAKELONG(xPos, yPos));
でできると思うぞ。xPos, yPos は 0 でも良い。
FlsAllocって一応2003カーネルのXP x64で使えるんだろうか まあx86のXP SP3でサポートされない限りしばらくは使う気が起きないが
>>248 仮にそういう想定だとしても的外れだと思う
>>238 タスクスイッチが頻繁に起きるようにすればいいんだよ
>>249 動作としては同じになるからこういうやり方もある、とは言えるかもね
本人
254 :
178 :2008/01/12(土) 15:02:00
>>237 わかりました!!
#
>>236 # 「ソフトウエアの使っている拡張子を知る」ということ
これは、なんとそのDiscardable\PostSetup\ShellNewの各データ
の中に隠れているでした。。。いまやっとわかりました!!
どうもでした!!!
Discardableを翻訳して見ろよ
>>252 やってみたのかよ
やってないのばればれ
>>256 ならねーよ
お前こそやってないのばればれ
俺も今まで一度もヤッたことありません。
俺も殺ったことありません。
261 :
245 :2008/01/12(土) 22:01:09
なんかちょっと荒れ気味だな。まぁ、これでこそWin32API質問箱って感じか。
>>200 って
>>203 だろ?
マウスの位置とってそこにウィンドウ移動したいだけなら
>>245 で良い訳だが。
まさか何かの拍子にマウス位置にウィンドウがジャンプする機能を作りたい訳じゃあるまい。
議場から抜け出したO沢が262ゲット
Googleツールバーの単語翻訳みたいなマウスカーソルに追従するやつじゃないの?
>>203 のwhile(1)の中身をWM_TIMERにでも書いて適当な間隔でSetTimerすればいいだけと思うが
クライアント領域をドラッグしてウィンドウを移動させたいのなら
>>245 だな
ビットマップとDIBについて質問です。 現状のプログラムは、24bitのビットマップのデータ(ビットマップヘッダ無し)を受け取り、CreateDIBSectionで同じ大きさのDIBを作りデータをコピーし、文字を書き込んで、 最後に変更したデータを元のデータへ戻すという処理をしています。 この方法ではビットマップデータとDIBとのコピーが2回発生するのでメモリコピーに多くの時間がかかっています。 それでもう少し効率的にやりたいのですが、ビットマップ情報のヘッダがない24bitのビットマップのデータへ文字を直接書き込むことはできるのでしょうか? またはビットマップのデータからコピー無しでDIBを作るとかできますか? どうか教えてください。
>>264 ビットマップからDIBは作れるが。
DIBSectionは無理っぽいな。
そもそもDIBでないなら選択されてるデバイスコンテキストのフォーマットに勝手に合わせられてる筈
>>264 DIBの受け渡しをメモリマップトファイルで行うようにして
CreateDIBSectionの第5引数にメモリマップトファイルのハンドルを渡せば
直接更新できる
>>264 DIBに文字だけ書いて、自分で元のビットマップと合成したら?
>>264 で思い出したんだけど、指定したDCに対するTextOutとかLineToとかGDI+の描画とか、どうやってるのか気になる。
さすがにSetPixelでポチポチ描いてるとは思わないし。そもそもSetPixelすらどういう処理をしているのか…
CreateDIBSectionで作ったものなら、ビットマップへのポインタがあるので、それで書き換えとかできるんだけど
>>269 デバイスドライバはDDBに直接アクセスできる
GPUに処理させるためのDDBだったもんな。 Vistaからは、GDIはすべてソフトウェア処理になったけどね。
272 :
264 :2008/01/13(日) 09:41:16
>>265-271 ビットマップに文字を直接書き込むことは無理で、
メモリマップトファイルを使う、または文字だけDIBに書いて自分で合成する、ということですかね。
かなり参考になりました。ありがとうございました。
>>272 絵を表示したウインドウに文字を書いている例が、猫の始めの方にあった。
表示内容を DIB として保存すればいいんじゃね。
一つ疑問なのだが、メモリコピーってそんなに時間かかるか? なんだったら、更新範囲だけ転送するという方法もあるし。
本当は他の部分でトチっていて時間かかってるんだろ
>>274 最近でこそ普及帯のPCでも1000MB/sくらい。
ちょっと古いと100MB/s出ないくらい。
そんなPCでVGA画像を60FPSコピーしようとすると、26.4MB/S必要になる。
さすがにメモリコピーだけでCPU時間を26%消費するのは痛い。
PropertySheet()で作成したダイアログの、 特定のタブを無効化するにはどうすればいいのでしょうか?
>>276 GDIでfpsがどうとかって
頭悪すぎだろ
>>278 GDIじゃなくてmemcpyね。純粋にHWの性能の問題。
DirectXだってmemcpyより速いなんてありえないっしょ。
VGAのコピーってDMAじゃないの?
100MB/sの帯域を26%消費するとCPU時間も26%消費することになるの?
>>281 やってみればわかる。
while(1){
Sleep(1);
memcpy(buffer0,buffer1,1024*1024*32);
}
>>282 ばーか
そもそもがmemcpyの実装にも依るだろうが
せめてMMXかSSEでも使って実験しろよ
無知って怖いね
100MB/sはSDRAMレベルだけどね。
懐かしのCoreTest/99だと、K6-2(100x4.5)のmoveで100MB/s、
Celeron300A OC(100x4.5)だと190MB/sとなっている。
DDR以降で同程度の負荷を想定するのは流石に無茶な感じになってしまうな。
>>264 の件だと、そもそも入出力部分のネックが一番大きい予感。
ファイル対象だとすると、DiskI/Oに一番時間食われてるとかありがち。
>>285 MMXやSSE使ってもCPU時間消費して転送するんじゃないのかね
CPU時間消費せずに転送できる方法があるなら教えてほしい
明示的に転送するならCPU時間消費しないわけ無いだろ
>>290 お前の頭の悪さはよく分かったからもう来なくていいよ
VC8以降のmemcpyって確かSSE2命令使っているんだよな
295 :
デフォルトの名無しさん :2008/01/14(月) 14:55:11
コールバック関数にユーザーデータとしてポインタを(DWORD)で キャストして渡してるケースが良くあるんだけど、64bit(Win64API?) への移植時にはどうなるのかな? WindowsではDWORDは32bitのままだよね。コールバックの ユーザーデータ受ける部分のプロトタイプが変わってるのかしら?
DWORD_PTR
つまり古いソースは書き直しが要るってことか
スレッドのコールバック関数はDWORDのままじゃなかった?
>>298 CreateThreadのあれは、引数void*だぞ。
300 :
デフォルトの名無しさん :2008/01/14(月) 19:58:47
返値の事だろバカ
DefWindowProc(NULL, 0, 0, 0L); を呼ぶとどうなるですか?
MessageBoxを呼び出すとデスクトップの真ん中に出ます。 アプリのウインドウの真ん中付近に出したいのですが、 どうしたらいいでしょうか? 最初のパラメータのウインドウハンドルにアプリ本体の メインウインドウを渡しても、デスクトップの真ん中に出て しまいます。
フックする
305 :
302 :2008/01/14(月) 22:31:06
フックしてWM_INITDIALOGを捉まえ、挙動を調べてみました。 ・確かに親ウインドウはアプリのメインウインドウになっている。 ・SetWindowPosで移動させるとデスクトップの座標を基準にして動く。 MSDNには「子ウインドウの座標は親のウインドウのクライアント 座標の相対値」と説明にありますが、MessageBoxのウインドウは 少なくとも件のアプリでは、親があってもデスクトップの座標を基準 に動いてしまうようです。 親の座標から位置を計算することは可能ですが、ちょっと腑に 落ちませんでした。何か原因があるのか…?
>>305 ヒント: 親とオーナーはフォーカスとアクティブとフォアグランドぐらい違う
ダイアログみたいに親をアクティブにできない子ウィンドウを作りたいんだけどどうすればいい? ウィンドウスタイルいろいろ試したけど駄目だった。
>>308 EnableWindow 使ってみたら?
>>310 親ウィンドウを無効にしたら子ウィンドウも操作できなくなる。
所有されているウィンドウには影響しないが。
>>311 そうなんだ。MessageBox() とかどういう仕組みなん?
313 :
302 :2008/01/14(月) 23:41:18
MessageBoxの最初のパラメータは親じゃなくてオーナーを指定するんですね。 ただ、フックした中でGetParent(ダイアログボックスのHWND)ってやると アプリのメインウインドウを取って来れるんですよ。 それならダイアログボックスのHWNDに対する位置操作はアプリの メインウインドウ相対になるんじゃないかと思うんですが。
315 :
302 :2008/01/14(月) 23:57:50
>>314 がーん。
よくよく考えるとメッセージボックスはアプリの子ウインドウじゃなくて
被所有ウインドウですね。
MFCみたいにアプリの真ん中に出したり、メインウインドをクリックしたら
チーンとか注意音を鳴らしたいんですが、簡単じゃなさそうですね。
>>312 親とオーナー(所有者)は違うと何度言ったらわかる?
>>316 違うのはもう良いから、どう違うのかとか、EnableWindow() では何故だめなのか教えてください。
>>318 なんだ、ただの蛇足じゃねーかよ、あんたのレス。
煽りたかっただけかい。
ここまでテンプレ
あんたもういいよ^^;
で、MessageBox()はどうしてるかわかったの
ここまでおれの自作自演
325 :
デフォルトの名無しさん :2008/01/15(火) 01:40:42
>>323 MessageBox()の逆汗でもしてろよ低脳
MessageBoxは引数hwndのウィンドウをオーナーにして、 かつEnableWindowで無効にしている。 メッセージボックスはhwndの子ではないので、 hwndを無効にしてもメッセージボックスは無効にならない。
CBTフックを使った例をよく見るな
メッセージボックスとかモーダルダイアログは自分でメッセージループを持っている。
>>315 WH_CBT を使えばできるよ。
俺は WH_CALLWNDPROCRET で実装しているけど。
330 :
デフォルトの名無しさん :2008/01/15(火) 10:10:40
>>328 モードレスダイアログボックスの場合は、メッセージループでIsDialogMessageで分別しなきゃいけないんだっけ?
検索や置換ダイアログなんかはコレだよね。
現在、 HDD1: Linux HDD2: Windows となっており、Linux上からWindowsのファイルシステムがマウントできます。 これを逆にWindows側からLinuxのファイルシステムをマウントするものを作りたいのですが、 HDD1のデータはWindowsからどうすれば読み出せますか?(データの解析は自前でやるのでとりあえず生バイト列が読めればよいです。) 管理ツールの「コンピューターの管理」からは一台目のHDDのパーティションが見えるので、 何かそういうAPIが用意されていると思うのですが、見つかりません・・・
バイト列が読めればいいならCreateFileに"\\.\ドライブレター:"を渡せばいい
じゃあ↓ "\\.\PHYSICALDRIVE序数" 序数は最初のドライブが0、次が1
>>334 即レスありがとうございます。CreateFileでできたんですね。
CreateFileはオープンするものなら何でもありだなw
とあるソースコードに // this resolves ATL window thunking problem when Microsoft Layer for Unicode (MSLU) is used ::DefWindowProc(NULL, 0, 0, 0L); と書いてあるのですが。コメントにしても動きます。何の役目をしているのでしょうか?
>>337 It resolves ATL window thunking problem when Microsoft Layer for Unicode (MSLU) is used.
::DefWindowProc(NULL, 0, 0, 0L);とUnicodeに何の関係があるのかなと思うわけで。
たぶん、うに牛のウィンドウプロシージャの位置をあれなんだと思う。
win95で動かしてみれば?
342 :
302 :2008/01/15(火) 13:25:28
>>329 ダイアログの位置をメインアプリの中央にするのは、コールバック内で
オーナーの位置から計算して移動させること出来ました。
MFCみたいにモーダルのメッセージボックスが出てる時、親アプリを
クリックしたら警告音を鳴らしたり、アプリ全体を手前に持ってきたり
する方法が分かりません。
親アプリには一切メッセージが飛んできませんし、ダイアログにも
(外側のクリックなので)何もメッセージが来ないようです。
何かヒントください。よろしくお願いします。
これもとの質問者は一人なの? メッセージボックス風のモーダルダイアログ作れば簡単じゃないの?
つーか変なスレッドから呼んでるんじゃないの
亀レスをまとめてみる
>>246 XP x64 ではFLS使用可能
XP x86 ではSP3でも非対応
>>277 プロパティシートというか、そもそもタブコントロール自体が
「特定のタブを無効にする」ということをサポートしていない
解決するにはサブクラス化し、クリック検知と無効テキスト
描画を自前でやればOK(以前やったことがある)
>>298-299 スレッドの戻り値はそもそも64bit値を返す必要性が無いからDWORDだろ
GetExitCodeThreadやGetExitCodeProcessで扱う値が32bit(WinMainの戻り値がint)なのと一緒
346 :
302 :2008/01/15(火) 14:04:30
>>343 多分もとの質問者はおれかと…。
自前で作ったモーダルのダイアログボックスでも、親アプリを
クリックしたら警告音を鳴らしたり、アプリ全体を手前に持って
きたりは、一筋縄ではいかなそうです。
そもそもイベントが何も発生しないので…。親アプリと同じ領域の
イベントだけ取るための不可視のウインドウでも作って、そこで
監視するのかな…? あんまりスマートじゃないですね。
>>344 メッセージボックスは通常のメッセージループの中から呼んでます。
まだよくわからない。 DialogBox() APIは使わないという条件?
オーナーをきっちり設定して窓作っていれば、特別なことをしなくてもその動作になるよ。
>>341 家ではNTしか使ったことないので持ってないんです。
NTしか使った事の無い人間がプログラマになる時代になったのか ある意味羨ましいな 9xなんて不正なハンドルをDestroyするだけで青画面だったからなw
>>345 > スレッドの戻り値はそもそも64bit値を返す必要性が無いからDWORDだろ
CreateRemoteThreadでこんな事やあんな事をしたい時にポインタ型と同じサイズでないと困る事がある
ま、こんなウイルスの温床になってるAPIなんて64bit版で廃止してもいいと思うが
352 :
302 :2008/01/15(火) 15:54:25
>>347 DialogBox() API を使っても同じ症状です。
>>348 うーん、そうですか。そうなるとアプリ側のメインウインドウに
何かありそうですね。単純なプログラム作って差を見てみます。
ありがとうございました。
これ以上は再現可能なコードを提示してもらわないとわからんな。
CreateCompatibleDCで作るとサイズ1*1のモノクロで CreateCompatibleBitmapで使いもしないビットマップ作って SelectObjectで割り当てて使い物になる裏画面になる。 どうしてこんな面倒なことにしたの?
ビットマップ割り当てて描画するだけがDCじゃない 時代もあった
356 :
デフォルトの名無しさん :2008/01/15(火) 17:02:51
おい!鮎!どうせ俺に釣られて網で焼かれるんだ!はじめから、塩味でいろ!
裏画面が同じサイズとは限らないんじゃね?
変数の宣言だけじゃ初期値が代入されないようなものだと思っとけ。
そのビットマップって使ってないことなくなくね?
なくが一個多くなくね?
Select中のビットマップは捨てれないかと たぶん削除失敗でリソースリーク
Win32の半分は不条理で出来ています。
StockObject扱いだからリークにならんよ
Do not delete a drawing object (pen or brush) while it is still selected into a device context.
それが装置文脈の中にまだ選択される間に、図画オブジェクト(ペンあるいはブラシ)をデリートしないでください。 装置文脈って何?
デバイスコンテキスト
370 :
デフォルトの名無しさん :2008/01/15(火) 19:48:41
リストボックスをいくつかの行に分けて表示したいんだけんども、どうやればよかったでしょうかね 忘れちまってorz case WM_CREATE: hList = CreateWindow(TEXT("listbox"), NULL, WS_CHILD | WS_VISIBLE | (LBS_STANDARD ^ LBS_SORT), 0, 0, 0, 0, hwnd, (HMENU)ID_LIST, ((LPCREATESTRUCT)lParam)->hInstance, NULL); return 0; こういう感じでリストボックスは作ってるんだけんども
高さが足りない 有勝 卓
画面に表示する内容を変更 InvalidateRect(hWnd,NULL,TRUE); 重い処理 って書くと重い処理が終わってからしか画面が書き換えられないんだけど、 InvalidateRectの直後(重い処理の前)に画面書き換えるようにできない?
>>372 UpdateWindow で出来たはず。
for(;;) { HPEN pen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255))); 略 DeleteObject(pen) } てなかんじでぐるぐるまわし続けると止まりますか?
無限ループ
>>375 ちゃんと解放してるから問題はないけど、
ループ内で何度も同じペンを作るのは無駄なんじゃないかと。
実体がいつあぼーんされるか
PenFactory
そのペンだったらストックオブジェクトWHITE_PENで事足りる気がする。
プロセスの起動時ってntdll.dllが読まれて、次にkernel32.dllが読まれて…っていきますよね 途中でDLLが無かったりするとエラー出して起動しなかったりもします このdllをロードするって作業はnotepad.exeとか個別のバイナリに実装されてるのではないと思っているのですが、 やっているのはカーネルなんでしょうか? カーネルがこういう処理をして、よきにはからったところで WinMainCRTStartupとかをコールしてるのかなぁとおもっているのですが、間違ってますでしょうか
Advanced Windowsとか読めばいいんじゃないかな
それであっている。
遅延ロードを有効にしてる場合はexeの側で一部の作業をやってることもあるけどな
即レスありがとう。そういえば遅延ロードなんかはいかにもexe実装っぽいですね どうもです
LoadModuleの立場は・・・
ドライブタイプを判定する「GetDriveType()」というAPIがありますが、 バッファローのリムーバブルハードディスク(USB接続)「HD-PSGU2シリーズ」 をつないで、そのドライブに対してGetDriveType()を呼び出すと、 「DRIVE_FIXED」が帰ります。 普通のUSBメモリなどでは「DRIVE_REMOVABLE」が帰ります。 これは仕様なのでしょうか? バッファロー以外のリムーバブルハードディスクを持っていないので 他のメーカーでどのような値が帰るのかはわかりません。 もし、何かご存知の方がいましたら教えてください。
リムーバブルってのはメディアがリムーバブル
>>388 そうなんですか。
では、普通の内臓ハードディスクとリムーバブルハードディスクを判別する
方法というのはあるのでしょうか?
今、自作のアプリにリムーバブル動作モードを追加してるのですが、
この場合には異なる動作をさせたいので、自分が実行されているドライブの
種類を判別したいのです。
くだ質ですが教えてください。 WM_PAINTでBitBltでピクチャーボックスに描画データ転送とそのままでは 他の領域が更新されないので空のBeginPaint/EndPaintを実行しています。 case WM_PAINT: hdc = BeginPaint(hPicBoxImage, &ps); BitBlt(hdc, 0, 0, 160, 120, hDrawDC, 0, 0, SRCCOPY); EndPaint(hPicBoxImage, &ps); hdc = BeginPaint(hwnd, &ps); EndPaint(hwnd, &ps); return (0); なんとなくうまいやり方でないような気がするのですが、他の手段はありますか? ダイアログベースのアプリでピクチャーボックスの位置をうまくとれなくて こんなことしているんですが…
>389 「ふつーの内蔵ハードディスク」ってのはどういう代物なんだ? たとえば、最近のSATAコントローラはデバイスのホットプラグに 結構対応していたりして、ディスクがしかるべきエンクロージャに 入っていれば、取り外せるわけだが >390 WM_PAINTで処理したいなら、そのピクチャボックスをサブクラス化すれば。 ダイアログ相対のピクチャボックスの位置は、 GetClientRect(hPicBox) -> ClientToScreen(hPicBox) -> ScreenToClient( hDlg) あたりを呼べばとれるけど。
ピクチャボックスにSTM_SETIMAGE送ればいいだけじゃないのか?
>内臓ハードディスク そんなの出たら暗記科目の試験はバッチリだな
>>389 とりあえず、DeviceIoControl()でIOCTL_STORAGE_GET_MEDIA_TYPESでいけないかなあ。
むしろIOCTL_STORAGE_GET_HOTPLUG_INFO
>>391-392 ありがとうございます。
MapDialogRect/GetWindowRect/GetClientRectで悩んでたのが馬鹿みたいでした。
ClientToScreen/ScreenToClientって便利ですね。
>>395 394だけど、それでいけるみたいですね。
DeviceHotplug がUSB接続のHDDは1になったわ。
普通、HDDのプラッタは稼働中に簡単に出し入れできないかと。 ホットプラグで抜き差しするのはドライブそのものが居なくなる訳だし。
プラッタが出入りするんじゃなくてヘッドが出入りするんだよ
InsertMenuItem()でビットマップ型でサブメニューをもつものが作れないんですが、 これらは排他の制限があるんでしょうか? MENUITEMINFOのfTypeにMFT_BITMAP。fMaskにMIIM_SUBMENUをつけるとビットマップが表示されず 変わりにビットマップサイズの巨大なアイコンの絵がでてきます。 MIIM_SUBMENUを取るとちゃんと表示されますが、ただのボタンになってしまいます。
401 :
デフォルトの名無しさん :2008/01/16(水) 21:18:42
ウィンドウクラス登録時に指定したメニューを、消すことはできないんでしょうか? SetClassLong(hwnd, GCL_MENUNAME, (LONG)NULL); ではダメでした。 どうすればいいでしょう。
ageてしまった。 すみません
SetMenuで出来ることとは違うのか
404 :
デフォルトの名無しさん :2008/01/16(水) 21:41:55
>>403 できました。
ありがとうございました。
またageてしまったorz
はじめまして。 ちょっと質問します。 あるソフトが使用しているwaveOutSetVolumeをフックして 別ソフトからボリュームをコントロールしたいんですが どうすればいいんでしょう? ものすごく大雑把な質問なんですが 何か取っ掛かりでも教えていただければ…
kenji's
教えてクンで悪いけど、 VC++6.0 でコンパイルが通る BOOL is_Os_Vista(void) { } の中を埋めてくれ。
BOOL is_Os_Vista(void) { return MessageBox(0, TEXT("OsはVistaですか?"), 0, MB_YESNO) == IDYES; }
return MessageBox(NULL, "OS は Vista ですか?", "is_Os_Vista", MB_YESNO)==ID_YES;
>>409 return MessageBox(NULL,"これはびすたですか?","はろー",MB_YESNO)==IDOK;
BOOL is_Os_Vista(void) { return GetTickCount() % 2; }
upper camel に _ か・・・
アプリを切り替えたり、メニューからダイアログボックスを呼び出したりすると、メインウィンドウはフォーカスを失いますよね? このとき、新しくフォーカスを得る(というのかな?アクティブになる)ウィンドウが、自ウィンドウの子ウィンドウ(ダイアログなど)であることを知ることはできますか? 自分が今やってるのは WM_KILLFOCUSで if(GetParent((HWND)wParam) == hwnd) としているんですが、なぜかうまく行きません。
WM_ACTIVATE の lParam
>>414 しかし注意書きを真に受けて「XP以上かどうか」で判定していたアプリが
どれくらいVistaでまともに動いたか考えると
「XPかどうか」で判定したくなる気持ちもわからんではない
>>419 それはまた別の問題だと思うが。
そのアプリは「XPかどうか」で判定していたとしても結局Vistaではまともに動かんのだし。
BF2142というFPSゲームがありますが、適当にプレイして アプリケーションを終了させると、C2D3GHz、メモリ2Gといった 環境でも、デスクトップや他のウィンドウが使えるようになる 復帰までの時間が十数秒ぐらい掛かり、異常に待たされます。 TerminateProcessで強制終了させても同じ様です。 メモリの消費量が多いアプリケーションですが、システムの メモリの回収?にそんなに時間が掛かるものでしょうか? 一体何が起きてるんでしょう。 早く復帰させる方法がありましたら教えてください。 PunkBusterという不正行為防止のサービスが動いてる事と 関係があるのでしょうか。一緒に殺せばいいかな。
知るかスレ違いじゃボケ ディスクに退避してたキャッシュ読んでんだろハゲ
どーせページアウトされてた連中を呼び戻すのに時間がかかってるだけでそ。 板違いだから言うけど、ページングでも切れば。副作用は関知しない
425 :
デフォルトの名無しさん :2008/01/17(木) 01:29:44
BOOL is_Hage(void) { ReleaseHair(); return NumOfHair(); }
× return NumOfHair(); ○ return NumOfHair() < YAKUYO_SUCCESS; ぐらいじゃないか?
>>420 動く保証がない(というか実際動かない)からXP以外での動作を拒否したくなるという
ことでしょ
OSのバージョンチェックなんて互換モードで誤魔化せるからあまり意味無いだろ
動く保証がない vs 全く動かない か。 微妙なトレードオフだな。
既存のウィンドウを、メインウィンドウをオーナーとして所有させたいんだけど方法はない? クグったらSetOwnerなんて関数があるらしいけど使い方もサンプルも見つからない…。 SetWindowLongでオーナーウィンドウのハンドルを設定したらできるかもしれないって書いてあるページがあったからやってみたけど効果なし。
433 :
409 :2008/01/17(木) 19:29:19
分かっている人には空ですぐ書けると思ったけど、心当たりの人は少ないんですねえ。 Vista 使っていると、これまでと環境が違うことが多く、皆も助かる話かなと 思ったけど、ダメですか。 私が今どうしようかと思っているのは、Program Files フォルダの中には一時ファイル を生成できない制限です。起動 exe は user フォルダにあります。起動 exe も Program Files へ移動すると動くのかはまだやってません。 文字の扱いを(面倒ながら) unicode にしたら、移そうかなと考え中。 余談ながら、word98, excel97 を動かして見たら、固まって終わり。もっと利口 な処理になってるんかと思ってたけど、ヒドイ。インストールからダメにしとけ ばいいのにネ。
相手にされないのは、バージョンの取得なんて 基礎中の基礎にすぎない事柄だからということに気付け。 本当に一時ファイルなら%TEMP%にでもおけばいいだろう。 プログラムが終了しても残っていなければならないようなファイルだったら、 そんなものProgram Filesに置くなというのがMicrosoftの主張。 従わないプログラム多すぎだから、Vistaでこんな仕返しに出た。
vistaの文句言うプログラマの大半が単なる無知の馬鹿なのが笑える 中にはそうじゃない人もいるけどね
>>435 最初は独立しているウィンドウでも所有させることはできない?
>After creating an owned window
とりあえず SetWindowLong(hWnd,-8,hMainWnd); でオーナーとなるウィンドウを指定して EnableWindow(hMainWnd,0); で目的の動作ができたので解決とします。
マジックナンバーにしてる意味はあるのだろうか。
442 :
デフォルトの名無しさん :2008/01/17(木) 22:48:19
ブビ厨だろ
質問です。 [詳細] ボタンを押すとダイアログが広がってコントロール群とコントロール群の間に複数の追加コントロール群が現れるようなダイアログはどう作ればよいのでしょう? イメージとしては、詳細ボタンが2つ並んでいて、上の詳細ボタンを押すと [詳細 >>] [詳細 >>] が [詳細 <<] [ ] チェック項目 [ EditCtrl ] [ ] チェック項目 [ EditCtrl ] [詳細 >>] のような感じで展開されます。 気になっている/考えているのは次のようなことです。 1. (プロパティシートの各ページがダイアログテンプレートを埋め込んでいるのと同じような仕組みで) ダイアログの一部にコントロール群を定義したテンプレートを埋め込む方法があるか? 2. (コントロール群が 1. で定義したものかどうかに関わらず)コントロール群を階層化して一括管理(移動や無効化、非表示など)できる方法があるか? 3. (1.2.が無理の場合)複数のコントロール群の各々に一つ一つ対応する ShowWindow(), EnableWindow(), MoveWindow() を書く以外の方法があるか? です。 お願いします。
1.2.3. ともに解決策に心当たり無しだが、もし MoveWindow() を複数回一度に呼び出すようなことを考えているなら BeginDeferWindowPos(), DeferWindowPos(), EndDeferWindowPos() を使った方がよいと思う。 あと、ボタンは [詳細 >>] <-> [詳細 <<] より [詳細 >>] <-> [<< 詳細] のが普通かな?
>>440 みたいな奴ってWindowsのバージョンが上がって自作ソフトが動かなくなったらOSのせいにしてキレるんだろうなぁ・・・
Vista叩いてる奴も
>>433 みたいな馬鹿が多いし・・・
また常時admin厨が.iniファイル書けずに文句言ってるのか
>>446 もう10年もVistaやってるようなモノ言いだな
日本語でおk
450 :
デフォルトの名無しさん :2008/01/18(金) 06:38:29
Delphi使用 アプリ起動時にIEをSW_HIDEでCreateProcessし、あるEventをキーに表示。 を行いたいのですがIEだとSetForegroundWindowが正常終了にも拘らず、表示されません。 Close処理SendMessage(handle,WM_CLOSE,0,0)もIEの場合正常に動作しません。 NOTEPADだと正常に動作(非表示Process生成→表示)しているので、指定ハンドルもあってると思うのですが。 ヒントでも良いのでお願いします。
>SetForegroundWindowが正常終了にも拘らず、表示されません。 この時点でターゲットウィンドウが間違ってる以外の答えは無いだろ
452 :
440 :2008/01/18(金) 07:26:05
>>446 親ウィンドウを変更する時はSetWindowLong使わずにSetParent使えって書いてあるけどオーナーの変更もすべきでないか?
453 :
450 :2008/01/18(金) 08:14:07
>>451 EnumWindowsProc見直します
ありがとうございました
>>444 1.はダイアログ内に子ダイアログを作れれば出来そうかも?
↓でいいみたいだな。 たった4行書けば済むものを、あれこれたくさん意見を頂いたもんだ。 BOOL IsWindowsVistaOrLater(void) { OSVERSIONINFO osvi; osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx (&osvi); return (osvi.dwMajorVersion >= 6); }
まだやってたんかい
>>452 お前が日本語と英語を理解していない事は分かった
それがMe脳クオリティ
>>455 は詐称で答え書いてやってるツンデレと見たが
461 :
デフォルトの名無しさん :2008/01/18(金) 13:01:36
元の阿呆の質問はis_Os_VistaであってIsWindowsVistaOrLaterではないしな
本人は
>>414 のレスもらって無言で消えて、あとは全部釣りだろ
私は例えばThemeが使いたかったらOSチェックじゃなくてuxtheme.dllがロードできるかで判定してるし、 DWMが使いたかったらVista以降かじゃなくてdwmapi.dllのロードで判定してる。 何のためにチェックするかによっても多少違うんじゃないかと。
俺はkernel32.dllのアドレス
俺はsystem32への書き込みが成功するかどうかでXPだと判断し、 Program Filesへの書き込みが仮想化されるかどうかでVistaだと・・・
アプリのダイアログを国際化しようとおもい、 1、リソースのみのDLLを作成。 2、LoadLibrary->FindResource->LoadResource->LockResourceして 3、それをDialogBoxIndirectに渡したんですが、 なぜかEXEに埋め込みのリソースが使われてしまいます。 何がおかしいのでしょうか?お願いします。
C#のstringに相当するものはないのでしょうか?
>>466 リソースに埋め込んでるのにDialogBox()を使わない理由って何?
C++だけでも少なくともstd::string CString AnsiStringくらいはすぐに出てくる
>>467 C#でP/Invokeやってるのかな?
「文字列のマーシャリング」でぐぐったら
つうか質問の意図が不明すぎ
LPCWSTR
474 :
デフォルトの名無しさん :2008/01/18(金) 21:24:14
「ブリーフケース」を作ろうとしてレジストリで .bfc という拡張子のところの ShellNewのCommandが %SystemRoot%\system32\rundll32.exe %SystemRoot%\system32\syncui.dll,Briefcase_Create %2!d! %1 であることから、次のようなコマンド C:\WINDOWS\system32\rundll32.exe C:\WINDOWS\system32\syncui.dll,Briefcase_Create "D:\Tmp" ブリーフケース" をコマンドプロンプトから入れてみましたが、メッセージなどは出ませんでしたが、 ブリーフケースは作成されませんでした。このコマンドラインをどのように修正すれ ばいいでしょう?よろしくお願いします。
全然Win32APIの話じゃないな
>>475 そうですね、すみません。どこに行って訊くべきでしょう
誘導のほどお願いします。
Windows板で聞けばいいんじゃね
>>477 わかりました。ありがとうございました。
479 :
デフォルトの名無しさん :2008/01/18(金) 23:49:48
ちょっと聞かしてください。 win32apiをクラス化しようとしたんですが 後々の拡張性を考えるとどういう風な設計 がベストなのかわかりません。 C++自体未熟なのもありますのでその点に 関してもまだまだなのですが、みなさんは どういう風に組み立てているのでしょう C言語でサブクラス化を駆使して作ってらっしゃる 方もいらっしゃるでしょうが、C++で組んでる方も いると思うわけです。 みなさんは、どこか参考になるサイトも見て組んでる んでしょうか、それとも自らの経験値を積むのみなのでしょうか 愚鈍な質問ですいませんがご教示お願いします。 ちなみにfastcopyのソースを見てもクラクラするだけでした
一体何の話なんだ。 何で唐突にサブクラス化って言葉が出てくるのか理解できない
>>479 MFCとかwxWidgetsとか既存のツールキットを調べてみるといいんじゃないか
ソース見なくてもドキュメント読んでれば設計なんかは読み取れるかと
>482 MSDNにサンプルあったんすね。英語ですけど・・・ がんばってソース追ってみます。ありがとうございます。
>>446 -8を直書きする馬鹿を擁護する気は全くないが
バイナリ互換性がなくなるからマクロの定数値が変わることは実際にはあり得ない
>>463 俺はVirtualAllocExのエントリが存在するかどうかで使えるかどうか判断してる
そしたらなぜかWin98で動かないんだぜ
>>458-462 横柄にまた出てきましたヨ。逃げも隠れもしませんヨ。
IsWindowsVistaOrLater() にしたのは、この語でぐぐると例が
たくさん出るから。Is_Os_Vista() じゃダメって分かったから
だヨン。
消えろ
逃げも隠れもしてくれ。誰も止めん。 むしろ隠れてくれたほうがへんなレスがつかなくて結構だ。
TerminateProcess(
>>487 , -1);
vista の取得・・・c:\windows\media\tada.wav のファイルハッシュを比較すればとれそうじゃね?
サービスパックでハッシュが変わってたらどうするんだよ
GDI+のEffectはVistaから使えるの?
Visual Studio Std 2005 で Win32API を勉強中です。 ウィンドウを表示して、その中にMoveTo や LineTo で線を書くことはできました。 そこで、その書いた線上にマウスを持って行くと マウスポインタが変更できるようにしたいのですが、 どんな感じに作っていけばいいのでしょうか? マウスの位置を調べる関数があるのですが、 マウスが動くたびにその関数を呼び出して、 その値を、先ほど書いた2点間の線上の一次方程式に入れて判断していくとか、 そんな感じになるのでしょうか? それとも、もっと簡単な方法とかあるのでしょうか。 教えてください。
GetPixelで調べるとか
497 :
デフォルトの名無しさん :2008/01/20(日) 00:05:27
OSの電源設定の名前(コントロールパネルの電源オプションから設定できるもの)を取得できる APIはありませんか? EnumPwrSchemes() では全ての電源設定名が取れてしまうっぽいので、 できれば現在設定されているものの名前が取得できたらいいのですが。。
ACPI
>>495 WM_SETCURSORの中でカーソル位置を取得してSetCursor()で変更かな?
線の色が決まってるなら
>>496 のようにGetPixel()で色を取得して判断とか。
Vistaの「ファイルを開く」コモンダイアログボックスで ファイル名を入力するコンボボックスのハンドルを取りたいのですが GetDlgItem(hDlg, edt1) では取得できませんでした (XPでは取得できます そもそもedt1はエディットボックスの名前だから 取れなくて当然なのかも) edt1から別の名前に変わったのかと... ご存知の方いますか?
>>498 GetActivePwrScheme()で取得したIDと
EnumPwrSchemes()の第一引数とを比較して一致したときの第三引数。
名前以外の設定値ならIDとReadPwrScheme()で取得できるようだけど
POWER_POLICYに名前を格納したメンバが無いしな。
あと、Vista/WindowsServer2008以降では別の関数群が推奨されてるよ
504 :
503 :2008/01/20(日) 11:04:43
分ると思うけど、ちょっと書き方悪かったので訂正。 (誤) >EnumPwrSchemes()の第一引数とを比較して一致したときの第三引数。 (正) EnumPwrSchemes()のコールバック関数の第一引数とを比較して一致したときの第三引数。
Win32APIが次のWindowsで.NETに置き換わるので 今からWin32APIプログラムなんてバカのやること なんて書いてあったんですが本当でつか?
MSも一応そのつもりだったが、結局諦めた。 で、書いた奴が馬鹿を見ただけ。
.NETの方が高速なら.NETでもいいけどな。
510 :
デフォルトの名無しさん :2008/01/20(日) 15:01:18
その.NETにおいてですが、現在ファイルのプロパティを表示するために ShellExecuteEx を使っていました。そのとき、通常のファイルやフォルダの場合ではOKだったのですが、 たとえばブリーフケースのような特殊なフォルダの場合、Explorer ではそれ用の専用のタブ も追加されて表示されていました。それと同じように表示するためには、構造体 ShellExecuteInfo のメンバをどのように指定すればよいでしょうか?現在しているものはこれらでした、 .cbSize = Runtime.InteropServices.Marshal.SizeOf(udtInfo) .fMask = SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_INVOKEIDLIST Or SEE_MASK_FLAG_NO_UI .hWnd = Me.Handle .lpVerb = "properties" .lpFile = FilePath この他に指定が必要な項目と値を知りたく思いました。ご指導のほど何卒よろしくお願いします!
なんでwin32スレで.netの質問をする馬鹿がいるのかね ドトネト厨は日本語が読めないのか?
>>502 >>505 d
Spy++でウィンドウクラス名調べて子ウィンドウ辿っていったら取れたよ
多分別の方法があるっぽいけど今回はコレで誤魔化す事にした
winsockに関する質問はここでいいですか?
514 :
デフォルトの名無しさん :2008/01/20(日) 17:11:58
int、LONG、DWORDなどの数値を、 LPCSTR、char配列などの文字列にするにはどうすればいいんでしょうか?
sprintf std::stringstream
itoaとかさ
このスレ的にはwsprintf
TCHAR 使ってないからそれは避けといた。
519 :
510 :2008/01/20(日) 17:26:26
>>511 と言いますか、
>>510 はWin32APIの ShellExecuteEx() についての質問なのですが、
なんとかご指導を頂ければありがたいと思いました。
何卒よろしくお願いします!
520 :
514 :2008/01/20(日) 17:30:39
>>515 とりあえず、sprintfでできました。ありがとうございます。
<stdio.h>をインクルードしないとできなかったんですが、
普通これは入れるものですか?
>>517 他にはwnsprintf,StringCbPrintfとかいくつかあるよな。
>>518 wsprintfA
_TCHARに対応するbasic_stringのtstring作ってほしい(Microsoftが作るなら_tstringかな) typedefするだけじゃんって言われればその通りなんだけどさ
typedefするだけじゃん
うるせーばか
525 :
498 :2008/01/20(日) 18:47:26
>>503 ,504
教えていただいた方法でできました。
レジストリを直に見に行くしかないのかとあきらめかけてたところで、助かりました。
ありがとうございました。
Vistaのほうも探してみます
例えば //testclass.h class CTESTCLASS { public : int the_method( void ); }; extern "C" __declspec( dllexport ) CTESTCLASS* CreateTestClass( void ); //testclass.cpp #include "testclass.h" int CTESTCLASS::the_method( void ) { return 1; } CTESTCLASS* CreateTestClass( void ) { return new CTESTCLASS(); } これで bcc 使って DLL 作成して、下のソースコンパイルしようとしても //dlltest.cpp #include "testclass.h" #include <windows.h> < 中略(LoadLib() と GetProcAddress()) > CTESTCLASS *TestClass = CreateTestClass(); TestClass->the_method(); //エラー 実体無いから当然ながらメンバ関数呼ぶ時点でコンパイルエラーになるんです DirectX8 だと LoadLibrary() で DLL 読んで Direct3DCreate8() で作成するだけで IDirect3D8 のメンバ関数呼べてるんですけど DirectX の実装はどうなってるんだろう これって DLL そのものの機能で解決できるでしょうか メンバ関数全部 export してメンバに手動でバインドしてやるような方法しかないのかな
クラス全体をエクスポートすることが出来たような class __declspec(dllexport) CTESTCLASS とか DirectXのインタフェイスは全部抽象メンバだから元々呼ぶ実体は(派生クラスにしか)ない
宣言に足すだけでクラスごとエクスポートできるんですね
COMも名前だけで実体はさっぱりだったんで、良い機会だし時間できた時に勉強してみます
>>527-528 ありがとう
リアルタイムにメモリ使用量(物理とページファイル)を取得したいのですが GlobalMemoryStatus以上に処理的にスマートな方法ってありますか?
QuerySystemInformation
532 :
デフォルトの名無しさん :2008/01/21(月) 00:34:32
ツリービューについて質問です。 キーボード操作からコンテキストメニューを出すために、 現在選択されているアイテムの座標を取得したいのですが、 使えそうなAPIを知っている方いませんか?
何故ドキュメントを読まない?
534 :
532 :2008/01/21(月) 01:04:26
すいません、解決しました・・・ GetItemRectで大丈夫そうです、 お騒がせしてすいませんでした。
>>533 暇な奴だな。もう少し有意義に時間使ったらどうだ?
そんなレスに時間を使う暇な535
「Delphiで無料でプログラミングしてみるお」からきました。 MsgrObject.Logon('ID','PASS',IMsgrService); 上のようにやるとエラーがでて、先にConnectを呼べとでます。たぶん三番目の引数が間違っているのかもしれないですが、 まったくお手上げでよくわからないので、ご教授してくださる方いましたら、おねがい致しますm(_ _)m
まずはスレタイ見るところから始めてみては。
539 :
デフォルトの名無しさん :2008/01/22(火) 10:49:13
ウィンエイピーアイのLPSTRとかの型を全部教えてください
型なんてコンパイラ用の情報なんだからリソースが許す限り作れる つまり「全部」という問いがナンセンス
ゼンブゼンブ
ExitWindowsEXについて引数にEWX_SHUTDOWNとEWX_POWEROFFが ありますが、通常WinXPの終了オプションで「電源を切る」と同じ動作は EWX_POWEROFFでオッケー?
544 :
デフォルトの名無しさん :2008/01/22(火) 12:47:56
Windowsの標準メニューの描画が止まるような障害ってありますか? 原因と対策、または、原因調査方法があれば教えて頂けないでしょうか?
WM_DRAWITEMとかWM_MEASUREITEM握りつぶしてたりとか
>>539 試しにWindows SDK V6.1のヘッダファイルをtypedefで検索してみたら4万件弱あったが
DECLARE_HANDLE(hoge)
>>539 C#からきた俺も同じようなこと考えてたから気持ちはわかる
550 :
デフォルトの名無しさん :2008/01/22(火) 19:57:59
通常のフォント関連のAPIで扱えて、そのアプリ内だけで使用する 独自フォント(アプリが起動している時のみ有効)のインストール 方法ってないでしょうか? 要するにシステムのフォントフォルダにインストールさせたくない アプリ独自の外字などを通常のフォント用APIで扱いたいのです。 よろしくお願いします。
何故ドキュメントを読まない?
DQN面子だから
553 :
550 :2008/01/22(火) 21:16:20
>>551 キーワードのヒントいただけないでしょうか。
手持ちのドキュメントやググっても、キーワードが悪いのか
見つけられないのです。
MSDNライブラリのフォント関連の関数が並んでいるところを見れば、それらしいのあるだろ。
555 :
550 :2008/01/22(火) 21:31:59
ありました。どうもありがとう
すべてが万事「何故ドキュメントを読まない?」で終わってりゃこのスレいらんな。
ドキュメント読まない人間に限ってこういう詭弁を振るいます
質問の多くはその程度の内容だから仕方がない。 ただ、それらしいのあるだろって言う位なら、 素直に教えてあげてもいいんじゃないかとは思うが。
自分の存在こそがいらない人間に限ってこういう受け答えをします
VisualBasic初心者ですが、早くも自作のゲームなど 開発しています。 ところで、VBで作ったプログラムをMacで動作させるには どうしたら良いでしょう? そのままではダメだという話ですが、なるべく低コストで 手っ取り早い方法がありましたら教えてください。
>>560 1.エミュレータを使う
2.Windowsをインストールする(Intel Mac)
頭のおかしい人間がたまにこんなネタも投下します
>>561 やってみたけど、駄目でした。
他に何かないでしょうか?
>>562 あの〜(笑) あなたには聞いていません。
分からないなら書き込まないでください。
>>561 3.頑張ってRealBasicに移植する
ピンときたら1行目でググればだいたいコピペだと判明します
568 :
561 :2008/01/22(火) 23:45:58
すまん、コピペと知らなかった エミュレータは最後に勧めないとネタが成り立たなかったのか
しかしあの程度のガイキチなら今どき2chでごろごろ見かけるよな 昭和は遠くなりにけりだぜ
ドキュメント読んだら負けかなと思っている
Mac用のエロゲが少ないのはなぜですか?
質問の前と後にサーをつけろ。 Macユーザーはホモのアカだからだ。
>560 呼んだ?
タスクトレイアイコンがメイン?なアプリケーションを作っています。 で、タスクトレイアイコンを右クリックして、ポップアップメニューからモーダルダイアログをだしても またタスクトレイアイコンを右クリックして〜って出来てしまいます。 タスクトレイアイコンに登録されてるウィンドウに二つモーダルダイアログができてしまう っていうのはなんか変な気がします。 なにが起きているのか教えてください。
よくパッケージソフトにある推奨スペックや必要スペックとかってどうやって計算してるの?
電卓
いまどきなら Pentium1GHz以上 メモリ512MB以上 WindowsXP以上 HDD80GB以上 くらいにしとけば医院で内科医
1GHzでも、Pentiumじゃダメだろw
>>575 君の書いたとおりに動作してるだけだと思うが。
オレはタスクトレイのアプリはモードレスのダイアログを作って
ポップアップメニューからの選択では、表示非表示を切り替えるようにしてる。
>タスクトレイアイコンに登録されてるウィンドウに二つモーダルダイアログができてしまう っていうのはなんか変な気がします。 普通。 メニューが表示される時点で気がつけ。
>>578 >HDD80GB以上
80GBも喰らうソフトを見てみたい
CreateIcon等で作ったアイコンをWM_SETICONでセットしたら後始末はどうしたらいいの? すぐにDestroyIconしてOK?それとも保持しておくべき? で、すぐDestroyIconしてOKならコピーがWindows側に保持されるということだから 元々設定されていた戻り値の旧アイコンはDestroyIconすべき?
試せば?
やだね
そんなこと言わずにお願いしますよ
WM_DESTROY で WM_SETICON 無効にしてからDestroyIconすれば?
WM_MOUSEWHEELメッセージを取得したいんだが case WM_MOUSEWHEEL:って書くと定義されていない識別子とか言われて 怒られるんだがどうすればよいですか?
_WIN32_WINDOWSあるいは_WIN32_WINNT
日本語のWindows95〜Meで動かす場合 _MBSCは指定しますか?
日本語Windowsで動かすかどうかより、 _tcsマクロが_mbsへ展開されてほしいかどうかの問題。 ややスレ違い気味。
HMENU hmenuTop = LoadMenu( instance, MENU ); // 親めにゅー HMENU hmenuSub = GetSubMenu( hmenuTop, index ); // サブメニュー RemoveMenu( hmenuTop, index, MF_BYPOSITION ); // サブメニューを親から分離する DestroyMenu( hmenuTop ); // 親だけ破棄 hogehoge( hmenuSub ); // 分離されたサブメニューは破棄されていない? DestroyMenu( hmenuSub ); // 分離したサブメニューは別々に破棄する必要がある? といった流れでサブメニューだけ読み込んで扱おうとしていますが、何か間違いがありますか?
DestroyMenuは配下のメニューを再帰的に破棄するのでサブメニューも死ぬ 親メニューは常に保持する必要あり
>>592 RemoveMenu does not destroy the menu or its handle, allowing the menu to be reused.
RemoveMenuされた時点でサブメニューは親メニューから切り離される。 だから親メニューを殺しても切り離されたサブメニューだけは残る。 よって再利用可能。
わざわざRemoveMenuして切り離す理由が分からんが デスクトップヒープやシステムリソースを節約したいのか?
Windows3.1時代を思い出すな
main.cpp (略、自動的に生成されたコードのまま) LRESULT WndProc(...){ switch(message){ case WM_INPUT: while(1){} //メッセージを受け取る break; case WM_COMMAND: switch(LOWORD(wParam)){ case IDM_DLG: DialogBox(hInst,MAKEINTRESOURCE(IDD_DLG),hWnd,Dlg::Proc); (略) } return DefWindowProc(hWnd,message,wParam,lParam); } dlg.h (略) namespace Dlg { int init(HWND hDl); INT_PTR CALLBACK Proc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); (略) };
続き dlg.cpp (略) LPCTSTR lstStr = {"0","1","2"}; int lstNum = 0; int Dlg::init(HWND hDlg){ int i; for(i=;i<3;i++) ListBox_InsertString(GetDlgItem(hDlg, IDC_LST1),i,lstStr[i]); // return FALSE ListBox_SetCurSel(GetDlgItem(hDlg, IDC_LST1)); return 0; } INT_PTR CALLBACK Dlg::Proc(HWND hWnd){ switch(message){ case WM_INITDIALOG: init(hDlg); break; case WM_INPUT: while(1){ } // メッセージ受け取れない return TRUE; case WM_COMMAND: switch(LOWORD(wParam){ case IDOK: EndDialog(hDlg,IDOK); break; (略) }
600 :
デフォルトの名無しさん :2008/01/24(木) 20:21:50
メニューからダイアログボックスを開いて、リストボックスから項目を選択できるようにしたいのですが、リストボックスに項目が追加されません。 また、ダイアログプロシージャでWM_INPUTメッセージを受け取ることができません。 原因が分かりません。どうか解決作をご教示下さい。 よろしくお願いします
>>596 コンテキストメニューを表示するときの常套句。
サブメニューの読み込み部分を関数化してみる便利さが分かる。
>>601 LoadMenu→GetSubMenu→DestroyMenu(親)だけでいいだろ
>>602 >LoadMenu→GetSubMenu→DestroyMenu(親)
めんどう。
エラー処理まで考えると無駄に分岐も多いし、
メニュー呼び出しが何種類もある場合はコピペになりがち。
長期的に見れば、一度
LoadSubMenu{ LoadMenu(); GetSubMenu(); RemoveMenu(); DestroyMenu(親); return sub; }
と関数化してしまえば
LoadSubMenu→DestroyMenu(サブ)
だけで呼び出せるようになる後者のが圧倒的に楽で保守性も高い。
あ〜、そうやりゃよかったのか。 今までずっと親メニューもいっしょに保持してたよ。 馬鹿みたい。
>>603 俺はCMenuみたいなクラス作って
class CMainWindow { private: CMenu menu; ... };
とでもしておいてmenu.GetSubMenu()して使い回すけどなあ
オーナードローとかすると毎回LoadMenuから行うのは結構コストが大きいし
親メニューが要らないのにいつまでも引っ張り回すのはマヌケ。 親メニューを使いたいのに親メニューを解放する奴は気が狂ってる。 違うことをするのに一つの方法だけでなんとかしようとする奴は頭が弱い。
FormatMessageってメモリに書き込まずに事前に文字数調べることは出来ないの? FORMAT_MESSAGE_ALLOCATE_BUFFERじゃなくて。
無理なんじゃないかな。
ないんじゃね?
思いつかなかったから FORMAT_MESSAGE_ALLOCATE_BUFFER なんか作ったんだと思われ。
611 :
デフォルトの名無しさん :2008/01/24(木) 23:41:44
>>600 LB_ADDSTRINGだったかで、追加してあげないと、項目は追加されない
と思った
そういやLoadStringとかも事前に文字数調べられないよな 自前でFindResource/LoadResourceしろってか?
脆弱性リストに毎度毎度がバッファオーバーフロー入っているのを見れば言わずもがな
そこでDEPですよ。
おれの DEP はダイヤモンドより堅いぜ!
malloc((size_t)-1)くらい用意しとけばめったにあふれないよ。
619 :
デフォルトの名無しさん :2008/01/25(金) 01:44:32
初歩的な質問ですまんが、 主スレッドと副スレッドのプログラムで 主スレッドから副スレッドを強制終了かけるときはExitThreadでよかったっけ? 副スレッド内のループの奥底で、副スレッド自身を終了させたいときは、c標準のkillthreadだっけ?
逆、自分を終わらせるのがExitThread (_endthread/_endthreadex) 他人を殺すのがTerminatThread。 killthreadは知らん。Win32にはないし、VC++あたりに存在するものでもないし。
そもそも強制終了してはいけない
622 :
デフォルトの名無しさん :2008/01/25(金) 02:19:11
>>620 >>621 トンクス
そうでした
TerminateThread関数でした。Terminateって思い浮かびにくいな
でも危険な関数って書いてあるね>>psdk
>>621 副スレッド稼動中に、主スレッドで終了メニューが選択されたときに
単に主スレッド内でDestroyWindowを呼び出すだけのほうが良さそうですね
プロセス終了時に副スレッドも勝手に終了してくれる?はず?なので
レスどもども
>>616 DEPと言えばWindows Server 2008で(おそらくVista SP1にも)
SetProcessDEPPolicyという関数が追加されるらしいが
プロセスがDEPの動作を変更できちゃっていいのか?
>>622 > でも危険な関数って書いてあるね>>psdk
だからそもそも強制終了してはいけない
624 :
600 :2008/01/25(金) 05:56:07
コンボボックスをリストボックスだと勘違いしてた/(^o^)\
>>622 >プロセス終了時に副スレッドも勝手に終了してくれる?はず?なので
プロセス終了時にリソースは回収されるとは言え、テキトーだなあ。
副スレッドに「自殺してね」ってお願いして死ぬのを待ってから、
主スレッドも終了するのが、副スレッドの終了処理ができるから良くね?
オーバーフローは問題ない オーバーランがいくない
Sleepって例えば10秒間寝てる間に高負荷がかかったとしても 最後の一秒以降にそのPCに負荷がかかってなければ おおむね正しく動くものなんですか?
何秒高負荷になろうとも正しく動きます
630 :
デフォルトの名無しさん :2008/01/25(金) 11:51:44
特殊フォルダのパスを取得するときに使用するCSIDLというものに関するリファレンスを読んでると、 version6.0とかversion5.0という番号がCSIDL_MYPICTURESとかCSIDL_MYVIDEOなんかの箇所に出てくるんですが これはどういう意味なんでしょうか・・ また何かプリプロセッサの定義の部分に付け加えないといけないとか?
>>629 どんな状況だろうが正しく動きません かと
餅の乳成分でショック起こすような奴は明らかに出来損ないで 種の存続のためにも劣勢として淘汰されるべき遺伝子なのだよ 結論「死ねばよかったのにね。」
( ゚д゚ ) _(__つ/ ̄ ̄ ̄/_ \/ /  ̄ ̄ ̄
哺乳類失格だな
書き込むサイズ指定するから 文章切れるけどOFはしないよ。
LoadStringのバッファオーバーランって無印95の時代だろ 何年前の話だよ
638 :
デフォルトの名無しさん :2008/01/25(金) 19:55:06
>>632 ありがとうございます。
ここで質問させていただく前に、ググって調べたときにそのページは読みましたが・・よくわからないです。
ソースの頭に、#define _WIN32_IE 0x0600 と付け加えても、かわらないですorz
>>638 もうめんどくさいからOSのバージョン依存の定数だと思っとけよバカチン
>>638 ソースの頭ってどこだよ?
その前にincludeしてしまっていたら駄目だぞ
>>638 何がよくわからんのよ。
Another method is to add a line similar to the following in your source code "before including the Shell and Common Control header files"
が答えでしょ?
PrecompileHeaderの頭に書くとか、プロジェクト設定のプリプロセス定義に書くとかでOK
ageて質問してる人ってロクなのがいないね
STDAFX.H
typedef struct _Hage { UINT uType; union { LPWSTR pStr; ...(省略)... } DUMMYUNIONNAME; } Hage みたいなのって 32bit環境だとunionメンバーって4バイト目から始まりますよね? 64bitだと8byteから始まるの?
>>644 コンパイラによって変わる
#pragma で指定できる
64bit環境でポインタサイズが64bitになるなら
デフォルトのままだとポインタは多分8byte境界におかれると思う
64bitといってもAlpha21064から最新CPUまでピンきりでは。 windowsに限定しても、Alpha IA64 AMD64
>>644 UINTはx64でも32bit
ポインタサイズの整数型が欲しければ、UINT_PTR、
明示的にサイズを指定したければ、UINT32, UINT64を使うといい。
>>645 やっぱそうですか。
>>646 ども。
>>647 ですよね。
でもバイト境界とかいう摩訶不思議なものが存在するらしいんですが
どうなんでしょ。
ぶっちゃけると
STRRETを.netで使いたいんです。.netだと言うと即座に却下されそうで
隠しました。ごめんなさいm(_._)m
[StructLayout( LayoutKind.Explicit, Size = 264 )]
internal struct STRRET
{
[FieldOffset( 0 )]
public UInt32 uType;
[FieldOffset( 4 )]
public IntPtr pOleStr;
[FieldOffset( 4 )]
public IntPtr pStr;
[FieldOffset( 4 )]
public UInt32 uOffset;
[FieldOffset( 4 )]
public IntPtr cStr;
}
が64bitWindowsで使えるか、ということなんです。
構造体サイズ変わりますよね
>>641 そうしてる・・
CSIDL_PERSONAL をSHGetFolderPathに渡すとマイドキュメントフォルダへのパスが取得できるんだけど
CSIDL_MYDOCUMENTS では何も返ってこない
ソースの頭、いろんなヘッダーファイルをインクルードする前に、#define _WIN32_IE 0x0600を置いてもだめ
プリプロセッサ定義に_WIN32_IE=0x0600としてもダメ
OSはXPなんだけどな
あなたそれ話のレベルが違う。 CSIDL_MYDOCUMENTSは「マイドキュメントという仮想フォルダ」のアイテムIDを取得する。 だからファイルシステムとしてのパスは取得できないよ
#define CSIDL_MYDOCUMENTS CSIDL_PERSONAL // Personal was just a silly name for My Documents やで〜
そもそも、CSIDL_MYDOCUMENTSはSHGetFolderPathでサポートされていない。 MSDNにサポートしているCSIDLが書かれているから、参考にしてみて。
というか、CSIDL_MYDOCUMENTSは無かったことにされてるので、 使わない方向でOKなんじゃないかと。
>>651-654 ホントだ
サポートされてる定数は限られてるみたい
またアホなことでズルズルと悩んでまった
みなさんありがとうございました。
>CSIDL_MYDOCUMENTSは無かったことにされてる そうなの?いつの間に・・・。
>>633 劣勢遺伝子は単に発現しにくいだけで種の存続にとって不利なものとは限らない
VBScriptのIsFolderメソッドのような働きをするAPI関数ってありますか?
「VBScriptのIsFolderメソッド」なんてないぞ FolderItem.IsFolderのことかね? 内部でIShellFolder.GetAttributesしてSFGAO_FOLDER見てるんじゃまいか
起動から〜時間後ごとに指定の処理を実行ってどうやればできますか? SetTimerしかない?
SetTimerでは何が困るのかを書いてもらえば代案を出せるかもしれん 困らないならSetTimerでいいかと
>>661 ごめんSetTimerだと何だか重くなりそうで嫌だなと思っただけなんだけど、そんなことない?
何を根拠に重くなると考えてるのかがさっぱり分からない
敢えて挙げるならWaitableTimerかなあ。 これならメッセージキューは不要だし。
やる意味がわからんけど副スレッドでSleep待機
プロパティなどで使われるテキストコントロールに似た、 背景が灰色のコピーはできるが書き込みやペーストはできない コントロールは何というのでしょうか。
Edit
ツールバーのリソースって 16色のビットマップしか使えないのでしょうか? Jpeg や png で書いたアイコンを ツールバーに反映させたいのですけど。
一旦イメージリストに読み込んでから使えば
Win32API の質問というよりは、リソースファイルの質問なんです。適当なスレに誘導していただければありがたいです。
環境は WindowsXP, 処理系はcygwin(gcc3.4.4+mingw-20050522-1 です。
以下のプログラムは、とある Win16 初心者本の例題を Win32 にあわせて書き直したものです。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5926.zip プログラムでは、ひとつのダイアログボックスを出現させて(DialogBoxマクロ)います。
DialogBoxの第二引数で指定するリソースでは、次のようにアイコンを定義しています。
KEKKA_XXXX DIALOG DISCARDABLE 100, 100, 130, 80
BEGIN
CONTROL "IDI_XXXX", IDI_XXXX, "STATIC", SS_ICON | WS_CHILD, 10, 25, 16, 16
END
ところが、このアイコンがダイアログに表示されません。
これはどこに原因があるのでしょうか。
特殊な環境ですみませんが、もしご存知の方がおられましたらよろしくお願いいたします。
static コントロール
>>668 PNGは分かるが、JPEGをツールバーに使うのか・・・?
673 :
670 :2008/01/27(日) 02:01:14
DLLを作成しています。 DLL内の関数内から呼び出す関数を同じソース上に作成し、その関数はDLL外からは呼び出すことができないようにするにはどうすればいいですか? privateステートメントのような・・ものってありません?
>>674 関数名を無しにすればいい
関数を static 修飾すれだけでいいはず
>>675 関数名を無しに?っていうトコロがよくわりませんが、static修飾子でいきます
トンクスm9
関数名無しっていうのは、番号でアクセスするとかいう感じの?
エクスポートしなけりゃいいだけだろ
質問です。ダイアログのボタンから、メニューウィンドウを同時に2つ出したいのでが、 確かに2つ出るのですが、同じウィンドウになってしまいます。 どうしたら良いですか? 異なるリソースIDは付けています。
ウィンドウを出してる部分のコードさらせ
HANDLEってよく出てくるんですが、これはポインタだすよね。 でも、何を指しているポインタなんだすか?
カーネル内オブジェクトとかUSER32内オブジェクトとか・・・
ポインタじゃないよ ただの整数IDだよ! というかそのように解釈すべきという意図で不透過な構造体へのポインタとして定義されてる 本当の意味で何を指してるかは知らない ハンドルテーブルとかいう奴かな?
APIごとに必要な情報のつまった構造体とかでしょ。 詳細は2kのソースを読むべし(嘘
ポインタテーブルのインデックスだったり
ポインタとOS起動時にランダムに決めた数値との排他的論理和ってのもあったな
突然だけど、質問。 LoadBitmapで読み込んだ画像を、適当な座標・大きさで 分割してそれぞれHBITMAPにするにはどうすればいい? 初歩的な質問で申し訳ない
別にビットマップを用意してDCに割り当ててBitBltとかするんじゃね?
ウィンドウAのプロシージャがタイマーによって発生させる情報をウィンドウBで同期表示したいのですがうまくいきません 現在は別々のプロシージャを用意してグローバル変数で情報のやりとりを行っています ウィンドウBでの表示はウィンドウAと同じ周期(1秒)のタイマーを用意して定期的に画面更新を行っています この方法では数回に一回起動時にウィンドウAの画面更新が止まったままになってしまうのですが処理が重すぎるのでしょうか? もっと簡単な同期方法がありましたらご教授ください・・・ Bではウィンドウ操作で表示内容が変わるので別々のプロシージャにしています
タイマ処理時にウィンドウAからウィンドウBにメッセージ投げるだけでいいんじゃね?
>>686 LoadBitmapは読み込んだ画像のHBITMAPを返しそれが読み込んだ画像を指すが、
分割してそれぞれを別のHBITMAPに入れるには、新しく画像を指すHBITMAPを作成しなければならない。
CreateCompatibleBitmap(hdc_b, 幅, 高さ) で新たな画像を指すHBITMAPを作る事が出来る。
引数、hdc_bには読み込んだ画像と互換性のある、新しいHBITMAP用に用意されたデバイスコンテキストハンドルである必要がある。
読み込んだ画像のデバイスコンテキストハンドルはCreateCompatibleDC(NULL)の返り値 = hdc_aを受け取り、
SelectObject(hdc_a, 読み込んだ画像のHBITMAP)で設定できる。
読み込んだ画像のデバイスコンテキストハンドルと互換性のある新しいデバイスコンテキストハンドルは、
CreateCompatibleDC(hdc_a)の返り値で取得できる。
CreateCompatibleBitmapで新たにHBITMAPを作成したあとは、そのHBITMAP hBitmapと作成に使用したhdc_bを使い、
SelectObject(hBitmap, hdc_b)しなければならない。別にしなくてもいいけど。
その後、分割前の画像のhdc_aと分割された画像を受け取るhdc_bを使い、BitBltなどで画像を分割するために転送して分割を行い分割は完了する事によって分割ができる。
680です。我有至極感謝!
結局、HANDLEって大先生でもよく解らないまか不思議なものなんですね。
windowsを操作するために使う車のハンドルみたいな物程度の理解でOKって感じですかね。
それが何であるか追い求めるな、それはWindwsの知ってはならない秘密の一つである。
>>690 には素敵なハンドルがいっぱい
駐車場の券のようなもの
>>691 マジレスすると冗談ではなく本当にそういう認識でいい。
ハンドルの目的は、リソースの直接的な管理をOSが全て自動でやりプログラマが直接手出しできないように
抽象化するためのものだから、その実体がなんなのか考えなくてもいいし、考える必要も無いように設計されている。
OSがエミュレータで動いていようがなんだろうが、ハンドルからであればリソースを利用できる。
ハンドルはリソースに対して割り振られた固有番号のようなもんだと思っておけば。 いや、事実そうなんだが。
695 :
688 :2008/01/27(日) 17:49:02
>>689 メッセージは
InvalidateRect(ウィンドウBのハンドル, NULL, FALSE );
UpdateWindow(ウィンドウBのハンドル);
で、いいのでしょうか?
画面更新がされない;;
ハンドルが何に対して固有かにもよるし OSのバージョンによって実装が変わってたりするから 一概には言えないな そういうgdgdしたことを考えずにすむための仕組みなんだよ
>>695 アプリケーション定義の任意のメッセージでおk。
PostMessage(ウィンドウBのハンドル, 更新されたよ, 0, 0);
メッセージを受けたウィンドウBの中で好きなことをすればいい。
>>690 >SelectObject(hBitmap, hdc_b)しなければならない
ここは引数が逆のような気がするが、キャストをするのか?
それとBitBltをしたあとは、分割された画像はhBitmapに入ってる?
何も画像が描画されないのだが…
教えてもらっている立場なのに、色々うるさくてすまない
でもGetModuleHandleの返り値はポインタだよな。 (公式な使い方かどうかは知らんが。)
今でこそポインタだけど、WIN16の頃はそーでもなかった、 みたいな話がまたぞろTheOldNewThingsのあたりから・・・
ポインタにせよ整数値にせよ、なんらかの識別子という意味では同じなんだし OS側でちゃんと処理されてるんなら気にする必要は無いやね 失敗時は NULL だったり INVALID_HANDLE_VALUE だったりで紛らわしくて気持ち悪いけど
GetModuleHandleの返り値を隠蔽されたものでなく モジュールを指すポインタとして使いたいときがあるって 話なんだって。
PSAPIのGetModuleInformationを使えばいい。
>>698 俺は
>>690 じゃないが。
1、元となるhBitmapをDC1に関連付ける。
2、分割サイズのBitmapを作って、そのハンドルをDC2に関連付ける。
3、DC2に対して、DC1から必要領域をBitBltする。
4、分割Bitmapを所持したDC2の完成。
って言ってるんじゃ?
ファイラのようなアプリで大量の、最悪数千個位のアイコンをロードする場合 片っ端からロードして行って大丈夫ですか? 画面に表示し終わったら片っ端から捨てていったほうがいいですか? それとも100個くらいキープしておくキャッシュ機構を作ったほうがいいですか? そのあたりの方針をどうすればいいのか教えてください。
OSのアイコンキャッシュがあるから別に気にしなくても良いんでないかと思う
単純計算だと、16pxの32bppで1KB、32pxで4KB。 今の搭載メモリなら数千個保持してもまあ大丈夫なんじゃね? それよりも、表示されているアイテムのアイコンだけを 非同期に読み込むような処理が重要な気がする。
>>704 代弁ありがとうございます。
教えられた方法をとっても、黒いものが描画されるだけでした
いくら考えても良い解決策が見つかりません
「画像をHBITMAPに分割する」方法を知っている人がいたら是非教えてください
ちょっとコード出せ
FormatMessageの戻り値が1024文字超えることはありますか?
決まってないようだ だからnSizeがあるんだろうけど
>>708 提示された方法はダメって決め付けてるけど、
自分のコーディングにミスがあるとは思わないの?
とりあえず
>>709
マルチスレッドについて勉強しているのですが、 whileの無限ループの中で繰り返し1回毎に同じ関数を別スレッドで実行させたいのですが その場合は毎回CreateThreadする必要があるのでしょうか?
コードは出せないけど… @LoadBitmapでリソースから画像(キャラチップ)を読み込む AImageList_AddMaskedで透過設定しつつイメージリストを作る(このときHBITMAPが必要) B背景にごちゃごちゃ描画したあと、肝心のキャラは裏画面に一度ImageList_Drawで全体を 描画して、そこで適当な大きさ・座標で表画面にBitBltする C裏画面で透過しちゃってるから、透過されずに四角で描画されてる こんな感じの流れです 708の方法だとAがうまくいかないんです…
708を実装したときのコードがまちがってるんでねーの
>>713 俺だったら仕様を見直すかな
状況がよくわからないけど本当に必要でなければスレッドの多用は避ける
負荷が大きいからね
708の方法だとうまくいかないんじゃなくて708の実装方法を誤っているから うまくいかない、と>709とか>712とか俺は思っているんだが。
>713 スレッドプールはお嫌い?
>>710 処理系依存だがsprintf系が1024文字までだったような
>>713 その通り
でもCreateThreadより_beginthreadとか_beginthreadexの方がいいお
>>716 練習で書いてるだけかと
721 :
713 :2008/01/27(日) 23:50:36
色々なアドバイスありがとうございます DirectXを用いた3D描画なのでスレ違い気味ですが、現行ではシングルスレッドで1ループに シーン間に描画キュー→頂点座標などの変更→Presentとしていたのをどちらかを別スレッドで行って処理を最適化しようと考えていました でも出来るだけシングルスレッドでやった方がいいみたいですね
もしゲーム絡みなら、素人が手を出せるレベルの話ではない予感。 ロストプラネット関係の記事を読めば、何か参考になるかもしれんね。
>>720 _beginthreadよりはCreateThreadのほうがまだましだ。
さだまさしに見えるから困る
マルチスレッドで分散なんて、適当に処理データを分けて並列化するだけだぞ?
CRTだって最近はDLL版使う流れだから、実はあまり問題ない気もする。 DLL版CRTならDLL_THREAD_DETACHで解放できる。 Advanced Windowsあたりに載っていなかったっけ?
スレッドあたり何十バイトか漏れててもキニシナイ
730 :
704 :2008/01/28(月) 01:00:59
>>730 所有権を消すってReleaseDCとかをするってこと?
ソースがあればうれしい
>>705 Win9x だと数千個あたりからアイコンが表示されなくなる。
1画面分だけ読み込むか、アイコンの画像データをメモリにコピーして」アイコンは解放する方がよいかもね。
元ファイラ制作者より。
ファイラみたいなの作るんならシェルのイメージリスト使わない?普通。 それともシェルそのものをぶっ殺したいのかな
>>732 それの原因、昔調べた事あるなぁ。
イメージリストって内部でアイコンを連結して一枚のビットマップにして管理していて
そのビットマップの縦or横が32767を超えると、Win9xの場合int=16bitだから
CreateCompatibleBitmapなんかが失敗して管理用ビットマップの生成に失敗する。
横方向はアイコンを4列固定で作ってるみたいで、32x32のアイコンだと理論上4096個目ぐらいから
イメージリストにアイコンが追加できなくなる。
当然シェルのイメージリストでも同じように失敗する。
最大最小ボタンが「?」になったり数字になったりするバグのこと?
指定のパスのフォルダのウィンドウを開くにはどうすればできる? 例えばC:\(省略)\デスクトップ\新しいフォルダ ならデスクトップの「新しいフォルダ」 をダブルクリックして開いた状態にしたいんだけど
>>737 ありがとうございます。できました
これは他にも応用ききそうで便利だ
応用効くというか常套手段なんだが・・・
ShellExecute(Ex)でExplorer指定してパラメータにパス渡すって手もあるな。 explorer /n,/e,PATHでフォルダツリーつきにしたり。
741 :
688 :2008/01/28(月) 08:10:19
PostMessage(ウィンドウBのハンドル, 更新されたよ, 0, 0); でやってみたのですが、なぜかメッセージが受け取られていないみたいです ウィンドウBのハンドルをグローバルにしてみたり SendMessage((HWND)FindWindow("ウィンドウBのクラス名",NULL),更新されたよ,0,0); でやってみてもだめでした ウィンドウBのハンドルの取得方法が間違っているのでしょうか?・・・
742 :
688 :2008/01/28(月) 08:29:04
書き間違えました・・・ PostMessage((HWND)FindWindow("ウィンドウBのクラス名",NULL),更新されたよ,0,0); でした
実際のコードを貼らない理由は何?
考えられる理由 ・ポスト先のウィンドウのメッセージキューが詰まってる ・ポスト先のウィンドウがメッセージを潰してしまっている ・メッセージが届いてない
・メッセージループが回ってない
FindWindowの結果がNULLかどうかくらいチェックしようぜ。 あとHWNDが戻り値の関数なのにキャストしてるのは何で?
>>742 PostMessage((HWND)FindWindow("ウィンドウBのクラス名",NULL),更新されたよ,0,0);
これのコンパイルが通らないけどなんで?
> test.c(5) : error C2018: 文字 '0x8d' は認識できません。
> test.c(5) : error C2018: 文字 '0x90' は認識できません。
つー冗談はさておき、FindWindowとPostMessageのエラーチェックとLastErrorぐらい調べてから書けよ
Spy++とか使えば
>>747 まさかとは思うが、「更新されたよ」が剥き出し(=""で括られていない)って落ちじゃない……
いや、SJISで「更」の1バイト目は0x8dだからそのまさかか……
マジレスとネタレスくらい区別しような
751 :
678 :2008/01/28(月) 15:03:51
質問です。ダイアログのボタンから、メニューウィンドウを同時に2つ出したいのでが、
確かに2つ出るのですが、同じウィンドウになってしまいます。
どうしたら良いですか?
>>679 >ウィンドウを出してる部分のコードさらせ
異なるリソースIDは付けています。
です。ソースコードを晒せと言う事なので、
関係する所を晒します。
752 :
678 :2008/01/28(月) 15:04:42
WNDCLASS wc; WNDCLASS wc2; wc.style =0; wc.lpfnWndProc =WindowProc; wc.cbClsExtra =0; wc.cbWndExtra =0; wc.hInstance =hInstance; wc.hIcon =LoadIcon(NULL,IDI_APPLICATION); wc.hCursor =LoadCursor(NULL,IDC_ARROW); wc.hbrBackground=GetStockObject(LTGRAY_BRUSH); wc.lpszMenuName =MAKEINTRESOURCE(IDR_MENU1); wc.lpszClassName="MainWindowClass"; return 0; hwnd=CreateWindow( "MainWindowClass", "Chapter6", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance, 0); if(hwnd==NULL) return 0;
753 :
678 :2008/01/28(月) 15:05:37
hInstance2=hInstance; wc2.style =0; wc2.lpfnWndProc =WindowProc2; wc2.cbClsExtra =0; wc2.cbWndExtra =0; wc2.hInstance =hInstance; wc2.hIcon =LoadIcon(NULL,IDI_APPLICATION); wc2.hCursor =LoadCursor(NULL,IDC_ARROW); wc2.hbrBackground=GetStockObject(LTGRAY_BRUSH); wc2.lpszMenuName =MAKEINTRESOURCE(IDR_MENU2); wc2.lpszClassName="MainWindowClass"; wc2.lpfnWndProc =WindowProc2; hwnd2=CreateWindow( "MainWindowClass", "Chapter6", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance2, 0); if(hwnd2==NULL) return 0; if(RegisterClass(&wc2)==0) return 0; ShowWindow(hwnd,CmdShow); ShowWindow(hwnd2,CmdShow); UpdateWindow(hwnd); UpdateWindow(hwnd2);
馬鹿者www 圧縮してアップローダーか何かに上げんかいwww
メニューウィンドウとか同じウィンドウになる、のところがわからん。 そのコードで再現可能?
756 :
688 :2008/01/28(月) 15:15:26
さすがにそれはないです・・・ しっかり定義してます と言いたいところですが、、、 #define UPDATE WM_APP+1とすべきところを #define UPDATE 適当な数字としていたのが原因でしたorz ネタと思われても仕方がないですね;; お手間をとらせてすいませんでした。
ちょwww
異なるアプリケーション間なら、RegisterWindowMessage()が望ましいがな。
質問する奴ってプログラミング初心者っていう以前に2ちゃんねる初心者が多いな
760 :
714 :2008/01/28(月) 22:24:35
730で丁寧にもexeで作ってくれたので、実際に言われたとおりに 所有権を消しつつ、コードを作ってみた。 hbit=元画像 chara=イメージリスト hdc=BeginPaint(hwnd,&ps); hdc2=CreateCompatibleDC(NULL); hdc3=CreateCompatibleDC(hdc2); hbit2=CreateCompatibleBitmap(hdc3,32,45); SelectObject(hdc2,hbit); SelectObject(hdc3,hbit2); BitBlt(hdc3,0,0,32,45,hdc2,0,0,SRCCOPY); DeleteDC(hdc3); ImageList_AddMasked(chara,hbit2,RGB(145,210,255)); ImageList_Draw(chara,0,hdc,0,0,ILD_NORMAL); しかしながら、未だにプログラムは成功しません。 かなりしつこいようですが、どうしても作りたいので 迷惑だと思いますが、誰かご教授お願い致します。
SelectObjectjの返値を無視しちゃう奴は、 GDIオブジェクトリークの刑であります。
>>760 一つだけ言えるのは、現時点での君のスキルでは無理ってこと。
どうしても作りたいならスキルを磨いてからに汁
763 :
714 :2008/01/28(月) 22:53:57
戻り値を受け取って、元のオブジェクトに戻しましたが、 やはり結果は変わりません どうしてでしょうか??
/ ))) / /// /―――-ミ / 彡彡 // / ヽ)) / 彡彡 iiiiiiiiiiiiiii iiiiiiiiii| / 彡彡 < ・ > 、<・ >l / | ヽ 〉 / ( | | __) | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ / | ≡ /, ――― |ゝ < 馬鹿にWin32APIを触らせるな! / | | L ___」 l ヾ \_________ _ミ l ______ノ ゞ_ | l ヾ ー / | l | | \ー ‐/ | |
イメージリストなんて使わず自分でスプライト処理ぐらい書けや
みんなインストーラってVSではなく他のソフトで作ってるの? そろそろインストーラ作ってみたいと調べてみたけど他の人が作ったソフトを 利用して作る方法しか載ってない…
VSのmsi生成は、なんつーか、今ひとつだからなー。
URLで示されたWEBサイトをローカルのファイルに保存するっていう関数があったように思うんですが だれか知りませんか?
urldownloadtofileとかいう奴だと思う
771 :
704 :2008/01/29(火) 00:28:44
>>760 既に
>>761-762 で言われてるけど、作ることに執着する前に、
構想を実現するだけのスキルを先に身に付けた方がいいと思う。
GDIオブジェクトの後処理とかは基本的なことなので、
その辺が理解出来てないとなると、今後もトラブルになりそう。
>>730 で言った"所有権を消滅"というのは、
DCを削除するのではなく、別のBitmapを所有させるということ。
新たに所有させるBitmapはDC作成時に初めから所持していたもの、
すなわち現Bitmapを所有させた時の、SelectObject()の戻り値が適切。
その後に不必要なDCを削除するのは言わずもがな。
それでも成功しないというのは、他にも問題があるから。
hbit2=CreateCompatibleBitmap(hdc,32,45);
これで、黒く描画されることなく、希望通りになるはず。
WM_PAINTが来ないときに GDI使って画面描き換えるのは禁止ですか? 1秒間に60回とか
ビットマップを読み込んでそのサイズにWindowをリサイズし、BitBltで表示する関数(RBF関数)を、WM_PAINTの中に入れていたのですが、 PAINTをそこそこの頻度で呼んでいたので「毎回ビットマップを読み込むのは頭悪いなぁ」と思い、PAINTの中のRBF関数をBitBltに替え、 GetSaveFileNameを使ってビットマップが選択された時だけ、RBF関数を呼び出すようにしました。 すると、今まで上手く動作していたのにいきなりBMPを選択してもWindowがリサイズされるだけでビットマップが表示されなくなりました。 PAINTの中で読んでいた時もGetSaveFileNameでファイルを選択できるようにしていたので、GetSaveFileNameが原因ではないはずです。 DeleteDC、DeleteObjectもきちんとできているはずなのですが・・・ なんどソースを見返しても原因が分からないのですが、何が問題か分からないでしょうか?
別に書き換えたっていいけど更新が必要になった時点でWM_PAINTが来るし 来ないならバックグラウンドで書き換える意味がないと思う WM_PAINTを定期的に発生させるほうがいいんじゃないの?
>>772 書き換えてもいいけど、普通はInvalidateしたりして、WM_PAINTが来るようにする。
>>772 書き換えても良いよ。毎秒20回でもそこそこスムーズに見えるよ。30回もあれば十分。
同じものを表示し続けるのに書き換えなんて必要ない。
DirectXだと普通にやってるけどな>必要のあるなしにかかわらず書き換え
それは必要があるから更新内容がなくても更新してるんだと思うが
タイミングをとるためとか?
OpenGLでの描画は、WM_TIMERだな あとPeekMessageでデッドタイムに描画するとか(コレは俺は嫌い)
InvalidateRect(hwnd, NULL, TRUE);を一秒間に20回もやると、パチクリしまくりング
アニメーション表示だろ。 Invalidaterectはアニメーション表示には不向きだろ。 普通はダブルバッファかな。
メニュー項目を選択して、ダイアログボックスなんかを出すと WM_KILLFOCUS と WM_ACTIVATEなんかはどういう順番で送られてくるの? どっちも処理するってのはお勧めできない方法なんでしょうか?
____ / \ / _ノ ヽ、_ \ / o゚⌒ ⌒゚o \ 今日もまた、誰も呼んでないのに | (__人__) | 60fpsで描写する仕事が始まるお… \ ` ⌒´ /
つ[Spy++]
ChooseColor関数で表示する色の変更コモンダイアログボックスのタイトルの変更ってできないですかね?
ChooseColorを呼ぶ前にWH_CBTしといてウィンドウ生成を捕まえる
ゲームじゃね?
はぁ?
WH_CBTをきちんとComputer Based Trainingのために使ってるアプリってあるのかね?
>>792 そういう目的ならWH_JOURNALPLAYBACKも一緒にインストールしろって事だろ
フックプロシージャでできないか
WM_MOUSEWHELLにおけるHIWORD(wParam)が正の値にしかならないんだが if(HIWORD(wParam)<0)って比べ方は間違ってる?
Use the following code to obtain the horizontal and vertical position: xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);
>>771 言われた通り、hbit2の第一引数をhdcにしたところ
正常に画像が描画されました。本当にありがとうございます!
また、762や764のおっしゃる通り、自分がいかに勉強不足だったか
ということを深く痛感致しました。
一から勉強し直します、迷惑をおかけし申し訳ありませんでした。
しかしこういう板って敬語を使うべきか迷う…
>>797 間違ってるぞ。
GET_WHEEL_DELTA_WPARAM(wParam)だよ。
つまり、((short)HIWORD(wParam))
800 :
704 :2008/01/29(火) 22:36:19
>>798 成功したという結果に満足して終わるのではなく、
ちゃんと理由を理解した上で、今後に活かして下さいな。
HWNDから実行ファイルのフルパスを取得したいのですが、 そのようなことができるAPIってありませんか?
>>801 GetWindowThreadProcessId→OpenProcess→NtQueryInformationProcess→ReadProcessMemory
とか言ってみる
>>796 HIWORDで得られるのは符号無しなんだから、正の値にしかならんわな。
>>802 おかげで、なんとかなりそうです
ありがとうございます!
GetWindowModuleFileNameは違う?
>>805-806 なんとかなりそうと言った手前、実装できませんでしたとは口が裂けても言えなくて
txtからコードを引っこ抜いて移植したところ、思ったとおりの動作をしてくれました
本当にありがとうございます
>>807 レスありがとうございます
そんな素敵なAPIあったんですね
ただ、ちょっと試してみましたが、どうやらEXEだけでなく、DLLも拾ってしまうようで・・
またそのようなことがしたくなったときに、使ってみます
809 :
773 :2008/01/30(水) 00:45:25
GetWindowThreadProcessIdの後はToolhelp32かPSAPI使ったほうが楽
>>809 原因が分からないとか言う前にデバッガで追えよ。
追ってみたら簡単に判明するじゃないか。
表示されない=WM_PAINT内のBitBlt()が失敗しているってこと?
なら失敗した原因は何?もしかして不正な引数があるから?
・・・とか、そういう風に手順を追って確かめてはみないのか?
それはそうと、猫を参考にしたようなソースだな。
必要以上にグローバル変数はあるし、基本設計からやり直した方が良いと思うが。
今回のバグは、これに起因する訳で。
デバッガって使い方わからん 訳ワカメなアセンビリの記号みたいな羅列みせられたって分かんねーよ、ってのが初心者の俺の叫びです
使ってるデバッガは何かわからんけど Visual Studio であれば、 デバッグ開始すると、なんか謎のウィンドウがたくさんでてくるよな。 "ウォッチウ", "自動変数", "ローカル", "コマンド ウィンドウ" とか。 「デバッグ」メニューには "ステップイン", "ステップオーバー" とか出てくる。 これらを MSDN で調べれば何をするものかわかろう。 他のデバッガでも同様のステップを踏めばわかってくるだろう。
それ以前にGetLastErrorシヨウヨ
デバッガが使えるのと使えないのでは、糸電話と光ファイバーくらい違うから デバッガの使い方を解説してる本でも買った方がいいかと。
>>812 それは実際にアセンビリを読んでいるのだろう
アセンビリかよ
>>812 LSIC-86 の時代からデバッガーなんぞ使ったことがない。
全部自分で欲しい中間状況は、printf() で取る。
変なトレースは繰り返しのときはかえって不便。
以前は、DrWatson が逆アセを出してくれていたけど最近は
出なくなって不便。
DLLで動的にポップアップメニューを生成しているのですが、 グローバル変数にHMENU g_hPopupMenuを置き、#pragma data_segで囲っても、 なぜかリセットされてしまいます DLLでの値共有にはファイルマッピングオブジェクトを使用するしかないのでしょうか?
アッセンビラーと聞いて VisualStudioならF10ポチポチ押してステップ実行すりゃいいよ
シンタックスハイライトってどうやって実装するんだろう。
>>819 メニューハンドルってプロセス跨いで使えたっけ?
>>821 リッチエディットでも使ってフォントと色変えればいい
予約語の登録はパターンマッチでも使って自力でやれ
グローバルフックを特定プロセスでだけ無効にしたい場合に DllMainで自プロセス名を見る→DllMainでFALSEを返す(ロードさせない) という実装は正当?
実行されている時点でロードは完了しているんだが・・・
827 :
819 :2008/01/30(水) 14:15:20
#pragma comment(linker, "/section:MYDATA,rws")
で共有セクション設定してないだけでしたごめんなさいごめんなさい
>>822 なんか問題なく表示できてます
HMENUとか共有使ったの初めてだからよくわからないけれど・・
というかカーネルオブジェクトハンドル以外はプロセス跨げないんじゃ
>>826 正当性はわからんが、DllMainを失敗させればフック自体は無効になるんでは?
Direct3Dに使うウィンドウはWM_ERASEBKGND呼ばれますか?
ここで聞くことを調べることだと勘違いしてないか?
聞いたほうが速いだろ
返事待つより自分でやってみたほうが早そうな
わからないなら黙っていろよ。お前らに質問を邪魔する権利はない。
いいから早く答えろよ
「表現の自由」という権利があるもん
自己解決しました、ありがとうございました。
-――――- 、 '": : : : : : : : : : : : : : : : :丶 /: : : : : : : : : : : : : : : : : : : : : : :\ /: : : : : : : : : : : : : : : \: : : ヽ: : : : : :ヽ /: : : :./: : |: : : : : : : ヽ: : : :\ : : : : : : : : : : . _ _/ : : /: : l : : :l : :.|: : :{ : :.:|\:__: :ヽ: : :.<\/ 〉: ヽ ` /.: : : :| : : |: : : |: :j:l : : |\':l ̄\. :!ハ: :|: :\ く: : : ヘ |: :/: : | : : レ'⌒l: :八: : | ヾ ヽ| |.:l: : //\>. :│ l: :! : : | : : |:.{ィてヘ \l __ j/: :</: : : : : :.:トヽ l:/! : : | : : lVハi:::::ハ 〃 ̄ ` /: : : : : : : : : :.l:| l:∧ : :lヽ :ヽ ! Vr圦 /// /: : : : : : : : : : : リ \∨ハ:\ ゞ'´ ' _ /: : /: :/: :∧: / f゙ヽ /: : : j:∧ ∨) ∠: :./l: /イ : :/ V | }. 厶-= ア: : ゝ イ_/^l |/ 宿題だよ♪ /ヽ |/^) l: /V!: :/二7 弋r< 人 ヘ __/ ヽ| l / '´ V/::::/{__/_j:_xj / /:::::::::>, (_ _ ヽ ノ } /7::::::// ヾル' レ' /::::::::::/^\ ヽ ヽ ノ //::::_// //| /::::::::::/ / ヽ \ /ヘ /l ヾ_:: ヾ、_ //l | 「:::`ヽ〃 / l ∧/ ヘ { :| /::/O::::://::l├┴―-{{. / | rく/ ∧ / /::/:::::::::〈/::::Ll:::::::::O::/:|ヽ∨ │ \ / ∧. / {:::{ :::::::::::::::::::::::::::::::::::/:: | ∧ ハ
Sleep(INFINITE); って使い道あるのかね
あるよ。
お前を一生眠らせる効果があるんだ
WaitForSingleObject(GetCurrentThread(), INFINITE); って使い道あるのかね
>>841 自スレッドでは見た目上の無期限の間停止させておいて、
他のスレッドからそのスレッドをSleepから回復させるという
>>826 >>830 が正しい
普通はロードされても機能しないように実装すればOKだと思う
どうしてもというのならDllMainでCreateThreadしてその中でFreeLibraryAndExitThreadを撃てばアンロードはされる
ただし、フックでロードしたDLLをFreeLibraryするという事実がどう影響するかは知らない
> DllMainでCreateThreadして > DllMainでCreateThreadして > DllMainでCreateThreadして
DLLMainではやっちゃいけない事が色々あってだな
846だが何かまずい?
orz レスのタイミングかぶった これってスタティックリンクの場合、APIが依存するDLLをまだロードしてない可能性があるのでアクセス違反が起きますよー って理屈ではないの?
DllMainでCreateThreadとかフックDLLをFreeLibraryとか言っちゃうゆとり世代はWin95で開発してみればいいと思うw てかXPSP2とかVISTAとかで自作ソフトが誤動作してキレるのって大抵そういう輩だからなー
ゆとり世代はWin95のとき生まれてないだろwwwwwww
ゆとり発見
グローバル領域で LPSTR *test; int count; 関数内{ count=確保する数; test =new LPSTR[count]; } 他の関数{ delete[] test; } とするとコンパイル時はエラーでないですが、実行するとdeleteしたところで アクセス違反のエラーがでてしまうんですが何故でしょうか? _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)); というところでエラーが でてしまいます。 test =new LPSTR[count];した関数内でdeleteしたらエラーはでないんですが
>>807 そいつはNT系だとプロセスをまたいでは機能しないという問題があったような
858 :
846 :2008/01/31(木) 00:26:52
番号振るのでうzって人はNGしてください DllMainでCreateThreadがまずいのは、 1.DllMainはシリアライズされる 2.CreateThreadはDllMainが制御を返さないと完全に開始しない(これはDisableThreadLibraryCallsを事前に使っていても同じ) 3.なのでDllMainで2.のスレッドでWaitするとデッドロックする これがひとつ、拙い原因なのは解りました。 もうひとつがたぶん、 >アタッチの際、開発者が作成した DLL エントリポイント関数の本体は、スレッドローカル記憶域(TLS)の作成、 >オブジェクトの作成、ファイルのオープンなど単純な初期化作業だけを行うべきです。 のくだりで、その根拠としてLoadLibraryの問題を挙げているのですが、これは >システムが自らの初期化コードを実行する前に使われる DLL で、このような不適切な呼び出しが発生する可能性があります。 のとあるので、フックのように動的にリンクされるDLLは当てはまらないのではないですか?
859 :
773 :2008/01/31(木) 00:30:01
>>811 これを機にデバッガを使ってみました
これでまた一つ賢くなれました
ありがとうございました
>>859 でもWM_PAINT以下のデバッグって結構面倒なんだよな
ブレークポイント抜けたら、またWM_PAINTが飛んできてブレークポイントで止まったりとかw
デュアルモニタ環境とかにすればいいのかも
テキストボックスから指定の行の文字列を取り出すのってどうやるの? SendMessage(テキストボックスのハンドル,EM_GETLINE,取り出す行数,"ここがよく分からない"); 調べたら「文字列を格納するバッファ」と書いてあったのでLPSTR型の変数を 入れてみたりもしたけどエラーでてしまう…
>>861 バッファの先頭WORD(16bit)に、TCHAR単位でのバッファサイズを入れておく必要がある。
エディットコントロールのメッセージではたまにあるパターンなので覚えておくこと。
WORDってことは64KB以上の行は途中で切れるのかな
65536文字超える行ってすごいな
>>862 ありがとう。バッファサイズを入れてから入れないといけないのね
調べてやってみたけどやっぱり上手くエディットボックスの文字が入ってくれない
勉強しなおしてきます
アホ丸出しな質問かも知れんのでスマンけど MCIでmp3を再生させてるんすけど、mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mop);てな感じで・・ これでも問題なく動くんですが、ファイル名に「〜」ていう文字が入ってると、エラーが起きるて再生できないんす。 一応mciGetErrorString関数でエラーの内容を表示させると、「MCIの初期化で問題が発生しました。」ってなってます。 なんでですやろ?wmpやその他のメディアプレーヤーでは再生できるんですが。
>>865 windowsx.hをインクルードしてEdit_GetLineマクロ使えよ
> Edit controls: The copied line does not contain a terminating null character.
マジカよ・・・つーか何だその設計w
868 :
866 :2008/01/31(木) 09:13:45
866っす。 ちなみにANSIビルド、UNICODEビルドでも同じ症状です。 ファイル名はGetOpenFileName関数でダイアログを出して取得してます。 MCIって、ファイルによって再生完了後のMM_MCINOTIFYメッセージの内容(wParam)が MCI_NOTIFY_ABORTEDになってたりするんですが、これも何でかわかりません。 MCIって邪道なんでしょうか・・・
自分が使いこなせないものはバグがあるか邪道に決まってるよな
PCの時計を設定するAPIって何でしょうか?
SetLocalTime
>>860 っAeroGlass
逆にWM_PAINTがなかなか飛んでこない(リサイズか最小化する必要がある)
>>872 レイヤードウィンドウにすると2000/XPでもそうなるよ
ドキュメントにそれらしき記載が見つからなかったので教えてください。 あるウィンドウが、WM_hogehogeの処理で非常に時間のかかる処理を行っていたとします。 その途中で、別スレッドがそのウィンドウに対してWM_nantokaを送った場合、そのメッセージ 処理はどのように動くのでしょうか。 1. WM_hogehogeの処理と別のスレッドでWM_nantokaを伴ったウィンドウプロシージャが呼び出される 2. WM_hogehogeの処理が終わるまでSendMessageがブロッキングされる
876 :
875 :2008/01/31(木) 15:52:44
書き忘れましたが、WM_nantokaを送る方法はSendMessageです。
877 :
875 :2008/01/31(木) 15:54:47
一応自前調査も書いておくと >>複数のスレッド間で送信されたメッセージが処理されるのは、受信側スレッドがメッセージ取得コードを >>実行したときだけです。送信側スレッドは、受信側スレッドがメッセージの処理を終えるまで、ブロック >>されます(待機状態になります)。 とのことなので2.だろうとは思うのですが。
例えSendMessageだろうと、いったんメッセージキューを経由する。 つまり受け取り側がGetMessageを呼ばない限りブロックされる。
>>875 3.
WM_hogehogeの処理が終わるまでWM_nantokaの処理がブロックされ、WM_nantokaの処理が終わるまでSendMessageがブロックされる
フォルダの作成日時を得るにはどうしたらいいの。
なんか最近似たような質問が多いなあ
>>881 GetFileTime
ブロックされるからPostMessageで投げるんだ
SendMessageTimeoutはマイナーAPI ?
IsHungAppWindowの方がマイナーだと思う
ほんとにマイナーAPIというか隠しAPIだな
大好きなあの子を振り向かせるにはどうしたらいいの。
C++ならfriend指定すればおk
C++のfirendは相手にprivateな部分をみせるだけ つまりあの子にちんこ晒す事ができるだけ
じゃあファイルマッピングでstd::mapを共有するにはどうしたらいいの
continueで人生をやり直したらおk
ごめんちょっとふざけた data_segだとSTLクラスの共有はできないと知ってファイルマッピングでやってみようと思ったんだけど、 std::map<int,char*>* hoge = MapViewOfFile(g_hFMhWndMap , FILE_MAP_ALL_ACCESS , 0 , 0 , 0); hoge = new std::map<int,char*>; でマップ作っても次アクセスするとエラーが出るんだ
std::mapのアロケータも指定して、ファイルマッピングから 確保するようにする。別のプロセスでも、同じ仮想アドレスに マッピングされるように工夫する、といけるような気がする。
そこはplacement new使うとこじゃね
>>893-894 ありがとう、やってみます
placement newとかはじめて知った・・奥が深い
waveIn系で複数サウンドカード対応出来た奴いる? (俺の環境はCreativeとHD Realtek) ノイズ混じるかいきなりWIM_CLOSE送られるかで散々だ。 規定のデバイス使う分には問題無いんだけど それ以外の使うとボロボロだよ 助けてママン
>>895 お互いまったく同一のSTL実装じゃないとダメだよ。
馬鹿な私にインスタンスハンドルとはどういうものか教えてください インスタンスハンドルを必要とする処理(ウィンドウ生成等)が含まれるプロシージャ内で static HINSTANCE hInst; case WM_CREATE: hInst = ((LPCREATESTRUCT)lParam)->hInstance; ボタン生成; と記述してボタンが押されたら新規ウィンドウを生成するプログラムなんですが hInst=〜;が邪魔と言われてコメントアウトすると正常動作するのです 中身を定義しなくても正常動作するのが不思議でならないのですがどうしてでしょうか?
>>898 たぶんインスタンスハンドルの知識は必要ない。
C/C++が理解できていないだけ。
900 :
896 :2008/02/01(金) 08:23:35
あれ?起きたら直ってた・・・ いろいろいじくったし俺の環境限定だったのかな? すまん忘れてちょ
質問です。 別のプロセスによってロックされて読み込み実行中のファイルを、 実行中に別のファイルとすりかえる機能を実現したいのですが、 具体的にどうすればよいのでしょうか?
>>902 やっているソフトがあるのでできるはずです。ですが、方法が分かりません。
通報しました。
>>904 ウイルスではありません。
真っ当なソフトです。
真っ当な方法では無いだろうな。 簡単にできたら問題だ。
具体的にソフト名は何よ 実現できてもカーネルドライバのレベルだと思われる
やろうと思えば普通にフックで実装できるよ。 適当なことを書いて誤魔化さないでくださいね。
お前らこの程度の事もできないのか?どんだけゆとりなんだよ!
外部からコードを注入するだけならフックで可能だが プログラム全体を完全に入れ替えるのは無理だろ 注入じゃねえぞ。「すり替え」だぞ
>>907 Process Explorerというソフトです。
>>912 それがやってることと君が言ってることは別の事なんだよ
>>913 そうなんですか・・・
では、ちょっと視点を変えてみます。
別のプロセスでロックされたファイルにアクセスするにはどうすればよいでしょうか?
>>912 Process Explorerでできるのって、そのプロセスが開いているファイルハンドルを強制的に閉じることだけじゃない?
「すり替え」なんて機能はProcess Explorerに無かったと思うけど。
という事にしたいのですね:-)
ここの人には簡単すぎてあくびものの質問かもしれないけれど、 WM_USER使って作ったメッセージをSendMessageやPostMessageで送る場合、 第2引数と第3引数のWPARAM、LPARAMには何入れてもいいの?
921 :
919 :2008/02/01(金) 16:11:16
ありがとうございます
922 :
デフォルトの名無しさん :2008/02/01(金) 17:00:05
デスクトップのスクリーンショットをbmpに保存するには、 どうしたらいいのでしょうか?
924 :
デフォルトの名無しさん :2008/02/01(金) 17:06:49
キーボードのPrtScのボタン押す。
デスクトップのDCを得て、デスクトップのサイズでBITMAPを作り メモリDCに選択してデスクトップのDCからBitBltして DDBをGetDIBits等でDIBに変換してファイルに保存 って今はもっと簡単なやりかたあるかな?
画面サイズのDIBSectionをCreateしてBitsにアクセスしながらファイルに吐き出したらいいんじゃないかな ていうかこのスレこんな質問の仕方でも真面目に答える人多いのな
こういう質問の仕方をする場合、大抵GDIの扱い自体を知らないから、
>>925-926 みたいなヒントを貰っても理解出来ないんじゃね?
理解できなきゃ調べろ、でOK。 少なくとも具体的な方法は教えてもらったわけだし。 方法がサッパリ判らない状況よりは大分ましになっただろ。
LoadLibraryでもらったHMODULEはCloseHandleで開放できますか?
何のためにFreeLibraryがあると(ry
敢えてFreeLibraryを使わず、CloseHandleで開放できないかって聞いてるんじゃまいか?
ATLのCHandleをつかいたいのです。
あんな程度のラッパなら、CLibraryでもCDllでもすぐ書けるだろ。
int i; int * pi; i=10; pi = &i; ってやるとエラーが。 なんでintのアドレスがintのポインタに入らないんでしょうか?
スレ違いです
>>934 普通にエラーでないし文法的な問題はない。
スレ違いだからこれ以上は書かないでね。
>int i; >INT_PTR * pi; > >i=10; >pi = &i; > >ってやるとエラーが。 どうでもいいが、これならスレ違いではないかもなw
0を入れるとS_OKみたいな エラーの名前が出てくる関数はないですか?
FormatMessage
DXGetErrorString9
>>914 Volume shadow copyのことかな?
さすがにそんな事は聞いてないだろ
MSDNライブラリに cchSize is the number of characters とか書いてある場合、 「文字数」と訳せるけど、サロゲートペアの場合は2つのTCHAR(WCHAR)で1文字という計算になるの?
WinAPIの関数を逆引きできる本かサイトあったら便利なんだけど、何か無いですか?
www.google.com
そのあたりの文字数は、要するにWCHARの数のこと。
第一条 機動刑事ジバンは、いかなる場合でも令状なしに犯人を逮捕することができる 第二条 機動刑事ジバンは、相手がバイオロンと認めた場合、自らの判断で犯人を処罰することができる (補足)場合によっては抹殺することも許される 第三条 機動刑事ジバンは、人間の生命を最優先とし、これを顧みないあらゆる命令を排除することができる 第五条 人間の信じる心を利用し、悪のために操るバイオロンと認めた場合、自らの判断で処罰する事ができる 第六条 子どもの夢を奪い、その心を傷つけた罪は特に重い 第九条 機動刑事ジバンは、あらゆる生命体の平和を破壊する者を、自らの判断で抹殺することができる
で?
あれくまたんありがとーーーーー>< 私女だけど今度カレー作りに行ってあげるよ
誤爆☆
timeSetEvent()使って10ms周期に決まった処理させてるんですけど PCに負荷かけて10ms周期だと処理が間に合わなくなった場合、タイマってどう動作するんですか? 間に合わなかった場合その周の処理は破棄されるか、数ms遅れでも実行されるかのどっちかだと思うんですけど…。
954 :
デフォルトの名無しさん :2008/02/02(土) 23:53:02
OSによる。
NT系統は、平均発生数を満たすように、 遅れて連発実行される、ってどっかで聞いた。
LPSTRってchar*のポインタ演算や*test='a'みたいな変更出来ない版? 参考書見てもcharやTCHARで済ましててLPSTR使ってないからどういう時に使えばいいのか わからないんだけど、例えばどういう風に使うものですか?
ファイルをコピーするときのバッファサイズを設定する方法ってWin32APIの中にありますか?
>>956 参考書順繰りに読めよ
LPSTRをcharやTCHARで済ましてるって所が全てを物語ってるだろ
つーか、LPSTRってchar*のtypedefだし。
>>956 LPSTRって何をtypedefしたものか知ってる?
さらにLPCSTRやらLPTSTRやらLPCTSTRやら色々あるけど
その中の「C」「T」「LP」が何を意味しているかも。
961 :
960 :2008/02/03(日) 00:35:31
先に答え書かれてたorz
LPはロングポインタ Cはコンスト TはUNICODE STRは文字列 でおk?
LPSTR : long pointer to string LPWSTR : long pointer to wide string LPTSTR : long pointer to text string LPCSTR : long pointer to const string LPCWSTR : long pointer to const wide string LPCTSTR : long pointer to const text string
Tはテキストか
ロングって何がロングなんだろ、って人もいるのかね。 最近は 64 ビット環境があるからそうでもないか。
時々WPARAMとLPARAMについて質問が出るな
もう Word サイズじゃないのに WPARAM
ありがとうございます。LPSTRってchar型のポインタの構造体なんですね 未だにどういう時に使うのか分からないけどとりあえず解決しました
どこから構造体が出てきたんだw
char型のポインタの再定義をしてるのか! やっと分かりました。ありがとう
SZ
char *p; LPSTR lp; と宣言したとすると*をとった「p」と「lp」が同じ意味 *lpとするとポインタ演算も一文字単位の代入もできる
ボタンにアイコンを描写したくていろいろ調べた結果 ボタンにメッセージを送れということで リソースにボタン(アイコン表示チェックボックスチェック)とアイコンを作ってWM_INITDIALOGで ::SendMessage(GetDlgItem(hWnd, IDC_BUTTON1), BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetDlgItem(hWnd, IDI_ICON1)); とやったんだが出ないのはなぜでしょうか? VC++ 6.0, OSはXPです。 何が間違っているかさっぱりなので誰か指摘お願いします。
描写とか言っちゃうプログラマって・・・w
いいからさっさと教えろよ
お前がさっさと教えろよ
GetDlgItemでアイコン取れんの?
HWND GetDlgItem(HWND,int); ~~~~ (HICON) SendMessage(GetDlgItem(hWnd, IDI_ICON1),BM_GETIMAGE,IMAGE_ICON,0);
&rha
通知領域のアイコンをクリックしたときにメニューを表示させたいと思っています。 下のようにメニュー項目の1個がサブメニューを持っていて、 項目A 項目B --> 項目D 項目C 項目E 項目F こんな感じで、項目ABCは固定の文字列で、DEFはそのつど変わる感じなのですが。 これを作るとなると、ABCも含めてInsertMenu()あたりを使わないと実現できないのでしょうか? できれば固定のABCはリソースファイルで持っておけたらいいなと思うのですが
982 :
981 :2008/02/03(日) 22:54:32
orz.. こんな感じのを書きたかった。 A B → D C E F
983 :
デフォルトの名無しさん :2008/02/03(日) 23:06:48
CreateWindowで指定するウィンドウサイズは、 タイトルバーやウィンドウの縁の幅も含んでいるのでしょうか?
>>981 ABCはリソースでできるでしょ。
「いいなと思うのですが」なんて言わずに
実際やってみればいいのに。
〜皿 只只 只只只只 只只 只只只 | 凸
DrawTextで最初の が表示されないですが。 どうすればそのまま表示できますか?
988 :
デフォルトの名無しさん :2008/02/03(日) 23:50:59
証券会社が作ってるソフトがあって、 それに自動ログインさせるソフトを作ろうとしてます。 ログインID [ ] パスワード [ ] OK みたいな画面です。 「ログインID」って文字列はspy++で見たところ、 staticだったのでFindWindowでウィンドウハンドルを取得して、 書き換えることが出来たのですが、 その横のEditの部分のウィンドウハンドルを取得することが出来ませんでした。 どうすればいいのでしょうか
>>989 やりたい事はウィンドウハンドルを取得して、文字列を突っ込みたいのです。
ログインID [ ]
↑ ↑
Static Edit
となっていて、
「ログインID」の方のウィンドウハンドルを取得してSetTextで文字列を変更するのは出来る。
でもEditの方はウィンドウハンドルが取得出来ないので、
Editの場合は、ウィンドウハンドルを取得するのに何かコツがいるのか知りたいのです。
ダイアログボックスにエディットボックスを乗せCreateDialogで表示させた時 エディットボックスに来てるキー入力のメッセージを取得するにはどうすれば良いのでしょうか? 環境はOSがXPで、VC++6.0を使ってます m(_ _)m
WM_INITDIALOGあたりでEditBoxをサブクラス化すれば。
GetWindowText GetDlgItem
>>990 spyでウィンドウハンドル取れないなら、自前で取れる気がしないな。
子ウィンドウ含めて取れるだけのウィンドウハンドル取ってみて、
セットテキストしてみて調べる。
それでもダメだったらSendInputぐらいしか思いつかない。
マルウェア対策で疑似Editを自作してるのかもね。
>>968 64bit環境のWPARAMは64bitだな。
WPARAMにポインタを入れてるメッセージがあるから
時期も時期なので、次スレ立ててきますね。
手伝ってあげないんだからね!
ツンデレキター
カレーに1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。