スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
∧_∧
( ´∀`) < ぬるぽ
過去スレ、関連リンクは
>>3くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう
・日本語版MSDN Online Libraryは不完全です。英語版(
http://msdn.microsoft.com)の利用推奨
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__∧∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>1
急速にスレの質が低下してまいりました
Advenced Windows
10 :
前スレ796:2005/04/30(土) 05:04:12
>>797,
>>798 ご紹介のページを参考に、ReadProcessMemory()で、ゲームの、デフォルト?セグメントにはアクセスできましたが・・・
アク禁のエリアが所々あって、適当なアドレスでアクセスしようとするとすぐ不正な処理エラーが出ます。
それと、やはりプログラムが取得したセグメントは一般には一つではないですよね・・・
やはりOSのメモリ管理情報からこうした情報を取得しなければならない、と思いますが・・・
色々実験したところ、プログラムの起動直後には、レジスタFSに、何かの管理情報が書いてあるセグメントがセットされているようですが・・・自分のじゃないので簡単にはとれないし・・・
>>10 だからして俺はXPが出たあとでもMEを使ってる時代があった
NT系は堅い
>>前スレ796==チートツール作り
だろ。相手にすることないよ。
13 :
前スレ796:2005/04/30(土) 10:43:11
>>12 ??前スレでも別に普通に相手されてましたが???
14 :
デフォルトの名無しさん:2005/04/30(土) 10:49:14
質問です。
シャアウェアをインストロールしたらレジスターが
書き換えられてディスクトップがぐちゃぐちゃになって、
エキスプローラでホルダーをクィックしても動かなく
なってしまいました。どうすればレジスターを修復で
きますか? ソフトはWindous95で機種はBMWの
アクティバです。接続環境はフレッシュISBNです。
ヤッホーやゴーグルなどの検索で調べても解らないので
ツーチャンネルの皆様、ご指導よろしくお願いします。
>>14 まず、お前自身のスピードを3倍にするところから始めるんだ。
まず普通に言葉が書けるようになってから出直してきてください
>>13 だから、ゲームのチートツール作りならこんなところで質問してないでゲ製に引っ込んでろって。
つーか、前スレ使い切れよ。
実行バイナリいじっちゃえ
新鮮な書籍コードってなんだよ
現在定義されている環境変数を列挙するAPIを教えてください。
Winに環境変数などというものは無い
26 :
22:2005/04/30(土) 20:39:02
サンクスです。実はなかなか厄介くさいですねぇ。
でもできることはできるっぽいんでやってみます。
envp 使えば?
28 :
22:2005/04/30(土) 20:56:47
WinMainでできます?
リッチエディットをただの文字数制限なしエディットボックスとして使いたいんだが、
Ctrl+Rで右揃えになったり、Ctrl+Vで違う書式のテキストが張り付いたりして気持ち悪い。
リッチエディット(2.0)のすべてのキーボードショートカットを無効にするのってどうしたらいい?
サブクラス化してプロシージャ書けば?
>>26 GetEnvironmentStrings一発で取れますよ。
>>10 俺も普通に相手してあげるよ。
ReadProcessMemory()でOK。
APIがダメなのではなく、お前さんの使い方が悪いんじゃないかな。
まぁその質問の仕方では、相手にされにくいわな。
__argc とか__argvみたいに __envpがあるんじゃないの?
お願いします。WindowsGUIでのプログラミングで、
使っているDLL(tar32.dll)に直接コマンドを送ったあと、
そのDLLは「結果を標準出力に出力している」、というのですが、
どこかに書き込んでいる様子は見えても
CUIでないせいで何もおきず、 " > "をつけてみたり"
SETSTDHANDLEを使って標準出力をファイルに変えてみても
取り出せませんでした。何か取り出す方法がありましたら
アドバイスお願いします。
int main()
{
return WinMain(GetModuleHandle(NULL), 0, "", 0);
}
>>34 tar32.dllが標準出力に出力?何か勘違いしてないか?
>>37 -xだけ指定すればファイルへ出力してくれそうに読めるが。
>>37 > -p
> アーカイブ中のファイルを標準出力(バッファ)に展開します。
これ、実際にはTar() の最後の引数で指定したメモリに出力される。
40 :
デフォルトの名無しさん:2005/05/01(日) 15:31:30
質問です。
CreateFile()やSetFilePointer()等を使って、標準関数のfgets()のような
一行読み込みをする関数を作っているのですが、なかなかうまくいきません。
よければヒントだけでも教えてくれませんか?
環境は
OS : Windows2000
コンパイラ : VC6
です。
ReadFile は使わないの?
42 :
40:2005/05/01(日) 15:51:19
すいません。ReadFile()も使います。
while文でSetFilePointer()を使って一つずつポインタを進めていきながら、
ReadFile()で1バイトずつ文字を読み込んでいくような感じで書いているのですが
どうも上手くいきません。
ReadFileした分は勝手にポインタ進むだろ
44 :
40:2005/05/01(日) 16:00:25
>>43 そうだったんですか。それでおかしくなったのかもしれません。
もうちょっとがんばってみます。
キャッシュしか残ってなかったな...
>>38 >>39 ありがとうございます。
-xだけだと指定に関係なく全ファイル展開になります。
>これ、実際にはTar() の最後の引数で指定したメモリに出力される。
Tar()の最終引数がDWORD dwSizeでバッファのサイズの値なんですが
これにメモリのポインタを入れればよいのでしょうか?
48 :
デフォルトの名無しさん:2005/05/01(日) 18:47:41
APIそのものの質問じゃないのですが、
ここの人が詳しいかと思いまして
パラメータをレジストリに保存してダイアログで設定するようなアプリを作ったとき
常にレジストリを読むわけにはいきませんし
読み込みと書き込みの両方を考えて
メモリ上のパラメータとレジストリの値とはどのタイミングで同期をとるもんなんでしょう?
起動時と終了時
ダイアログを開いたときに読み込んで閉じるときに(必要なら)書き込む。
51 :
48:2005/05/01(日) 19:02:19
同時に2つ立ち上がる可能性があるので
・起動時とダイアログを開いたときに読み込み
・終了時とダイアログを閉じたときに書き込み
・読み込み時にレジストリが見つからなかったときは
メモリのパラメータをデフォルトの値にして
書き込み時を待って反映させる
としようと思います。
52 :
10:2005/05/01(日) 19:04:23
>>32 どうもです。チートツールってほどのものじゃない個人的なものなんですが・・・
以前に埋めに入っているスレで質問して誰も答えてくれなかったことがあるんで・・・
もちろんReadProcessMemory()は正常に動いてるのだとは思いますが・・・
4Gのアドレスのうち、全部があるはずはないですよね・・・
たしかにコード近辺、スタック近辺とあとよくわからないシステムエリア?近辺は読み取れるんですが、大方は読み取ろうとすると不正な処理ダイアログが出ます。
自分の領域ならばLDT読むとかいろいろ方法はあるとは思うんですが、他プログラムの領域なんで・・・
あと質問の仕方のまずい所を・・・?
>>33 私でしょうか?
__envp調べて見ます。
>>18 私のことですよね?
やはりその前に何の変数が何に使われているのか確認しないといけないので・・・
>>51 複数起動を仕様としたアプリ?
そうでないなら複数起動は制限しとくようにしたほうがいい気がするよ
>>54 複数プロセスのアプリからロードされるプラグインDLL
なんですよ
56 :
32:2005/05/01(日) 20:13:48
>>52 やろうとしていることが嫌われていることもあるが、それ以前に質問の仕方が悪い。
過去ログを見て、回答をもらえている質問者と、そうでない質問者の違いを見て、
何がいけないのか察してくれ。
それが面倒だったら、ここで質問するよりも、
チートツール作ってる人達のWebサイト見たほうが早い気がするよ。
>>55 共有メモリを利用するという手はどうよ?
最初にプロセスにアタッチされたときにロードして、
すべてのプロセスから参照されなくなったときに保存すると。
>>57 いいかもしれないけど、そんなにクリティカルな情報でもないので
できたらやってみます
ところでDLLってプロセスのメモリ空間ごとにコピーされるんですよね
それじゃあスタティックリンクと一緒じゃろ
>>47 すまん。後ろから2番目だわ。
でも-xで指定ファイルの解凍ができるが。
62 :
52:2005/05/02(月) 00:29:13
よく過去ログとか見ろって言われるんですが、現実にはなかなか最初から全部目を通せる人っていないと思うんですが・・・
ふつうの人はお金にも時間にも限界がありますから・・・
私もできたら本屋で売っている面白そうな本、全部買いたいですよ・・・
結局何が悪かったのかよくわからなかったのですが、とにかく悪いということなのでここで聞くのはあきらめます。皆さんどうもありがとうございました。
>>58 おお!これですね。わかりました。早速熟読を・・・
あとは動的に取得されたセグメントの情報ですね・・・
一応ググってはいるんですが、英語のばかりひっかかるんで・・・もちろん英語でも読んではいるんですが、???という感じで・・・
あと途中退場して本当に申し訳ありません・・・
ご容赦下さい・・・
>>62 仮令個人使用だろうとチートツールはチートツール。
それが只のマナー違反か犯罪になるかはゲームの種類と体制によるが。
そうである以上、まとまった情報が得られないことくらいすぐに判ると思うが。
そうでなくとも、教えて君は一般的に嫌われる。
まぁ、「半年ROMしてから書き込め」という板もあるくらいだ。空気は読もうな。
本当に欲しいなら惜しまずに金と時間を投入しろってこった
ステータスバーを付けたいのですがどうすればいいでぇすくわぁ?
>>59 32ビットではDLLはプロセス間で独立してると思っていいですよ。
(昔はDLLを使ったプロセス間通信なんてアホな話もありましたが。)
DLLでプロセス間でまったく同じメモリ内容になる部分は、
OSが自動的に見えないところで共有してくれています。
これを意識する必要は、メモリ & ディスクキャッシュの節約という面以外ではないです。
>>62 開き直るなよ。
お金にも時間にも限界がある人が回答してるんだよ。
だから質問の仕方が悪いと相手にされないの。
質問がド下手な人の相手をすると、お金と時間が無駄になるし、
そもそも回答してくれる人の手間を極力省くために、
自分の時間をいくらでも注ぎ込む気構えがないのは、失礼でしょ。
だから相手にされないの。
DLLネタで便乗しちゃうけど
DLL作るときってベースアドレスずらしてる?
重ならないように設定するのめんどいんだけど・・・
あと、重ならないことで実際どんな効果があるのかしらん
デスクトッププロパティの「ドラッグ中にウィンドウの内容を表示する」
をONにして適当なウィンドウをぐりぐりドラッグすると
再描画されずに白いゴミが残ることがあるんだけど
へぼいマシンなんだからウィンドウの内容を表示するオプションOFFにシル
って対応だけでいいのかな?
BitBltで絵を張っている位なんだがこっちがミスしてるのかな・・
72 :
デフォルトの名無しさん:2005/05/02(月) 16:58:52
ボタンの色と同じ色で、ある領域を塗りつぶしたく、
FillRectを使い、第三引数でGetStockObject(**_BLUSH)とやっているのですが、
GRAYは暗く、LTGRAYは明るく、HOLLOWはうまく表示されず、同じ色が出せません。
いい方法がありましたら、教えてください。
73 :
72:2005/05/02(月) 17:08:45
少し修正します。
GRAY_BRUSH、LTGRAY_BRUSH共にボタンの色より濃くなってしまいます。
当然BLACK_BRUSH、DKGRAY_BRUSH、WHITE_BRUSHも違う色です。
>>72 ::CreateSolidBrush(RGB(255,255,255)) でブラシ作って
::FillRect したらどうかな。
そのブラシは後でDeleteObject する
ボタンと同じ色なら
CreateSolidBrush(GetSysColor(COLOR_BTNFACE))
じゃないのか?
76 :
72:2005/05/02(月) 17:25:03
>>74 ありがとうございます。似た方法はやっていました。
ペイントソフトでボタンの色を調べて、その色で塗りつぶしたのですが、
微妙に色が違ってしまいました。デスクトップの色数とかが原因かもしれません。
>>75 ありがとうございます。同じ色を表示できました。
システムデフォルトのグレイ関係ならヘッダファイルに定義してあるはずだが
ボタンの色とかって、ユーザごとに違うだろ。
デフォルトのグレイならって書いてあるのじゃん
マウスカーソルがぐるぐる円を描くように動作するプログラムを
作りたいのですが、どのように作ればいいのでしょうか?
まったく検討もつきません、どなたかアドバイスよろしくお願いします。
>>80 タイマーで円を描くようにマウスポインタの位置を変更していけばいいだけじゃないの?
SetCursorPosと円の方程式でなんとかしる
>>81-83 レスありがとうございましたっ!
そして
>>83さん、結構探したつもりだったんですけど、
助かりました、本当に。感謝!
ネットワーク関係のアプリを作りたいんですが、
初歩として2台のPC間でファイルの送受信を行うプログラムを作ろうと思いました。
WINAPIに必要な関数は用意してありますか?
ちょっと調べればわかることをなんで訊くのか謎だ。
検索語が分からないんです。
[winapi, ネットワーク]や[ファイルの送受信, winsock2]
等で検索してみたのですが欲しい情報が見つかりませんでした。
それでこちらで質問させてもらいましたが、もうちっとgoogleを漁ってみます。
失礼しました。
winsockって分かってるなら来るなと。
データの送受信なのか、ファイルをファイルとして送受信したいのか。
ファイルをファイルをして送受信したいんです。
目的としてはファイルを送信する側が
自分が持っているファイルの一覧を受信者に送信、
受信者は一覧を見て欲しいファイル名を送信、
送信者は指定されたファイルを送信する。
こんな感じのことがしたいので最初はエラーとか全く考えずに
ある決まったファイルを送受信したいなと思ったんです。
んでもって、やりたいことが決まっても
どんな関数を使えば良いのかよく分からないので質問しました。
ftp使えば?
簡易FTPをお勉強として作りたいという前提で答えると。
データの出元や最終的な出力先がファイルというところは、
ネットワークプログラミングとは関係ない。
winsockって分かってるなら、それで普通にデータの送受信を
すればいいじゃん。
そうじゃなくて、FTPクライアントを作りたいだったらwininetあたりで。
93 :
デフォルトの名無しさん:2005/05/03(火) 19:23:59
TrackPopupMenuExでポップアップメニューを表示するときに
(キーボードで操作できる)カーソルを
あらかじめ特定の項目に移動させたいのですが
そういうことはできますか?
94 :
デフォルトの名無しさん:2005/05/03(火) 19:50:11
>>90 プログラミングのスパイスって本に君の希望する内容が書いてある。
>>90 プロトコルについて勉強汁。
ちなみに、君の希望するものは FTP。
RFC FTP で検索汁。
いまどきFTPもないんでやっぱHTTP+Web DAVだろ。
('A`)
98 :
デフォルトの名無しさん:2005/05/03(火) 21:06:01
ウィンドウプロシージャでWM_CLOSEメッセージが送られてきたら
MessageBoxを出して本当に終了するかどうかを促す実装をしているのですが、
それだけのプログラムをクラスとか一切使わず作るとうまくいくのですが、
自前のウィンドウプロシージャクラスを使うとメッセージボックスは表示されません。
しかし、エンターキーを押すと、デフォルトのOKが押されて終了してくれます。
クラスの中では、WM_CLOSEメッセージの時にはOnClose関数に飛ぶようにしているだけで、
特に変なことはしてないつもりです。
検索してみても分からなかったので、ここで質問させてもらいました。
同じような現象になったことある方や、意見がある方は回答をお願いします。
条件が曖昧ですがよろしくお願いします。
環境:Visual C++.NET 2003, WinXP(SP1)
100 :
98:2005/05/03(火) 21:30:42
書き込みしたあとも色々試してみたのですが、
どうやら、ウィンドウ(メインのウィンドウ)が表示されている間に
メッセージボックスを出そうとすると表示されないということが分かりました。
WM_CREATEではうまくいきますが、WM_LBUTTONDOWN等ではうまくいきません。
101 :
98:2005/05/03(火) 21:33:30
>>100 ウィンドウプロシージャ関数
switch(msg)
{
case WM_CLOSE:
return OnClose();
・・・他のメッセージ処理
メインウィンドウのOnClose関数
ウィンドウプロシージャの基本クラスの関数をオーバライドしてます
{
if(MessageBox(m_hwnd, "Really?", "", MB_YESNO) == IDYES)
DestroyWindow(m_hwnd);
return 0;
}
どのくらい晒せばいいか分かりませんが、
とりあえずかかわってるとこだけ書いてみました。
TCHARの文字列をwchar_tの文字列に変換したいのですが、
TCHARがcharの時もwchar_tの時も上手くいく方法はどのようなものがありますか?
_UNICODEが定義されてないときだけ
変換したらいいんでないですかね?
106 :
デフォルトの名無しさん:2005/05/04(水) 00:05:49
スレッドとウィンドウメッセージの関係について質問です。
GUIを扱うメインスレッドと、長い処理を行うワーカースレッドがありまして、
あるウィンドウに対して送信するときにクリティカルセクションを使って
排他をしようと考えています。
状態遷移を考えているうちに疑問に思ったのですが、
・ワーカースレッドで、クリティカルセクションをロックしてる最中に
メインスレッドにSendMessageすると、どうなるでしょうか?
メインスレッドに処理が移った瞬間デッドロックするのでしょうか。
>104-105 ありがとうございます。
#ifdef でやってみます。
108 :
デフォルトの名無しさん:2005/05/04(水) 00:09:08
補足ですが、
あるウィンドウは、メインスレッドのダイアログ上に存在します。
単なるエディットボックスです。
>>106 メインスレッドがそのクリティカルセクションをロックしようとしなければ大丈夫。
110 :
デフォルトの名無しさん:2005/05/04(水) 00:22:48
リソースを「実行時」に生成して、
外からインスタンスハンドルと「特定のID」を引数として引っ張ってこれるようにしたいのですが
どうしたらいいですか?
111 :
デフォルトの名無しさん:2005/05/04(水) 00:31:27
>>109 いや、今の設計では、メインスレッド側もロックしようとします。
やっぱダメかな・・・
ボタンを押したりしたときにそのウィンドウにテキストを出力する時とか。
ちゃんとクリティカルセクションのlock/unlockはしてますが。
112 :
デフォルトの名無しさん:2005/05/04(水) 00:35:49
要するに、ワーカースレッドの中でlockしたまんま、
メインスレッドへSendMessageは正当なのかということなのですが、
なんか試した限りではうまく動かないみたいです。
クリティカルセクションのコードを外せば動くんですが。
ああもう寝よ・・・
113 :
デフォルトの名無しさん:2005/05/04(水) 00:40:38
なんか設計が悪い気がしてきました。
別のスレッドからのSendMessageって、スタックから見るとかなり
ややこしいことになってるみたいなんで、バグの温床のような気がします。
SendMessageを使わない別の通信手段を考えることにします。
それがいいよ。
以下のフローに変更。
データをバッファリングすることにして、
そのデータをクリティカルセクションのロック対象とする。
ワーカスレッドは、バッファを更新したらWM_USER+nの適当なメッセージを
PostMessageでGUIを持つメインスレッドへ通知し、
GUIメインスレッドは通知を受けたらコントロールを更新してバッファをクリアする、
というフローに変更。
これでメッセージループが正常に回るようになりました。
気持ち悪い部分が消えて良かった・・・
よかったね。
えーっ SendMessageをPostMessageにしちゃうの?
同期的に処理しなくていいなら、最初からPostMessageにしとけ、っていう気もするけど、
ロックの都合で変えるのは、どうかと思う。
基本的には、クリティカルセクション内でSendMessageするのは、よくない。
SendMessageのように、いつ返ってくるのかわからないような処理を、
排他状態で行うのは、パフォーマンス的にもよろしくないし、なんか気持ち悪い。
(気持ち悪いのは、デッドロックしやすいからよくない、ということだと思うのだけど、
デッドロックするような設計なら、長かろうが複雑だろうが、ダメなものはダメだなぁ。)
もしかして、ロック対象のオブジェクトを、SendMessageで誰かに触らせようとしているの?
だとしたら、それはロックの使い方を間違っているよ。
ロックしている = 自分以外に触らせない
ということだから。
渡す側は、オブジェクトに触れる前にロック。オブジェクトに触れ終わったらアンロック。
渡された側も、オブジェクトに触れる前にロック。オブジェクトに触れ終わったらアンロック。
ロックしないで触るコードがあれば直すべし。
SendMessageする時や、メッセージキューから受けとる時は、ロックしていない状態でいいよ。
118 :
117:2005/05/04(水) 03:10:23
誤解があるかも・・・
> SendMessageする時や、メッセージキューから受けとる時は、ロックしていない状態でいいよ。
SendMessageすることや、メッセージキューから受けとること自体は、
オブジェクトのハンドルやポインタは扱うかもしれないけれども、
オブジェクトの中身には触れないことなので、ロックが不要なのです。
もちろん、
そのハンドルやポインタ自体がロック対象のオブジェクトというのであれば、
ロックしなくてはいけませんが、そんなロック対象のものを直接SendMessageで渡してはいけません。
必ず、一段噛まさないと。
そんなことわかってるよ。
すいません、DeleteMenu(sysMenu,SC_MINIMIZE,MF_BYCOMMAND );
上記のようにでぇりーとした、みにまいずなアイコンを再び
使えるようにしたいのですがどうすればいいのでぇすくわぁ
>>119 わかってりゃ、最初の質問だって出なかったろ。
InsertMenuで追加するとか
123 :
デフォルトの名無しさん:2005/05/04(水) 17:41:50
自分で作成したプログラムからチャットとかに、なんでもいいから文字を送信
したいんですけど、送信するにはどんな関数を使えばいいんですか?
そういうのは存在するんでしょうか? 優しい方教えてくださいm(_ _)m
チャットを荒らしたいんですが、どんな関数を使えばいいんですか?
優しい方教えてくださいm(_ _)m
ただ文字を送信したいだけです。
フォームに文字を入力せずに、自分で作成したプログラムから
特定の文字を送信するにはどうすればいいのかなぁ、って思っただけです。
>>126 とりあえずスレ違い。
HTTP 関連のお勉強から始めれ。
氏ねとか軽軽しく言っちゃダメだよ
じゃ
死ね
は?あと
お望みならぶち殺したろか?
とかは?
申し訳ございませんが二度と私達の前に姿を現さないで頂けませんでしょうか
ぐらいで
私達って、勝手に他人を巻き込むなよ
メッセージボックスをたくさん表示させて、
一番最後に出たメッセージボックスのOKボタンを押したら、全ての
メッセージボックスが閉じてくれるジョークプログラムを作ろうと思うのですが、
どのようにすればよいでしょか?
罠作者はお帰りクダサイ
///////////////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <time.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int )
{HWND hwnd[999];MSG msg;WNDCLASS unkoClass;int i,j=0,k=0;srand(clock());
{unkoClass.style = CS_HREDRAW | CS_VREDRAW;unkoClass.lpfnWndProc = WndProc;unkoClass.cbClsExtra = 0;
unkoClass.cbWndExtra = 0;unkoClass.hInstance = hinst;unkoClass.hIcon = NULL;unkoClass.hCursor = LoadCursor(NULL, IDC_ARROW);
unkoClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);unkoClass.lpszMenuName = NULL;unkoClass.lpszClassName = "うんこ";
if( !RegisterClass(&unkoClass) ) return 0;}for(i=0; i<999; i++){j=rand()%1000+1;k=rand()%1000+1;
hwnd[i] = CreateWindow( unkoClass.lpszClassName,"うんこ",WS_OVERLAPPEDWINDOW,j,k,200,200,NULL,NULL,hinst,NULL);
ShowWindow(hwnd[i], SW_SHOW );}if(IDNO == MessageBox(*hwnd,"うんこおk?","うんこ", MB_YESNO )){ }
else {SendMessage(*hwnd, WM_CLOSE, 0, 0);}while( GetMessage(&msg, NULL, 0, 0) ){TranslateMessage(&msg);DispatchMessage(&msg);}
return 0;}LRESULT CALLBACK WndProc(HWND hwnd, UINT imsg, WPARAM wp, LPARAM lp){
switch(imsg){case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd, imsg, wp, lp);}return 0;}
///////////////////////////////////////////////////////////////////////////////////////
何を作ったのやら。
139 :
デフォルトの名無しさん:2005/05/05(木) 00:37:13
リストビュー(ListView)で質問です、、
項目のヘッダを押すとそのカラムについてソートされるようにしたいんですが、
項目のヘッダが押されたというのは、何のメッセージを捕まえればよいですか?
140 :
デフォルトの名無しさん:2005/05/05(木) 00:38:46
猫のページにありました
すいません。
141 :
デフォルトの名無しさん:2005/05/05(木) 00:40:27
気を取り直してもう一つ質問です。
リストビューの任意の項目で、
右クリックしたらポップアップメニューを出したいのですが、
何のメッセージを捕まえればよいですか?
猫のページにありました
すいません。
>>136 おぉ、最高っす!
参考にさせていただきます!
144 :
デフォルトの名無しさん:2005/05/05(木) 00:55:25
ウィンドウがアクティブ化したときに何らかの処理を行うために、フックを使おうと思います。
WH_CBT と WH_SHELL とどちらを使うほうがよいでしょうか?
145 :
デフォルトの名無しさん:2005/05/05(木) 00:58:40
猫のページにありました
すいません。
146 :
デフォルトの名無しさん:2005/05/05(木) 01:02:20
ウィンドウがアクティブ化したときに何らかの処理を行うために、フックを使おうと思います。
WH_CBT と WH_SHELL とどちらを使うほうがよいでしょうか?
147 :
デフォルトの名無しさん:2005/05/05(木) 01:04:55
おれもそう思う
148 :
デフォルトの名無しさん:2005/05/05(木) 01:06:42
リストビューの任意の項目で、
右クリックしたらポップアップメニューを出したいのですが、
何のメッセージを捕まえればよいですか?
-<二:彡――
150 :
デフォルトの名無しさん:2005/05/05(木) 01:47:32
追加で質問です。
リストビューで項目ヘッダの淵をダブルクリックすると
横幅がトリムされますが、これをプログラム側から行うには
何のメッセージ送ればよいですか?
>>150 LVM_SETCOLUMNWIDTH メッセージでカラムの幅を
LVSCW_AUTOSIZE(アイテムのテキストの幅に合わせる) 又は
LVSCW_AUTOSIZE_USEHEADER(カラムのテキストの幅に合わせる) にする。
152 :
デフォルトの名無しさん:2005/05/05(木) 02:11:12
>>151 ありがとうございました。
できました。
1アプリケーションが持つウィンドウは
あまり多くないほうがいいのでしょうか?
具体的には、
キーボードを模したコントロール用パネルを作るときに、
各キーがそれぞれパネル上の一つの子ウィンドウという作り方は
推奨されない作り方なのでしょうか?
100個ぐらいなら普通にうごくんじゃね?
普通ボタンにしねぇか?
ってか、ボタンもテキストボックスもスタティックテキストもウィンドウなんだけどな
昔Win16の時はご法度だったけどね、100個も並べたらまずリソース足りなくなってた
今は平気なんじゃないかなあ。
と言ってる俺は300-500並べるやつを作らなくてはならないんだが、これはやばそうだな・・・
座標で管理
>>156 あれ?昔ボタンで作られたキーボードの窓があった様な・・
誰が使うんだ?って代物だったけど。
Win95の頃かな。
159 :
153:2005/05/05(木) 03:13:25
>>155 そう! その通り!
私は、ボタンをいっぱい使う
アプリケーションが作りたかったのです。
多くのボタンを持ったアプリケーションが懸命に動作する姿は、
私をも感動させるものがあるでしょう。
160 :
↑:2005/05/05(木) 03:31:46
アホ
>>160 下手に出ておればいい気に
なりおって! 氏ね!
>>158 付属のソフトウェアキーボードのことか?
163 :
デフォルトの名無しさん:2005/05/05(木) 17:14:49
LoadImageでIMAGE_ICON,16,16指定でアイコンハンドル(HICON)を読んで
タスクアイコンに設定したいのですが、
Windows2000用ではICOファイルから16色のテーブルを読み込みたいのですが、
指定する方法を教えてください
とりあえず日本語勉強してからもいちど来てくれ
マイクの設定ってプログラム上から出来ませんか?
ミュートとか音量設定とか
できる
168 :
デフォルトの名無しさん:2005/05/06(金) 12:51:51
ダイアログプロシージャA内で、別のダイアログBを生成したとき、
プロシージャBに何か値を渡すにはどうしたらいいでしょうか。
例えばダイアログAのチェックボックスの選択状況によって、
ダイアログBの初期状態を変化させるなどしたい場合です。
今はグローバル変数に持たせて渡しているのですが、あまり多用したくないです。
M−V−Cだとかを一度勉強しなはれ
>>170 THX
>>169 ウィンドウのクラス化めんどくさいんだもの。
SDKのみで懇切丁寧にクラス化の手順と仕組みが載ってる本とかないですかねー
Webに多少資料があるけど余りよく理解できない。
クラス化は関係ない。
つうか答えるならわざわざもったいぶるような書き方するなよ。
質問者には当然のように問題点を詳細に書くよう要求するんだから
回答者だって答えるならば少なくとも意味が伝わるように書いてくれ。
はい次の質問者の方どぞ
なにこのアホ。
>>175 キチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ね
キチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ね
キチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ね
気に入らない答えが聞きたくなかったら質問しないことだよ
意味不明。
>>178 キチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ね
キチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ね
キチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ねキチガイ氏ね
181 :
166:2005/05/06(金) 14:47:47
>>167 出来ればAPIの名前とか方法の手がかりを教えてもらえないでしょうか?
よろしくお願いいたします。
>>178 気に入らない質問が聞きたくなかったら回答しないことだよ
カレントドライブがネットワークドライブか判別する方法ってあります?
ある
186 :
184:2005/05/06(金) 15:24:59
>185
質問が悪かったですかね orz
どうすればわかりますか?
>>183 気にいらない質問が見たくなかったらロムらないことだよ
で、
>>169ってどういう意味?
クラス化する以外にどうしろと。
M−V−Cが何なのかすらわからない俺。
M−V−C
が顔文字に見えてきた
Microsoft Visual C++
サブクラス化について質問です。
サブクラス化された子ダイアログから
親ダイアログの変数を参照するにはどうすればいいのでしょうか?
ダイアログの変数?
>>193 とりあえずGetParent()で親のウィンドウハンドルが手に入れられる。
196 :
193:2005/05/06(金) 18:05:37
>>194 子ダイアログであるエディットボックスのウインドウプロシージャ内から
その親であるダイアログ内で使われている変数の値を参照したいのです。
>>195 ウィンドウハンドルを使えばいいのでしょうか。
少し調べてみます。
お二人ともレスありがとうございました。
つーか、ダイアログで使う変数ってなんだよ。
ダイアログクラスのメンバ変数か?
で、
>>169ってどういう意味?
クラス化する以外に。
そんなの知ってる。
168の質問内容に対し、
クラス化する以外でMVCをどう実現するのだという事。
APIとは何の関係もなさそうだな
プロシジャ間のデータの受け渡しの実現方法の質問。
質問です。
WinMain関数のメッセージループを
HDC hdc = GetDC(hwnd);
while(GetMessage(&msg, NULL, 0, 0)) {
TextOut(hdc, 0, 0, TEXT("test"), 4);
DispatchMessage(&msg);
TranslateMessage(&msg);
}
このように書いた状態でメッセージボックスを表示させると
文字とメッセージボックスが重なったときに文字が消えてしまいました。
これを文字が消えないようにするにはどうすればいいのでしょうか?
よろしくお願いします。
高度なプログラミング技術だ。
>>205 WM_PAINT内にTextOutを移す。
HDC hd = GetDC(hwnd);を消す
209 :
205:2005/05/07(土) 00:30:13
>>207-208 ご解答ありがとうございます。
>>207 WM_PAINT内ではうまくいくのですがどうしてもループの中でやりたいときは何か手はあるのでしょうか?
>>208 やってみましたが表示されなくなってしまいました。
>>209 >WM_PAINT内ではうまくいくのですがどうしてもループの中でやりたいときは何か手はあるのでしょうか?
メッセージボックスをモードレスなダイアログでモーダルに見せかけるようにすればできないことはないが
面倒だし君のスキルでは多分無理だ。
つか、なんでそんなことがしたいの?
>WM_PAINT内ではうまくいくのですがどうしてもループの中でやりたいときは何か手はあるのでしょうか?
_, ._
( ゚ Д゚) ?
>209
>WM_PAINT内ではうまくいくのですがどうしてもループの中でやりたいときは何か手はあるのでしょうか?
汎用的な手は無いと思う。
DialogBox関数でダイアログを作成した場合、ダイアログを閉じるまで、DialogBox関数から
帰ってこない。=君が作ったメッセージループもGetMessage関数で止まってる。
Windowsの構造上無理。
advanced windowsを買ったはいいが付録のソースを
コンパイルしようとしたらエラー出まくりな上に
最初からCDに入ってる実行ファイル郡は全て
「このコンピュータでは扱えないファイル形式です」だとよ(プゲラチョフwwwwwwwなめすぎwwwwwww意味分からんwwwwwww互換性ないから使えないってことか?wwwwwwwwこれがジェフリーの集大成なのか?wwwwwwwwwwwwww
やっとコンパイル通りやがったぜ
__ __/ / | ┌─┼` _ _|_
/ ─ / / \ ○ | / | |┐ | | / |
__/ _/ / \ | / レ / レ  ̄ / |
/\___/ヽ
/'''''' '''''':::::::\
. |(●), 、(●)、.:| +
| ,,ノ(、_, )ヽ、,, .::::|
. | `-=ニ=- ' .:::::::| +
\ `ニニ´ .:::::/ +
,,.....イ.ヽヽ、ニ__ ーーノ゙-、.
: | '; \_ _ノ.| ヽ i
| \/゙\ /\| i |
> ヽ. V | ||
216 :
デフォルトの名無しさん:2005/05/07(土) 07:34:49
217 :
デフォルトの名無しさん:2005/05/07(土) 07:50:50
リストビューの内容領域が、リストビュー自体より大きくなって
スクロールバーが出ているときに
スクロールバーがでないようにMoveWindowでサイズを変更したいのですが、
適切なサイズを計算するにはどうしたらよいですか?
>>216 バカが知ったかしてみたかったんじゃねーの。
>>217 GetClientRectでリストビューのサイズ取得してそのサイズにあわせてMoveWindow
>>219 ちょっと質問を誤解されているようです。
GetClientRectの引数は親ウィンドウのつもりだったのかリストビューのつもりだったのか
わかりませんが、
リストビューそのもののサイズを
内側のスクロールバーがでなくなるように変えたいのです。
リストビューにGetClientRectしても、現在のサイズが返るだけでした。
>>209 ループ内でInvalidateRect()とUpdateWindow()を呼べばいい。
超能力を使ってみた。
こんな意味じゃなかろうか↓
例えば、項目の文字列がかなり横長のに、ウィンドウの幅が50ピクセルくらいだと、
クライアント領域内に水平スクロールバーが表示されるってことかな?
人間だったら手動でビューの幅を広げるけど、
そのための十分なサイズを計測する方法を聞いているのだと思われ。
最初からそういってるやん。
>>223 超能力ありがとうございます!
超能力で質問にも答えていただけますか?
一応、GetScrollInfoでリストビュースクロールバーの情報を得て
nMaxとnMinをとって8ぐらい足すとうまくいくようなんですが
なぜ糞挙動なアプリを作りたいのか、目的がわからない。
アイテムを挿入するたびにウィンドウの大きさが変わってしまうのか。
最初から表示したいものが決まってて、要素の数や幅が不変なのであれば
リストビューの属性をスクロールしない設定にしとけばいいんじゃね。
そういう設定項目あるよ。
>>226 サイズを変更するのは初期化時のみで
あとはユーザーのリサイズにあわせます
表示したいものはデータによって変わりますので幅も変わります
糞挙動ということはないです
228 :
223:2005/05/07(土) 10:49:28
>>227 226は漏れじゃないぞよ。念のため。
各カラムのサイズを調べればよさげ?
ってかリストビューもあんまり使ったことないし、
徹夜明けの頭で適当に答えてるだけなので責任はもてない。
もっとマシなやつに聞いてくれ。寝る。
幅なら幅って最初に言っといてほしいよな
普通に考えりゃ幅だろ
縦を気にしてたらきりがないからな
>表示したいものはデータによって変わりますので幅も変わります
>糞挙動ということはないです
どう考えても糞。
縦だったら仕事で作ったのがあるけど、MFCべったりだ。
縦幅ならアイテム数調べて、それ×何ピクセルか指定するだけでいいし
どうにでもなるやん。
234 :
デフォルトの名無しさん:2005/05/07(土) 12:48:32
ClientToScreenはクライアント座標をスクリーン座標に変換する、とありますが
これはマルチモニタシステム上では「仮想スクリーン座標」に変換するものと
考えていいんですか?
自力でテストできたらいいんですが、生憎ディスプレイがひとつしかないので
>>233 そして画面下を割るわけですね
つーか、わざわざ少しずつ広げるくらいなら最初から全画面表示しときゃいいじゃん
↑脳味噌が一階層しかねぇのかよアホが。
まぁそう自分を貶すなよ
まぁ、APIの話題ではなくGUIがいかにあるべきかの話題なのですれ違い
>>217,
>>225 GetScrollRange あたりを調べてみて
GetSystemMetrics の幅や高さを足したら?
親ウィンドウも連鎖的にでかくなるのか?
>>205 >>207のようにWM_PAINT内に移した上で、ループ内にInvalidateRect(hwnd,NULL,TRUE)とUpdateWindow(hwnd)でダメ?
ウインドウハンドルからLOGFONT構造体を取得するにはどのようにすればいいでしょうか?
>>241 ウインドウハンドルからって何?
ウインドウハンドルにフォントが関連付けられてる?
>>243 HDCからHFONTを取得する方法きぼんぬ。
HDCはHWNDから簡単に取得できるしHFONTからLOGFONTも可能だし。
デバイスコンテキストを理解せよ
GetObject
GetDCでいつも同じDCが返って来るとは限んないよ
>>245 ありがとうございます。
デバイスコンテキスト関係は知識が浅いのでもう少し勉強します。
じゃなかった
WM_GETFONT
>>246 ありがとうございます。
それを試してみます。
>>247 その都度取得と開放を繰り返すので問題ないと思います。
251 :
232:2005/05/07(土) 17:20:02
>>235 顧客からの要求で、「ダイアログが画面内に収まらないなら画面縦一杯に出してListCtrlにスクロールバーを出せ。
さもなくば、適切なサイズにListCtrlをあわせてスクロールバーは出すな。
ただし、ダイアログのサイズは自由に変えられるようにしろ」なんてのがあったりするわけだがね。
#あ、説明不足で誤解されそうな悪寒。
もうしゃべらないでいいよ無能
253 :
デフォルトの名無しさん:2005/05/07(土) 18:56:17
指定されたフォルダから指定されたファイルを検索するWindowsの標準関数は、
ファイル名を一字一字比較して、末尾まで一致するファイルへのポインタを返す
という仕様になっていると思うのですが・・・間違ってないでしょうか?
254 :
デフォルトの名無しさん:2005/05/07(土) 19:00:31
>>253 指定されたフォルダから指定されたファイルを検索するWindowsの標準関数
の名前を書いてくれなきゃわからない。
最近よくみかける
>>254みたいなのってなんなんだ?
>>253 ワイルドカードがあるからそう単純ではないと思う。
>>260 ワイルドカードは内部でPathMatchSpecを呼んでるだけだろ。
ポップアップメニューって親ウィンドウの中じゃないと絶対表示できない?
グローバルなフックプロシージャからTrackPopupMenu使ってみたけど親ウィンドウ以外では表示されません。
なんか方法ありますか?
なんのポップアップだよ
別にウィンドウに限定されないけどなあ
質問させてください
Cの構造体ってコンパイラによってメンバが
4バイトの境界にそろえられてしまったりすると思うんですけど、
Windowsビットマップをそのまま読み込んで表示しようとした時に
読み込んだバッファに構造体のポインタをそのまま当てはめて使っているサンプルを
見かけるのですが問題ないのでしょうか
手持ちのbccではオプションに色々指定してもちゃんと1バイト区切りになっていましたが
そういう取り決めになっていたりするんでしょうか
多分心配無用
>>265 構造体の定義で
struct {
char a;
int b;
};
なんていう馬鹿なことしなければ大概大丈夫。
>>265 普通はBITMAPFILEHEADERの定義の前に
#pragma pack(2)
とか入ってるから大丈夫よ。
まあメンバごとに読んだ方が行儀がいいのは確かだけど。
269 :
265:2005/05/07(土) 23:32:37
ええと、BITMAPFILEHEADERやRGBQUADでWORDとBYTEがあるので大丈夫かなあと心配してみたんです
お話を聞く限り大丈夫そうなので構造体使って画像読み込む関数つくってみます
ありがとうございました!
何もしないと、パディングされちまうけど、
BITMAPFILEHEADERとかBITMAPINFO、INFOHEADERとかRGBQUADとかのような、
パディングされたら困るやつは、ちゃんと定義のとこでパディングされないように細工してある
>>166 MSDNのmixer〜のあたりを読めば書いてあります。
マイクはMIXERLINE_COMPONENTTYPE_SRC_MICROPHONEでmixerGetLineInfo。
ただ、ビットマップに関する構造体に関しては定義でパディング対策してあるけど
ビットマップの実際のビットデータ部は、画像の横幅によってはスキャンラインごとに、
ラインの最後にパディングが有るから、ビットマップファイルを触るときはそこに注意だな
273 :
265:2005/05/08(日) 00:28:51
>>270 >>272 レスありがとうございます
きちんと対策がしてあるものなのですね
データ部の4byte境界は横幅とビットカウントから1ラインのバイト数出す
関数作って対応済みです(`・ω・´) シャキーン
いろいろ心配していただいてありがとうございました
275 :
デフォルトの名無しさん:2005/05/08(日) 00:57:46
Win32API でのファイル操作についての質問です。
#include <windows.h>
HANDLE hFile;
・・・・・・・・・・・・
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow) {
HWND hwnd;
MSG msg;
WNDCLASS winc;
hFile = CreateFile(lpCmdLine , GENERIC_READ , FILE_SHARE_READ , NULL ,
OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);
if (hFile == INVALID_HANDLE_VALUE) {
MessageBox(NULL , TEXT("ファイルが開けません") , NULL , MB_OK);
return -1;
}
(以下略)
をコンパイルして実行したら、存在するファイル名をコマンド引数に指定しても
「ファイルが開けません」のエラーメッセージが出てしまいます。
当方の開発環境は、
OS:Windows XP
コンパイラ: lcc-win32 Ver3.8
です。
どなたか問題点を教えて下さい。お願いしますm(_ _)m
>>275 CreateFileに渡しているlpCmdLineに何が入っているか確認してみようとは思わん?
>>276 ダイアログボックスには何度も表示しましたが、改めてコンソールに出力してみると、
276さんに言われるまで見落としていたのですが、lpCmdLine に入っていたのは
C:\Document and Settings\・・・・\filename.txt
ではなくて、
"C:\Document and Settings\・・・・\filename.txt"
↑ ↑
文字列そのものの両端にダブルクォーテーションがある
ということに気づきました。
気づかない方がヴァカなのかも知れませんが、(私にとって)これは盲点でした。
でも、その一言のお陰で解決しました。どうも有難うございましたm(_ _)m感謝感謝
>>277 ちなみにD:\とかだとダブルクォーテーションが排卵よ
スペースが入れば入る
スペースって宇宙の事だよね
急速にスレの質が低下してまいりました
>>278 D:\・・・ でもダブルクォーテーション入りました(当方の環境では D ドライブは CD-ROM)。
こちらの環境が Windows XP だからなのか、それとも lcc-win32 のためなんでしょうか・・・・・・
サボらないでコマンドラインパーサ書けよ
>>283 "を含むパス名って存在しないんだっけ?
パーサを書こうにも仕様がわからんとね。
存在しねぇよ
仕様がわからんとねとか言う前に、自分でファイル名つけてみろよ
なんでファイル名にスペースなんて使えるようにしたんだろう
ファイル名に\ とか / とか使われたらお手上げだよ。
CreateFileの前にPathUnquoteSpaces(lpCmdLine);を入れると解決するよ。
Path系のAPIはIE4以降必須だから・・・
今時IE4以降が入ってないようなWinマシン使ってるヤツが居るのか?
天然記念物だな
>>290 某コンピューター系大企業の生産現場では、製品チェック用のノーマルWin95PCが現役だったよ。
工場とかには結構な数あるんじゃないかな?
Win95ならもう既にshlwapi.dll入ってたと思うが
おいおい
製品チェック用のマシンにどこの馬の骨とも知らんヤツの作ったアプリ入れるんかい
自社製より信頼性が高いと思っているのかも知れない。
295 :
234:2005/05/08(日) 14:59:05
だれかおせーて
質問したかて、必ず知ってる人間が居るとは限らん
とりあえず俺はしらね
仮想の意味がわからんが、モニタ2台あるとスクリーン座標はそのまま出るよ
たとえば、1024幅が2台あってプライマリを左にすれば、 0 - 2047 の範囲になる
ダライアス可能?
Gと外伝なら見たことあるな。
えっ、ダライアスだよ。
301 :
234:2005/05/08(日) 20:19:46
すんません、
セミコロン(;)つきのファイル名って存在しますか?
どころか、セミコロンだけでも存在できる。
あちゃあ、まぢですか?
セミコロンをファイル名リストの区切りにしようとしてたんだけど、
破綻しちゃった。
おススメの区切り文字ってありますか?
>>304 MFCのCFileDialogでやってるように縦簿'|'はどう?
307 :
306:2005/05/08(日) 21:53:35
「棒」ね
>>304 普通にセミコロンでいいじゃんか。
環境変数のパス名とかの区切りだし
縦棒にします!
ありがとうございました!
環境変数ではどうしてんだろう・・・
UIやメッセージを表示する専用の子ウィンドウを沢山持つアプリケーションを作る場合、
その時点で使ってない子ウィンドウは、どのようにしておくのが推奨されていますか?
毎回、使う度にCreate と Destroyを繰り返すのはシステムに負荷が掛かるのでしょうか?
一応、作成しておいて、ただ見えなくしておくだけの方がいいのでしょうか?
>>312 TPOに応じて方法を使い分けるべきかと。
少数の複雑なウインドウなら隠蔽するだけのほうがいいと思うが、多数のボタンやエディトボックスなら使うたびにCreateとDestroyを繰り返したほうがいい。
一つのプログラムに二つの方法を混在させると開放し忘れでリークするということもあるだろうからどちらかに統一するのがベター。
回答ありがとうございます。
マナーの良いプログラミングを心掛けていきたいと思っています。
フックについてですが、WH_GETMESSAGE でフックをかけているんですが、
ウィンドウのアクティブ/非アクティブを変えても WM_ACTIVE が捕捉できません。
全く同じコードで WM_LBUTTONDBLCLK などのメッセージは捕捉できるのですが
WM_ACTIVE は何か特別扱いになっているのでしょうか?
引用符切り分けるのめんどくさい
>>316 WM_ACTIVEはsendされるメッセージ。
WH_GETMESSAGEはpostされたメッセージしか捕らえられない。
>>319 なるほど。ありがとう御座います。
WH_CALLWNDPROC でフックできました。
FindFirstChangeNotification()
や
ReadDirectoryChangesW()
のように、ディレクトリごとではなく、ファイルごとに変更を知る方法はありませんか?
一つのファイルを複数のプロセスが共有で開いて読み書きしている時に、
他の誰かが書きこんだことを知りたいので、書き込まれた位置までわかるとありがたいのですが。
FindFirstChangeNotification
それって、ネットワークドライブでも使える?
使える
PROCESSENTRY32構造体についてなんですが
PROCESSENTRY32 unko;
と宣言してるのですが
「'PROCESSENTRY32' : 識別名を宣言するのに、型が指定されていません」
とエラーがでます。解決方法を教えてください
PROCESSENTRY32 構造体を宣言してください。
327 :
デフォルトの名無しさん:2005/05/09(月) 08:47:08
#include <tlhelp32.h>
329 :
デフォルトの名無しさん:2005/05/09(月) 09:13:09
というか<tlhelp32.h>にインクルードしてるのに
「CreateToolHelp32Snapshot' : 定義されていない識別子」って出ます。原因と解決方法を教えてください
331 :
330:2005/05/09(月) 09:17:51
すいません解決しました
どう解決したんだよ
>>328を書いた以上、経過を説明してくれないかな
333 :
330:2005/05/09(月) 10:18:54
関数名間違ってただけ
>>325 ...ENTRY... に「出るもの」の名前は後任者が勘違いしやすい。ここはもっと
ピタッとする名前があるのにしないのはまずいな。
334 が非常に的外れなレスをしている気がしないでもないが、
>>334 いやいや、その変数をEntryするのかもしれんぞ。
#どこにかは知らんが。
337 :
デフォルトの名無しさん:2005/05/09(月) 16:46:46
シリアルポート2つ使うプログラムで同じCOM番号を指定した時にそれを共有して使う方法を教えてください
Telephony API
339 :
デフォルトの名無しさん:2005/05/09(月) 17:05:29
340 :
デフォルトの名無しさん:2005/05/09(月) 17:17:22
>>336 あの続きのコードを見たくなった。日経の小説も気になってんだけど。
342 :
デフォルトの名無しさん:2005/05/09(月) 18:06:47
>>340 知らないならレスしないで下さい。ウザイだけです、消えてください
オマエモナ
騙りが横行してる希ガス
共有ねぇ。DuplicateHandleするとどうなるのかは気になるけど、
素直にアウトプロセスCOMみたいなRPCな仕掛けを挟んだら?
めんどい
コンボボックスを選択して確定することにするにはどうしたらいいでしょうか?
ただたんにテキストをかえるだけではだめなようです。
そのコンボボックスのハンドルはわかっています。
wm_Settext文字を変更することはできたのですが内部的には確定されていないのか結果が反映されないのです
>>347 CB_ADDSTRINGで文字列を追加して、帰ってきたインデックスをCB_SETCURSELで選択。
349 :
321:2005/05/10(火) 09:58:23
>>322 あの、それはディレクトリごとだし、
ファイルの変更部分は通知されませんが。
ReadProcessMemoryを使ってもことごとくNULLが返ります。アクセス権がないようなのですが解決方法を教えてください。
あとPROCESSENTRY32構造体のメンバth32ProcessIDにはProcess32Nextなどで最後に得たプロセスIDが格納されるのですか?
>>349 ファイル単位で監視っていうのは無かったと思う。
>>349 ディレクトリの変更がきたら自分で調べりゃいいだろ
なんでもかんでもAPIに無いと、何もできないのだろうか
354 :
デフォルトの名無しさん:2005/05/10(火) 12:20:28
>348
ありがとうございます
しかしそれでは目的のテキスト(CB_SETCURSELでセットしたインデックスのテキスト)は一瞬表示されますが
それが選択状態にはならず元にもどってしまいます
なにかいい方法はないでしょうか
355 :
デフォルトの名無しさん:2005/05/10(火) 12:30:30
>>354 他のイベントで変な事してるんじゃないのか?
357 :
デフォルトの名無しさん:2005/05/10(火) 12:45:30
そのようなこともないと思います
新規で試しにワードパッドのフォントを変えるものを作ってみましたが
同様でした。
コードは
SendMessage((HWND)コンボボックスのハンドル,CB_SETCURSEL,77,0);
念のためそのコンボボックスの親ウィンドウに
SendMessage((HWND)親ウィンドウのハンドル, WM_COMMAND,MAKEWPARAM(165, CBN_SELCHANGE),(LPARAM)(HWND)コンボボックスのハンドル);
と送ってみましたがそれでもダメでした
>>357 >新規で試しにワードパッドのフォントを変えるもの
新規で作って検証するなら、
ウィンドウにコンボボックスのみを貼り付けて、
そのコンボボックスに CB_SETCURSEL を送るだけじゃないのか?
って言うか、外部プロセスのコンボボックスを変えようとしている?
申し遅れましたがその通り外部のプロセスのコンボボックスです。
やはりこれもwin98で影響を受けたsetforeground同様の制限をもらってしまうのでしょうか?
361 :
デフォルトの名無しさん:2005/05/11(水) 01:28:05
質問なのですが
Win32において
Destoryを実行した場合
Destoryを実行されたWindowが一番最後にうけとるメッセージはなんなのでしょうか?
WM_NCDESTROYが最後でいいのでしょうか?
私的ライブラリでGUIをクラスライブラリ化したのですが
ウィンドウが破棄されたタイミングで自身のインスタンスにたいして
delete thisを行いたいのです。
MFCのほうではPostNcDestroyなるメソッドがあるっぽいのですが・・・
Win32オンリーの場合はどのように対処したらよいのでしょうか?
362 :
デフォルトの名無しさん:2005/05/11(水) 01:30:29
つspy++
>>361 それで良いと思う。気になるならMFCのソースを見てコードをまねれ。
DestroyWindowを実行すると、WM_DESTROY、WM_NCDESTROYの順番でメッセージが送られる
その後のWM_QUITはウィンドウプロシージャでは受け取らない
よって、NCDESTROYが最後にウィンドウが受け取るメッセージ
365 :
349:2005/05/11(水) 09:55:50
>>351-353 ありがとう。
無駄に重くなるけど、ディレクトリごと監視します。
>>350 ReadProcessMemoryの返り値はBOOLですよ。
0が返ってきたら、GetLastError()してエラーコードを見ましょうよ。
>>365 あぁ?失敗したらヌルポが返るんだよデブ。もう原因わかったからどっか行っていいよ
>>366 「ヌルポ」がcatchできないんですが^^
368 :
デフォルトの名無しさん:2005/05/11(水) 13:30:36
369 :
デフォルトの名無しさん:2005/05/11(水) 14:28:27
StretchBltの縮小画質がありえないくらい
汚いんですが(ゴミが入るようなかんじ)、フリーか何かで代用のAPIないでしょうか?
教えてください
何でもかんでも API って言えばいいと思ってる奴
キタ━━━━(゚∀゚)━━━━ッ!!
>>369 SetStretchBltMode はどのモードでやった?
gdi plus
IPicture::Render
自前でリサイズしたら?
376 :
デフォルトの名無しさん:2005/05/11(水) 16:57:48
誘導されてきました
フォルダの中のファイルの監視をしたいのですが
下のコードを実行して c:\test フォルダ内のファイルの内容を変更すると
メッセージボックスが二回表示されてしまいます。
変更は一回しかしていないのに二回でてしまうのですが
ここまでコードを短くしても出るので行き詰まってしまいました
二回検知してしまう動作が正しいのでしょうか?
どこかおかしくて二回出てしまうのならばご指摘お願いします。
HANDLE hFind = FindFirstChangeNotification( "C:\\test\0", FALSE, FILE_NOTIFY_CHANGE_SIZE );
if( hFind == INVALID_HANDLE_VALUE )
return;
while( 1 )
{
DWORD ret = WaitForSingleObject( hFind , INFINITE );
if( ret == WAIT_OBJECT_0 )
{
MessageBox( NULL, "TEST", "Changed!", MB_OK );
if( FindNextChangeNotification( hFind ) == 0 )
return;
}
}
FindCloseChangeNotification( hFind );
>>376 変更手段によるかと。
例えばエディタの場合、一時ファイルを作ったりするから一回の変更と思っても
複数回ファイル操作が行なわれているかも。
実際、fopen(..., "w")を行なうと空のファイルができるのでこの段階で一回、
fclose()でバッファフラッシュが起きて一回、都合2回通知されることは実験で確認した。
>>376 何でファイルを変更しているのか知らないけど、多くのソフトはファイルを一度
0 サイズにクリアしてから改めて書き込む (CreateFile() で CREATE_ALWAYS を
指定したり、fopen() で "w" を指定していたりなど) ので、
1. 0 クリアで 1 回
2. データの書き込みで 1 回
の合計 2 回、変更が検知される。
(試しに 0 バイトのデータを保存してみること)
さらに、ディスクキャッシュサイズごとに書き込むので、そのたびに
変更が検知される可能性もある。
379 :
376:2005/05/11(水) 18:40:25
>>377 >>378 そういうことだったのですか!よく分かりました。
ファイルが変更されたあとフォルダのサイズが変わる?ので二回きている
とか色々考えていました
ちなみにファイルはテイストファイルでnotepadで書き換えていました
でも二回くるのはどうしようもないですね
ちょっと厄介になってきましたが
上手く一回だけ処理できるよう試行錯誤してみます
ありがとうございました
テイストファイル(・∀・)!! ワラタ!!
笑う(・∀・)!! ワラタ!!
_ ∩
( ゚∀゚)彡 ワラタ!!ワラタ!!
⊂彡
ここはハッピーなインターネットですね?
386 :
デフォルトの名無しさん:2005/05/11(水) 20:12:21
WAVEファイルに格納されているサンプリングデータを取得するには、
WAVEファイルを自前で解析するしか方法はありませんか?
WAVE ファイルを解析するための API はないのでしょうか?
WaveOut
そもそもWaveファイルにしてもBitmapファイルにしてもファイル構造はどっちも単純だろうに。
>>386 標準のwavファイルならヘッダを取り除けば、あとは生のPCMデータのはずだけど。
低レベル再生したいのなら、
>>387のWaveOut系APIでも使えば良い。
再生中に、サンプルデータも自由に処理できるしね。
高レベルAPIでいいなら、PlaySound()やsoundPlaySound()で。
解析したいと言ってるのにPlaySoundはないだろうw
ところでMCIってまだあるのかな。
考えたら5年ぐらいマルチメディア刑API触ってないや
>>389 waveファイルってRIFF形式だった気がするんだが。
mmio〜系のAPIで操作できる・・・はず
>>389 > 標準のwavファイルならヘッダを取り除けば、あとは生のPCMデータのはずだけど。
PCMとは限らないんだけど。。。
>>390 もちろん残ってる。Win95の頃と実装は変わってるようだけど。
宣伝乙。
いやしかし、既成ライブラリに頼るというのはこの場合正解だよ。
WavOutは使いやすいとは言い難いしな。
396 :
デフォルトの名無しさん:2005/05/12(木) 01:11:31
ピクチャーコントロールにDirectXで描画するダイアログベースのツールを作ろうとしているのですが、
ピクチャーコントロールの更新されるタイミングが分からず困ってます。
DirectXの描画特有の問題かとも思ったのでDXスレで伺ったのですが、
なかなかレス頂けないみたいなのでこちらにも失礼します。
まずはアプリ起動時にDXで適当な矩形でも表示してみようと、
WM_INITDIALOGで矩形描画関数を呼んでみたのですが、
一瞬描画されたあと、ピクチャーコントロールの色で塗りつぶされてしまうようでした。
なので、WM_PAINT内でも同じように描画関数を呼んで見たのですが相変らず
起動時に矩形を表示してくれません。
(というかピクチャーコントロールの描画で消されているような感じ。)
WM_LBUTTONDOWN内などで描画すればきちんと表示されるのですが、
WM_MOVE内で呼んだ時などは、一度目の移動では表示されず、
二度目以降の移動では表示されるという、よく分からない挙動になっています。
どうしたらいいのでしょうか?
環境はW2k、VC6、DX9.0bです。よろしくお願いします。
>>396 まずはDirectX描画域の背景を描画しない設定にする。
ダイアログのスタイルにWS_CLIPCHILDRENを適用、
コントロール側のWM_ERASEBKGNDで0以外の値を返す
これでちらつき・上書きは消えるはず。
398 :
デフォルトの名無しさん:2005/05/12(木) 02:18:11
Win32API を使用したプログラムを実行したときに、コマンドプロンプトを待たせない方法はないのでしょうか?
例えば、コマンドラインから notepad を起動したとき、
C:\>notepad[改行]
C:\>
(notepad が開く)
となりますが、自作のプログラムでは
C:\>hogehoge[改行]
(hogehoge が終了するまで待機状態)
となってしまいます。
これを解決するにはどうすればよろしいのでしょうか?
400 :
398:2005/05/12(木) 02:28:36
ビルドというか、lcc-win32 でプログラムを作成し、
C:\>lcc hogehoge.c
C:\>lcclnk hogehoge.obj
というふうに実行ファイルを作成しています。
それとも、この環境では
>>398 の問題を解決することは出来ないのでしょうか?
Meadow2ってエディタについてくるfiber.exeってやつなら
C:\ > fiber.exe hoge.c
ってすれば
「.c」拡張子のファイルをクリックした時に起動するプログラムがそのファイルを開いて
シェルにも処理がもどる。
>>400 それは「Win32API」の話ではなく、特定の処理系の話なのでスレ違い
403 :
398:2005/05/12(木) 02:58:49
すみません、説明不足でした。
エディタのことではなくて、自分で作成(コンパイル)した Win32API プログラムを実行したときに、
そのプログラムが実行したままシェルにも処理が戻るようなプログラムを作りたいのです。
C:\>lcc hogehoge.c
C:\>lcclnk hogehoge.obj
C:\>hogehoge
C:\>
(hogehoge.exe は実行されたまま)
となるような hogehoge.c を作りたいのですが、どうすればよろしいのでしょうか?
プロセスやスレッドについて調べてみても、どうもうまく行きません。
void FreeConsole(void);
405 :
398:2005/05/12(木) 03:13:58
>>404 そんな関数があったんですね。
どうもありがとうございました!!m(_ _)m感謝感謝
406 :
396:2005/05/12(木) 03:38:07
>>397 ありがとうございます。
>まずはDirectX描画域の背景を描画しない設定にする。
>コントロール側のWM_ERASEBKGNDで0以外の値を返す
この二つの意味は同じでしょうか?別の事を指してますか?とりあえず
DirectXで描画したいのはダイアログ内に配置したピクチャーコントロールなのですが、
これをサブクラス化してその自前プロシジャ内に
case WM_ERASEBKGND:
return 1;
と追加してみたのですが、変わりませんでした。
>ダイアログのスタイルにWS_CLIPCHILDRENを適用、
これはピクチャコントロールが乗ってる親ダイアログのプロパティで設定しても変わりませんでしたし、
ピクチャコントロール自体にSetWindowLongでWS_CLOPCHILDRENを設定してみても変わりませんでした。
407 :
デフォルトの名無しさん:2005/05/12(木) 03:47:08
>>398 今の状態だとエクスプローラから実行するとコンソールが開くんでないかい。
それで構わないのならFreeConsoleでも使ってればいいんだけど、
そうじゃないのなら、lcclnkのマニュアルをよく読んどけ。
Win32APIの話っていうより
そもそもWindowsプログラミングの
>>376 何をしたいのかによるけど、
通知を何度受けるかわからない
という前提で作ったほうがいいですよ。
また通知を受けるたびに処理をしてたら重くなるので、
通知を受けたら、変更があったということだけ覚えておき、
それに対するアクションはその場ではしないほうがいいです。
もし通知に対してアクションをしたいのであれば、
1秒くらい待ってからやったほうがいいかも。
ウインドウのタイトルや枠などの色の取得方法を教えてください。
GetSysColor
文字列が正当なURLであるかどうかを確かめるAPIと、
URLからホスト名などを抜き出すAPIはありますか?
>>413 使ったことは無いけど、
>文字列が正当なURLであるかどうかを確かめるAPI
::UrlIs()にURLIS_URLを渡して確認する。
>URLからホスト名などを抜き出すAPI
::UrlGetPart()にURL_PART_HOSTNAMEを渡して切り出す
>>414 できました。
ありがとうございます。
#shlwapi.dllには、自前で書くこともできるけど、面倒くさいから書きたくない処理をする関数がたくさんある気がする。
MSはレジストリを使うことを推奨してるのに
レジストリを使うアプリが嫌われる理由は何?
ユーザーが消しにくいから。
インストールしたフォルダを削除しても消えないからね。
まあそれが利点でもあるんだけど。
レジストリをいじりまくるとレジストリファイルが断片化・肥大化するから。
Win9xの場合はそれが原因で不安定になることがあった。
もういい加減過去の話だが。
.NETではXMLで保存するのが推奨されるとかどこかで読んだ気がするんだけど
ちょっとしたツールだと、フォルダごとコピーすれば設定もコピーできて楽。
しかしファイルで保存するにしてもユーザーのフォルダにしてほしいなあ
自分ちのマシンならどこでもいいが・・・
ユーザのフォルダに設定ファイルを置くと、
1つのフォルダごとコピー・移動・削除
では済まなくなるので、レジストリと大差ないんだよね。
その割には、メリットがない。
EXEと同じフォルダにINIファイルを置くのは、
シングルユーザ当たり前のDOS時代の悪い慣習を引きずってると思う。
レジストリにすれば、ファイルのインストール先を気にしなくていいし、
レジストリをバックアップすれば、一括して設定をバックアップできるよね。
便乗で質問ですが、
ユーザーのフォルダの取得って何を使えばよいですか?
ユーザー毎の設定を\Documents and Settingsの奥深くにある
フォルダに置きたい。
424 :
デフォルトの名無しさん:2005/05/12(木) 20:10:22
>>423 GetEnviromentVariableで環境変数HOMEPATHを取得
USERPROFILEでもいい
2000、XPでもレジストリのコンパクションはできないから肥大化する一方
なんだよ、レジストリってのは欠陥システムだな。
ややこしいことが1つの売りだったんだよ
商用とかシェアウェアにとっては
SH〜系ってなんかアバウトというか、信用ならねーって感じのAPI群だけど、
それがMS推薦っぽいね。
なんていうかもうapi関数大杉('д`)
>>426 レジストリのサイズは消せば小さくなると思うけど・・・
VS.NETをインストール中に、一時的にものすごく大きくなるけど、インストール終わると減るし。
>>424 他に良い方法があれば教えてください。
1つのINIファイルの中にユーザごとに設定を書くと、
一人の設定を他所に移すのが難しくなるよね。
ユーザ別にINIファイルを分けると、
ユーザ名が変わったときにファイル名を変更しないといけない。
ユーザ名の代わりにSIDを使うと、他所のドメインやPCに移したら困るし。
>>433 キーや値を削除してもサイズが減らない、それがWINDOWSのレジストリ
VACUUMかければいいじゃない
そりゃPostgreSQL
どうせレジストリがパンクする頃には
新ウィンドウズが出てるんだろ。
XPももう過去の物だろw
Snes9xにキーの入力情報送りたいんだけど
SendMessageやPeekmessageでは矢印や
ABYXに相当するボタンの情報を送っても無反応です。
(F1や1等ゲームというよりSnesの機能に相当するものは動きます。)
(例えばキーボードのAにSnesのAを割り当ててSendMessage送っても効果なし)
なんかこれ解消するAPIないっすか?
Peekは受ける側だったorzPostMessageね
DirectInput使ってるからだろ。
442 :
439:2005/05/13(金) 05:37:47
どうにかならんもんですかね。
SendInpu()とかはだめ?
444 :
439:2005/05/13(金) 06:14:58
試してみようと思ったらサンプル少ねぇ
MSいってみます
445 :
439:2005/05/13(金) 12:56:46
>>443 キタ*・゜゚・*:.。..。.:*・゜(゚∀゚)゚・*:.。. .。.:*・゜゚・*!!!!!
後世の為に置き去りメモ
SendInputを使う為にstdafx.hの中に
#define _WIN32_WINNT 0x0501
#define WINVER 0x0501
を宣言。呼び出したい場所で
UINT ret;
INPUT tt;
tt.ki.wVk=0x41;
tt.ki.dwFlags=0;
tt.ki.time=0;
tt.type=INPUT_KEYBOARD;
ret=SendInput(1,&tt,sizeof(INPUT));
押しっぱになるのでdwFlagsで適度に補正してやる必要あり。
GetWindowThreadProcessIdなどで取得したプロセスIDのベースアドレスを求めるにはどうしたらいいのでしょうか?教えてくださいお願いします
>>446 プロセスIDのベースアドレス
この時点で、何か間違ってるよ。
いったい何がしたいの?
うるせぇカスだなぁ。わかんねぇならでしゃばんなよボケが。
readprocessで戻ってきたハンドルのベースアドレスだよタコ。ほんとお前みたいカスがくると気分悪くなるぜ。
お前のせいでまたこんなレスしてしまった俺は結局自分で解決するハメになると。ほんとうぜぇ・・・
スレのレベルが急速に低下してまいりました。
お前が読み取りを始めたいアドレス=ベースアドレス(ReadProcessMemory()では)。
プロセスID→プロセスハンドルにはOpenProcess()がある。
だからReadProcessMemoryで指定するベースアドレスがわかんねぇから教えろっつってんだよ。あ?わかんねぇんだろ?お?あぁ?コラ
__ ┌┬┬┬┐ __
―――┴┴┴┴┴―――――、
/.  ̄ ̄ ̄//. ̄ ̄| || ̄ ̄ ̄||| ̄ || __________
/. ∧// ∧ ∧|.|| ||| || /
[/____(゚_//[ ].゚Д゚,,) ||___||| || <
>>448,451を迎えに来ました
||_. * _|_| ̄ ̄ ∪|.|. .|ヽ. _|| \__________
lO|o―o|O゜.|二二 東|.|京 精神 .病院 ||
| ∈口∋ ̄_l__l⌒l_|_____|_l⌒l_||
 ̄ ̄`ー' ̄ `ー' `ー' `ー'
おまえらわかんねーならレスするなつってんだろ!
おいおい、騙りを何相手してやってんだ?
うるせーよ。煽りたいだけのやつはしゃしゃりでんなよカスどもが
ほんと使えねーなー
459 :
デフォルトの名無しさん:2005/05/14(土) 04:10:02
リソースエディタで作ったダイアログ内のボタンコントロール上に
矩形を描画しようとしているのですが、全く表示されません。
TextOutしてみても何も文字が表示されません。
どこがおかしい部分があるでしょうか?
何か他の部分で、ここがあやしそう、などありましたら教えてください。
hdc=GetDC(hWnd);//hWnd=GetDlgItemで取得したボタンのハンドル
hPen=CreatePen(PS_SOLID,1,RGB(r,g,b));//rgbは適当な値が入ってる
hBrush=CreateSolidBrush(RGB(r,g,b));
SelectObject(hdc,hPen);
SelectObject(hdc,hBrush);
Rectangle(hdc,0,0,100,100);
TextOut(hdc,0,0,"iii",3);
460 :
459:2005/05/14(土) 04:22:41
WM_PAINT内でやったらうまくいきました。
WM_INITDIALOG内でやってたのでダメだったようです。
461 :
459:2005/05/14(土) 05:02:09
度々すいません。やはり挙動が変です。
今までデバイスコンテキストの取得はGetDCを使ってたのですが、
GeginPaintとかいうのを使った方がいいらしいので書き換えました。
ですが、ダイアログ起動時に四角形は描画されるものの、ボタン自体が描画されません。
ボタンの部分を押してみるとボタンは出現するのですが、
今度は四角形が消えてしまいます。どうしたらよいのでしょうか。
//ダイアログのプロシジャ内
case WM_PAINT:
DrawRect(GetDlgItem(hWnd,IDC_BUTTON),100,100,0);
return FALSE;
//矩形描画関数
void DrawRect(HWND hWnd,int r,int g, int b){
PAINTSTRUCT paint;
HDC hdc;
HBRUSH hBrush;
RECT rct;
GetClientRect(hWnd,&rct);//hWnd はボタンのハンドル
hdc=BeginPaint(hWnd,&paint);
hBrush=CreateSolidBrush(RGB(r,g,b));
SelectObject(hdc,hBrush);
Rectangle(hdc,4,4,rct.right-5,rct.bottom-5);
EndPaint(hWnd,&paint);
ReleaseDC(hWnd,hdc);
DeleteObject(hBrush);
}
>>446 ほんとここの無知どもはウザイよね。
おまえの気持ちはよくわかる。
特に
>>449の馬鹿は、わかんねーのに答えるからレベル低下してるってのが
どうやら理解できないらしい。
というわけだから、わかるおれが答えてあげよう。
全部説明するとなると大変なのでかいつまんで言うと、
まずプロセスといっても中で実行されてるのはスレッドという単位だ。
つまりプロセスで実際に動いているスレッドを特定する必要がある。
これはいろんな方法があるので別途AdvancedWindows読むなり
すればわかる。PSAPIとかでググるのもいいかも。
スレッドを特定するまでできたら、そのスレッドに対して一旦
SuspendThreadなりで停止させ、GetThreadContextを呼ぶ。
すると現在の正確なEIPが得られる。
EIPが得られたら、そのアドレスからこんどはプロセスに
割り当てられているメモリのベースアドレスを特定する。
メモリのチェインをたどっていけばEIPの範囲に収まる
ブロックが見つかるはず。
それが質問のベースアドレスということになる。
まあPSAPIを使わなくても、たとえば普通のアプリなら
0x400000以降がベースアドレスだとか決め打ちされてる。
もちろんこの辺を細工しているアプリもある。
これの特定はプロセスにロードされているコードセクションの
PEヘッダ部分を見るのが手っ取り早い。
一番早いのは、そのプロセスに侵入してしまうという方法。
この辺のやり方の詳細を知りたいなら、やっぱり
AdvancedWindowsを読んどくのが良い。
結局AdvncedWindows嫁って結論になったけど、
プロセス・スレッド周りの質問は説明しようとすると長くなるからね。
こんな糞スレだと、その説明が正確とも限らないし。
とりあえずやり方だけでも知っとけば道は開ける。
やっぱあの本の存在は偉大なんだよなあ。
ちなみにAdWinにはPEヘッダの読み方は載ってないので、
その辺はWebか何かで調べるしかない。
pe formatかなんかでぐぐれば出てくる。
PEヘッダの構造を理解するのにはかなり時間がかかると思うけど、
プロセスを解析する近道はPEヘッダなので、この辺はぜひ調べて欲しい。
464 :
459:2005/05/14(土) 08:41:54
いろいろ試してるのですが解決しないので
簡略化してUPしました。ソースとVC6のリソースが入ってます。
おかしい所を指摘していただけると助かります。
ダイアログ内にボタンが二つあります。
起動時にボタンの上に白い四角が表示されるのが理想なのですが、
なぜかボタン自体が描画されません。
ボタンを押すと色選択ダイアログが開き、
選択した色の四角がボタンの上に表示されるようにしたいです。
ですが、このサンプルではなぜか、一方のボタンで色を選択すると
もう一方のボタンの上の四角が消えてしまいます。
常に表示されているようにしたいです。
よろしくお願いします。
ttp://gamdev.org/up/img/2660.zip
>>461 ボタンはダイアログの子ウィンドウ。
WM_PAINTが来たのはダイアログであって、ボタン(子ウィンドウ)に来たわけではない。
だからそのコードは不正。
で、そういうことがしたければオーナードローしなさい。
>>464 >おかしい所を指摘
あんたの頭。
以下解説を書こうとしたら>465に先を越されたので割愛。
>>448 > うるせぇカスだなぁ。わかんねぇならでしゃばんなよボケが。
人に文句つける前に、自分の日本語を見直せよ。
[
>>446より ]
> プロセスIDのベースアドレスを求めるには
・プロセスID
プロセスを一意に識別するための識別子
識別子にベースアドレスなどない。
君の質問は、
「整数値 1 のベースアドレスを求めるにはどうすればよいか?」
などと言っているのと大差ない。
日本語は正しく使え。
質問です
ウィンドウを何よりも最前面に表示するにはどうすればいいのでしょうか?
DirectDraw等で全画面+最前面になってる物のさらに上に表示したいです
普通に最前面にしただけでは無理でした orz
471 :
459:2005/05/14(土) 13:09:56
>>467 サブクラス化はボタン一個ずつに対してプロシジャ作るのが面倒くさいからやめました。
ボタンを押したらColorChooserダイアログを出して色を選択し、
ボタン上の四角に反映させたかったのですが、
押された後ではボタンのイベントは発生しないので、
オーナードローでは次に押すまで色が反映されないのでダメでした。
結局、消極的な方法で妥協しました。ありがとうございました。
DirectDrawサーフェイスの前に持ってくるにはクリップするしかない
質問です。
@ウインドウ作成してアクティブな状態にする
Aマウスでウインドウ外をクリックして非アクティブにする
Bタイマーで定期的に ShowWindow や SetForegroundWindow などを呼ぶ
AとBを繰り返すと、一回目は最前面にウインドウが表示されるのに、2回目以降は最前面に表示されません。
どうすれば最前面に表示することが出来るのでしょうか?
よろしくお願いします。
>>473 CreateWindowEx(WS_EX_TOPMOST, ...
>>470のような高度な要求をしなければこれでいい。
SetForegroundWindow()は2000/XPで挙動が変更されたはず。
475 :
470:2005/05/14(土) 14:24:43
>>472 まえゲームで全画面+最前面なものをしてたときに、
なんかの拍子で、最前面表示してた後ろのWinampがゲーム画面内にずっと表示されたままになったので
なにかほかに方法があるのかなと思ったのです orz
#Winampは再生中の時間もちゃんと表示され操作も可能でした
477 :
470:2005/05/14(土) 15:41:59
>>476 某MMORPG用のツールなので窓化はむりぽいです
公認ツールとして交渉中なので orz
ゲームのウィンドウをオーナーに指定する
DirectDrawSurfaceはGDIのクリッピング領域に従わないと思うから
ちゃんと描画されない気がするけど
だからDirectDrawClipperでやるしかないって
>>471に亀レス
> ボタンを押したらColorChooserダイアログを出して色を選択し、
> ボタン上の四角に反映させたかったのですが、
そういうボタンならサクラエディタなるオープンソースのテキストエディタに
あるからソースを参照にしてみるのはどうかな?
ちなみにサクラエディタではオーナードローで描画してるよ。
> 押された後ではボタンのイベントは発生しないので、
> オーナードローでは次に押すまで色が反映されないのでダメでした。
これはどこかソースがまずいんじゃない?
オーナードローは大した手間ではないし、コントロール上で自分の
好きなように描画する定石なんで知ってて損は無いよ。
あと、
> サブクラス化はボタン一個ずつに対してプロシジャ作るのが面倒くさいからやめました。
こいつは実装次第でどうにでもできる。
ReadProcessMemoryなんていうスケベなAPIを使うのに、
自力で使いこなせないようなレベルの低い香具師って、
ろくでもないことをやろうとしている人間の屑だろうな。
どうせゲームのチートツールやウィルス等の怪しげなものを作ろうとしてるんだろ?
いいかげんウザイので、答えを教えてやる。
VirtualQuery()だ。
もうこのスレに出てくるなよ。
>>481 カスが必死にググッてその様かwwwwwそんなもん質問する前から知ってますがwwwwwwwいい加減カスは黙ってチンポでも弄ってろwwwww
最近w使う人増えたね。
Windows, DWORD, WM_*
485 :
473:2005/05/15(日) 11:02:32
>474
レスサンクス
早速試してみましたが駄目でした
>>485 SetWindowPosでHWND_TOPMOS指定したら?
レスサンクスと書かれると、less thanks と読んでしまう。
GetLastErrorの使い方がわかりません
MSDNに載ってます
使い方は載ってません
>>490 プログラムなんかやめたほうがいいよ
載ってます
msdnのトップに出てる赤シャツの男って凄い頭よさそうだよな。
腕組みながらあの自信に満ち溢れた顔なんかとくに。
どうも、赤シャツの男です。
80−130です
血圧かよ!
漏れのIQは 10D10+5 だぜ。
期待値で60…低っ
急速にスレの質が低下してまいりました
だがそれがいい
sinunayomajide!
>>498,499
標準が 3d6 なんだから激高だろ。
もうダイスから離れろ。
winiqcfg.exe
506 :
473:2005/05/15(日) 23:56:07
>486
レスサンクス
早速試してみましたが駄目でした
507 :
デフォルトの名無しさん:2005/05/16(月) 00:37:11
MessageBox関数には
printf("%d",i);
みたいに引数を渡すことは出来ないのでしょうか?
CString tmp; tmp.Format("%d", i); MessageBox(tmp);
510 :
デフォルトの名無しさん:2005/05/16(月) 00:44:21
>>509 どうもありがとうございます。
さっそく続きを作っていこうと思います。
sprintfをすっとばすのかい・・・
513 :
デフォルトの名無しさん:2005/05/16(月) 14:11:28
string形で宣言と同時にサイズだけ指定することってできますか?
514 :
513:2005/05/16(月) 14:13:04
形じゃなくて型だった
516 :
513:2005/05/16(月) 14:25:47
>>515 ほんとだ!
C++だった。すいませんでした。
APIで手書きしてるとプロシジャ間で値の受け渡しとかしたいとき
どうしてもグローバルが多くなるんですけど、
皆さんはどうやって解決してますか。
>>517 コールバックデータに入れるだろ、普通。
>>518 是非とももう少し詳しく解説お願いします。
>>519 つまり、受け渡したいデータを構造体にまとめて、
関数の引数に渡すってことだ。それだけだ。
>>520 解りやすっ
別人だけどありがとうございました。
どうやって入れますか?
そういやlparamとかを
構造体のポインタに型変換してよく使ってるもんなー
LPARAMはx64でもポインタが入るんだっけ?
LPARAMはそもそもそのための引数だからな
64bit環境でのWin32 APIを使用したプログラミングってどうなるんだろう。
とくに、ポインタ関係。
64bitのプログラムは、64bit用の新しいAPIを使うのかな
普通に考えてそうなんじゃね?
今でも残ってる16bit版みたいに互換性が必要なヤツ以外は
>>526 適切に作ればソースはそのままでいけることになっている。
W/LPARAMは64ビット化されていて、それぞれUINT_PTR/LONG_PTRからのtypedefになっている。
その〜_PTRってのはポインタと同じサイズの整数型、つまりWin64では64ビットになる。
DWORD_PTRなんてわけわからんものもあるが。
一部のAPIはそれに対応した版が追加されている。(SetWindowLongPtrなど)
Win32の定義から考えると、変更をしてないならDWORD_PTR = LONG_PTRじゃね?
530 :
526:2005/05/16(月) 22:02:38
あ……64bit環境でwin32って変だな。
64bitのWindowsのAPIを利用したプログラミングと言ったほうがいいのかな。
32bitのバイナリはエミュで走らせるからいいとして、
64bitはtypedefを変えているからソースはそのままでコンパイルしなおすだけで動くというわけですか。
でも、本当に完全に、「適切」に書いている人ってどれぐらいいるんだろう。
ポインタが4バイトで、int型も4バイトってのが前提なソースを書いている人もかなり居そうなんだけど。
typedefされて、さらに何重にもdefineされているあの変数名をそのまま使っていない人もかなりいそうな気がする。
>>529 Win32ではDWORD_PTRはunsigined long _w64からのtypedefdeで、ULONG_PTRもそこからtypedefされている。
わけわからんって書いたのはDWORDは32ビットということ(x86では)なんだから、
DWORDと名乗る型に32ビットではないものがあるというのがわけわからんと言いたかったから。
>>530 これがすべてを物語っている。
SetWindowLong の検索結果のうち 日本語のページ 約 2,980 件
SetWindowLongPtr の検索結果のうち 日本語のページ 約 44 件
ちなみにVCではint/longは4バイトのまま。long/LONGをsigned DWORDとして使っているから永遠に(I)LP64へは移れないだろうな。
>>531 そんなこと言ったって、Win32のDWORDは現にunsigned longのtypedefなんだしさ・・・
DWORDは32bitと決まってるならunsigned longのtypedefはおかしいんじゃ?
あれ?longって規定は32bitだっけ・・・?
>>532 それはVCやその他Win16/32用コンパイラが(unsigned )longを32bitにしていたのを利用しただけ。
Cができたときからstdint.hがあれば間違いなくtypedef uint32_t DWORD;になっていただろう(と信じたい)。
ちなみにC/C++の規格を見るとlongは32ビット以上が必要と言える。
534 :
デフォルトの名無しさん:2005/05/16(月) 22:36:06
マウスフックです。教えてください。
ウィンドウをクリックしたまま、そのウィンドウを出て、
別のウィンドウに移るとWM_MOUSEMOVEやWM_LBUTTONUPが
飛んでこなくなるんですけどなんでですか?
初めにWM_LBUTTONDOWNでセットしたグローバル変数にも
参照できなくなります。
誰か教えてくださいmm(__)mm
>>534 フックプロシージャは DLL 内に置いてあるか?
あと、DLL の場合 #pragma data_seg("shared") に包んでやらないと
プロセスごとにグローバル変数の実態も変わるからな。
536 :
534:2005/05/16(月) 23:02:19
返事ありです。
>フックプロシージャは DLL 内に置いてあるか?
もちろん置いてます。
>あと、DLL の場合 #pragma data_seg("shared") に包んでやらないと
>プロセスごとにグローバル変数の実態も変わるからな。
まさにそんな感じです。ちょっと調べてみます。
またわからないことあったら教えてください。
すいません、教えて下さい。
親ウィンドウにスタティックコントロールを子ウィンドウとして置き、ここに目的の描画処理を行っています。
で、この子ウィンドウのスクロールバーが上手く動きません。
具体的には
1.ウィンドウにSetFocusしない限りWM_VSCROLL/WM_HSCROLLが来ない
2.スクロールバーをドラッグしてもWM_VSCROLL/WM_HSCROLLが来ない
3.それどころかドラッグしてもポインタが動かない
4.にも関わらず、スクロールバー上での右クリックメニューからのスクロールは可能
1は大体諦めて、SetFocusした後はスクロールするんだからと妥協しましたが・・・。
2〜4がいまひとつ納得いきません。
子ウィンドウ上でドラッグなどしつつ届くメッセージをチェックしたところ、WM_NCHITTESTくらいしか来ていません。
WM_NCHITTESTを拾って、スクロールバー上の座標ならHTVSCROLL/HTHSCROLLを返すようにしてみましたが、効果なし。
使用しているのがスタティックコントロールだというのが主要因かとは思いますが、こちらも別件で問題が発生して頓挫しています。
(ResisterClassExしたクラスでCreateWindowExが失敗する)
よい打開策はありませんでしょうか?
一応、別にスクロールバーコントロールを作成するという案はありますが、修正箇所が多くて二の足を踏んでいます。
これしかない、というのであれば別コントロール案を採用します・・・。
int が64ビットじゃないなんて
なんのための64ビットだよ?
もちろんメモリマップを広げるためでしょ。
2Gオンメモリで読み込みなんてそのうち当たり前になってくるかも。
540 :
526:2005/05/17(火) 00:34:44
sizeof(int) == 4と決め付けた既存のソースが多いからじゃないのかな。
int型のサイズを変えて既存のソースを動かせなくするより、
64bitのintは__int64型にするなどとしてしまったほうが都合がいいのでは?
数年前に同じような話の展開を見たことがあるな・・・
あのころは16bit->32bitだったが・・・
そんなのコンパイルオプションで32ビットにできるようにすればいいだろうに。
デフォルトでは64ビットにしておけよ。
なんでクソソースに合わせなきゃならんのだよ?
できの悪いほうに合わせるなんてまるで日本の教育だな。
int は 32bit の方が良いな。
それよりも short 16bit、int 32bit、long 64bit の方が
型の意味的にも綺麗なんだけどなぁ。
SHFILEINFO shfInfo;
::SHGetFileInfo( Ext, NULL, &shfInfo,
sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SMALLICON );
で関連づけられているアイコンを取得しようとしています。ワードのファイルの場合"*.doc"でうまくいきますが、
エクスプローラのフォルダやドライブのアイコンを取得したい場合どのようにすればよいのでしょうか?
Shell32.DLLから決めうちで取得してもよいのですが、将来OSの仕様が変わったときが心配です。
547 :
デフォルトの名無しさん:2005/05/17(火) 14:19:16
HeapAllocとVirtualAllocの違いというか、長所ってどんなんでしょうか?
ヒープ領域って1アプリ(?)辺り、如何ほど頂けるのでしょうか?
最後に、VCでのmalloc = HeapAllocと考えてよろしでしょうか?
>>547 大雑把に言うと
VirtualAllocはプロセスのメモリ空間から直接メモリを割り当てる。だからオーバーヘッドがでかい。
HeapAllocは一旦独自のヒープをVirtualAllocで確保し、そこから必要なだけ切り出してくる。
だからこまごまとしたメモリ(数MBまで)の確保にはHeapAllocが、広大なメモリの確保にはVirtualAllocが適している。
>>547 VC持ってるなら、mallocのソースもあると思うから読んでみるよろし
今Virtualとか関係無くなってないか?
551 :
547:2005/05/17(火) 16:21:53
勉強になりました
どうも
時代はパーシャル
健さんハッケソ
文太さんじゃねーのか?
ソーダッタ
朝日ソーラじゃけん
○<天ーん!
大
||
ω
>>550 適当なこと言うなよ。
VirtualAllocとHeapAllocではメモリをどこから持ってくるかが違う。
ただしHeapAllocでデフォルトヒープのみを使う場合は
GlobalAllocやLocalAllocしても同じ。
さあ今日もこの合言葉で締めましょう。
「AdvancedWindows読め」
HeapCreateの解説
>If dwMaximumSize is zero, the heap is growable. The heap's size is
>limited only by available memory. Requests to allocate blocks larger
>than 0x7FFF8 bytes do not automatically fail; the system calls the
>VirtualAlloc function to obtain the memory needed for such large blocks.
AdvancedWindowsの存在がなかったらWindowsプログラミング挫折してたかも。
それぐらい凄い本。
本来MSDNに含まれるべきだが商売汚いM$は絶対そんなことしない。
MicrosoftPressのJeffreyRichter著の本は他のもオススメできると思う。
ProgramingWindows2000とか。
565 :
デフォルトの名無しさん:2005/05/17(火) 22:39:20
>>564 UNIX板やLinux板でその発言してみろ
泣いて向かってくるぞ
WindowsAPI
AdvancedWindowsは読んだことないけどな・・・。
VirtualAllocとHeapAllocを
MSDNライブラリで引いてみりゃ、
その違いはすぐにわかるでしょ。
568 :
デフォルトの名無しさん:2005/05/18(水) 00:22:04
文字を一文字だけ描画するための関数ってありますか?
TextOut()って文字列ですよね?
一文字だけ描画する場合もこの関数を使うんでしょうか?
そうだね
570 :
537:2005/05/18(水) 00:30:39
この見事なスルーっぷりは、スクロールバーコントロールを使えという無言のアドバイスですかね。
やっぱそれしかないのかな・・・_| ̄|○
>>570 状況がよくわからん。IDは-1じゃないよな?
CreateWindowExの失敗も追及してみないか
572 :
537:2005/05/18(水) 00:53:45
>>571 レスありがとう。
IDって何を指してますでしょうか?
SetScrollInfoのウィンドウハンドル?(そんな訳ないか
根本的な対策という意味ではCreateWindowExの失敗を追った方がよいかも知れません。
2つまとめて質問するのは失礼かつ分かりにくいかと思って、スクロールバーに絞った所存です。
必要ならば、ResisterClassExとCreateWindowExの処理部分を晒します。
573 :
568:2005/05/18(水) 01:07:28
>>569 お返事ありがとうございます。
TextOut()の4番目の引数(文字列のポインタを指定するところ)に
char型の変数のアドレスを渡すのってありですか?
実行してみたら普通に動いたんですけど、このやりかたで問題ないのでしょうか?
それとも文字をchar[]かstring型の変数に代入してからやったほうが良いのでしょうか?
574 :
デフォルトの名無しさん:2005/05/18(水) 01:26:06
>>573 文字列長に-1を指定してないなら、charのアドレスを渡すのもアリ。
575 :
デフォルトの名無しさん:2005/05/18(水) 01:28:06
>>573 文字列長に-1を指定してないなら、charのアドレスを渡すのもアリ。
576 :
568:2005/05/18(水) 01:57:31
>>575 お返事ありがとうございます。
文字列長に-1を指定するなんてこと普通ないと思うんですけど、
何か特別な意味が有るんでしょうか?
文字数をいちいち意識しなくてすむ。
>>528 DWORD_PTRは「DWORDもポインタも格納可能な型」ってことだから
sizeof(DWORD_PTR) >= max(sizeof(DWORD), sizeof(LPVOID))ならなんでもいい。
579 :
568:2005/05/18(水) 02:49:34
>>577 すいません、どういうことかわからないんですけど。
もしかして文字列長に-1を指定すると自動的に文字列長を計算してくれるとか?
でも試しに文字列のポインタと-1を指定して実行してみたんですけど、
何も表示されなかったんですけど。
どういうことなんでしょうか?
580 :
567:2005/05/18(水) 03:01:57
わかりました(たぶん)
DrawText()関数では文字列長に-1を指定すると文字列長を自動的に計算してくれるみたいです。
TextOut()関数ではそれは無いみたいです。(たぶん)
>>581 この際、君の好き嫌いは気にしちゃいられない
時差の設定の影響されないファイルのタイムスタンプの取得方法を教えてください。
>>583 先ずはその意味不明な日本語の解説をしてください。
日本で取得してもアメリカで取得しても同じ値を得たいのです
>>582 GetFileTimeして得られたFILETIMEを、FileTimeToSystemTimeで
SYSTEMTIMEに変換すればOK。
ただし、FATファイルシステムでは、タイムスタンプをローカルタイムで
持っているため、タイムゾーンの設定が間違っていた場合には、
GetFileTimeがそもそも誤った結果を返す。
このため、FATファイルシステムにおいては
>時差の設定の影響されないファイルのタイムスタンプの取得方法
は存在しない。
無理
漏れはまた、
「時差の設定の」「影響されないファイルのタイムスタンプの」取得方法かと思ったよ。
環境変数TZについてですが日本語Windowsの場合未設定になっていますが他国語版Windowsでは設定されてるのでしょうか?
お前等をアレするAPIを教えてください
593 :
590:2005/05/18(水) 14:08:27
⊂(。Д。⊂⌒`つダンダッテー
_tznameは使うなって事か‥‥
メールのUIDLを取得する方法を教えてください
リッチエディットのスムーズなスクロールを、
無効にすることは可能ですか?
可能ならどうすれば…
今のOSバージョンとCPUメモリ、グラフィックスドライバを
言ってくれないとわからんw
スタンバイから復帰させる方法を教えてください
電源ボタンを押す
スタンバイからプログラムで復帰させる方法を教えてください
スタンバイ状態でプログラム動くの?
時刻かなんかでメッセージ受けるの?
603 :
デフォルトの名無しさん:2005/05/18(水) 15:56:32
スタンバイから復帰させる方法を教えろつってんだろ!!
テメーシネヨ、できないのはできない
スタンバイ状態にしろ、休止状態にしろ、
マシンの制御がBIOSのACPI側に移行してるだろうから、
OS側ましてや、アプリケーションなんかではどうのこうのは出来ないはず。
スタンバイの場合はメモリには給電されてるから復帰が早いってだけじゃなかったっけ?
スタンバイから復帰させる方法を教えてください
607 :
597:2005/05/18(水) 16:08:00
スムーズなスクロールというより・・・
マウスのホイールでスクロールしたときに、
ホイールクルクル止めても、行が多いとスクロールし続けてるのを何とかしたい…
RichEdit1 です
OSとか関係あるん?
xp,p43G,512M,ti4200
寝てる人に目覚まし鳴らすスイッチを持たせるようなもんだな >スタンバイから復帰
寝てる本人にはどうしようもない。
口ばっかだな
元の質問の答えには使えないな
スタンバイに入ってしまったらどうしようもないもんな
うわー…
寝る前に目覚ましをセットするようなものか
スタンバイから復帰させる方法を教えてください
それは、確かな外殻団体を作れ!
RichEditにオートインデント機能を持たせようとENM_KEYEVENTSを設定し、WM_KEYDOWNのVK_RETURNが来たところでTabや半角スペースを入れるようにしましたがうまくいきません。
原因はコントロールの改行挿入が完了しないままEM_REPLACESELでTab挿入をしてることにあるみたいです。
エンターが押された後にコントロール内での処理が終わってから来るメッセージはありますか?
SHBrowseForFolderにチェックボックスを付ける方法を教えてくださ
無理
>>619 BROWSINFO構造体のlpfnメンバにコールバック関数を設定して
コールバックの方で、BFFM_INITIALIZEの時にCreateWindowで自前で作れ
CreateWindowで作ってやるよハゲ!
俺を女子高生のサブクラス化にさせる方法を教えてください
難しい日本語つかうね。
プリンタにインストールされているフォント一覧を取得する方法を教えてください
EnumFontsでどうかなぁ
>>616 >スタンバイから復帰させる方法を教えてください
タスクスケジューラを設定しておくか、
WakeOnLANで起こしてもらうか、
手で電源ボタン押す。
631 :
630:2005/05/19(木) 17:28:03
何この静けさ?
静かでいいじゃない。
633 :
630:2005/05/19(木) 17:51:32
そだな
Sleep
質問者のその後が無いからなあ
MessageLoop
リストボックスのインデックスを取得する方法を教えてください。
じゃなかった。説明たりね。スマソ
641 :
デフォルトの名無しさん:2005/05/19(木) 19:52:52
アイコンリソースについての質問です。
リソースファイル(resource.rc)に
MYICON ICON DISCARDABLE "icon.ico"
MYICON2 ICON DISCARDABLE "icon2.ico"
などと書いて、プログラム中で MYICON と MYICON2 を切り替えようとしてもうまく行きません。
というより、どうやら最初の1つ(MYICON)しか認識されないようです。
どうすればよろしいのでしょうか?
どうやってどうなったのか書かない奴はネタと判定します。
>プログラム中で MYICON と MYICON2 を切り替えようと
というのは具体的にどういう実装なのか
>うまく行きません。
とは、どういう期待に対する、不満足な結果なのか
を明らかにしないのは釣り。
MessageBoxで使われてるフォントは何でしょうか?
画面のプロパティで設定しているフォント
647 :
641:2005/05/20(金) 07:15:57
具体的には、タスクトレイに表示したアイコンを動かしたいのです。
タスクトレイにアイコンを表示するには、
NOTIFYICONDATA n_mid;
m_nid.cbSize = sizeof(NOTIFYICONDATA);
m_nid.hWnd = hWnd;
m_nid.uID = TRAY_ID;
m_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
m_nid.uCallbackMessage = WM_TRAY;
m_nid.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_EXCLAMATION));// ここではシステムの「!」マーク
lstrcpy(m_nid.szTip, TEXT("Tip Message"));
Shell_NotifyIcon(NIM_ADD, &m_nid);
変更するには、
m_nid.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_QUESTION));// ここではシステムの「?」マーク
Shell_NotifyIcon(NIM_MODIFY, &n_mid);
などとすればよいことまでは分かるのですが、
自分で書いたリソースファイルの中に2つ以上定義したはずのアイコンが1つしか使えないのです。
自分で作成したアイコンを2つ以上使うにはどうすればよいのか、どなたか教えてください。お願いします。
ImageList
>>647 少なくとも、こちらで書いた中にそれを組み込んでも
普通に切り替わる。
>>647が書いてない部分に何か原因がありそう
650 :
537:2005/05/20(金) 11:36:07
質問者のその後って、漏れのことかも・・・(⊃ω⊂)
SCROLLBARクラスに変更したら、外観が他のウィンドウと異なることが発覚。
結局CreateWindowExの失敗を追及しようかと思うようになりますた。
ちなみに失敗するのはこんなコードです。
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = NULL;
wc.lpfnWndProc = RightWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = (LPCTSTR)RWINDOWCLASS;
wc.hIconSm = NULL;
wc.hIcon = NULL;
RegisterClassEx(&wc);
hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,
(LPCTSTR)RWINDOWCLASS,
"",
WS_CHILD | WS_VISIBLE | WS_BORDER,
log_rect.log_pos_x,//左ウィンドウ補正
log_rect.log_pos_y,
log_rect.log_width,//幅
log_rect.log_height,//高さ
hWndSuper,
(HMENU)ID_LOGVIEW,
hInst,NULL);
改行が多いと怒られたので分割します。
651 :
537:2005/05/20(金) 11:36:59
>>650の続き
RWINDOWCLASSにはヘッダでクラス名のテキストを定義してあります。
このコードで起きる現象。
・RegisterClassExは成功する。
・CreateWindowExがNULLリターンするが、GetLastErrorで取得するエラーは
「この操作を正しく終了しました。」
ちなみにRegsterClassExをコメントアウトすると
「ウィンドウクラスが見つかりません。」
となるので、クラス登録は成功していると考えられます。
WH_CBTフックもしてません。
ウィンドウプロシジャでWM_CREATEやWM_NCCREATEも処理していません。
ということで、原因をつかみかねております。
すいません助けて下さい・・・ 。・゚・(ノД`)・゚・。
652 :
537:2005/05/20(金) 11:40:41
すいませんもうひとつ書き忘れました。
このCreateWindowExですが、クラスを"STATIC"に変えるだけで普通に動きます。
//STATICコントロールにした状態で作り込みしていましたので・・・
リストボックスでクリックされた項目の番号によって判別し、
発生するイベントを作りたいのですが、
その番号を配列文字列の数値に割り当てたいのです。
そのやり方を教えてください。
>>652 その RightWndProc の WM_CREATE で何かやってる?
655 :
654:2005/05/20(金) 11:54:25
ああ、何もやってないってか。
WM_CREATE が来るかどうかは調べられる?
656 :
537:2005/05/20(金) 12:01:42
>>655 ありがとうございます。
デバッガでトラップしてみたところ、WM_CREATEが来ていないように見えます。
ただ、CreateWindowExのエラーが出る前に、RightWndProcが2回呼ばれていました。
そのメッセージを見ると・・・
1回目:WM_NCCREATE
2回目:WM_NCDESTROY
アレ?これはもしかして・・・。
ちょっとRightWndProcを見直してみます。
ちゃんとDefWndProcしてないかも・・・。
>>651 CS_OWNDC か CS_PARENTDC のどちらかをセットするとどうなりますか。
658 :
537:2005/05/20(金) 12:05:52
>>657 ありがとうございます。
両方のパターンを試してみましたが、現象に変化なしです。
659 :
537:2005/05/20(金) 12:14:37
>>656その後
親ウィンドウのWM_CREATE処理で
CreateWindowExするモジュールの呼び出し→SetWindowLongでサブクラス化
とやっているのが気になったので、RightWndProcのCallWindowProcをDefWindowProcに変更。
変化なし orz
660 :
537:2005/05/20(金) 12:57:54
たびたびすみません。
解決しました。
RegsterClassExの一部を変更しました。
wc.lpfnWndProc = DefWindowProc;
サブクラス化のSetWindowLongが後で走る訳ですから、クラス登録ではDefWindowProc
を登録しておけば済む話だったんですね・・・。
WM_NCCREATE→WM_CREATEとならずに
WM_NCCREATE→WM_NCDESTROYとなっていたのが重大なヒントになりました。
ありがとうございました。
>>661 そこに LB_GETCURSEL を使うって書いてあるじゃんか
>662
でもintにキャストできません
は?やってみたのかよ
665 :
663:2005/05/20(金) 16:17:55
i=(int)SendMessage(list , LB_GETCURSEL , 0 , 0);
これじゃダメですか?(ダメだったけど)
>>665 どういう値を期待してどんな値が返ってきたの?
それで問題なく取得できるはずだけど。
ListCtrlじゃなくて、ListBoxだよね?
667 :
663:2005/05/20(金) 16:49:33
>666
ありがとうございます。
どうやら違うところで手違いがあったようです。
後は何とかなりそうです
668 :
663:2005/05/20(金) 17:01:47
ああ、何とかならない。。。
strcpy(name[0] ,buf[i][0]);
とか文字列に埋め込むと、なぜかフリーズしてしまうorz
ほかが見えないとわからんが、、
strcpy(name, buf[i]) ではないのか
670 :
663:2005/05/20(金) 17:22:10
static char buf[256][256][1024];
static char name[2][1024];
nameもbufも多次元変数です。
実のところソースは汚すぎなんで。。。
671 :
663:2005/05/20(金) 17:34:04
もういいや。吊ってくる
64MBの配列か・・・いいけどね、ベツニ
>>668 後は i の値とか。
つか、ここに来たからには嘘でも lstrcpy を使え。
GETCURSELは非選択だとLB_ERR(-1)返るから注意な
質問させてください。昨日から悩んでいるのですが、解決できません。
マルチスレッドでshell namespaceを使い、zipの中身を列挙したいのです。
4Mと40Mのzipファイルを用意し、以下のソースを実行したところ(長くてすみません)、
STAの待ち行列に入っているような挙動になりました。
これを回避したいのです。
ちなみにエクスプローラだと、あるエクスプローラで40Mのzipを
開こうとしつつも、別のエクスプローラで4Mのzipを開けます。
#include <windows.h>
#include <stdio.h>
#include <process.h>
#include <shlobj.h>
#pragma comment(lib, "shell32.lib")
void f(void* p) {
int i = (int)p;
::OleInitialize(NULL);
wchar_t* name = (i%2==0) ? L"D:\\4M.zip" : L"D:\\40M.zip";
LPITEMIDLIST idl = ::ILCreateFromPathW(name);
LPSHELLFOLDER desk, sf; LPENUMIDLIST el; HRESULT hr;
hr = ::SHGetDesktopFolder(&desk);
hr = desk->BindToObject(idl, 0, IID_IShellFolder, (LPVOID*)&sf);
printf("start %d\n", i);
hr = sf->EnumObjects(NULL, SHCONTF_NONFOLDERS, &el);
printf("end %d %x\n", i, hr);
sf->Release();
desk->Release();
CoTaskMemFree(idl);
::OleUninitialize();
_endthread();}
int main(int argc, char* argv[]) {
HANDLE hs[10];
for (int i=0; i < 10; i++) hs[i] = (HANDLE)_beginthread(f, 0, (void*)i);
::WaitForMultipleObjects(10, hs, TRUE, INFINITE);
char buf[256];
gets(buf);
return 0;}
>>675 > ちなみにエクスプローラだと、あるエクスプローラで40Mのzipを
> 開こうとしつつも、別のエクスプローラで4Mのzipを開けます。
この場合は、マルチスレッドではなくマルチプロセスになるから、
比べる意味がないのはわかってる?
>>677 エクスプローラはマルチプロセスでしたっけ?
複数のエクスプローラを立ち上げると
explorer.exeのスレッドが増えるだけだと思いますが?
679 :
678:2005/05/20(金) 19:52:28
>>677 すみません。678で馬鹿なこと書きました。
>>678 そういうチェックボタンあったから、
たぶんマルチプロセスにもできるんだよ
681 :
デフォルトの名無しさん:2005/05/21(土) 00:46:32
>>678,679
エクスプローラはマルチプロセスではないだろ?
>>680 フォルダオプションの「別のプロセスでフォルダウィンドウを開く」なら、タスクバーその他を管理するプロセスとフォルダウィンドウを管理するプロセスを分けるってだけじゃないか?
683 :
デフォルトの名無しさん:2005/05/21(土) 01:31:21
WM_TIMERでInvalidateRgnするとタイミングの問題なのかたまに画面全体がバグるんだけど
どうやって回避する?
684 :
デフォルトの名無しさん:2005/05/21(土) 01:32:58
> 画面全体がバグる
> 画面全体がバグる
> 画面全体がバグる
> 画面全体がバグる
> 画面全体がバグる
動的にmsvcrt.dllを呼び出してアプリケーション側で
ちゃんと初期化したいんですが、
仕様って後悔されてませんにょ
686 :
683:2005/05/21(土) 01:36:09
なんていうか、画面全体が更新領域に設定されるのかすごいちらつく
ウィンドウとか全部真っ白になるけどそのプログラムを止めて再描画させるようにすれば直る。
>>685 日本語を話せるようになってから、また来てくれ