1 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 23:23:58 ] スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。 やさしいお兄さんやお姉さんたちが答えてくれるかも。 過去スレ、関連リンクは>>2-10 くらい。 ■注意 ・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。 ・日本語版MSDN Online Libraryは不完全です。英語版(msdn2.microsoft.com/library/ )の利用推奨。 ・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。 ・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで - Win32API質問箱 wiki wiki.livedoor.jp/program1/d/FrontPage Win32API質問箱 Build68 pc11.2ch.net/test/read.cgi/tech/1215348804/
307 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 01:27:28 ] フラグの説明読んで書いてみりゃいいだろ なんで自分から動こうとしないんだよ
308 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 01:28:02 ] >>306 普通にググれば見つかるのだが
309 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 10:19:12 ] LVS_EX_LABELTIP Version 5.80. If a partially hidden label in any list view mode lacks ToolTip text, the list-view control will unfold the label. If this style is not set, the list-view control will unfold partly hidden labels only for the large icon mode. 別に複雑な操作がいる訳でもなし このくらい試してみようぜ
310 名前:デフォルトの名無しさん [2008/08/12(火) 10:57:03 ] CS_OWNDCにしたときに増えるメモリってどれくらい? 猫でもをみたらちょっとだけメモリを消費するって書いてあったけど タスクマネージャを見たけどあんまり変わってないっぽいけど
311 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 11:38:05 ] 見たまんまだ 確認したならそれを受け入れろ
312 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 13:35:46 ] 640KBで動く時代からあるAPIdsと説明がそういう風になることもあるw
313 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 13:40:12 ] TextOut関数で背景を部分的に変える関数等ありますでしょうか?
314 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 15:00:59 ] たかだが背景色だけ変えるなら SetBkMode で OPAQUE 指定 { SetBkColor して TextOut } を変えたい単位で分割呼び出し 複雑な背景をどうこうしたいなら SetBkMode で TRANSPARENT 指定 先に背景を描画しきって TextOut
315 名前:デフォルトの名無しさん [2008/08/12(火) 15:58:29 ] ShowWindowをAdvancedWindowsのやつでAPIフックしたらアドレス違反になるんだけどなんで?? 全プロセスにDLLにして注入ではなく、自プロセスのフックのみでやってる。適当なexeにDLLにして注入してもやっぱり違反。 他のAPIはフックできてる。環境はBCBなんだけど。
316 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 19:08:36 ] WriteProcessMemoryでやれ。権限もクリアしていて、それでできなきゃアドレス間違っている。メモリ覗いて確認しろ。
317 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:00:27 ] >>316 俺VirtualProtectでやってるんだけど WriteProcessMemoryのほうがいいわけ?
318 名前:317 mailto:sage [2008/08/12(火) 20:01:46 ] >>315 その事象で俺が経験した事といえばスタックオーバーフロー
319 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:38:48 ] どうせエラー値確認していないんだろ
320 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:30:16 ] アドレス違反で落ちてたらエラー値も何も無いだろ
321 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:58:43 ] だから何でVirtualProtectのエラーチェックしないの?ゆとり?
322 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:01:10 ] 書き込みでAVになるか、書き換えた関数が呼ばれた時例外発生するか質問者ははっきりさせないといかんな。
323 名前:317 mailto:sage [2008/08/12(火) 22:09:50 ] >>321 俺別にエラーチェックしてないとは一言も言ってないんだがwwwww >>320 の言ってる通りアドレス違反で落ちてるんだから・・・・・ 多分だけどやっぱ>>315 はスタックオーバーフローしてるんじゃない? GetProcAddressもあわせてAPIフックしてるならその辺を睨んだ方がよさげ つーかコード掲示するかAdvancedWindowsのページがわからないと これ以上なんともいえない
324 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:27:47 ] 呼び出し規約かw
325 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:19:47 ] Ollyか何かで追跡してみれば
326 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:24:58 ] エディットコントロールの文字列選択の処理ってどうなっているのですか? どうやって選択範囲を計算してるのですか?
327 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:37:19 ] GetTextExtentPoint
328 名前:315 mailto:sage [2008/08/13(水) 12:55:18 ] コードも例外発生の場所も書いてなくてスマン。 なのに原因を見抜けるってのはもうすげぇな、感謝!例外は置き換えた関数が呼ばれたときにおきてた。 きちんとstdcallだってのを置き換え関数で宣言したら、うまく動くようになった。 BCBとかdelphiは標準だとcdeclとかfastcallとかだったっけ。 とにかくみんなサンクス!!
329 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 15:10:46 ] >>327 キャレット位置をどうやって計算しているかわかりますか?
330 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 15:26:17 ] 一文字ずつ幅を足していく
331 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 15:34:53 ] WM_LBUTTONDOWN クリック位置x.y座標取得 GetTextExtentPoint32関数で得られた文字列のサイズと比較していく、って事ですか?
332 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 19:09:19 ] GetTextExtentExPointを流用してもいいけど
333 名前:デフォルトの名無しさん [2008/08/13(水) 20:11:50 ] あるアプリのタブコントロールを別のプロセスから変化させたいのですが 別プロセスからTCM_SETCURSELをSendMessageすると、タブの位置は 変化するものの、TCN_SELCHANGEなどの通知メッセージがアプリ側で 発生しないので、肝心の内容が置き換わりません。 仕方なく、別プロセスから続けてWM_NOTIFYを発生させる事を考えたのですが、 別プロセスからでは構造体(NMHDR)を渡すようなメッセージは 伝わらない様です。 別プロセスからうまくタブが変化した事を通知する方法はないでしょうか。 該当コード SendMessage(htab, TCM_SETCURSEL, 3, 0); { NMHDR nmhdr; nmhdr.hwndFrom = htab; nmhdr.idFrom = GetDlgCtrlID(htab); nmhdr.code = TCN_SELCHANGE; SendMessage(hmain, WM_NOTIFY, GetDlgCtrlID(htab), (LPARAM)&nmhdr); }
334 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 20:29:33 ] VirtualAllocEx WriteProcessMemory
335 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 20:41:43 ] sendinputを使おうと思って検索したらこんな2種類の書き方が出てきました。 lpKey->type = INPUT_KEYBOARD; inputKey[cnt].type = INPUT_KEYBOARD; この -> と [ ].type はどう違うんですか?
336 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 20:53:59 ] >>335 C言語スレ池
337 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 21:30:56 ] ステータスバーの文字の色を変えるにはどうすればよいですか?
338 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 21:38:25 ] MSDN読め
339 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 21:56:25 ] >>336 分かりました。
340 名前:デフォルトの名無しさん [2008/08/13(水) 22:14:10 ] >>334 ありがとうございます。 できました。 かなり泥臭いですね・・
341 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 07:25:29 ] BitBltする大きさが少し違っただけで、いきなり速度が変わるんですが、なんか理由があるんですか。 あとディスプレイを2つつないでる環境でも、速度が結構落ちるんですが。
342 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 07:31:47 ] そりゃそうでしょうね
343 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 07:54:37 ] ヒントでもいいから教えて
344 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 08:11:23 ] おっ 典型的ゆとり発言
345 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:15:43 ] 知らないならレスしないでください
346 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:52:15 ] 自己解決しました ありがとうございました
347 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 11:19:44 ] 間違ってました やっぱり教えてください
348 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 14:55:53 ] 教えてもいいが 気に入らない態度がお前の
349 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 15:50:41 ] 知らないならレスしないでください
350 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:42:44 ] 自己解決しました ありがとうございました
351 名前:デフォルトの名無しさん mailto:質問age [2008/08/14(木) 18:46:37 ] 標準入力にデータが存在するかを調べるにはどうすれば良いでしょうか。 _kbhitやPeekConsoleInputを試してみたのですが、リダイレクトされた場合に機能しないようです。 CreateFileでOVERLAPPEDが使えるかとも思ったのですが、Consoleでは無視されると説明されていて 実際試してもうまくいきませんでした。
352 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 19:22:58 ] そういうときには実際に読んでみればいいんだよ。
353 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 19:41:47 ] DialogBoxやCreateDialogから行くcallback関数に変数等を渡す場合 はグローバルで宣言しておくしかないですか?
354 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 19:48:42 ] >>353 DialogBoxParam・CreateDialogParamの初期値で適当な構造体のポインタでも渡しとけ
355 名前:デフォルトの名無しさん [2008/08/14(木) 20:00:22 ] >>352 申し訳ありません、情報が足りませんでした。 入力がない間は他のことをしたいのです。
356 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:04:00 ] スレッド分けれ
357 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:05:00 ] >>354 出来ました。ありがとうございます
358 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:20:26 ] >>356 元が*nixなコンソールプログラムの処理中に、 出来るだけ手を加えずにほんのちょっと通信したかっただけなんで スレッド分けとかソケットは遠慮していたのですが、やはりそこまでやらないと駄目ですかね。 シグナルとかあればそれでもいいのですが。
359 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:40:50 ] Win32APIをC++でラッパしたフリーのライブラリ でお勧めのものがありましたら教えて下さい.
360 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:44:41 ] Boost
361 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:53:10 ] msdn.microsoft.com/ja-jp/magazine/cc534994.aspx これとか?
362 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 21:08:18 ] WTLを勧める
363 名前:359 mailto:sage [2008/08/14(木) 21:57:02 ] ありがとうございます。 自作ライブラリの参考にしたいので、 単純で解析しやすいのは無いでしょうか? eGUI++は、相当頑張ればなんとか読めそうでしたが、 WTLの方は[!endif]とか変な記号があってわかりませんでした。
364 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 22:00:52 ] へ?俺が見た限り、WTLに[!endif]なんて存在しないけど・・・
365 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 22:39:08 ] >>359 STLSoft
366 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 23:43:56 ] >>363 [!endif]はVSのプロジェクトテンプレートだろうがw
367 名前:359 mailto:sage [2008/08/15(金) 08:00:34 ] Win32APIとなんらかのC/C++コンパイラ・リンカ があれば使えるようにできるといいなと思います。 つまり、リソースは使わずに、 マクロも極力避けるという感じで。 STLSoftも良さそうですね。
368 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 11:32:16 ] Perl. system ('notepad.exe','abcde.txt'); ↑これでメモ帳が開けるんだけど、 win32APIの観点から、なにか アドバイスはありませんか?
369 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 11:42:45 ] ありません
370 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 12:23:23 ] 何を求めてるのか具体的に書かんと分からんよ アドバイスって何よ 同じ事をしたいだけならShellExecute
371 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 13:47:36 ] Perlは便利というアドバイス
372 名前:351 mailto:sage [2008/08/15(金) 22:39:32 ] 自己解決しましたので報告します。 GetStdHandleなどで得たハンドルを直接WaitForSingleObjectに入れることが出来ます。 ただしそのままではKeyDownだけではなくKeyUpでもシグナル状態になってしまうため、 WaitForSingleObject+ReadFileまたはWaitForSingleObject+ReadConsoleの組み合わせだけではブロックします。 FlushFileBufferやCancelIOではキーボードイベントをフラッシュする事が出来ず、 他にフラッシュできそうなAPIを見つけることが出来ませんでしたので今回は採用を諦めます。 どうしても直接入力/リダイレクト両対応でノンブロッキングな標準入力を行いたい方は シグナル状態になった際にPeekConsoleInputで無関係なシグナルを検出し、 その時だけReadConsoleInputでイベントを取り除いてください。 >>356 さんの言うようにスレッド化するのも手だと思いますが、ブロックするのでスレッドを終了できなくなるはずです。
373 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 22:48:15 ] 別にスレッド終了せんでもええやん?
374 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 01:25:25 ] CreateThreadまたは__beginthreadexを使用する時に 指定するスタックサイズは皆さん「0」指定で使ってますか? 通常は「0」で問題は無いのでしょうが もし仮に明示的なスタックサイズを指定している方がいれば その利点などについて詳しく教えてもらえるとうれしいです。
375 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 01:46:41 ] 0って言ってもデフォルトサイズを使うって指定しているんだから、サイズによって何が変化するか自分で考えろよゆとり馬鹿
376 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 01:49:05 ] ・デフォルトのスタックサイズでは足りない場合に増やす スタックがあふれるようなアルゴリズムが悪いんだが、やむを得ない場合があるかもしれない ・スタックを減らしてアドレス空間を節約する スレッドを大量に作るとき、スレッド1個ごとに何MBも取ってると、アドレス空間の枯渇が早い という利点は思いつくが、今のところ俺は0以外を指定したことはない
377 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 04:24:02 ] STACK_SIZE_PARAM_IS_A_RESERVATION が指定できない2000以前じゃデフォルトより下げても意味なかったし0以外ねーな
378 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 04:51:04 ] 64bitコードならともかく、32bitコードじゃスタックサイズを増やすのはまずねーだろ。 アドレス空間足りねーよ。
379 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 12:18:14 ] デフォルトで1MBくらいなんだから、スタックサイズちょっと増やしたくらいでアドレス空間足らなくはならんだろ。
380 名前:374 mailto:sage [2008/08/16(土) 12:24:45 ] >>375-379 回答ありがとうございます。 >>376 の言うとおりスタックを減らしてアドレス空間の 節約をした方がいいのか迷っていたので、 ほかの人の意見を聞いてみようと思って質問しました。 スレッドのスタックサイズに関しては特に意識する必要は無いという事ですね。
381 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 12:50:42 ] 質問です。。。 現在keybd_eventを使用して実際のキー操作をシミュレートしようとしているのですが, keybd_event( 'A', 0, 0, 0 ); のようなコードでは,実際にAをずっと押しているときのように,動作しません。 (例えば,テキストエディタをアクティブにしていたらAがいくつも入力される。 どうしたら,実際のキーボードを押しているように動作させることが出来るのでしょうか?
382 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 12:54:08 ] スタック領域って減らせるのか? 最初は4KBぐらいしか確保されてなくて必要に応じて動的拡張されるとかじゃなかったっけ?
383 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 14:27:15 ] GetOpenFileNameのダイアログ使ってるとMAX_PATH超えられないけれど 対策もしくは代替手段て有りますか?
384 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 15:13:42 ] ダイアログを自作する
385 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:02:35 ] perlで ShellExecuteで、 notepad.exeを開きたい場合は どう書けばいいの?
386 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:14:04 ] `notepad.exe`
387 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:18:04 ] >>386 試してみたら、確かにメモ帳が開きましたが、 それってShellExecuteで開いてるの?
388 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 21:23:53 ] >>383 フックプロシージャの中からだとそういう制限は無かった気がする。 違ったらごめん。 >>387 ShellExecuteの中の人は、拡張子exeの関連付けに従ってプロセスを起動する。 何も特別なことはない。
389 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 21:52:03 ] >>387 どういうAPIを使ってるのかは、それが仕様化されてるのでなければ 処理系の実装依存だろうな。 直接ShellExecuteを呼びたいのなら ActivePerl Win32 API ShellExecute とかでググれ。 それでわからなければPerlの人に訊け。
390 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 22:55:06 ] 今の状況だと、 真っ黒なDOSプロンプトが開いて、 そのDOS窓が残ったままで、 メモ帳も開く、という動作なのですが、 DOS窓が開かないで、 あるいは一瞬だけ開いて、 それでメモ帳が開く、というのを するのに、shellexcuteを使えば いいんでない?と思ったのですが、 違いますか?
391 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 00:09:09 ] コマンドプロンプト経由で起動する事情なんざ、Win32的には知ったこっちゃないな。 Perlが勝手にやってることなんだから、あっちで聞け。
392 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 06:24:19 ] やだね お前が勝手に聞いてろ
393 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 09:20:57 ] perlをWindowアプリとしてリコンパイルすれば解決する
394 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 10:40:24 ] perlネタはもういいよ。
395 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 13:01:22 ] perlがコンソールアプリだからだろ active perl scriptを使えばいい
396 名前:383 mailto:sage [2008/08/17(日) 13:34:18 ] >>388 フックプロシャージャ作って中でCDM_GETFILEPATH使っても MAX_PATH以下になるようになってるみたいです。 CDM_GETFOLDERPATHやCDM_GETFOLDERIDLISTだと フォルダまでがMAX_PATHであれば選択ファイル名を追加で その分超えることは出来るみたいですがOKボタン押させて貰えない。 さらに深いフォルダにはアクセスさせてもらえないし 他の大半のアプリも触れない領域じゃ独自ダイアログにするほどのことでもない気がするので諦めます。 あとD&Dもメッセージが飛んでこないので駄目みたいです。
397 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 14:36:47 ] なんか知らんがUnicodeに汁
398 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 16:18:46 ] >>381
399 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:07:58 ] >>381 チート厨は氏ね
400 名前:381 mailto:sage [2008/08/17(日) 17:31:50 ] >>399 Wiiリモコンをパッドにしたいだけなのに。。。
401 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:33:55 ] >>400 それでもBAN対象のゲームは多いはず
402 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:05:19 ] >>400 ヒント っKEYEVENTF_KEYUP
403 名前:383 mailto:sage [2008/08/17(日) 18:08:46 ] >>397 長いファイル名は必然的にUnicode関数使うし 最近のプログラムなんでUnicodeビルドしてる。
404 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 19:39:11 ] シェル関数(SHGetPathFromIDListなど)がMAX_PATHを超えれないから シェルに依存しているコモンダイアログも必然的にMAX_PATHを超えられないのだろう てかMAX_PATHを超えてしまうほど深い階層にファイル置くなよ
405 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 19:57:28 ] ThickFrame(ウィンドウサイズを変更する枠)で、 「ユーザーがウィンドウサイズを変更している間は、WM_ERASEBKGNDメッセージを無効にする」 という処理を加えたいんですけれど、 処理の開始は、WM_NCLBUTTONDOWNメッセージを捕まえてそれで問題ありませんでした。 処理の終了(サイズ変更の終了)も、同様にWM_NCLBUTTONUPメッセージを捕まえれば良いのかと思ったんですが、 うまくいきませんでした。 この場合の、「ウィンドウサイズ変更が終了した」という情報を、 アプリケーションが取得するにはどうしたら良いでしょうか? 誰かご存知の人は教えてください。
406 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:03:49 ] WM_SIZEとかWM_WINDOWPOSCHANGEDとか?
407 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:22:33 ] >>402 KEYEVENTF_KEYUPを引数としてキーが上がったということも書いているのですが, >>400 のやりたいことのように出来ません。。。