1 :
デフォルトの名無しさん :
03/11/20 23:51 スレ立てるまでもない、Win32APIについての質問はこちらへどうぞ。
最低限、最新スレくらいは質問する前に検索ぐらいしてください。
過去スレ・参考は
>>2-5 くらいを参照してください。
3げっと
2⊂(゚ロ゚⊂⌒`つ≡≡≡≡≡≡≡≡≡≡
5げとーん
ListViewのリポートの話です。 コラム数が1つでListView_SortItemsでソートすると、ちゃんとソートしてくれないです。 中途半端にソート処理が中断している感じになります。 複数回繰り返すとだんだん正しくなっていきます。 比較関数は自前のをわたしています。 コラム数が2つ以上だと正常に動きます。 今は幅0のダミーをおいて凌いでいるのですが、何でだかわかります?
LBS_sort で作ったの?
8 :
デフォルトの名無しさん :03/11/21 13:01
イベントドブリンって美味しいの?
先輩,質問っす。 1回の WM_PAINT で複数回 ::BeginPaint()〜::EndPaint() やっちゃうと 2回目以降の ::BeginPaint()〜::EndPaint() で何も描画されないっぽいんだけど これって仕様というか,当たり前すか? それとも,ちょっと工夫するだけで何回でも ::BeginPaint〜::EndPaint が できたりするんすか?
>>9 ::EndPaint() で更新領域がクリアされるからだと思う。
>6 途中でGPEが発生して、コントロールが捕まえているとか。
>>12 すみません.
GPEとは何でしょう?初耳です。
情報へのリファレンスでもかまないので教えていただけますか?
>>13 Generic Protection Exception
一般保護例外
英語あってるか自信ない
Generalですな
DDEについての質問です。 WM_DDE_REQUESTを受け取ったとき、 どうやってTopic名を判断すればよいのでしょうか? item名しか渡って来ないみたいなので、 返すデータが判断できず困っています。
Winsockを使って常駐型メールチェッカーを作ったんですけど、 時間が経つにつれてだんだんメモリ使用量が増えてしまいます。 メモリリークのチェックルーチンを入れましたがメモリリークはしていないようです。 何が原因か分かる方いたら教えてください。 Win2k+VC6standardです。
それだけで分かるわけ無いだろ
>>19 たしかに。
概要をいうと、ごく普通の非同期Winsockプログラムで、
WSAAsyncSelect()を使ってウインドウにイベント通知させて送受信処理をしています。
3分ごとにPOPサーバーに問い合わせして、その都度WinsockをCloseしています。
ごく普通でないつくりをしているから意図しない動作になっているんだと思うが
なるほど。。。。 くじけそうだよ。
新着メールとか、何かで malloc や calloc をしたなら、絶対に free をしましょう
>>22 Thread抜けるときにAPI使ってない?
リークが心配なら、メールチェック部分を別プロセスにしちまったら?
タスクマネージャのメモリ使用量の列見てうだうだ言ってるだけだろしねや
レスありがとう
>>23 ソースが大きすぎて晒せません。
>>24 mallocはしていませんです。
>>26 別プロセスって別exeにすると言うこと?
>>27 そのとおりです。あと、仮想メモリも見てます。放っておくと仮想メモリも徐々に増えます。
>>25 Threadは使ってないんですけど、なんか引っかかりますね。
WndProcから受信処理を呼び出してAPI呼びまくりだし、
CreateProcessでメールソフト起動したりしてます。
29 :
デフォルトの名無しさん :03/11/22 11:51
タスクマネージャなどでRunDll32.exeが起動しているとき、 それがどのDLLを起動させたかを見つける方法はないでしょうか? お願いします。
デバッグカーネルじゃダメかな
>>28 CreateProcessで得られるProcessInfoの中に、プロセスハンドルとスレッドハンドルが返るけど
両方とも破棄してる?
#スレッドハンドルは忘れられがち。
Thread云々を聞いたのは、ThreadやProcessの終了にAPIを使うとデストラクタが呼ばれないから。
デバッグカーネルちょっと調べてみましたが、難しそうなのであきらめます。 ありがとうございました。
ReadProcessMemoryでRunDllの引数を持ち出してくるのはどうか。
34 :
デフォルトの名無しさん :03/11/22 18:00
>>18 切り分けできてないならサンプル作って漏れるか試してみたら?
リストビューについて質問です。 @リストビューでアイテムを複数選択(このときLVN_ITEMCHANGINGでFALSEを返すようにする) Aリストビューでアイテムを選択(このときLVN_ITEMCHANGINGでTRUEを返すようにする) Bリストビューでアイテムを選択(このときLVN_ITEMCHANGINGでFALSEを返すようにする) とします。 通常であれば、Bの選択で1個をクリックすれば、@で複数選択したのは解除されて、 Bでクリックした1個だけが選択状態になるのですが、@で選択したアイテムの選択状態 が解除されません。何か私が間違っている点があるか、アドバイスをいただけないでしょうか? 質問に不足があれば御指摘願います。
37 :
デフォルトの名無しさん :03/11/22 20:04
>>36 それでうまくいきそうです。
ありがとうございます。
>>35 LVN_ITEMCHANG捕まえて結局何をしたいのだ? 目的が見えてこない。
>>37 普通、セルを選択できないようにする時にTRUEを返す。
>>39 ある処理をしている間はアイテムの選択状態を変えられないようにしたいのです。
それはうまくいくのですが、その後にBで挙動がおかしくなるのです。
検索していくつかのページを見ても、
「選択できないようにするにはLVN_ITEMCHANGINGを捕まえてTRUEを返す」
という程度のことしか書いていないのでどうすればよいかわからず
質問させていただいた次第です。
41 :
デフォルトの名無しさん :03/11/22 20:41
ウインドウ作成したあと以外にUpdateWindowは、どおいう場合に使うのか教えてください!
>>41 WM_PAINTが処理されるのを待てないとき
>>40 とりあえず余計なコードを省いてリストビューだけのウインドウで試してみたら?
それで駄目なら作成時のスタイルが変とか?
>>43 そうですね。
再現条件をまず調べてみることにします。
ペゾルトのサンプルは冗長
47 :
デフォルトの名無しさん :03/11/23 18:24
BITMAPINFOにカラーテーブルを設定して CreateDIBSectionxで 8bppのBMPを作った後に その戻り値のDIBSectionのハンドルから作成時のカラーテーブルを取得したいのですが、 GetDIBitsではBITMAPINFOHEADERの情報しか教えてくれません。 どなたか、良い方法があれば教えてください。
>>47 GetDIBColorTable, SetDIBColorTableでできるかもしれない。
俺も知りたいので結果報告頼む。
>>48 GetDIBColorTableで目的どおり取得できました。
本当にありがとうございました。
51 :
デフォルトの名無しさん :03/11/23 23:19
dllからアプリケーションにメッセージ送れます?? インスタンスを引数にできるSendMessageみたいなものがあればいいんですが.
インスタンスって何? hInstance のこと?
>>51 SendMessage では送りたくないの?
>>52 うん.hInstanceのこと
>>51 SendMessageで送れます?
>>54 インスタンスだと微妙に解らないから名前は適切にお願い…そこが理解できない俺のスキルの低さかもしれんが
SendMessageで遅れる PostMessage のがイイかもしれないけどね。
パラメータとして送りましょう。
>>55 レスありがとうございます.
SendMessageのパラメータとしてどのように与えればよいのですか?
SendMessageはHINSTANCE型を引数としてもってないようですが..
>>56 SendMessage (HWND, MSG, WPARAM, LPARAM(HINSTANCE));
とでもしたら?
俺もきちんと本を読んで作ってるわけじゃないけど、もう少ししっかり本を読んだら?
本に書いてないかもしれないけどソースから学べることだよ
>>57 それは意味が違うと思う。
>>56 は
SendMessage(hInstance, msg, wparam, lparam);
としたいんでは?
で、SendMessageがHINSTANCE型を受け付けないって悩んでんじゃない?
>>57 ご親切にありがとうございます.
Webはたくさん見てきたんですが,解決できるサイトがなかなかなくて..
もっと勉強します!
あ、それでいいのか。 スマソ。
>>58 そのようにしたいんですけど,わからなくて..
>>59 俺もwebで頑張ってたけど本を買ったほうがすごい知識が入る。
MicrosoftPressって言うオレンジ色の本をすすめる(分厚くてやってられんけどな
>>58 そういうことか、やっぱり履き違えてたね。。。
hInstance はウィンドウに送られるわけじゃなくて hInstance はプログラム(exeファイル)を指すって事でいいのかなぁ。
リソースを読む時とかの引数になるし
>>63 hInstanceをexeファイルの意味使いました!
ご存知ですか?
>>64 よくわからない日本語なのでなんともいえません
>>62 SDKでプログラム組むのに良い本って少ないんですよねぇ.
>>65 すんません.
hInstanceをexeファイルの意味で使いました.
dllからexeへメッセージを送る方法をご存知ですか?
よろしくお願いします.
>>61 あれ、やっぱそうだったの。
hInsetanceからhWndを求めることってできんのかな。
GetNextWindowで見つけていくしかないかも。
PostThreadMessage(GetCurrentThreadId(), ... ではどうか
hInstanceから PostThreadMessage()のスレッドIDとか、 PostMessage()のHWND をどうやって得るか、って話でしょ?どっちも簡単にできるけどな。
ん〜・・・ クラス名を探してくプログラムならあるって聞いた事があるから リソースにクラス名を保管しておけばいいんじゃないかな?
>>70 ,71
たくさんのレスありがとうございます.
PostThreadMessage関数で試してみます!!
まあ、素直にアプリケーションから教えてもらえと
キーーーー
>>70 GetWindowInstanceの逆ってことだよな?
Instance
|
+WindowA
|
+WindowB
こーゆー場合はどっちのハンドル?
なぜインスタンスから? 結局メッセージを送るのにHWNDで送るんでしょ?
>>79 ここらで少しまとめようぜ。
そのほうがわかりやすいし
>>80 とりあえず、(私が読んだ限りでの)ここまでのまとめ。
--
問題
dllからあるHINSTANCEのプロセスのウインドウにメッセージを送りつけたい
前提
1.何らかの方法でHINSTANCEがわかっている
不明
1.そのプロセスにウインドウが(0個または)2個以上ある時の処理(
>>77 )
2.送り先はそのDLLを使うEXE/DLL? それとも他のEXE? (
>>75 ?)
解決へのヒント
1.PostThreadMessage (
>>69 )
2.GetNextWindow(
>>68 )
51の書き主です. 送り先はそのDLLを使うEXEです. そのEXEのhInstanceはdllに伝わっています. dllでマウスイベントをフックし処理し終わると同時に,EXE側のある関数を実行させたいのです. つまりフック処理が終わる時点でEXE側にメッセージを送ることができればと思って質問しました. しかし,なかなかうまいこといかないんですね.
>>84 75:アプリケーションに教えてもらう?どういう意味すか?
>>84 だな。
>>83 念の為付け加えておくと、そのHINSTANCEはDllMainの引数じゃあないよね?
DllMainのHINSTANCEはDLLのインスタンスで、EXEのインスタンスではないので。
なお、
>>75 のようにEXEからHWNDなり関数ポインタなりThreadID/Handleなりを
もらうならHINSTANCEは不要。
自作アプリとDLLの連携ならSet関数作って渡してやればいいし、 自作のアプリ以外をフックしてるなら EnumWindowsでウインドウ列挙して探すとか色々。
>>85 DLLに、アプリからhWndを教える関数を設けるとか。
>>86 はい,
#pragma data_seg
内で変数を共有させて,EXE側のHINSTANCEをdllにわたしています.
関数ポインタを使う手もあるんですね.思いつきませんでした.やってみます.
ご丁寧にありがとうございます.
プロセスIDやスレッドIDならいざ知らず、 他のプロセスのHINSTANCEやHMODULEを取れたとしても、 別のプロセスからは使い道がないような気がするのだが。(既出?)
メニューバーのメニューって 個別に大きさ変更したりできるもんですか?
あー、よく寝た
あー、よく寝た
94 :
デフォルトの名無しさん :03/11/24 14:05
>>83 >そのEXEのhInstanceはdllに伝わっています.
どうやって伝えたの?
Win32のEXEのhInstanceは実際問題、定数。
96 :
デフォルトの名無しさん :03/11/24 14:16
>>91 "オーナードロー"で検索。
ビットマップを貼り付けたりいろいろできる。
>>97 「何らかの方法で」以上のことは答えてないと思うんだが。
どんな方法であるにせよそのルートでHWND渡せばいいんじゃネーノ
>>98 >「何らかの方法で」以上のことは答えてないと思うんだが。
>>#pragma data_seg
>>内で変数を共有させて,EXE側のHINSTANCEをdllにわたしています.
ニホンゴヨメマセンカ?
つーか、EXEのHINSTANCEなんぞもらってナニしようと思ったんだか。
>>96 ビットマップの貼り付けはわかったんですが
画像の貼り付け無しにそのまま
項目サイズの拡大縮小はできないんでしょうか?
MacOSXのDockのように
カーソルが近づくと徐々に拡大され
離れると徐々に縮小されるといったことは
オーナードローで可能なんですか?
オーナードローで検索しても
見つかるのは画像の貼り付けばかりなんですが
無理なんでしょうか
>>89 >#pragma data_seg
>内で変数を共有させて,EXE側のHINSTANCEをdllにわたしています.
で、何でHWNDを渡さないんだ?
HINSTANCE渡すメリットって何?
で、オーナードローの手続きちゃんと理解できた? SDKならWM_MEASUREITEM、MFCでもMeasureItem()でサイズ変更できるのは直ぐ見つかる。
>>95 んなこたぁない
配置アドレスが変われば中身も当然変わる
教えて君ですまないです。他のスレから来ました。 あのーPrintScreenキーを押してデスクトップ画面を取得できますよね。 それが共有メモリ内に入るのはわかっているのですが、できれば格納さ れているメモリアドレスを知りたいのです。どうすればいいのでしょうか? WinAPIで解決できるのか、それともポインタで解決できるのか 皆様教えてください。
開発環境を書き忘れてました。Win2k+VC++6.0です。
>>105 クリップボード内に何が入っているか調べる方法≒
クリップボード内の何かを取得する方法
向こうのスレでヒント貰ったのにわかってないのか?
#それ以前にAPIの何たるかがわかってないならまずそれを勉強しろ。
108 :
デフォルトの名無しさん :03/11/24 21:28
>>105 共有メモリというより、クリップボードに入るんじゃないか?
ChangeClipboardChain,CloseClipboard,CountClipboardFormats,EmptyClipboard
EnumClipboardFormats,GetClipboardData,GetClipboardFormatName,GetClipboardOwner
GetClipboardViewer,GetOpenClipboardWindow,GetPriorityClipboardFormat
IsClipboardFormatAvailable,OpenClipboard,RegisterClipboardFormat
SetClipboardData,SetClipboardViewer
>>108 ってなんて親切なんだよ。漏れにもやさしくしてくれ
>>105-106 このスレ的には、
ChangeClipboardChain, CloseClipboard, CountClipboardFormats,
EmptyClipboard, EnumClipboardFormats, GetClipboardData,
GetClipboardFormatName, GetClipboardOwner, GetClipboardViewer,
GetOpenClipboardWindow, GetPriorityClipboardFormat,
IsClipboardFormatAvailable, OpenClipboard, RegisterClipboardFormat,
SetClipboardData, SetClipboardViewer
あたりかな。
つーか、MSDN 見ればわかると思うけど。
113 :
デフォルトの名無しさん :03/11/24 21:33
>>それともポインタで解決できるのか ポインタ理解してないの? だとしたら、Cで実用的なプログラムか書けないし、API使うのは無理だよ。
>>104 実際問題exeの配置アドレスが変わることなんてあるの?
最近は.reloc削り落としたexeも多いくらいなのに
>>108 .111さま
ご親切にありがとうございます。授業ではLinuxでの勉強しかしたことが無かったので
Windowsプログラムは初でございます。
WindowsのプログラムはWinAPIの塊と聞いていたのでどうにかなるかな?と思っていま
したが、甘かったですね。回線切って吊ってきます。
リソースエディタでエディットコントロールをCStringとかでコントロール変数登録すれば それ使ってそのまま中のデータをやりとり出来るのかと思ったら、そういうわけじゃないんですね というか、エディットコントロールと全く無関係のただの変数に見えるんですが… (読んでもいつも""だし文字列代入しても反映されるわけじゃないし) あれって一体何なんでしょう。単なるラベル? CEdit型のコントロール変数で登録した奴はそのまんまSetWindowTextとか使って 直接いじくれるからわかりやすいんですけど
PSDK最新版入れたんだけど /******************************************************************************\ * This is a part of the Microsoft Source Code Samples. * Copyright 1993 - 2000 Microsoft Corporation. * All rights reserved. * This source code is only intended as a supplement to * Microsoft Development Tools and/or WinHelp documentation. * See these sources for detailed information regarding the * Microsoft samples programs. \******************************************************************************/ #include <stdio.h> main() { #ifdef JAPAN printf ("Win32、これは事件だ!"); #else printf ("Win32, it's happenin'!"); #endif return(0); } こんなサンプルがあるんだな、日本人をおちょくってるのか。
>>117 なんかむかつくソースだな。。。
もっと日本語わかってる奴が書け
>>116 「DDE」でMSDNを検索してよく読め。
値型のDDEは自動的には反映されないのだ。
なるほど、使う前にUpdateData()で更新してやらないといけないわけですね やっぱり勝手に反映してくれるほど甘いもんではなかったようで…(当たり前か) どうもありがとうございました。だいぶ混乱してたので助かりました
あるトップレベルウィンドウをオーナーとするトップレベルウィンドウのHWNDを全部取得するにはどうすればいいですか?
123 :
デフォルトの名無しさん :03/11/25 09:11
>>122 EnumWindowsを使って自分で振り分け
教えていただきたいことがあります。 どうかよろしくお願いいたします。 500x500のサイズのウインドウを作成し、ファイルから700x700のサイズの画像を読み込み、縮小して 一旦、メモリ上に置きたいのですが、どのようにすればよいのでしょうか。 かなりいろいろ いじっているうちに、訳が分からなくなり、混乱状態です。どうか、お力をお貸し下さい。 HDChdc, memDC; PAINTSTRUCTps; HBITMAPhBit;//メモリへ読み込んだ画像を識別するためのハンドルを保存 HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hwndBase1, GWL_HINSTANCE); hdc = GetDC(hwnd); memDC = CreateCompatibleDC(hdc); hBit = (HBITMAP)LoadImage(hInstance, "test.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE); SelectObject(memDC, hBit); hdc=BeginPaint(hwnd, &ps); StretchBlt(hdc, 0, 0, 500, 500, memDC, 0, 0, 700, 700, SRCCOPY); //ウインドウに 画像を縮小して表示 EndPaint(hwndBase1, &ps);
>>126 はい。
pc2.2ch.net/test/read.cgi/tech/1068950713/ で質問しましたが、こちらで聞くのがワタシも適していると思いました。
ファイルから700x700のサイズの画像を読み込み、画像を500x500のサイズに縮小してメモリ上に置きたいのですが、
どうかよろしくお願いいたします。
>>128 CreateCompatibleBitmapで500x 500のビットマップ作って
そいつにStretchBlt
>>129 ありがとうございます。
CreateCompatibleBitmap ですね。ちょっと試してみますね。
131 :
デフォルトの名無しさん :03/11/25 16:28
Windowsでネットゲームを作っています。 不正が行われないようにプログラムの改造等を防がないといけないのですが、 ReadProcessMemoryとか、WriteProcessMemoryを使われると、 どうしても解析されてしまいます。 他のプロセスから自分のプロセスに対してこれらのAPIが呼ばれた事を検知したり、 使えなくする方法はないものでしょうか?
そりゃあれだ、OSから作れってこった
>>131 設計を見なおしてメモリ書き換えても不正できないようにする。
キャラクターのステータス、アイテム、スキル使用はすべてサーバ側で行い、
クライアントは表示、入力のみを処理する。
例)
C: アイテム使用要求
S: サーバ側のキャラデータを見て使用可否を判定して使用処理。結果をクライアントに送信
C: 結果を受け取って結果を表示
1/100秒ごとにメモリ上のデータを暗号化するとか。
CRCでも付けとけ。
>>135 そんな規模のものなら改造されても大丈夫だろヽ(´ー`)ノ
VRAMに保存しておけ。 デバッガはAPIで検出できるからこっちは問題ない。
有料のネトゲですらチートされるってのに・・・・。
>>131 もしできたらNCとかに教えてやんなw。
>>139 VRAMだと画面モード切り替え時等に消えかねない
>>129 本当にどうもありがとうございました。おかげでうまくいきました。ものすごく助かりました。
正直なところ MSDNで検索してもなかなか ”CreateCompatibleBitmap” を使えばいい、
って分からないですよね。今回はヒントを頂いたおかげで分かったのですが。
逆に、よく ご存じでしたよね。googlで”CreateCompatibleBitmap”検索してもちょっとしか
ヒットしませんし・・・。やはり、熟練、経験がモノを言うんですね。
さて、プログラムの続きをしよっと。
リソースにある文字列の長さをLoadStringする前に取得する方法はないでしょうか?
キーボードについて詳しく解説してるページないですか? メッセージ中のextended keyとかscan codeとかの使用用途を知りたいのですが
145 :
デフォルトの名無しさん :03/11/25 23:20
exeファイルのパス名からメインウインドウのハンドルを取得するには どうしたらいいですか? ウインドウハンドルからProcessハンドルを取得する方法はあちこちで見つかるのですが。。。 すべてのウインドウを列挙してProcessハンドル経由で exeファイルのパスを調べることはできそうですが、もっとスマートなやり方があれば 教えてほしいです。 よろしくお願いします。
>>142 いや、探し方が悪いんだと思うぞ。
私はたまたま今日、仕事で初めて画像をはっつける羽目になったんだが、
CDCのクラスメンバ眺めてたらCreateCompatibleBitmap()が使えることに気づいたぞ。
#で、ビットマップオブジェクトの解放することに気づくまでの一時間、メモリリークで苦しんだが(爆笑
>>145 ない。
アプリケーションが必ずウインドウを持っているとは限らないし
ウインドウを持っていてもどれがメインか一意に決定できない。
くらっくのやりかたおしえて りーど/らいとぷろせすめもりとかつかうんですか?やりかたおしえて あとたーげっとをふぁいるめいでしていしたいのでそのつもりでおねがいします しぁぇうけにゅのこがさすとぶへくとりづしあおきゃで? たこでもわかるようにめいかいにおねがいします
>>145 WM_DESTROYに対してPostQuitMessageを実行するウインドウか否か
どうやって調べる? ウインドウプロシージャを逆汗するか
LoadModuleもどきのスパイ関数を自作するかしかないだろ?
>>148 > クラックのやり方教えて
> リード/ライトプロセスメモリとか使うんですか?やり方教えて
> あとターゲットをふあいるめいで指定したいのでそのつもりでお願いします
> しあぇ浮け乳の焦がさすとぶへくとりづし青きゃで?
> タコでもわかるように明快にお願いします
IME2000 の再変換でもそれなりに読めるようになるんだな。
3〜4行目はサパーリわからんが。
>>147 起動していない、もしくは取得できるウインドウがなければ
ウインドウハンドル取得結果はNULLになると思います。
また、メインウインドウじゃなくてトップレベルウインドウでもいいです。
>>149 よくわかっていないのですが、
特にウインドウに対してメッセージなど送ったりはしないつもりです。
>>151 トップレベルウインドウもひとつではない
WM_SYSKEYDOWNでALT+F4は無効にできるのですが ALT+SPACEが無効にできません。 何か方法はないでしょうか
>>145 もう答えは出ていると思うが、もし一発で探せる方法があるとして、仮にそのEXEを10000回起動したとする。
どうやって10000個のハンドルを返す?
ちょっと考えれば納得できると思うが...
>>131 クライアント上で実行されている限り、クラックできないプログラムは無い。
理想は全ての処理をサーバ側で処理することだけど、その場合でも必ずしも
専用サーバを立てる必要はないよ。
ホストのプレイヤーに負担させればいいだけ。
まぁ、こんなこと聞く時点ですでにある程度できあがっていて、いまさら
設計変更なんてできないと思うが。
最終的には何をやってもダメだけど、分かりにくくする方法はいくらでもあるだろうから、 その方向で考えた方が現実的。
>>158 ◆??? -> #???
の任務を命ずる
これで理想の取が一発変換だシメシメ
160 :
デフォルトの名無しさん :03/11/26 21:03
MSに明日はあるだろうか。
http://www.zdnet.co.jp/enterprise/0311/19/epn11.html 巨大化した組織の宿命?
心無き人が増え、能ある人を追い出す。そして形骸化。
MSよ、原点に戻れ!
従来のOSとWin32APIを見直し、その練磨と機能拡張に専念しろ。
そして、WinFXではなく、Win64APIとして堅牢なベースを創れ。
現状のシェアに浮かれてMFCだのWinFXだのとMS自作のクラスを
ユーザーに強要していると早晩、見捨てられるぞ! それらは
ユーザーの仕事だ、あれもこれも抱き合わせるのではなく、まず、
自らの足元を固めろ。
以上、心からMSの将来を思う者より、愛を込めて。
どこがWin32APIの質問なのよ。
162 :
デフォルトの名無しさん :03/11/26 21:16
ごめん! 【WinFX】次世代Windows Longhornを語るスレ への間違いでした。 なかったことにして下さい。ペコペコ。
WinFXの話でもねーじゃん。死んだ方がいいんじゃないの。
ウザイやつはシカト、これ常識
ワラタ
画像を画面の中心から徐々に拡大して画面いっぱいになるようにしたいのですが、 for ( x =ScreenWidth/2 ; x >= 0 ; x--){ y = (計算式) MoveWindow ( hwnd, x, y , MWidth, MHeight, TRUE) ; hdcMmem = BeginPaint ( hwnd, &ps); StretchBlt ( hdcMmem, 0, 0, MWidth, MHeight, MmemDC, 0, 0, 1000, 500, SRCCOPY) ; EndPaint(hwnd, &ps); このプログラムで実行すると、拡大している最中、チラついてしまい、見苦しい感じがします。 チラつかないようにする方法は何かないでしょうか。
MoveWindowは止めなはれ。 BeginPaintも、GetDCあたりにしなはれ。
んを〜 早いレスありがとうございます。 そうですか、GetDCですか。早速試してみます。 コメントありがとざいます。
あとWM_ERASEBKGNDを潰すのも基本な。
あ、あのー。 MoveWindow を使わない方法ってどのようなモノでしょうか。 どうかよろしくお願い致します。 WM_ERASEBKGND も試してみますね。ありがとうございます。
たとえばスクリーン画面(GetDC(0))に描画して、 MoveWindowは最後に回すとか
そういうことですか! ものすがい勘違いしてました。 ありがとうございます。
>>172 結構いけてます。 本当にありがとうございました。
InvalidateRect(hwnd, NULL, TRUE); UpdateWindow(hwnd); ってやってるんだけど、再描画してくれるときと、してくれないときがあります。 どうしてでしょう? プログレスバーを操作しています。
メッセージポンプ回してる? SendMessageさえ受け付けられない状態だとUpdateWindowも効かないよ
>167のループ ウィドウサイズ変更(再描画無し) 画像拡大 再描画(Invalidate* | Update*) でもだめですか? スクリーンだと他と競合するかもしんないし あんま使わない方が安定した動作を提供できると思うんだけど 解決済みだったら流してください
つーか、うちの環境の場合StretchBlt自体の負荷で死ぬな。
Win32APIの関数のローカルのオンラインヘルプがほしいのですが VC++ .NETを買えば手に入りますか?
msdnですね? 付いてくると思います。 詳しくはマイクロソフト本社のMicro$oft Visual Studio などを参照してください
>>181 どもどもサンクス
今フリーの環境でやってるんだが、
あとあとオンラインヘルプがほしくなりそうだったので買おうかどうか迷っていましたが
買う気がかなり高まりました。
>>182 買ってください
ところでフリーって言葉ってどうおもう?
フリーソフトとかなら通じるんだけどフリーという微妙な言葉
”無料で”って意味でもっと良い言葉無い?
free…自由なという意味合いが強い気がする
SuperFree = 超自由
"超" っていうな〜……… 。・゚・(ノД`)・゚・。
>>183 自分はフリーソフトって意味で言いましたよ
Borland C++ Compilerを使ってますぜ
MSのplatformsdkアップデートからドキュメントだけ落とせたかも これならローカルでも参照できるぞ
>>187 それは日本語ですか?
>>2 のリンク先が英語だったのであきらめていたのですが
英語なら素直にお金出して買いますんで
>>188 ドキュメントとCのヘッダ、VC用インポートライブラリ、開発用各種ユーティリティツールとドキュメント参照用のDocumentExplorer7.0が含まれる。
当然全英文だが日本語版MSDNは一部だけしか翻訳されてないような気も‥‥
どーでもいいが、あれくらいの英語読めないようだとどの道つらいと思うんだが‥‥
>>188 そういや PlatfomSDK があったね。忘れてたw
日本語なかったっけ?…
191 :
デフォルトの名無しさん :03/11/27 21:00
>>180 欲しいのは日本語ヘルプなの?
なら、VC++ .NET買っても、ほとどんどは英語だよ。
日本語は一部。(しかも、間違ってたりもする)
>>191 そうだねぇ
while( GetMessage(&msg, NULL, 0, 0) )
って文も間違えてるしね
>>191 これ見て思ったこと。
マイクロソフトの日本法人も怠慢だよな。
ちなみに俺のソースコードは全部 while (GetMessage(&msg, NULL, 0, 0) < 0) となっている、 GetMessageの戻り値は ・正常 1 ・終了 0 ・エラー −1
>>196 間違えたし
while (GetMessage(&msg, NULL, 0, 0) > 0)
これでよしっと
198 :
デフォルトの名無しさん :03/11/27 23:56
SetWindowsHookExのWH_KEYBOARD_LLを使いたいのですが、 MSDNによると、フックプロシージャは HKEY_CURRENT_USER\Control Panel\Desktop の LowLevelHooksTimeout よりも短い時間で処理するよう求めています。 ところが、自分の環境(Windows2000 SP4)のレジストリにそんな値はありません。 存在する人はミリ秒くらいになっているのでしょうか。
僕の使ってるキーボードにPower Sleep Wakeってのがあります。 これらが押されても何も処理させないようにするにはどのようにすればよいでしょうか? 僕は>198さんではないのですが、SetWindowsHookExのWH_KEYBOARD_LLで キーを拾ってるのですが、どうあがいてもPowerでシャットダウンしてしまいます。 キーコードは0x5Eかなと思ったのですが駄目です。 メッセージボックスで表示させようとしたりデバッガで止めようとしても シャットダウンしてしまいどうにもならない状況です。 >198さんへ 僕のwindows2000マシンにもその値はなかったです。
201 :
デフォルトの名無しさん :03/11/28 00:37
今後 winny が使えなくなるので、違うものを作ってくれる人はいますか?
203 :
デフォルトの名無しさん :03/11/28 00:48
GetMessage()って、無効な引数を指定したとき以外にも戻り値が-1になることがあるの? もしなければ、msgが確実にMSG構造体である限り、 while (GetMessage(&msg, NULL, 0, 0)) でいいような気がするんだけど…だめかな?
204 :
デフォルトの名無しさん :03/11/28 01:01
ウチのMSDNではGetMessageにそう言うコードは避けてくれと日本語で書いてある。 >GetMessage 関数は、エラーが発生すると -1 を返します。したがって、次のようなコードは避けてください。 >while (GetMessage( lpMsg, hWnd, 0, 0)) ... >このように書くと、GetMessage 関数がエラーを返した場合も、ループが繰り返されてしまいます。
>>178-179 どうもありがとうございます。返事が遅くなってすみません。
今のところ、スクリーン上での競合はないと思っていますが、言われてみると確かにあり得る話ですよね。
今後の参考にさせていただきます。
アドバイスをお願いしたいことがあります。 POPUPウインドウ(タイトルや最小化・最大化・終了ボタンのないやつ)に計算しながらグラフを描画していく プログラムについてです。 終了ボタンがないため、POPUPウインドウ上で右クリックするとプログラムが終了するようにしています。 描画が終わってから右クリックすると終了してくれますが、描画中に右クリックしても描画が終わるまで 終了処理がされません。 描画中に右クリックして、即終了させたいのですが、何かよい方法はありませんでしょうか。
>>204 それは、GetMessage()の呼び方が
GetMessage(&msg, NULL, 0, 0)
ではなく、
GetMessage(lpMsg, hWnd, 0, 0)
だからじゃないのかな?
例えば、GetMessage()の第2引数がhWndになっていると、hWndが
無効なハンドルだった場合に、エラーになって-1が返る可能性が確かにある。
でも、最初の呼び方では、実際にはエラーになる可能性ってないような気が…。
>>207 グラフ描画中にメッセージを処理する。
スレッドを使う。
グラフ描画処理をメッセージ使って分割する。
>>209 ありがとうございます。
えー、で、その、恐縮なのですが。。。。
メッセージ処理するウインドウプロシージャに強制的に定期的に処理させに行く
(呼び出す)方法を。。。。お願いします。
タイマーで描画するんじゃダメなん?
ワタシは 頭が固いのでどうも柔軟に考えられません。理解が及ばないところはお許し下さい。 タイマーで何かを処理したくても描画・計算中は完全にタイマーのメッセージもキーボードやマウスのメッセージも 受け取ってくれないんです。
えー、ちなみに 計算は for ( float x= ・・・・・) { for ( float y= ・・・・・) { <計算式 が延々と続く> } <ウインドウに 1ピクセル表示> } グラフが完成するのに 20秒くらい。。。。 ちなみに PentiumIII 1.26GHzのPCです。
スレッドを作成して、そこで描画や計算処理させたら? それか、ループ内にPeekmessage置いて応答させるとか。 詳しくは知らんが・・
215 :
デフォルトの名無しさん :03/11/28 08:47
SetWindowTextみたいなAPIにもUNICODE版とかあるんですよね? UTF8を設定出来ますか?
216 :
デフォルトの名無しさん :03/11/28 09:58
現在の言語ロケールを取る方法教えて下さい。
>>216 Get(User|System)DefaultLCID
>>215 ほとんどのAPIにはUnicode版があって
#define UNICODEすると自動的に呼ばれる。
でもUTF-16なのでUTF-8は変換してから渡す
文字列がUNICODE固定なら SetWindowTextW としてもいい
>>218 UTF-16 じゃなくて、UCS-2 じゃなかったっけ?
メニュー項目のEnabledをコード中から操作したいんですが、どうしたらいいですか?
224 :
デフォルトの名無しさん :03/11/28 16:51
GetMenuItemInfoで出来る。
>>223 文おかしいじゃん・・・
「そうやって検索したら?」→「今質問したように検索したら?」です
GetじゃなくてSetでした。
227 :
デフォルトの名無しさん :03/11/28 17:09
検索したけどなかったので質問です。 あるIDのメニューアイテムが存在するかをID値で知るには どうすればよいですか?
>>227 最初の質問とちがくない?
Enabledかどうかはメッセージを送って確認するんじゃないかなぁ?・・・
メニューアイテムがあるかどうかは一つずつ確認するしか?
上はMENUITEMINFO を使うことをお勧めする
>>223 ,
>>224 わざわざありがとうございました。
SetMenuItemInfoなのかなと思ったんですが、パラメータを見た感じなにか違うような気がしてました。
構造体を調べたらできることがわかりました。
>>227 は私じゃないです。
>>229 おつかれ〜、ってまだ完成してない?
無理せずがんばれよ〜
>>227 失礼しますた
検索する文字列とメニューアイテムの名前が一致するID値を取得したいって事?
パラパラ質問する前にMSDNのMenu関連を通読しろ
>>231 お前が質問してきたときもそういわれたいか?
マズ自分で調べるてから聞くのは当たり前。
調べ方解らない場合はどうすりゃいいんだ?
質問の仕方が気に食わないなら無視しとけばイイだけだろ?
>>207 210 212 213 です。
なんとか解決できました。 Getmessage で処理できるんですね。
そういう使い方を初めて知りました。 でも、みなさんのおかげで
ちょっとづつ 賢くなっていきます。ホント。
>>230 出来ないと思ったら、DrawMenuBarを忘れてました。
詳しく調べたらEnableMenuItemという便利なものがありました。
>>231 このスレの住人にはいい人が多いのでつい・・
>>234 おめでとうよ!
俺は何をしてるのか全く理解できなかったからROMってたけど出来てよかったじゃん。
俺も負けずに頑張るぞー
>>236 基本的にいい人は少ない。
時々でてくるだけ、その他は自分で何とかしろとかちゃんと調べろとか文句いうやつら
win32で画面をクリアするにはどうすればいいのですか? 教えてください
>>239 あなたのクリアの定義を教えてください。
Win32のラスボスを倒せばいいんじゃね?
なかなか初心者にはあのボスは手ごわいぞ。 まず起動可能なFDを作成し、FDから立ち上げ、プロンプトから forma・・・・ これ以上はネタバレだからやめとくか。
249 :
デフォルトの名無しさん :03/11/28 23:50
インプットダイアログみたいなのってコモンダイアログで用意されてないんだっけ? イメージとしては1行のテキストを入力できればよいんだけど。
無いよ。
251 :
デフォルトの名無しさん :03/11/29 00:15
自分で作った方が早いような。
んなもん10分もありゃできそうなもんだがなぁ
アドレス バーみたいなやつか? あれ拡張コンボボックスだろ
InputBox InputBox は,ユーザーが文字列を入力できる入力ダイアログボックスを表示します。 #include <Dialogs.hpp> void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString InputString = InputBox("Input Box", "Prompt", "Default string"); }
スタティックコントロールにSetWindowTextを使用して文字列を設定したところ 強制終了してしまいました。 (実行は成功しているが、メインウィンドウに処理が戻るといきなり落ちる) 文字列を短く設定したところ、強制終了しませんでした。 設定する文字列の長さに限界があるんでしょうか?
32KBあたりじゃない?
>>256 予期しない領域を破壊していると言う落ちはないか?
void fusianasan() { char sage[]="age"; SetWindowText(aborn,sage); }
デスクトップなどの特殊フォルダのアイコンを取得したいのですが、 SHGetFileInfoでできるでしょうか…いろいろやったんですが出来なかったので よろしければご教授お願いします
ドラッグアンドドロップでファイル名を取得してソレからアイコンの部分だけ抜き出すって事?
簡単に言うとデスクトップやマイコンピュータのアイコンが 含まれているファイルと、アイコンのインデックスを取得したいです。 SHGetFileInfoで取得すると普通のフォルダのアイコンのインデックスが戻ってくるので… レジストリ読んだ方が早いのかな…
263 :
デフォルトの名無しさん :03/11/29 16:17
フォントの名前からファイル名(Arial.ttfとか)を得るAPI、 もしくはフォントファイル名からフォントの名前を得るようなAPIはあるでしょうか? RemoveFontResourceでフォントを削除したいのですがファイル名が分からない状態なのです。 ご教示くだされば幸いです。
あっ、レジストリを参照すればいいのか… 解決しそうです すみませんでした_| ̄|○
265 :
デフォルトの名無しさん :03/11/29 16:31
>>262 SHELL32.dllをアイコン関係のツールで解析するのはだめか?
>>262 特殊フォルダのアイコンが入ってるファイルを
取得する方法はわかりませんが、アイコンを
取得するだけなら SHGetSpecialFolderLocation で
特殊フォルダのPIDL取得して、
pszPath = そのPIDL
uFlags = SHGFI_PIDL | SHGFI_ICON
としてSHGetFileInfoを呼び出せば取得できると思います。
特殊フォルダのアイコンが入ってるファイルを
取得しないといけない、ということならすみません。
>>256 まさにその通りでした。
たかだか3つの数字と10文字にも満たない文字を表示するだけなので
charバッファを50も取ってりゃ十分だろ。と考えたが実際は、60ちょっとあった…。
まさか仮に取ったバッファがオーバーしてるとは…鬱だ。_| ̄|○≡
>>259 そんな感じ。
ただ、charの宣言の仕方が私の場合
char sage[50];
ってなってた。
>>257 ほんとにあったのか…限界…。
レスくださった
>>257-259 さんありがとうございました。m(_ _)m
>>265 どうもです。それも考えましたがOSごとに一定かどうかわからなかったので…
>>266 できました。どうもありがとうございます
269 :
いなむらきよし :03/11/29 18:01
キケー!
270 :
デフォルトの名無しさん :03/11/29 20:56
左ボタンを押すと、「左ボタン」と表示され 右ボタンを押すと、「右ボタン」と表示され 左キーを押すと… 右キーを押すと… という風にしたいのですが キーを先に押した場合は、右キー・左キーと表示されるのですが ボタンを押してしまうと、もう一度キーを押しても右キー・左キーと 表示されなくなってしまいます。 WM_KEYDOWNとWM_COMMANDをひっくり返してみても return 0をbreakにしてみたりしたのですが、結果は同じです。 下のソースでどこかおかしいところがあったら指摘してほしいのです。 改行多すぎでエラーが出るので、ソースは次のレス番号に乗せます よろしくお願いいたします。
case WM_DESTROY: PostQuitMessage(0); return 0; case WM_COMMAND: switch(LOWORD(wp)) { case 1: user_sentaku = TEXT("左ボタン"); hyouji(); break; case 2: user_sentaku = TEXT("右ボタン"); hyouji(); break; } return 0; case WM_KEYDOWN: switch(wp) { case VK_LEFT: user_sentaku = TEXT("左キー"); hyouji(); break; case VK_RIGHT: user_sentaku = TEXT("右キー"); hyouji(); break; } return 0; これも改行多すぎですエラーがでたので、できる限り削りました。 ウィンドウプロシージャの中に記述されているものです。
hyouji()は何してるの?
>>272 hyoujiは、押されるごとに、右キー、左キー、右ボタン、左ボタン
と画面に表示する関数です。
void hyouji()
{
HDC hdc;
hdc = GetDC(hwnd);
SetTextColor(hdc , RGB(255 , 0 , 0));
SetBkColor(hdc , RGB(255 , 255 , 255));
TextOut(hdc , 30 , 30 , user_sentaku , lstrlen(user_sentaku));
ReleaseDC(hwnd , hdc);
}
クリックした場所が悪いとか・・・
>>273 ボタンのプロシージャにWM_KEYDOWN:が行ってる。
SetFocusやサブクラス化でググレ
ああマウスのボタンじゃないのか・・・ じゃあ、ボタンのメッセージ処理した後に SetFocus(自分のhWnd) でいいと思われ。
ソースが悪いな…
>>276 (専用ブラウザでソース参照用)
case WM_COMMAND:
switch(LOWORD(wp))
{
case 1:
user_sentaku = TEXT("左ボタン");
hyouji(user_sentaku);
return 0; // こっちをリターンする
case 2:
user_sentaku = TEXT("右ボタン");
hyouji(user_sentaku);
return 0; // こっちもね
}
break; // ここは必ず返しましょう
case WM_KEYDOWN:
switch(wp)
{
case VK_LEFT:
user_sentaku = TEXT("左キー");
hyouji(user_sentaku);
break;
case VK_RIGHT:
user_sentaku = TEXT("右キー");
hyouji(user_sentaku);
break;
}
break;
こんな感じでいい?
あと user_sentaku はグローバル変数なの?
関数の引数にしようべ
>>277 (ソース参照用)
リロードすりゃよかった・・・鬱
皆さん、たくさんのレスありがとうございます。
Setfocusをやってみたところ、見事解決しました。
どうもありがとうございます。
switch文をif文に変えてみたり、意味のないことをいろいろやって
お手上げだったので大変助かりました。
基本的なことがよく理解できてないようなのでそこのところを
きちんと勉強しようと思います。
>>277 user_sentakuはグローバル変数にしてました。
user_sentakuは関数の中に記述した方が、わかりやすいですね。
アドバイスありがとうございます。
皆さん、どうもありがとうございました。助かりました。ありがとう。
280 :
デフォルトの名無しさん :03/11/30 11:28
vb.netで ウィンドウにtabを送ってフォーカスの移動を行いたいのですが sendmessage(hwnd, wm_keydown, vk_tab, 0) だとフォーカス移動が発生しません。 postmessage(hwnd, wm_keydown, vk_tab, 0) ですとフォーカス移動が起こるのですが 発生するタイミングが違うので困ってます。 sendmessageでtabを送る方法か、若しくは postmessage処理の終了を待って、次の処理に取り掛かる方法 というのがありましたら教えて頂けますでしょうか。
WM_NEXTDLGCTLじゃあかんのか
ありがとうございます。 Public Const WM_NEXTDLGCTL = &H28 SendMessage_int(hwnd, WM_NEXTDLGCTL, 0, 0) これで試してみたのですが、フォーカスの移動が発生しません。 なにか間違っているでしょうか? IE中のリンクやテキストボックスのフォーカスを移動したいのですが。
283 :
デフォルトの名無しさん :03/11/30 13:02
>>280 質問するなら、IEのウィンドウだとちゃんと書け。
SendMessage()やWM_NEXTDLGCTLは使えない。
APIのkeybd_event()を使え。あと、WM_KEYDOWNの後にWM_KEYUPもちゃんと書け。
>>283 IEのウインドウの中のリンクやテキストが標準のウインドウとは違うと
思いつくほうが少ないだろ。
IEの中は特殊だとちゃんと書け。
SendMessageやWM_NEXTDLGCTLが使えない理由をちゃんと書け。
>283 keybd_eventだと sendmessage(hwnd, wm_char, *, 0) keybd_event(vk_tab, 0, 0, 0) sendmessage(hwnd, wm_char, *, 0) とした場合、文字入力が終わった後にtabが起こります。 postmessageと同じく、意図したタイミングで起こってくれないんです。 postmessageやkeybd_eventの終了を待つ方法ってあるのでしょうか?
自分のプログラムのウィンドウでなく 別に起動してる他のアプリのウィンドウで 現在マウスカーソルがどこのメニューの上にあるとか 判断することはできるのでしょうか? 例えば 自分のプログラムがバックグラウンドで動作していて ユーザはペイントを起動して使ってるとすると ペイントの「ファイル」の上にマウスカーソルが来てるときに その情報をバックグラウンドで動作してるプログラムの方で 認識することはできるでしょうか? メニューの選択後でなく,ただマウスカーソルが上に来た時です
288 :
デフォルトの名無しさん :03/11/30 17:45
うちのじいちゃんが言うには、戦争が起こる前から三国人の犯罪は多かったらしい。 8月15日を境に、奴らは戦勝国のごとく、略奪や強姦、放火を繰り返していったという。 「幼なじみのゲンさん(親切で人思いの人だった)は、駅の近くに住んでいた。 終戦後、家の修理や片づけをしている最中に、奴らは集団でやってきた。 家に入ってくるなり大声を上げて、目の前で家に火を放った。 ゲンさんは、「おどりゃー、なんしょんなら!」と叫びながら、バケツの水でその火 を消そうとすると、奴らは数人がかりで押さえ込み、そばにあった縄でそのまま柱に縛 り付けた。奴らは安全な場所に離れて、ゲンさんが叫びながら生きたまま焼かれる姿 を笑いながら見ていたという。 その後、奴らはゲンさんから奪ったその土地にバラックを建て、終戦直後不足してい た煙草や、密造酒、三国人の仲間が略奪した食料などを売っていたらしい。 現在、その場所は、大きなパチンコ店になっており、焼肉店が並ぶ。
>>287 すいません
マウスの位置座標取得はわかるんです.
今悩んでるのはそのマウス位置が
別プログラムのウィンドウ内にあるって判断だけじゃなく
別プログラムのメニューやボタンのどの上にあるのか
って情報が取得できるのかってことなんです
すみません。 リストボックスの特定項目の文字列を変更するにはどうすればよいのでしょう。 LB_DELETESTRING してから LB_INSERTSTRING すると選択が解除されて不自然になってしまいます。
>>290 それ、俺も悩んで15分くらいいろんな事やってわっかんねーって検索かけたりした
(つまり質問していいほどのレベルじゃないかなと思ったから
んでどうやればいいかというと
GetWindowText
>>286 ChildWindowFromPoint(Ex)
GetWindowRect
ScreenToClient
これで、云々すれば、いけるとおもわれ。
>>291 GetWindowTextはウインドウの文字列のコピーを取得する関数で、直接のポインタじゃなかった記憶があります。
すみません。わかりません。
とりあえずは選択項目のインデックスを保存しておいて除去挿入後に再選択という方法を取ったのですがスマートではありません。
>>293 すまそ、質問の意味とりちがえた
特定のっていうのは選択したときってこと?
できたならそれでいいんじゃないかなぁ
>>294 選択されているときと、選択されていないとき両方の場合が考えられますが、ただ特定の項目の文字列を変更したいということです。
挿入した物を選択したいの? なら挿入した番号を取得して LB_FINDSTRINGメッセージとか LB_SETCURSELとか?
>>292 ありがとうございます
けど別プログラムのウィンドウを子ウィンドウとして取れるんですか?
>>286 ChildWindowFromPoint を使った事ないから正直よくわからんが、
親ウィンドウに NULL、もしくは GetDesktopWindow() を指定すれば、
デスクトップを親に持つ「親ウィンドウ」のハンドルが取得できる気がするぞ。
親ウィンドウのハンドルが取得できれば、あとは煮るなり焼くなり。
boost::thread::yield() の実装って Sleep(0) なんすね。 確かに MSDN にも,Sleep(0) すると他のスレッドに実行権を 引き渡すような事が書かれてありました。 でも実際に while(1) Sleep(0); とすると CPU 使用率が 100% になります。 `yield ' ってのはこんなもんでいいんすか?
>>300 他に動かすべきスレッドが無ければ自分に戻ってくる
他のスレッドに実行権を引き渡すのにもCPUを使用するわけだが。
ああ,さりげなく300getしてたんだ……
>>301 >>302 お二方ともサンクスコ。とりあえず"当たり前だ"という事で了解しました。
いまいち `yield' の一般的な存在意義が分かってないんだけど,
マタリと修行しますわん。。。
304 :
デフォルトの名無しさん :03/12/01 00:52
すいませんが、教えてください。 タスクトレイの通知エリア(MSDNだと"Status Area")に 外部アプリのアイコンが表示されているか調べる方法が わかりません。 アイコンが消えて、プロセスだけが残るという症状があるので これを検知したいのです。 いろいろ調べても良くわかりません。 ググッタ時にタスクバーをキャプチャしてBMPで調べている人も いるようですが、いまいちのようです。 FindWindow()で取得したハンドルで、やりたいのですが・・・ よろしく、お願いします。
すいません。ageてしまいました。
質問はageてもいいと思うけど
>>306 無駄なレスするな、この腐れ甘納豆やろうが
>>307 無駄なレスするな、この腐れ甘納豆やろうが
>>308 無駄なレスするな、この腐れ甘納豆やろうが
甘納豆(゚д゚)ウマー
311 :
デフォルトの名無しさん :03/12/01 03:08
無駄なこともいいかもw
>>311 無駄な事をたくさんする事はスピッツ公認です
今、32bitOSで動くメモリサーチツール作ッてるんだけど あるプロセスのメモリを全部参照するには、ぶら下ってるモジュール毎にToolhelp32ReadProcessMemoryで取得しれば全部取れますか? この方法ではグローバル変数とか漏れますか? 教えてエライ人
それ使うとwindows以外ではサーチできないよ
> windows 9x系?
win32APIだからいいんじゃね?
317 :
デフォルトの名無しさん :03/12/01 21:49
わかっていること。 元のプログラムはinetd をつかったサーバで、 ファイルやネットワークの読み書きは標準入出力を使っています。 これをwinxp + borland c++ 5 で動くようにしたい。 自分の開発環境にはflock や lockf や fcntlはありまえん。 とりあえずファイルの排他処理をやろうと思っています。 io.h の中にそれらしき関数を見つけました。 lock, locking, unlock。 lockとunlockを使えばうまく処理できそうなのですが。 代案はありますか? よろしくお願いします。
次の人どうぞー
>>313 全部参照するなら、VirtualQueryExでヒープ情報を取得してから、その領域
に対してReadProcessMemoryって感じ。
詳しくはMSのWalkerっていうサンプル(VC++6.0にも付いてくる)でも見てくれ。
>>317 普通にCreateFile()で排他制御できると思うが。
だれかSDKでのブラウザの作り方教えてくれー. 関連するAPIだけでもいいんで. MFCならCHtmlViewを使えばええみたいやけど.
IWebBrowser2
Donutのソース嫁
325 :
デフォルトの名無しさん :03/12/02 12:13
Win2k VC++6.0 で OLE によるドラッグ&ドロップを実現させようとしていて、
サンプルソースをネットで見つけたもののC++環境でコンパイルが通らなくて困っています。
oleidl.h の IDropTargetVtbl型の変数を .cppのソースで宣言した時に、
oleidl.h に IDropTargetVtbl構造体の定義がしてあるにもかかわらず、
コンパイル時にIDropTargetVtbl型が定義されてないというエラーがでます。
oleidl.hのIDropTargetVtblの定義の前には、/* C style interface */というコメントがあり、
これは、Cからしか呼び出せないのでは?と思っています。
どうにかして、C++から呼び出す方法はないのでしょうか?
APIの質問というよりかは、C++言語の質問だと思われますが、
よろしくお願いします。
ちなみに、OLEのサンプルソースは
http://www.nakka.com/lib/ の OLEドラッグ&ドロップ にあります。
わからないけど extern (C)とかやってみたら? あてずっぽでごめん
VC++ならIDLをimportして継承したほうが楽でいいと思うが。
C++ならVtblはいらない。 直接メソッドを呼び出せる。
329 :
デフォルトの名無しさん :03/12/02 13:38
>今、32bitOSで動くメモリサーチツール作ッてるんだけど >あるプロセスのメモリを全部参照するには、ぶら下ってるモジュール毎にToolhelp32ReadProcessMemoryで取得しれば全部取れますか? >この方法ではグローバル変数とか漏れますか? >教えてエライ人 もっと根本的な問題があるのです。 プロセスに割当てられたメモリで参照可能な領域の 開始アドレスとサイズを取得する方法が欲しいのです。 (0x00000000 〜 0x7FFFFFFFで内で参照可能/不可能な領域がある) モジュール単位で検索した場合、一応クリアできると思っていたのですが その様な情報を取得できる関数などありませんでしょうか? 動作環境はwin98/win2000です
>>330 めもりくりーなーのサンプルプログラムがどこかにあったと思う
探してみては?
現在、explorerのタイトルバーからフルパスを取得しています。 しかし、この方法ではフォルダオプションの設定でフルパス表示になっている 必要があります。この設定に関係なく、explorerウインドウのフルパスを取得 することは可能なのでしょうか?
yes/no で答えられるからやり方について質問したほうがいい(とアドバイス
332です。 可能であればやり方をおしえてください。 SHGetSetSettingsあたりか、レジストリを変更してフルパスを得てから元に戻す というのも考えましたが、勝手に設定をいじるというのは避けたいと考えています。 よろしくお願いします。
キーロガーを作成してるのですが win起動時に立ち上げるためスタートアップにショートカットを作成しています。 これだとばれてしまうのでスタートアップに入れないで起動させるには どのようにすればよいでしょうか?
run keyでも使え
エクスプローラ等でファイルのプロパティの、 選択できるラベルみたいのを実装したいのですが、どうしたらいいですか? EM_SETREADONLY を送ればリードオンリになり色もそれらしくなるのですが枠線が消えてくれません。 よろしくお願いします。
>>338 いまいちよく分からんがダイアログに貼り付けたエディットコントロールの
枠を消したいってことか?
そうです。 わかりますか?
エディットコントロール貼り付ける段階でウィンドウスタイルから枠の表示を消しとけ。
WS_BORDER とは違う枠線みたいです。
通常は枠がないんじゃないの?
WS_EX_CLIENTEDGEあたりじゃないか?
345 :
デフォルトの名無しさん :03/12/02 19:03
CreateDIBSection()でつくるHBITMAPの、 ピクセルフォーマットを、R5 G6 B5 にする方法しってたら偉いから、教えて。 または、HBITMAPのピクセルのアドレスを取得する方法。
R5 G6 B5フォーマットってあるの?
解決しました。 ありがとうございました。
すいません。レスがつかないんで・・・
やっぱり、
>>304 は難しいですかね。通知領域のサイズを調べれば、アイコンの数くらいは
わかるんですけど
>>345 CreateDIBSectionにポインターのアドレス渡すだろ?
そいつにDIBピクセルの先頭が入る。
350 :
デフォルトの名無しさん :03/12/02 20:36
>346 あるよ。おれの16ビットモードは、565。 >349 それだと555になってしまうのよ。 565にする方法を教えて教えて教えて教えて教えて教えて教えて教えて教えて教えて
教えて君に変貌したので無視推奨
>>350 そんなに知りたければ自分で調べつくしてください
352 :
デフォルトの名無しさん :03/12/02 20:44
普通に演算して変換してやりゃいいだろうに…… プログラマーならだれでも出来るだろ。最適化できるかどうかはともかく。
>>330 >プロセスに割当てられたメモリで参照可能な領域の
>開始アドレスとサイズを取得する方法が欲しいのです。
だからその領域を取得するのがVirtualQueryExだっちゅーの
>>345 BITMAPV4HEADERかBITMAPV5HEADER
>>350 349はR5G6B5のことじゃなくて
>または、HBITMAPのピクセルのアドレスを取得する方法。
これに対する回答だと思うが。
>304 タスクバーは再起動すると、もっかいアイコン入れてね〜ってメッセージを トップレベルのウィンドウに送ってくるよ。
ここみればハッシュばっちり分かるというサイトは無いものか・・・
>>335 Autoexec.bat に入れるといいよ。
>>356 > 外部アプリのアイコンが表示されているか調べる
だから、それは違うんじゃないかと。
>>356 , 359 さん
レスありがとうございます。
>>359 さんの書かれている通りです。
外部アプリが、自作ものならそれなりに対応はあるんですが、
市販のものなので無理です。
取り合えず、通知領域のハンドルは
HWND hTaskBar = ::FindWindowEx(0, 0, "Shell_TrayWnd", NULL);
HWND hTaskTray= ::FindWindowEx(hTaskBar, 0, "TrayNotifyWnd", NULL);
HWND hPager = ::FindWindowEx(hTaskTray, 0, "SysPager",NULL);
HWND hChild = ::FindWindowEx(hPager,0,"ToolBarWindow32","通知領域");
とすれば、得ることができ、そのサイズを調べれば、アイコンがいくつ
表示されているかわかります。
と、今のところここまでなんです・・・・
>>360 タスクバーが縦になっててもサイズから分かるのか。
>>361 確かに縦になって、2列以上になるとわかりませんね。
363 :
デフォルトの名無しさん :03/12/03 07:37
364 :
デフォルトの名無しさん :03/12/03 11:25
任意ファイルをウインドウにドロップしたら、ウインドウプロシージャ内で、 ダイアログボックス(DialogBox()を使って)開くようにしているんですが、 そのウインドウプロシージャ内の変数の内容を、ダイアログプロシージャに 送ることは出来ませんか? 出来ないとしたら何か良い方法は無いでしょうか? 今、やり方が分からなくてのでグローバル変数を使っているのですが 辛くなってきて・・・
>>364 構造体にして DialogBox の時に送れば?
構造体を関数が保管して
Kouzou* Saved (Kouzou* kz)
{
static Kouzou* MyKouzou;
return MyKouzou = ((kz==NULL)?MyKouzou : kz);
}
とすれば NULL を送れば現在の構造体を受け取れるようにもできるのかなと思う
>>365 一行目と3行目以降は全く関係ないです(紛らわしくてゴメンナサイ
任意のウィンドウメッセージ(WM_APP+n)を定義して渡せば? ある程度の量があるなら構造体なりクラスなりにしてポインタを。
↑っていうよりまずモードレス使わなきゃなんじゃないの…?
>>368 関数に保管しておけば
WM_INITDIALOGの部分で読み取れるから大丈夫
>>364 DialogBoxParam を使うのが定石です。
ホットキーを使っていつでもウインドウを呼び出せるようにしたいのですが、 SetForegroundWindow() だと メッセージボックスが表示されていた場合に メッセージボックスの親ウインドウがアクティブになってしまって あまりうれしくありません。ALT+CTRLで切り替えたときのように、 メッセージボックスが出てればそちらがアクティブになるような方法は ありませんでしょうか? OSはMe/2000/XPですが、最低XPでさえ動けば。。。
>>371 事故解決しますた。
GetParent(GW_ENABLEDPOPUP)
で逝けました。
こっちの方がいいYO!という方法がありましたらご教授いただけましたら幸いです。
>365-370 レスありがとうございます。 構造体にデータを入れて、ダイアログプロシージャに送る事で 解決できました。 他のことにも応用できそうで勉強になりました。 本当にありがとうございました。
WM_INITDIALOGでSendMessageで親に問い合わせるとか
InsertMenuItemアイテムでシステムメニューに追加するとき 最後に追加する方法が知りたいのでお願いします。
質問時はあげないと誰も気づかないぞー >InsertMenuItemアイテムでシステムメニューに追加するとき >最後に追加する方法が知りたいのでお願いします。 この最後って「最後尾」って事でいいんだよね? 某書籍のサンプル hMenu = GetSystemMenu (hwnd, FALSE); AppendMenu (hMenu, MF_SEPARATOR, 0, NULL); AppendMenu (hMenu, MF_STRING, IDM_SYS_ABOUT, TEXT ("About...")); AppendMenu (hMenu, MF_STRING, IDM_SYS_HELP, TEXT ("Help...")); AppendMenu (hMenu, MF_STRING, IDM_SYS_REMOVE, TEXT ("Remove Additions"));
>>377 さんくす。
MSDNに
この関数は InsertMenuItem 関数に取って代わられましたが、まだ使用できます。
ってあったから使わないほうがいいかと思ったのですが・・
その辺、どうなんでしょう。
MSDNって聞いて早速 MSDN で調べたら GetMenuItemCount こんなものが出たぞ、俺も知らなかったが直感っていいもんだな 詳しくは自分でMSDNみてみそ
>>379 どもっ!
自分もやってみたんですけど
InsertMenuItem(hMenu, -1, TRUE, &mi);
ってやったら最後に追加されました。これって裏技かな
CreateFile ReadFile CloseHandle を使用して「一行だけ」文字列を抜き出す方法ってありますか? fgetsなら一行、もしくは指定した文字数だけ受け取れますがReadFileだとファイルから全部抜き出して、 改行の部分まで for や while でループしながら探索しなくちゃでき無そうなんですけど… やっぱりfgetsを使ったほうがいいでしょうか? 何か一行だけファイルから抜き出すいい方法があれば教えてください。
>>380 さぁ?
仕様じゃないのかな
ListBoxでも -1 指定して Insert すると最後になるぽ
>>382 でも、キモイので教えていただいた方法でやります。
ありがとうございました。
質問ageし忘れた…鬱
>>381 ReadFileで1byteずつ読んで処理するのが面倒ならC/C++標準ライブラリ
使っとけ。そのためのライブラリだ。
俺ならstd::getline()使うが。
>>385 わかりました、ありがとうございます。
getline()はC++ですよね。
C++はやってないので調べてみて使ってみたいと思います
387 :
デフォルトの名無しさん :03/12/05 15:43
質問させていただきます。 CreateProcessで起動したコンソールアプリケーションの標準出力を、別のところに出す方法を模索しています。 (hello.exeは、printf("hello");だけ行うコンソールアプリケーションです) 色々検索などして調べました結果、下記のようにしてファイルへの出力はできたのですが、 最終的にはダイアログのエディットボックスに出力したいのです。 残念ながら sui.hStdOutput = GetDlgItem(hWnd, IDC_MAIN_EDIT); にするだけでは出力されませんでした。 何か知恵をお貸しいただければ幸いです。
388 :
デフォルトの名無しさん :03/12/05 15:44
HANDLE hWrite; SECURITY_ATTRIBUTES sa; STARTUPINFO sui; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; hWrite = CreateFile("out.txt", GENERIC_WRITE, FILE_SHARE_READ, &sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); ZeroMemory(&sui, sizeof(sui)); sui.cb = sizeof(STARTUPINFO); sui.dwFlags = STARTF_USESTDHANDLES; sui.hStdInput = NULL; sui.hStdOutput = hWrite; sui.hStdError = NULL; CreateProcess("hello.exe", "", NULL, NULL, TRUE, 0, NULL, NULL, &sui, &pinfo ); CloseHandle(hWrite);
>387 パイプを作れ。 説明は面倒なので自分で調べるか、他に親切な人を捜せ。
>390 ありがとうございました。解決しました!
エディットコントロールを使っています。 入力を10進数に限定するのは ES_NUMBER でできました。 入力を16進数に限定するにはどうすればよいのでしょうか? よろしくお願いします。
サブクラス化したら?
他のアプリがMIDI鳴らしている時に、 それをプログラムを終了せずに、強制的に止めさせて、 自分の鳴らしたいMIDIを鳴らす方法はありますか? SDKの方は英語しか見つからなかったので、 よく分からないもので。
沢村か?
マウスが、自分のウィンドウ上になくても、マウスカーソルを変えたいのですが、 どうしたらいいでしょうか?
コントロールパネルのマウスの設定でお好みのマウスカーソルをお選びください
いえ、プログラムで、一時的にマウスカーソルをかえたいんです。
>>395 そのアプリにそのためのAPIが用意されてないと難しいだろ。
試しにDDEでopenコマンドでも送ってみたら?
402 :
デフォルトの名無しさん :03/12/06 12:45
割り込んですいません。DDEの話がでていたので SDIで作成したアプリを、ある拡張子に関連付けしたのですが、 フォルダオプションのファイルの種類で確認すると詳細設定がでて こないんです。 InitInstance()は、自動生成したものを使っていますが、何か 特別なことをするのでしょうか? ご存知でしたら、教えてください
403 :
デフォルトの名無しさん :03/12/06 14:02
2ch関係のツールを作っています。 コテハンA・・・・☆☆☆☆ コテハンB・・・・☆☆☆☆ このような感じでエディットボックスなどに出力して それをコピペで2chに貼り付けできるような仕組みを 考えています。コテハンの長さにあわせその後の・の数を変えて 見やすいようにしたいのですが、任意の文字列の幅を調べるには どうすればよいのでしょうか?
GetTextExtentPoint32 GetCharABCWidths
407 :
デフォルトの名無しさん :03/12/06 17:35
起動しているだけで他のプロセスが出力したOutputDebugStringの内容を 受け取るソフトウェアがあるのですが、それはどうやっているのでしょうか? googleで検索してみたのですが、 exeを起動してそのexeだけの出力を受け取る方法しか見つかりませんでした。
>>406 ありがとうございます。 ヒントを元に、ググッてみます。
>>409 知りたい? 知りたい?
教えてあ〜げないw
キーフックについての質問っすー. int SetHook() { hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyHookProc, hInst, NULL); if (hHook == NULL) { MessageBox(NULL, "SetWindowsHookEx失敗です", "Error", MB_OK); return FALSE; } else { bHook = TRUE; return TRUE; } } int EndHook() { DWORD dwError; if (UnhookWindowsHookEx(hHook) == TRUE) { bHook = FALSE; return TRUE; } else { dwError = GetLastError(); MessageBox(NULL, "UnhookWindowsHookEx失敗です", "Error", MB_OK); return FALSE; } } SetHookして,hHookはNULLでない値をもらってフックできているはずなんですが, EndHook時に,UnhookWindowsHookExがTRUEを返さず,失敗します. GetLastErrorでエラーコードを調べたところ「無効なフックハンドラだ」といわれました. 何が原因なんでしょうか?
>>411 とりあえず UnhookWindowsHookEx() は成功時に非 0 を返すとなってるから TRUE との比較は邪魔。
で、それをはずしても失敗している場合だけど、hHook が DLL 内のグローバル変数で、かつ
SetHook() したプロセスと違うプロセスから EndHook() したりとかしてない?
413 :
デフォルトの名無しさん :03/12/07 06:47
リストビューをサブクラス化している。 アプリケーション終了時にはプロシージャを元どうりにして サブクラス化を解除しないでも問題ないよな?? 詳しく知らないので誰か教えて・・・
s/元どうり/元どおり/g
>>413 アプリ終了とWM_NCDESTROYはどっちが先?
>>413 レス遅れてすいません。
良くわからないのですがWM_CLOSE
またはWM_DESTROYで元に戻すと思います。
DispatchMessageされる時点でGWL_WNDPROCが指し示す先に 関数の実体がなくなっているとSTOPダイアログなわけだが 最後にDispatchMessageされるのと、関数がアンロードされるのは どっちが先だと聞いたつもりなんだが SendMessageしかり
もしかしてウインドウではなくウインドウクラスを書き換えているつもりか?
質問が意味不明で済みません。 WM_CREATEで Org_Proc=(WNDPROC)SetWindowLong(hListView, GWL_WNDPROC, MyListViewProc); としたのを WM_CLOSEで SetWindowLong(hListView, GWL_WNDPROC, Org_Proc); として、もとに戻しさないでも問題ないのかということです。 個の場合ウインドウを書換えてるのでしょうか?
420 :
デフォルトの名無しさん :03/12/07 15:43
基本的なことですいませんが、 方向キーを押してもWM_CHARが発生しません。 方向キーが押されたときになにか処理するためにはどうしたらいいですか? けっこうぐぐったんですけど見つからず…。
WM_KEYDOWN wParamに仮想キーコードが入る
A〜ZとかはWM_KEYDOWN→TranslateMessage→WM_CHARだけど、 方向キーはWM_KEYDOWNでやらないとだめってことですか。 どのキーならWM_CHARがくるのか…は自分で調べますわ。 ありがとうございますた。
後から見た人が間違えるといけないので… >wParamに仮想キーコードが入る 仮想キーコードはHIWORD(lParam)でした。
424 :
デフォルトの名無しさん :03/12/07 17:21
>>423 >>wParamに仮想キーコードが入る
で正しくないか?
WM_CHARは、SHIFT押しながら押したりIME入力で確定したときにも送られるので、注意が必要。
425 :
デフォルトの名無しさん :03/12/07 18:20
ShellExecuteで起動したプロセスの終了待ちってどうやればいいんですか? WaitForSingleObjectにHandle渡しても怒られます。
>>425 >WaitForSingleObjectにHandle渡しても怒られます。
変な表現使わずどうなったのか正確に書きなさい。
427 :
デフォルトの名無しさん :03/12/07 18:34
VC++6.0 でプログラムを作っているのですが、 毎回メモリ監視ソフトで見ていると実行終了時に必ず2kbずつリソースが減っています。 これはメモリの開放し忘れが原因なんでしょうか? デバッグ時もリリース時も同じ状態です。でもエラーは全く出ていません。
>>419 SetClassLongという関数を知っているか?
431 :
デフォルトの名無しさん :03/12/08 12:28
まさかとは思うけど,っていうか,この問題は私が別の OS を買って その上でソフトを動かせばきっと解決するとは思うんだけど…… 他プロセスが持ってるファイルハンドルを強制的にフラッシュさせるか, WriteFile() でバッファリングさせない方法とかがあったりしますか? とある市販 USB 機器からデータを転送してくるソフトがありますが, 私の OS の USB ドライバ周辺が不安定なせいか (多分このせい…WinMe だし) データの転送が終わったはずなのに,猶もデータを待ち続けているようなのです。 ソフトには「中断」ボタンがあるんだけど,押しても機能していないっぽいし。 結局ソフトを強制終了させるしかなく,当然,ファイルハンドルは正常に クローズされず,バッファに残ったデータはファイルに書き出されません。 ソフト自身が独自にバッファを持っていたら,それはもう仕方がないとしても この問題を解決する方法とかはあったりするもんでしょうか?
433 :
デフォルトの名無しさん :03/12/08 12:32
メーカーに聞け
>>432 あ,すいまそん。
ファイルサイズは 600MiBytes〜1GiBytes です。ごめなさい。
>>433 そか,それが一番かも分からんですね。
「中断」ボタソが利かないのはソフトのバグだろうし。
ありがとうです。
マイコンピュータ→プロパティ→パフォーマンス→ファイルシステム→ トラブルシューティング→すべてのドライブに遅延書き込みを行わない
>>431 >他プロセスが持ってるファイルハンドルを強制的にフラッシュさせる
ヴォリュームをアンマウントすると強制的にフラッシュされるはずだが
>WriteFile() でバッファリングさせない方法とかがあったりしますか?
WriteFile()というかCreateFile()でFILE_FLAG_WRITE_THROUGH
オープンソースなドライバじゃないんだから そんな細かい話したってどうにもならないだろ。
すまんかった
俺も変わりに謝ろう < ̄ ̄) ) ( /====ヽ ( す )ヘ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ヽ__/y )ヽ、 < うわーそれで見逃して〜 (´Д`;/ / , ヽ、 \___________ |`ヽ/ / /` ) .し(、__/〉 彡 ノ /_ 〈 ノ ̄|ス|~\ / /|マ|、 \ / / ,ヘ|ソ| \ \_____ ┌──┐ (__,_|/  ̄ \_ |___ ( └──┘ \_) ↑ 諭吉
>>412 レス遅れてすいません!!
ありがとうございますー.試してみます!!
>>436 どうもです。
あ,それかっ!?……と思ったら,既にその設定になっていました。
ところで,WriteFile() を少し行って強制終了させるという実験を
してみたんだけど,きちんとフラッシュされますね。
やはり例のソフトは自分でバッファを持ってるのかも知れません……
>>437 どうもです。興味深いです。
アンマウントというと,FSCTL_DISMOUNT_VOLUME あたりでしょうか。
脳内会議により週末に新しく HDD と Win2000 を購入する事が決まったので
いろいろ実験してみたいと思います。
レスくれた皆様,サンクスコです。
>>442 それって AVI ファイルとか書いてたりしますか?
444 :
デフォルトの名無しさん :03/12/09 01:59
WNDCLASSEX構造体で質問です。 hbrBackgroundメンバに関してですが、これへの代入方法として wndclass.hbrBackground = (HBRUSH) GetStockObject (GRAY_BRUSH); という方法でブラシのハンドルを渡す方法と、MSDNのリファレンスにある color value を直接代入する方法があるようですが、後者の方は the value 1 must be added to the chosen color という但し書きが あるのですが、これは実際に使用するときは1を加算せよということ なんでしょうか? ×間違い? wndclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND; ○正しい? wndclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND+1; 下の使い方が正しいということなんでしょうか? 実際にやってみると、どちらでも色に違いがないので、 よくわからんなぁと思っているのですが。
445 :
デフォルトの名無しさん :03/12/09 02:02
>>444 追伸
COLOR_SCROLLBARの場合は+1をしないと
NULLブラシのようになってしまうようです。
ということはやっぱ+1が必要なのかな。
>>445 ×間違い
wndclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
wndclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND+1;
○正しい
wndclass.hbrBackground = (HBRUSH) (COLOR_BACKGROUND+1);
リストビューに、3列3行の項目を作ったのですが、 一番左のセルしか選択できません。 全てのセルに対して、クリックして選択できるようにするには どうしたらいいんでしょうか?
1列3行のリストビューを3つ作ればよい
>>448 マ、マジですか?
そーいった力技以外に方法は無いのでしょうか?
>>449 CListCtrl *listctrl=(CListCtrl*)GetDlgItem(IDC_LIST1);
listctrl->SetExtendedStyle(LVS_EX_FULLROWSELECT);
マウスの動作を検出したいのですが、以下のコードだと画面上の 座標は取得できました。マウスポインタの動作とは関係なくマウス そのものの移動量を取得したいのですが何か方法はないのでしょうか? 現在の画面上の座標を求めるコード: case WM_MOUSEMOVE: c_x = LOWORD(lParam); c_y = HIWORD(lParam);
DirectInput なんかが良いのでは
>>451
>>451 マウスそのものの移動量?
俺のマウスはコードレスだからどこまででも移動できるぞ
>>452 あ・・・(゜0゜;)DirectInputの範囲なのですね。
やってみます。
>>453 どこまでも移動できる事を検知したいのです...
マウスメッセージじゃ駄目だろ
ついでに↓ お絵描きソフトなんかでマウスやペンの移動履歴を高精度で 取りたい場合には GetMouseMovePointsEx ね。
(追伸↑は画面内での移動に限られるから、451的用途には使えない)
>>454 お手軽に済ませるなら、SetCursorPos で画面の真ん中に移動して、
WM_MOUSEMOVE でどれだけ移動したかを検出して自前で積算する、
って手もあるよ。マウスカーソル表示しないならこれでも十分。
>>443 "それ" とは,私が USB 機器からダウソしているファイルでしょうか?
ファイルは m2t,MPEG-2 Transport 形式ファイルです。
もっと言えば,その USB 機器とは日本デジタル家電の「ロクラク」です。
細かなトラブルもあったりするけど,なかなかいいヤシです。
>>460 wndclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND+1;
wndclass.hbrBackground = (HBRUSH) (COLOR_BACKGROUND+1);
この2つの違いを理解してないな。
>>461 なるほど。TS ならAP等ハングしても受信できてた部分だけで使えますね。
多少アレな手段ですけど、apihijack (google で引いて) で CerateFile を
フックしてFILE_FLAG_WRITE_THROUGHを立てるなんて手もあります
(apihijack のhookは単一の coff ファイルにしか出来ないので、loadlibrary
や cocreateinstance もフックしてロードされたdllをさらにフックする必要も
あるかも知れません)。 MS の "Detours" っていうAPIフックライブラリでも
同様のことが出来そうですが、こちらは使ったことがありません。
>>463 どうもです。apihijack について早速 codeproject のページを眺めてみました。
なんとも過激ですね(笑い)。オラなんだかワクワクしてきました。
ありがとうです。
465 :
デフォルトの名無しさん :03/12/10 16:19
VC++.NETで、 ウインドウプロシージャの中で、 MessageBoxをたくさん呼び出した後に、 PostQuitMessageを呼び出してもプログラムが終了されないのですが何故でしょうか?
MessageBoxはモーダルじゃないの? プロシージャから戻らないとか・・
>>465 たくさんというのが、どういう状況か想像できない。
>>466 の言うとおり、基本的にモーダルじゃないっけか?
あるウィンドウParentがあって、Parentに対してウィンドウプロシージャParentProcが 関連付けられています。そのウィンドウを親ウィンドウとするウィンドウChildで 発生するメッセージはParentProcで捕まえられますが、ウィンドウChildを 親ウィンドウとするGrandChild
で発生するメッセージはParentProcでは捕まえられません。 この場合、ウィンドウGrandChildで発生するメッセージはどのように捕まえれば いいのでしょうか? ウィンドウParentのウィンドウクラスはプログラムの開始時に登録したもので、 ウィンドウChildとウィンドウGrandChildのウィンドウクラスは最初から登録されている STATICです。つまり、ウィンドウChildとウィンドウGrandChildはスタティックコントロール です
470 :
デフォルトの名無しさん :03/12/10 19:49
age
ageるな!ぼけ!
>>468 そのメッセージってSTN_系のか?
もしそうなら、Childのプローシージャでしか
捕まえられないのでは?
>>472 >そのメッセージってSTN_系のか?
そうです。STN_CLICKEDを取得したいのですが。
>もしそうなら、Childのプローシージャでしか
>捕まえられないのでは?
やっぱりそうなんでしょうか。_| ̄|○
SetWindowLong関数でChildのウィンドウプロシージャのアドレスをParentのそれに
変えてみたりもしたんですが、これだとGrandChildのメッセージは一応取得できるけど、
なんか描画がヘンです(Childが再描画されない)
> ChildのウィンドウプロシージャのアドレスをParentのそれに 無茶すなよ(w
>>474 ありがとうございます。コントロールのサブクラス化によって解決できそうな感じ
だったのですが、やはりChildの再描画部分がうまくいかないです。
結局やりたいことは
親ウィンドウ(WS_OVERLAPPEDWINDOW)に大小のスタティックコントロールが
貼り付けてあり、大きいほうが下、小さいほうが上という上下関係で重なっていて、
大きいほうがクリックされたときのSTN_CLICKEDメッセージと小さいほうが
クリックされたときのSTN_CLICKEDを区別したいのです。
現状だと先に読み込んだほうが大きければ、後から読み込んだほうをクリックしても
大きいほうと重なっていればそちらが認識されるようです。
この上下関係を常に大きいほうが下、小さいほうが上という上下関係を確実にするため
子ウィンドウと孫ウィンドウという方法を取ったのですが、両方とも子ウィンドウにして
かつ、両者の上下関係を確実に管理する方法はあるのでしょうか?
>現状だと先に読み込んだほうが大きければ、後から読み込んだほうをクリックしても >大きいほうと重なっていればそちらが認識されるようです。 若干訂正 現状だとコントロールが重なっている部分をクリックした場合、見た目の上下関係は 関係なく、先にCreateWindowしたコントロールが優先されるようです。
WS_CLIPSIBLINGSじゃないかな?
スタティック程度なら自分でウインドウクラス定義しちゃえば?
デキタ━━━━(゜∀゜)━━━━!!!! 大小のコントロールボックスを両方とも子ウィンドウにして、どちらかに(実際どっちが正しいんだろう) WS_CLIPBLINGSを指定して、小さいほうのみSetWindowPos関数でHWND_TOPを指定すると 狙っていた挙動になることがわかりました。 ちょっと難しく考えすぎていたようです。 皆さんレスありがとうございました。
キーボードからの入力について教えてください 普通はWM_CHARを使うと思うのですが、カーソルキーなどの入力を得たいときには WM_KEYDOWNを使って仮想キーコード(VK_*)で受け取りますよね。 このときデバイスに依存するのは、スキャンコードだけで キーコードは非依存と思っていいのでしょうか? 実はアスキーと非アスキーの入力をすべて受け取りたいのですが、 VK_*の割り当てられていない通常のボタンのキーコードを、 TranslateMessageを通さずに解釈して、ABC...Z等と解釈していいのか判断できないんです。 やっぱり、アスキー、非アスキーはWM_KEYDOWNとWM_CHARに分けて二度解釈するのが正しいのでしょうか?
482 :
デフォルトの名無しさん :03/12/11 15:48
VC6.0 + Win2K の環境なのですが、 MSDNのGetStockObjectの英文リファレンスを 読むと、GetStockObject(DC_BRUSH) という 値があるんですが、実際にこれを使うと定義されていない というコンパイラエラーがでます。 DC_BRUSHは Device Context のブラシと思いますが、 これは GetDCBrushColor関数やSetDCBrushColor関数 で、取得や設定ができるようですが、こちらの2つの関数 も定義されていないとコンパイラエラーとなります。 この値は日本文リファレンスには載っていないのですが 実装されていないのでしょうか? wingdh.h で宣言されているというので、windows.h を includeしています。 wingdi.h を独自に include しても 変化なしでした。
>>482 GetDCBrushColorには
[This is preliminary documentation and subject to change.]
とあるので削除されたということなのかな。
知らんけど #define _WIN32_IE0x0500 #define _WIN32_WINNT0x0500 みたいなんが必要ってことはない?
>>484 その辺りの詳細はよくわからないのですが、
一応、簡単なWindowアプリで実験しています。
だからその辺りも defineされてないのかな。
>>484 #include <windows.h>
の前に、その2つを define してみましたが、
やはり定義されてないと表示されますね。
まあ、ダメならダメでいいんですが。
>>486 ごめん、タブが消えてた。それでじゃない?
wingdi.h で確かに
#if (_WIN32_WINNT >= 0x0500)
#define DC_BRUSH 18
#define DC_PEN 19
#endif
って定義されてたよ。だから
#define _WIN32_WINNT 0x0500
でいいと思う。
>>487 どもども。そのように定義したらちゃんとコンパイルできました。
しかしSetDCBrushColor関数を使っても、ブラシを変化させら
れなかったようです。なんでかなぁ。
>>488 ウインドウクラスの背景に
hbrBackground = (HBRUSH) GetStockObject(DC_BRUSH);
と渡したのですが、たとえば
ダブルクリックメッセージを拾って、その中で
hdc = GetDC(hwnd)
SetDCBrushColor(hdc, RGB(0xff, 0, 0));
ReleaseDC(hwnd, hdc)
などとしてみても、背景色には変化ないみたい。
ウインドウプロシージャが終了するか、デバイスコンテキストが
終了するとDC_BRUSHもデフォルトになってしまうのかな。
背景色を好きな色で塗るにはやっぱWM_ERASEBKGNDを
処理するのが一般的でしょうか? GetStockObjectだと、
グレイ、白、黒くらいしか選択できないので。
CS_OWNDC
>>489 つーか、GetStockObject(DC_BRUSH)の結果はチェックしてみたのかよ
自分以外のアプリのタイトルバーを変更したいんですが、 ウィンドウのタイトルバーの表示とタスクバーの表示を違うようにしたいのです。 例えば かちゅ〜しゃ のように。 タイトルバーには「かちゅ〜しゃ Ver x.xx [全既得スレ]」と 見えますが、タスクバー上は「かしゅ〜しゃ」という感じです。 SetWindowText ではタスクバー上も変わってしまうのでダメでした。 SendMessage で WM_SETTEXT を飛ばしても同様にダメでした。 これを実現するにはどうすればいいでしょうか? ヒントだけでも宜しくお願いします。
>>490 CS_OWNDC を指定したらできますた。
ありがとうございます。
>>491 動作はしていたようです。どもども。
>>492 OpenJaneもタスクバーとウィンドウタイトルの文字列が違うが
Spy++で見てみるとメインウィンドウに、サイズ0の見えない親があって
そのウィンドウがタスクバーに表示されていた。
GetMessageってなんで戻り値がBOOLなのに-1が帰ってくるんですか?
おまんこに勃起したペニスを突っ込む
BOOLにした奴が馬鹿だった。
498 :
名無し@沢村 :03/12/11 22:52
自分のアプリ起動中に他のアプリがRegisterHotKeyなんかで 設定してるホットキーを無効にする事ってできますか?
>>498 booleanを返すということは
if(GetMessage(...)){}やif(!GetMessage(...)){}を期待しているってことじゃないの?
その書き方が間違ってるってのはどうよ。
Register<->Unregister
BOOL≠boolean
BOOL==FOOL
GetPixelとSetPixelについて教えていただきたいことがあります。 ファイルからメモリ上にビットマップを読み込み、別に用意したメモリ上で減色したビットマップを生成したいのですが、 (GetPixelでピクセルを読み込み、RGB分解して減色させて、SetPixelで書き込むと)かなり時間がかかります。 なにか他にいい方法はありませんでしょうか。
GetDIBits/SetDIBits
ビットマップファイルは無圧縮だとただの配列なので、ポインタで直接読み取れ。 ビットマップの構造調べればすぐわかるど。
フラットツールバーについて質問です。 ツールバーを作るときにTBSTYLE_FLATをつけるのが間違いだと 解説されているところばかりなのですが、 作成後にスタイルを変更する方法だと、ツールバーの高さが変わってきます。 たとえば猫では >しかし、CreateToolbarExとかCreateWindowExでいきなりこれらのスタイルを加えても思い通りになりません。 >いったん従来どおりのスタイルでツールバーを作ってから SetWindowLongでスタイルの指定をします。 とあるので、もしかすると不定なのかなって思ったりもしてるのですが。 で、どうしようかということで少し実験してみたのですが、 フラット状態で作成されると背景が親ウインドウの背景ブラシで塗られるという解釈でいいのでしょうか? このように書かれた解説も見当たりませんでした。 透明状態で作成されるという記事はいくつもありましたけど・・・ 自分の環境ではWin2kしか試せないので、確信が持てません。 ちなみに、WTLとかのソースを見る限り言いのかなという気はしているのですが。
>>494 有り難うございました。
とは言ってもどうすればいいのか良く分からないなぁ。
このヒントでもう少し調べてみます。
>505-506 どうもありがとうございます。 早速いろいろ試してみます。
>>501 ありがとうございます。
Unregister()の存在は知っているのですが…
他のアプリなんでUnregisterなんてのはご法度ですよね。
第2パラメータの関係で元に戻す事もできないですし。
ようは自分以外はキーを無効にしたいのです。
フックしているのですが、ホットキーは有効になってしまってて…。
フックの仕方がまずいのだろうか???
仕変っていうか制限にしてもらおうかなぁ…
>>510 と、見落としていたスマン。
上書きができないとすると、APIをフックするか先行して登録するしかないんじゃないかな?
>>508 タスクバーに表示されるのはトップレベルのウィンドウで
所有されているウィンドウ、ツールウィンドウ(WS_EX_TOOLWINDOW)、非表示ウィンドウは
タスクバーに表示されない。
あるマウス操作を自動化したくてちょっと作り始めました。 ただ、操作を記録とか難しいことはやろうとはしていません。 で、とりあえず書いてみたソースが下のとおりです。 SetCursorPos(1024/2, 768/2); HWND hWnd; Sleep(2000); hWnd = ::GetCapture(); ::SendMessage(hWnd, WM_LBUTTONDOWN, 0, 0); 全然、全然クリックしてくれません。 どこがおかしいのでしょうか?
>513 WM_LBUTTONUPも入れたら?
>>513 GetCapture()がNULLになってると予想
すみません。mouse_eventというAPIがありました。
517 :
デフォルトの名無しさん :03/12/13 12:10
WaitForSingleObjectでシグナルを待つ場合、 この関数でブロック・ポーリングせずにシグナルが発生したら 登録しておいたコールバック関数を呼び出すようなAPIはないですか? ポーリングしたりサブスレッドで監視して通知というのは避けたいのです。
> コールバック関数を呼び出す 一部のAPIはコールバック関数を登録できるけど、汎用のものは無いね。 コールバック関数って、そのコンテキストでの制約を考えるのが 嫌だから俺はあんまり使ってないなあ。 処理するスレッドが明示されているほうが楽だと思うが、いかが。
>>519 面倒だからじゃない ?
俺には、そんなに面倒とは思えないけど。
>>518-521 スレッドを使わないのはスレッド作れない特殊な環境だからです。
# WZ Editorのマクロ言語TX-Cというコンパイラ
>517の件は無理そうということなのでタイマで監視するかDLL化する方法を探ってみます。
ありがとうございます。
>>522 API も関数ポインタ (コールバック関数の登録に必要だよね) も使えるのに、CreateThread() が使えないの ?
どんな環境なんだろう...。
>>522 スレッドが作れなくなる、何か強い理由があるなら(漏れはその環境を持っていない)
いま現にWaitForSingleObjectを使ってること自体にも深い問題がありそうだな
オフスペックとか
メインウィンドウのメニューからダイアログボックスを呼びたいのですが、 一応表示はされるものの、表示した瞬間にすべての入力を受け付けなくなります。 ぐぐっては見たんですが結局原因はつかめず。 なぜでしょうか?
>525 何に対して入力が受け付けなくなるの? まさか「メインウィンドウ」とか言わないよね?
>>526 入力を受け付けなくなるのはダイアログボックス・メインウィンドウ双方です。
こうなるとIDEからデバックの中止をしなければプログラムを終了できない状況です
で、そのときの画面は、タイトルバーの表示を見る限りでは、背面に表示している はずのメインウィンドウがアクティブウィンドウの状態で、ダイアログボックスは 非アクティブウィンドウにの状態になっています
自己解決しました。 リソースエディタでメニューからリソースの挿入で、挿入するリソースを 選ぶときにどういうわけかIDD_PROPPAGE_SMALLを選んでいたのが 処理が帰ってこなくなっていた原因だったようです。 直接的には、リソーススクリプトの内容が原因だったことになるので、 いくらソースを眺めてもおかしなところは発見できないでいました。 IDD_FORMVIEWを選んだら何事も無かったかのように解決しました。 お騒がせしました。
CHOOSEFONTを使って作った、フォントを変更するコモンダイアログボックスなんですが、 サンプルの部分と実際に変更した文字が、横に並んで出るんですけど一つづつの文字が、縦で出てしまうんですけど。 そうゆう設定ってどこで行っているんでしょうか? 構造体の宣言はこんな感じで行いました。 ZeroMemory(&cf,sizeof(CHOOSEFONT)); cf.lStructSize =sizeof(CHOOSEFONT); cf.hwndOwner =hWnd; cf.lpLogFont =&lf; cf.Flags =CF_SCREENFONTS | CF_EFFECTS; cf.hInstance =GetModuleHandle(NULL); if(ChooseFont(&cf)){ if(hFont != NULL){ DeleteObject(hFont); hFont=NULL; } hFont=CreateFontIndirect(&lf); rgbColor =cf.rgbColors;
頭に@が付いてるのは縦書き用フォントだ。
>>531 そうゆうことだったんですね。解決しました。サンクス
533 :
デフォルトの名無しさん :03/12/14 04:50
マルチディスプレイ環境でwmp6.4などのように2つ目のディスプレイに最大化をさせたいのですが方法が分かりません 取り合えず2つ目の画面の位置を調べたいのですが、GetDesktopWindow⇒GetWindowRectでは 2つ目の画面で実行しても、1つ目のディスプレイの値が返ってきてしまいました どなたか、2つ目の画面の位置を調べる方法、もしくは最大化させる方法など知っている方がいましたら 教えていただけないでしょうか?
すみません、wmp6.4の最大化というのは最大化ボタンを押した時の最大化ではなく Alt+Enterを押した時のフルスクリーンのことです どうかよろしくお願いします
535 :
デフォルトの名無しさん :03/12/14 15:21
MSペイントのブラシ機能を実装するにはどうしたらいいですか? フリーラインを引くときカスタムパターンを使いたいってことです。 LineDDAを使うほかないかな? MSPAINT.exeのなかを見てもLineDDAは使ってないし・・・・ 8x8パターンのブラシを作成しても、それで線を引くAPIがわかりません・・・ 良い方法があったら教えてください、よろしくお願いします
SelectObjectでブラシを選択するんじゃないの?
>>537 それも試してみたんですけど、線を描くとぎざぎざするんですよね。
使い方が悪いのかもしれませんが・・・
明日納期なのでとりあえずLineDDAを使って無理やり描画させておきます
あとはBeginPathくらいか
540 :
デフォルトの名無しさん :03/12/14 21:34
WINAPI で分割ウインドウを作るのに使えるファンクション というと、どんなのがありますか? MFCのCSplitterWndに相当するものはあるんでしょうか?
>>540 専用のAPI なんてない。
スプリッターウインドウコントロールなんて便利なものもない。
作り方が分からなければ MFC の CSplitterWnd
のソースコードを参考にしたらよかろう。
教えていただきたいことがあります。 やりたいこと: ファイルからメモリ上”A”にビットマップ読み込み → 別のメモリ上”B”に"StretchBlt"で画像を縮小 → メモリ上”B”のアドレスからRGB要素読み込み → 減色してメモリ上”B”に書き込み 問題点: これだと書き込みエラーが発生します。 質問: 試しにメモリ上の”A”を読み書きしてみましたが、問題なく読み書きできます。 "StretchBlt"で画像を縮小した場合、なにか前置きで 書き込み可能にするようなものが必要なのでしょうか。 検討いただくに当たり、何か情報が足りないようであれば何なりと言ってください。どうかよろしくお願い致します。
>>541 そうっすか。ありがとうございます。
MFCのCSplitterWndはクセが強いので
APIでなんとかならんかと思ったのですが。
>542 その「メモリ」は、DirectDrawSurfaceとか、DIBSectionの中身の 事を指しているのか?それとももしやLocalAllocで貰ったものを 指しているわけでは無かろうな。
>545 すみません、正直なところ意味がよく分かりません。 ビットマップの読み込みはこんな感じです。↓ // ファイルからの読み込み HINSTANCE hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE); hdc = GetDC (hwnd); BmemDC = CreateCompatibleDC (hdc); hBmem = (HBITMAP) LoadImage (hInstance, fname, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE); SelectObject (BmemDC, hBmem); ・ ・ ・ //読み込んだ画像を画面サイズに合わせて縮小し、メモリ上に保存 hdcMmem= BeginPaint (hwnd, &ps) ; MmemDC = CreateCompatibleDC (NULL) ; hMmem = CreateCompatibleBitmap (hdcMmem, MovePicW, MovePicH); //メモリに画像サイズを確保 SelectObject (MmemDC, hMmem); SetStretchBltMode (MmemDC, COLORONCOLOR); //拡大縮小モード StretchBlt (MmemDC, 0, 0, MovePicW, MovePicH, BmemDC, 0, 0, BasePicW, BasePicH, SRCCOPY) ; //拡大縮小画像をメモリに保存 EndPaint (hwnd, &ps);
メモリーDCに張りつけたビットマップと DIBのピクセルデータを混同してないか?
BeginPaintいらん
>547 >548 ワタシも BiginPaintはいらないと思うんですが コンパイルすると ”値が割り当てられていないローカルな変数 'hdcMmem' に対して参照が行われました” という警告が出てしまいます。 DIBピクセルデータとは、はじめにファイルから読み込んだデータとは形式(ビットマップ構造)が異なってしまうんでしょうか。
上でGetDCしてるの使え。 CreateCompatibleBitmapでできるのはDDB DIBがほしかったらCreateDIBSectionしる。
>550 GetDC ですね。 確かにうまくいきました。
>550 CreateDIBSection で変換しなくてはいけないんですね。 引数が いくつか理解できませんが がんばってやってみます。 みなさんどうもありがとうございました。ヒントを頂けたおかげで、 またガンバル気になれました。正直、かなり苦労していますが 1歩進む毎に、感動している状態・・・。 今後も 質問させて頂くこともあると思いますが、根気よくおつき あい頂けたらと、心からお願い申し上げます。 なにせ、日曜日の数時間しかプログラム書けないもので。。。 年をとると 頭が固くなっていけませんね。。。ははは・・・
>>533 MonitorFromWindow してモニタを調べて、GetMonitorInfo 。
>542 で質問させて頂いた者です。 前回の質問とは別に、新たな質問です。 以下のようにピクセルデータを読み込んで処理しています。ところが、100枚くらいある ビットマップの内、数枚に問題が出てきます。 その問題とは、ビットマップの最後数ピクセル分のデータが読み込まれていないような のです。いろいろ for文の dwSize を意図的に +20 とかにすると最後まで読み込まれ るようです。以下のようなヘッダの読み込み方法ではいけないのでしょうか。 LPBYTE lpBitmapHead = ( LPBYTE ) bmData.bmBits;//ビットマップ情報 DWORD dwSize = bmData . bmWidth * bmData . bmHeight;//絵のサイズ ・ ・ ・ for ( i = 0; i < dwSize; i ++) { LPBYTE lpR = lpBitmapHead + i * 3 + 2; LPBYTE lpG = lpBitmapHead + i * 3 + 1; LPBYTE lpB = lpBitmapHead + i * 3; <処理> }
>>554 dwSize = ((bmData.bmWidth+3) & ~3) * bmData.bmHeight;
>>554 >>555 でサイズは求まるが
>for ( i = 0; i < dwSize; i ++) {
>LPBYTE lpR = lpBitmapHead + i * 3 + 2;
>LPBYTE lpG = lpBitmapHead + i * 3 + 1;
>LPBYTE lpB = lpBitmapHead + i * 3;
> <処理>
>}
この読み方じゃダメだろ。
ラインの最後にある(かもしれない)パディングを考慮してない。
>555 さっそくのコメントどうもありがとうございます。 DWORD dwSize = ((bmData.bmWidth+3) & ~3) * bmData.bmHeight; をやってみたところ、ビットマップサイズより大きな値が出ているようで、エラーが出ます。
>556 そうですか。ピクセルの読み方がおかしいですか。どのような方法が望ましいのでしょうか。 >555 すみません。改めて、ありがとうございます。
DIBの場合、横のラインが32ビットの倍数じゃなきゃあかんので、単純にwidth * hightじゃ足らないのが出てくる。
>556 >559 ワタシのやり方だと、パディングのデータを読み込んでいる分、ビットマップの最後のピクセルまで 読み込めなくなってしまうのですね。 それで、 >555 の DWORD dwSize = ((bmData.bmWidth+3) & ~3) * bmData.bmHeight; になるわけですね。 パディングの分を考慮して もう一度トライしてみます。 どうもありがとうございます。
>>561 ん?
4ピクセル境界じゃなくて4バイト境界だよ
全体のサイズより、パディングを含めた 横のサイズと高さを使った方が簡単
うおー。 もうわけわかめ。 自分のためにも書かせて頂きたいのですが、ビットマップは大きく分けるとヘッダー部分とピクセル部分で構成されていますよよね。 ピクセル部分には横1ラインの最後に調整用にパディングを含むことがある。パディングがbmWidthで取得する際は含まれない。 だから bmWidth * bmHeight では表示のサイズだが、データをいじる時はパディングを含めた ((bmWidth+3) & ~3) * bmHeight でサイズを取得する必要がある。 ということですのね? 試してみたのですが、((bmWidth+3) & ~3) * bmHeightでやると、ビットマップの最後の方の数ピクセル分 ビットマップデータからはみ出してしまうようです。理解の足りていないところがあるのでしょうか。どうかよろしくお願い致します。
>>564 ((bmWidth+3) & ~3) * bmHeight
は間違ってる。
1ピクセルのバイト数をbppとすると
((width * bpp + 3) & ~3) * height
1ラインのバイト数 pitch = ((width * bpp + 3) & ~3) なので
座標(x, y)のピクセル位置は
pitch*y + bpp*x
ちょっと補足 pitch*y + bpp*x はトップダウンDIBの場合。 普通はボトムアップDIBなので pitch*(height - y) + bpp*x
ボトムアップDIBはheightがライン数だとして pitch*(height - 1 - y) + bpp*x かなーと思いますです…
みなさんありがとうございます。 もしかして、 BITMAP構造体の ”bmWidthBytes”で1ラインのバイト数は取得できますか? それと、1ピクセルのバイト数を取得するのにはどのような方法がありますか。 いろんなHPを参考にしようと、検索してみるのですが、ただただ混乱するばかりです。
>>570 マクロ使う手もある。
#define WIDTHBYTES(bits) (((bits) + 31)/32*4)
WIDTHBYTES(横ピクセル*bpp) とか・・
>>570 ああ違った、1ピクセルのバイト数か・・検索したか?
自ノードから送信されるIPパケットの内容を知る方法はありませんか? (winsockにDLLをかましたり、pCapのようなドライバを作らないで)
>>575 Windows 2K/Xp系限定なら、SOCK_RAW 使えば、流れているパケットを全部Sniffできるので、
送信元アドレスが自分かどうか見ていれば、送出パケットを全部拾えます。
ついでに言うと、Switchingじゃない馬鹿ハブ使っていれば、
他PC同士の通信も全部見れます。
レスどうもです。
SOCK_RAWとSIO_RCVALLで拾えるのは、多分受信パケットのみですね。
何か違う方法があるのでしょうか?
>>578
580 :
デフォルトの名無しさん :03/12/18 01:48
ホシュ
Richeditコントロールでキーワードを色で文字修飾する エディタを作ろうと思ったんですけど VisualStudioみたいに入力後にリアルタイムで修飾をかけるには どうしたらいいんでしょうか? 最初変更部分だけEM_STREAMINしてやればいいかな?と おもってコーディングを進めていたんですが変更部分以外も全部書き変わって モウダメポ(つдT) 多分やったことある人は結構多いと思うのでご教授願いますm(_ _)m
ちなみにファイルから読み込んだデータとかはちゃんと修飾して 表示するとこまではできてます
そういうのはカスタムコントロール作ってやったほうがいいよ。 RichEditはあまりに貧弱すぎ。
SFF_SELECTION
現在選択されている部分(カーソル位置)をデータのストリームに置きかえます。
↑で一応部分変更出来るようです
あと入力された文字を検出したいんですけどWM_CHARじゃ漢字取れませんでした
今WM_IME_ENDCOMPOSITIONで入力終了だけ検出できるんですが入力された
文字を引き取るにはどうしたらいいでしょうか?
>>583 カスタムコントロールってよくわからないので調べてみます
LoadBitmap(hInstance, "リソース名"); で、リソースの読みこみに失敗するんですがなぜでしょうか
サブクラス化してあったのでWM_CHAR、WM_IME_ENDCOMPOSITIONを検出後 にCallWindowProcしてエディットコントロールに表示させた後にEN_GETLINEで取ること ができました あとは修飾ルーチンに文字データを送ってあげればうまくいきそうです
>>586 MAKEINTRESOURCEマクロは使ってみました?
>>589 別のリソースで試してみても駄目ですか?
bitmapリソースってあんまり好きじゃなので自分の場合は
他の方法で外部のbitmapファイルを呼ぶようにしてます
>565-574 返事が遅くなりましたが、おかげさまでできました。本当にありがとうございました。1ピクセル当たりのバイト数は8色、16色、256色、16ビット、24ビット でそれぞれ決まってるんですね。 ほんと、めちゃくちゃ嬉しいです。ありがとうございました。
592 :
デフォルトの名無しさん :03/12/18 17:55
ここの住人は親切ですね
593 :
CreateScalableFontResource :03/12/18 17:56
NT4/2000/XP にて、CreateScalableFontResource() の第三引数へ漢字を含むパス名を与えると、 次の AddFontResource() で失敗する(エラー2)のはなぜでしょうか? パス名がASCIIのみなら問題なく動作します。 Win98では漢字でもASCIIでも問題なく動作します。 tmp = "c:/user/temp/xxx.fot"; ttf = "c:/dir/xxx.ttf"; // OK //ttf = "c:/漢字/xxx.ttf"; NG if (CreateScalableFontResource(1/*read only*/, tmp, ttf, NULL) == 0) return GetLastError(); if (AddFontResource(tmp) == 0) return GetLastError();
>591で書き込んだのですがどうも内容が変でごめんなさい。 ビット数が分かるからバイト数も分かるんですよね。それが言いたかったんです(自分が読んでもそうは読めませんけど・・・)。 以上 お世話になりました。 m(_ _)mアリガト
>>579 > SOCK_RAWとSIO_RCVALLで拾えるのは、多分受信パケットのみですね。
うんにゃ。指定したネットワークポートの出入りパケット全部でし。
パケットSniffのスレッド自体は50〜60行位で書けるので、試してみそ。
>>593 引数がマルチバイト型文字列扱いされていると格納方法が違うのでは?
デバッガのメモリダンプ見てみればわかるかもしれませんよ
>>596 > 引数がマルチバイト型文字列扱いされていると格納方法が違うのでは?
サンプルプログラムを作り、引数をprintfで確認してみました。格納方法は問題なさそうなのですが。どこが悪いのでしょう。
実行結果:
C>apitest \漢字\XXX.TTF \ABC\XXX.TTF
*** test 1 ***
CreateScalableFontResource(1, "C:\DOCUME~1\user\LOCALS~1\Temp\api56.tmp", "C:\漢字\XXX.TTF", NULL) = 1 (LastError=0)
AddFontResource("C:\DOCUME~1\user\LOCALS~1\Temp\api56.tmp") = 0 (LastError=2)
*** test 2 ***
CreateScalableFontResource(1, "C:\DOCUME~1\user\LOCALS~1\Temp\api56.tmp", "C:\ABC\XXX.TTF", NULL) = 1 (LastError=0)
AddFontResource("C:\DOCUME~1\user\LOCALS~1\Temp\api56.tmp") = 2 (LastError=0)
RemoveFontResource("C:\DOCUME~1\user\LOCALS~1\Temp\api56.tmp") = 1 (LastError=0)
サンプルプログラムのソース: ///@file apitest.cpp /// build: cl /W3 /MD apitest.cpp gdi32.lib #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <locale.h> void addfont(char* ttf, char* tmp) { int ret; DeleteFile(tmp); SetLastError(0); ret = CreateScalableFontResource(1/*read only*/, tmp, ttf, NULL); printf("CreateScalableFontResource(1, \"%s\", \"%s\", NULL) = %d (LastError=%d)\n", tmp, ttf, ret, GetLastError()); if (ret == 0) return; ret = AddFontResource(tmp); printf("AddFontResource(\"%s\") = %d (LastError=%d)\n", tmp, ret, GetLastError()); if (ret == 0) return; ret = RemoveFontResource(tmp); printf("RemoveFontResource(\"%s\") = %d (LastError=%d)\n", tmp, ret, GetLastError()); DeleteFile(tmp); }
サンプルプログラムのソースの続き: int main(int argc, char** argv) { setlocale(LC_ALL, ""); char tmpdir[_MAX_PATH]; char tmp[_MAX_PATH]; GetTempPathA(sizeof(tmpdir), tmpdir); GetTempFileNameA(tmpdir, "api", 0, tmp); for (int i = 1; i < argc; ++i) { char ttf[_MAX_PATH]; _fullpath(ttf, argv[i], sizeof(ttf)); printf("\n*** test %d ***\n", i); addfont(ttf, tmp); } return 0; }
追加調査で、AddFontResourceEx() を試してみたら、こちらは漢字を含むパス名も OK でした。 ただしこのAPIは 2000/XP 以降のみなので、NT4/9X に対応できず、採用することができません。
9xではAddFontResource使えばいいんじゃ? ってまだNT4があるか
Win9XかNTか判別して、NTならResourceExで、 9XならResource()ですませばよろしくて?
NT4ではAddFontResourceWを使ってみるとか
>>601-603 OSに応じてAPIを呼び分けるならば、NT4 のみがネックになります。
原因はほぼわかってきまして、CreateScalableFontResource() が作成する
フォントリソースファイル(サンプルプログラムでは "%TMP%\api*.tmp")
をダンプしてみたところ、そこに TTF ファイルのフルパスがMBCSで埋め込
まれるのですが、その埋め込まれたパス名の末尾が漢字の個数分だけ欠けて
いました。
"C:\漢字\XXX.TTF" に対して
"C:\漢字\XXX.T" となります。NT系カーネルのbugっぽいです。
MSDN,KBには該当する記載がないので、必要な前処理をなにか忘れているのか、
それともNT4の太古から眠るbugを見つけたのか。。うーむ。
CreateScalableFontResourceの段階でおかしくなってるのに なんでAddFontResourceExだとうまくいくの?
>>605 >CreateScalableFontResourceの段階でおかしくなってるのに
>なんでAddFontResourceExだとうまくいくの?
CreateScalableFontResource()を使っていないからです。
AddFontResourceEx()を使う場合は、プライベート指定引数があるので
TTFファイルを直接にプライベート登録できます。
AddFontResource()を使う場合は、プライベート指定が出来ないので、
事前にCreateScalableFontResource()を使い、TTFファイルに対応した
プライベート属性フォントリソースファイルを作り、それを登録する
必要があるのです。
>>595 他ノード間のパケットと自分のところにきたパケットは
読むことはできるけど、自分のところから送信するものについては
読めないみたい
OpenThemeData() に指定するクラス名って、 CreateWindow() するときのクラス名とは別のようなんですが、 使えるクラス名の一覧や説明ってどこかにないでしょうか?
起動中のEXEのフルパスを取得するのってどうやるの?
自プロセスならGetModuleFileName(NULL)
611 :
デフォルトの名無しさん :03/12/20 01:36
ううう、困った。 CreateWindowで作ったコントロール(リストビュー)のフォントのサイズを 変更(大きさだけ変えたい)するにはどうすれば良いのでしょうか?
CreateProcessしたプロセスを親プロセスから終了させるにはどうすればいいのでしょう?
>>611 WM_GETFONT → GetObject → LOGFONTを適当に書き換えて
CreateFontIndirect → WM_SETFONT
>>612 PostThreadMessageを調べよう。
ディスクトップで マウスのボタン右クリックして「最新の情報に更新」って項目を選んだときは どういうAPIを実行してるんですか? やっぱりPostMessageでWM_PAINTを送ってるんですか? hDC=GetDC(0) このhDCに書いた落書きを更新で消したいんですけど。
>>616 落書きしてしまったウィンドウ全てにInvalidateRect。
面倒なら画面全部覆うウィンドウを一瞬表示するだけでもいい。
こうすれば更新リージョンが追加されWM_PAINTが発行される。
細かい突っ込みだが
×ディスクトップ
○デスクトップ(desktop)
>面倒なら画面全部覆うウィンドウを一瞬表示するだけでもいい。 だったらInvalidateRect(NULLだろ
>>618 デスクトップ上にある全てのウィンドウを再描画ってことじゃね?
SS_BITMAPを指定したスタティックコントロールに透過色を指定したいのですが、 いろいろ調べたにもかかわらずその方法が見つかりません。 もしかして不可能なんでしょうか?
>>617 ,618,619,620
さんありがとう!
InvalidateRect(0,&Rect,true);
で落書きを消すことができました
ショートカットファイルや共有ファイルのアイコンで ショートカットファイルのアイコンの矢印部分のような 通常のアイコンの上に描画されるアイコンがありますが、 このアイコンのシステムイメージリスト内のインデックスを取得する方法ありますでしょうか。
624 :
デフォルトの名無しさん :03/12/21 09:38
Winプログラミングと、C++のコンビネーションについて 考えてみたんですが、たとえばボタンやエディットなんかの コントロールをクラス化して、メインのウインドウで使おうと する場合に、メインウインドウのウインドウプロシージャの case WM_CREATE: の部分で子ウインドウのオブジェクトを 生成するのがgood かと思うんですが、しかし、case の 中では static CButton hoge; というのはできないんですよね? そうすると、子ウインドウはウインドウプロシージャの 冒頭で実体化するほかないということなんでしょうか? そのあたり、C++使って書いている人はどうやってますか? コンストラクタで子ウインドウの生成ってのは難しいですか?
>>624 なんでstaticてな制限だらけでゲロ使いにくいマゾ仕様にするんだ?
しかも関数内staticなんて、俺に言わせればケリ入るほど最悪だ。
もしそんなのが出てくるようならoperator()()使ってでも避けたいね。
ちなみに俺はコントロールなら非staticメンバにしてるし、
ClassWizardが自動生成するコードも非staticメンバだ。
あとよー、コンストラクタっておまいGWL_USERDATAを知らんのか?
DLLを使わずに、KeyHookをすることは可能ですか?
タスクトレイのアイコンにカーソルを合わせるとツールチップで文字列が表示されるんですが、 その文字列を外部のプログラムから取得するにはどうしたらいいのでしょうか? ステータスをツールチップで表示するようなプログラムがあるので、 そういう文字列を取得したいのですが
>>626 フックの有効範囲が自分のアプリ内なら DLL を作る必要なし。
他のアプリのフックなら DLL を作る必要あり。
MFCやらATLやらを使わずに、ActiveXコントロールを使用する方法を 解説しているサイトはないでしょうか?
>>630 Delphi関連のサイトにあるんじゃないか?
>>631 Delphi って元々 ActiveX サポートしてませんでしたっけ?
できれば VC++ での解説だとありがたいのですが…
使ってみたい ActiveX コントロールがあるのですが、
MFCもATLもわからないんです。
ATLとかMFCのソース追っかければええんでないの?
InputBox(っていってわかるでしょうか)を一発で表示してくれるAPIってのは ないんですよねぇ?
> InputBox はぁ? なにそれ? ここはWin32API質問箱なんすけど、合ってます?
最近、明らかにAPIに関係がない質問が多いようです。
>>633 ダイアログボックスに ActiveX コントロールを貼り付けて、
そのダイアログボックスを DialogBox() で表示させようとするだけで、
-1 が帰ってきてしまいます。何らかの仕組みがあると思うのですが、
MFC や ATL のソースを追いかけてもやたらと冗長そうな処理ばかりで
どれが重要なのか検討がつきません。
全部教えれ!とは言わないので、そのあたりのヒントになるような
サイトってないでしょうか…?
>>637 ここ読んでるってことはWin32 APIについてなら
細かいことはともかく基本的な枠組みはわかるよな
だからMFCなら基本的には追えば何とかなるはずだ
だがActiveXだのATLだのはCOMベースでWin32 APIとは
また別な考え方の上に成り立っているものだ
なめてかかると意外に手ごわいから気をつけて
AfxMessageBoxなどで、デフォルト ヘルプ コンテキストをコンテキストとして選択した場合、 ダイアログボックスのキャプションはどうやれば変更できるのでしょうか?
はは〜ん、さてはMFCの質問をWin32APIスレでしようとしてる奴がいるな?
AtlAxWinInit()、AtlAxDialogBox() を使ってどうにか ダイアログ自体は表示できるようになりました。 でもActiveXをコントロールする方法がわかりません… やっぱりMFCを使うしかないんでしょうか…
ActiveXコントロールコンテナを自作するのは無謀だと思う 大人しくMFCなりATLなりの助けを借りたほうがいいぞ
今ここを読んでいて、MFCスレかVCスレと勘違いしました
>>642 ありがとうございます、わかりました。
どうもお騒がせしました。
タッチタイピングソフト作ってるんですが、Win32API使って キーを押しつづけても一回しか入力できないように(キーリピートを防止)したいんですが どうしたらいいでしょう(´・ω・`)
キー入力はどうやって受け付けてるの?
>>645 該当キーのWM_KEYUPがくるまでWM_KEYDOWNを捨てればok
最小化すると、通常はタスクバーの方に収納されますが これをMSNメッセンジャーみたいにタスクトレイに向けてアニメーションさせることは出来ないでしょうか? SPY++で追っかけても分かりませんでした・・・
>>645 WM_KEYDOWNのlParam見て、30ビット目が立ってたら捨てる。
>>648 TrayNotifyWndを探して
中のToolbarWindow32をフック
その後アイコンを探してその座標に向かってアニメーションを描画させればいいのかな
フルスクリーンからWindowsボタンを押下した時に、タスクバーに収まらず 普通のウィンドウになってしまうのを、回避するのにはどうすれば良いのでしょうか? フルスクリーンかタスクバーに最小化されているか、どちらかという状態に したいのですが....CreateWindowの引数が間違っているのが原因なのでしょうか?
自分で最小化するしかない
>>652 なるほど、自分やるしかないのですね・・ ( ´・ω・)
やってみます。
CreateMDIWindowで作った子ウィンドウのプロージャにstatic宣言の変数をつけると(C言語) 1つの子ウィンドウを閉じただけで影響が他の子ウィンドウに出るんですが、そういうもんですか? というか、子ウィンドウそれぞれのための変数ってどうすればいいんでしょう?グローバル変数・・・・。
>>654 WNDCLASSEXのcbWndExtra
SetProp, GetProc
std::map<HWND, MYDATA>
など
×GetProc ○GetProp
質問です. int CDllKeyhook::SetHook() { hHookKey = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)(CDllKeyhook::KeyHookProc), hInst, 0); ... } CDllKeyhookクラスのメンバ関数としてSetHook,KeyHookProcを定義しています. 上記のようなコードを書くと 「overloaded-functionからHHOOKへ変換できません」 とエラーが出ます. KeyHookProcをクラスの外に出さずに,メンバ関数のままでこの処理を行うには どうすればよいですか?
>>655 ,656
後は本やMSDNを見たりして調べます。ありがとうございました。
>>657 「= :: 」 は単に「=」で良いと思うんだけど・・・どうでしょう?
関数がオーバーロードされているんでは? HHOOK って何だろう?
>>658 すんません.HHOOKではなくHOOKPROCです.
SetWindowsHookExで,KeyHookProcへのポインタを渡したいだけなんだけど,
これがコンパイラに「関数の定義」と誤解されてオーバーロードって言われてる
みたい
メンバ関数はそのままじゃコールバックに使えないので staticにするのが常道。問題はthisをどうやって渡すかだな・・・
>>657 CDllKeyhook::KeyHookProcはstaticじゃないとダメだけど大丈夫?
(非staticなメンバ関数は隠し引数としてthisを受け取る)
本人じゃないけど
>>660 ,661staticでやってみたところ上手くいきました。
知識不足ですんません. クラス内で関数をstatic宣言しろってことすか?意味あるんすか? コードを載せてもらえるとありがたい.
∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ 〜′ ̄ ̄( ゚Д゚)< なんだこの厨房どもの会話は UU ̄ ̄ U U \______ thisつきで呼び出したいなら以下で?保障しないけど? class CDllKeyhook { unsigned char KeyHookProc[18]; //↓この関数がフック関数の実体(第一引数がthis) static LRESULT CALBACK RealKeyHookProc(CDllKeyhook*, int, WPARAM, LPARAM); CDllKeyhook() { static const unsigned char code[18] = { 0xFF, 0x34, 0x24, // push [ESP] 0xC7, 0x44, 0x24, 0x04, // mov [ESP+4], 0, 0, 0, 0, // <this> 0xB8, // mov EAX, 0, 0, 0, 0, // <RealKeyHookProc> 0xFF, 0xE0 // jmp EAX }; memcpy(hook_proc, code, 18); *(long*)(hook_proc+7) = (long)this; *(long*)(hook_proc+12) = (long)RealKeyHookProc } ... }; CDllKeyhookのメンバからなら hHookKey = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)(this->KeyHookProc), hInst, 0); として登録する
hook_procをKeyHookProcに置換
上のコード見て,昔MASMでOSのkernel勉強してた頃の push bp mov bp, sp を思い出した. ありがとうございます.やってみます.
>>666 おっアセソブラわかるのか。じつはvcの生成したの見てまねして作っただけだから
最後のjmpでレジスタ使わずにやる方法を知ってたら教えて。
コードの良し悪しは,他人にわかりやすい記述になっているかで決まるいいますが,
アセンブラ使って関数呼び出しとは,これまたトリッキーで自分以外読めねぇ..
まぁわかる人はわかると思うけど,これって常套手段なんですか?
ちなみにアセンブラ使わずに
661が言うようふつーにstatic付けるだけで,動いてくれました.
class DLLKEYHOOK_API CDllKeyhook {
static LRESULT CALLBACK CDllKeyhook::KeyHookProc(int nCode, WPARAM wp, LPARAM lp);
CDllKeyhook::SetHook();
}
int CDllKeyhook::SetHook()
{
hHookKey = ::SetWindowsHookEx(WH_KEYBOARD, KeyHookProc, hInst, 0);
}
>>664 こんなC++初心者に,丁寧にありがとうございました.
すんません.動いてませんわw 664の方法をとらせてもらいます. ありがとうございました
FlushInstructionCacheしといた方がいいかもね
ちょっとテクニカルだけど、俺ならこうする。 動作確認してないけど。 class DLLKEYHOOK_API CDllKeyhook { public: DLLKEYHOOK_API CDllKeyhook() { hook_class = this; } virtual LRESULT KeyHookProc(int nCode, WPARAM wp, LPARAM lp); int SetHook() { hHookKey = ::SetWindowsHookEx(WH_KEYBOARD, PreKeyHookProc, hInst, 0); } protected: static LRESULT CALLBACK PreKeyHookProc(int nCode, WPARAM wp, LPARAM lp) { return hook_class->KeyHookProc(nCode, wp, lp); } static DLLKEYHOOK_API CDllKeyhook *hook_class; }
>>668 普通どうするかはしらないけど、不特定多数のフックをかけるのじゃなければ
671のが明らかにいいよね(不特定多数のフックなんてやったことないけど)。
余談かもしれないけど
>>664 のはフックを想定したものじゃなくて、ウィンドウ用のクラスを作ったときに
ウィンドウプロシージャでオブジェクトを使うのにGetPropとかGetWindowLongPtr
とか使いたくなかったので、Delphiではこのためにオブジェクトごとにコード片を
動的に作ってやっている、というのを読んでまねした。MFCはどうやっているんだろう。
>>670 FlushInstructionCache(GetCurrentProcess(), KeyHookProc, 18);
でいいの?
MFC だと HWND から CWnd* を取得できる関数があるよ。
マウスボタンが押されたポイントのスレッショルド範囲とエスケープキーが 押されていないかを考慮して、ドラッグが開始されたかどうかを判定してく れるAPIがあった様な気がするのですが、何て名前でしたっけ?
DragDetect?
そんな便利な関数があったのか
>>667 レジスタ壊したくなけりゃ、pushしてからretすりゃいいじゃんよ。
アセンブラ使いならそんなの常套手段だと思うが...。
>>677 どうせ戻りがEAXにはいるんだからレジスタの内容が変わること自体は
関係ない
>>678 そうじゃなくて、fastcallやレジスタ渡し最適化の心配をしてるのかと思ったが..。
あのコードでは最適化の心配など無いとおもうが。
確かに、よく見るとそこまで最適化される可能性は少ないね。スマソ まぁ、そんなことどーでもいいけどさ、 > 最後のjmpでレジスタ使わずにやる方法を知ってたら教えて。 なんて書いてあったんで、「なんだこいつ、そんなことも知らねーの?」と思っただけ。
普通に相対アドレス計算すればよかろ class CDllKeyhook { unsigned char KeyHookProc[18]; //↓この関数がフック関数の実体(第一引数がthis) static LRESULT CALBACK RealKeyHookProc(CDllKeyhook*, int, WPARAM, LPARAM); CDllKeyhook() { static const unsigned char code[16] = { 0xFF, 0x34, 0x24, // push [ESP] 0xC7, 0x44, 0x24, 0x04, // mov [ESP+4], 0, 0, 0, 0, // <this> 0xE9, // jmp rel32, 0, 0, 0, 0, // <RealKeyHookProc> }; memcpy(hook_proc, code, 16); *(long*)(hook_proc+7) = (long)this; *(long*)(hook_proc+12) = ((long)RealKeyHookProc) - ((long)hook_proc+16); } };
>>681 もったいぶらずに教えろよ。jmpでやる方法を。
すまん
thisポインタをecxで引き渡す場合があるという記述を見た記憶があるが どの処理系の話だったか思い出せない
設定したファイルのCRCを取得するAPI命令ってありませんか?
691 :
デフォルトの名無しさん :03/12/24 17:11
RegCreateKeyEx のクラス文字列へのポインタ lpClass ってのは どういうときに使うんですか? 適当に文字列を入れてみましたが レジストリにはなんも反映されなかったようです。
694 :
デフォルトの名無しさん :03/12/25 03:26
>>693 なるほど。NULLでいいのか。
どもども。
>>446 確かに、モーダルです。
友達にちょっとしたイタズラのプログラムを作ってくれと言われたので。
WM_DESTORYが来たときに、くどいくらいに終了確認するプログラムです。
case WM_DESTORY:
if (IDNO == MessageBox(hwnd,"本当に終了しますか?","確認",MB_YESNO)
break;
if (IDNO == MessageBox(hwnd,"マジで?","エラーエラーエラー",MB_YESNO){
・・・・・・
}else{
・・・・・・
}
・・・・・・
なんて事をやってます。
そして、十数個ぐらいMessageBoxを呼び出したあと、PostQuitMessageを呼び出しています。
でも終了されません。
MessageBoxをコメントアウトすると、普通に終了できるんですが・・・。
WM_DESTROYはWindowが破棄された後に来るはずなので、 くどい位終了確認するならWM_CLOSEの方がいいと思われ。 で、WM_DESTROYをハンドリングするなら0を返すかDefWindowProc 呼ばないとだめじゃねーのかな?
イタズラはイヤズラ わざわざメッセージを処理せんでも他の言語で(ry
>>695 WM_CLOSEでのDestroyWindow直前でやるべき
>>695 その情熱を建設的なことに傾けろ。
例えば、メッセージボックスだけでゲームノベルを創る、とか。
>>700 それ、昔バッチファイルでやった記憶が‥‥(´Д`)
メッセージボックスじゃ長文が書けないからキツいなあ 画像はMessageBoxExでカスタムアイコン指定すれば何とかなるか
>>701 pauseを知らなかったってオチは梨だぜ
>俺が昔作ったやつはCで作ったけどディスクトップとwindowsフォルダーに >ダミーのdllとかtxtとか適当な拡張子くっつけてコンピュータを散らかす そんなことされたら発狂して氏にそうw
_, ,_ パーン
( ‘д‘)
⊂彡☆))Д´)
>>704
すいません。質問なんですが ret = lpDD->lpVtbl->SetCooperativeLevel(lpDD,hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); でフルスクリーン表示してるのですがウィンドウ表示にしたくて 最後の部分を DDSCL_NORMAL にすると バックサーフィスに書き込む部分 lpDDSBack->lpVtbl->GetDC(lpDDSBack, &hDC); でエラーが出て終了してしまいます。 どうしたらいいでしょうか? あとメニュー付のフルスクリーン表示してるのですが フルスクリーン時はダイアログが表示できないのでしょうか?
hWnd アプリケーションが使用するウィンドウ ハンドル。 呼び出すアプリケーションの最上位ウィンドウ ハンドルに設定する (最上位ウィンドウが作成した子ウィンドウに対するハンドルではない)。 dwFlags パラメータに DDSCL_NORMAL フラグを指定する場合、 このパラメータは NULL となる。 とMSDNに記述されているのでハンドルを指定すると駄目かもしれませんね
すみません。
>>694 では、WM_DESTORYではなく、WM_CLOSEです。
それから、自己解決しました。
終了するときは、DefWindowProc()にそのままWM_CLOSEを渡して、
終了しないときは渡さない方法でうまくいきました。
でも、何ででしょう? 何で、PostQuitMessage()ではうまくいかないんでしょう。
WM_QUITメッセージがきたら、
メッセージループのところでゼロが返って、終了すると思うんですが・・・・・・。
メッセージループのところを書き間違えているわけでもないし、
PostQuitMessage()は、WM_DESTORY、以外では使えないのでしょうか?
PostQuitMessage()はWM_DESTORY以外でも使えます
普段の流れは WM_CLOSE〜DestroyWindow〜WM_DESTORY〜PostQuitMessageですよね。 ウインドウを破棄する前にスレッド終了させようとしたから不具合起こったんじゃないの?
フックについての質問: 全アプリのマウスイベントをフックするプログラム組んでるんだけど フックプロシージャ−中で SendMessage(hWnd, WM_COMMAND, 0, 0); //hWndはdllを動作させるアプリのウィンドウハンドル 他のアプリがフォーカス得てるときに,違うアプリのプロシージャ実行したら落ちるわけ? だれか解決策を教えてくだされ.
落ちてるコードが違ってましたわ. SendMessage(hTool, ... ); //hToolはdllを動かすアプリのツールバーのハンドル よろしくお願いします.
>>710 DDSCL_NORMALだとフリッピングが出来ず、バックサーフェスは利用不可なので、
プライマリと同じオフスクリーンサーフェス作って、それをバックサーフェスとして利用する。
Flip使えないから、Bltで転送。
ダイアログの表示はクリッピングで出来ると思う。
>>716 その hTool は DLL 内のグローバル変数だったりしないか?
他のアプリからフックプロシージャが呼ばれているときには、メモリ空間もそのアプリのメモリ空間になる。
#pragma 使うか MapViewOfFile() とか使わないと値が共有されない。
720 :
デフォルトの名無しさん :03/12/26 22:44
1行づつテキストファイルを読みこんでEDITに1行づつ追加していき 全体のテキストを表示させたいのですが WM_SETTEXTではファイル全部を読みこまないと無理のようです。 コピーペーストで追加していけば、出来そうなのですが他に良いやり方があれば 是非教えてください。
>720 どうしても1行ずつの追加でないといけないのか?
>>721 今は、あるサイズ以下の時だけ動的にメモリーを確保して
一度に読込む方法で問題は無いです。
でも大きいファイルも表示出来たらと思って聞いてみました。
まあ、EDITに巨大なテキストを表示すること自体良くなさげなので諦めます。
テキスト末尾をEM_SETSELして、EM_REPLACESELするのが 常道だな
>>722 RichEditにしてストリームで読み込めばいいんじゃないの?(プロージャで繰り返すし
>>723 windowsx.hにある Editマクロ Edit_SetSelなど使うと簡単そうだね。
って、メッセージ送ってもマクロだろうが難易度は変わらないか。
>>714 >ウインドウを破棄する前にスレッド終了させようとしたから不具合起こったんじゃないの?
でも、WM_QUITがきたら、
while( (Ret = Getmessage(msg, hwnd, 0,0,) ) != 0)
なので、whileループを抜けるのではないでしょうか?
>>700 それ、Win32APIを覚えたての頃にやった事があります。
といっても、C言語を覚えたのが三ヶ月ぐらい前の話だから、最近です。
我ながら、ひどくショボイものが出来上がりました。
質問です。 ApiMon、デバッガなどを使って、プログラムを実行していると、 たまに、デバッガがかけられている事を感知して、終了するプログラムがあります。 あれは一体、どうやっているのでしょうか? 自分にデバッガがかけられているかどうかを調べるAPIがあるのでしょうか?
IsDebuggerPresent
>>727 ありがとう存じます。
そのまんまの名前ですね。
if (!IsDebuggerPresent())
return 0;
こんな感じでしょうか?
家にネットにつなぐ環境がないもので・・・。
ところで思うのですが、
あるAPIだけ自前で処理し、
ほかはすべて本当のdllに渡すニセモノのdllを作って、
パスより優先されるカレントディレクトリに置いたら、
デバッガの感知を回避させることが可能でしょうか?
if (IsDebuggerPresent()) return 0; メッセージループの中にこれを入れておけばいいんじゃね?
>>728 なんかクラッキングっぽいな
できるかできないかといえばできるだろう。
>>728 > あるAPIだけ自前で処理し、
> ほかはすべて本当のdllに渡すニセモノのdllを作って、
> パスより優先されるカレントディレクトリに置いたら、
IsDebuggerPresentはkernel32.dllだからこの方法は使えないような…。
サイドバイサイドをつかってもね。
EXEで参照しているkernel32.dllという文字列をkernel3_.dllとかにして
偽の名前のDLLを作ったほうがいいかも。
http://www.chiyoclone.net/details.html#listexp を使うとそういうの作りやすいよ。
そういえばWinny2でもIsDebuggerPresentを使っていて
クラック版では外されていたね。
>>731 GDI32.DLLはその方法使えたけど、kernel32.dllはだめなんかのぅ…
アンチデバッガの素人がつくったアプリなら破るのは簡単。 本物のIsDebuggerPresentの入り口を書き換えてやるだけで、コロリと騙される。 まず、そのアプリをサスペンドモードでCreateProcessする。 自分のプロセス空間の中でIsDebuggerPresentのアドレスを調べる。 アプリのプロセス空間の中で、同じそのアドレスにあるページのアクセス保護を変更する。 そこに 0x33 0xc0 0xc3 の 3 バイトを書き込む。 アクセス保護を元に戻しておく。 そのプロセスをレジュームする。 しかし本物のアンチデバッガを知ってるヤツが作ったアプリなら、 SoftICEでも使わんかぎり、無理。素人にはまず不可能。
734 :
デフォルトの名無しさん :03/12/28 10:32
普通のフォルダのアイコンを取得するにはどうすればいいでしょう? SHGetFileInfo(strFullFileName.c_str(), 0, &shFileInfo, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_LARGEICON); とやると、strFullFileNameにフォルダのパスを入れても フォルダのアイコンが取得できません (SHGFI_USEFILEATTRIBUTESを外せば取得できる) 逆にいうと「必ず存在する普通のフォルダ」でもいいんですけど レジストリを読んでExtractIconExですかねぇ。。。 でも、あれ環境変数読んでるんだよな Il||li _| ̄|○ il||li 何かいい案がありましたら、ご教示お願いします
IShellFolder::GetUIObjectOfでIExtractIconを取得してIExtractIcon::Extract
>>735 それを使うとしても
Extractの引数にするファイルは実在しないといけないですよね
それともなんか指定があるのかな?
>>736 IExtractIcon::GetIconLocationでファイル名ではないシェル固有の位置情報も得られたはず
>734 >(SHGFI_USEFILEATTRIBUTESを外せば取得できる) 取得できるのに質問してるのはなぜ?
HICON hIcon; ExtractIconEx("shell32.dll", 3, NULL, &hIcon, 1); もうね。これ。これが通の頼み方。
はて、アイコンが変更されていたらどうするんでしょう
じゃ、やっぱレジストリじゃん
742 :
デフォルトの名無しさん :03/12/28 16:13
みなさん、分割ウインドウを作るときは どうされてますか? APIレベルでの サポートはないようなのですが。
743 :
デフォルトの名無しさん :03/12/28 16:23
リソースで作ったダイアログのハンドルを取得するにはどうすればいいのでしょうか? TABキーでIDC_EDIT104,IDC_EDIT105をフォーカスするようにしたいのですが、 SetFocusにはハンドルが必要なんです。 IDD_CAL DIALOG DISCARDABLE 0, 0, 252, 123 EXSTYLE WS_EX_DLGMODALFRAME STYLE WS_POPUP | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_SETFONT CAPTION "Form" FONT 8, "MS 明朝" { CONTROL "Label100", IDC_LABEL100, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 174, 80, 0, 0 CONTROL "身長[m]", IDC_LABEL101, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY | SS_CENTER, 7, 7, 67, 15 CONTROL "体重[kg]", IDC_LABEL102, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY | SS_CENTER, 82, 7, 67, 15 CONTROL "BMI", IDC_LABEL103, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY | SS_CENTER, 157, 7, 67, 15 CONTROL "", IDC_EDIT104, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | ES_AUTOHSCROLL | ES_RIGHT, 7, 37, 67, 15 CONTROL "", IDC_EDIT105, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | ES_AUTOHSCROLL | ES_RIGHT, 82, 37, 67, 15 CONTROL "", IDC_EDIT106, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | ES_AUTOHSCROLL | ES_RIGHT, 157, 37, 67, 15 CONTROL "BMIを計算", IDC_BUTTON108, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 45, 75, 60, 18 CONTROL "終了", IDC_BUTTON109, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 120, 75, 60, 18 }
>>743 コントロールのスタイルにWS_TABSTOPがいる、
後メッセージループを書きかえる
while (GetMessage(&msg, NULL, 0, 0)) {
if (hDlg == 0 || !IsDialogMessage(hDlg, &msg)) {
〜〜
}
}
>>737 了解、やってみる・・・
シェル関数苦手なんだよな
>>738 SHGFI_USEFILEATTRIBUTESを利用しなきゃいけないから
>>739 通すぎて、私にはできません(笑)
>>744 はタブ移動させる別の方法な。
>>743 ダイアログのコントロールのハンドルはGetDlgItem(hDlg, IDC_EDIT104,)で取得できる
>738 >SHGFI_USEFILEATTRIBUTESを利用しなきゃいけないから フォルダのアイコンを取得するのにファイル属性を利用しなきゃいけない理由は?
abc.exeという実行ファイルがあったとして この実行ファイルの引数がどうなっているか調べる方法はありますでしょうか? もしくはそれがわかるソフトでもかまいません。 よろしくお願いします。
>>748 どんな引数を受け付けるか?ってこと?
どんな引数で起動したか?ってこと?
abc.exe /?
>>748 PDHかな?
もしくはそのプロセスへ潜り込んで、中からGetCommandLineとか。
>>751 情報ありがとうございます。
>もしくはそのプロセスへ潜り込んで、中からGetCommandLineとか。
は、具体的にどのような方法でやればよろしいのでしょうか?
a.exeがb.exeを起動しているとして
bのプロセスに潜り込むのですか?
748はマルチ 無視汁!
RegEnumValueをwhile(1)ループさせて、indexの値を0から初めて インクリメントしていって任意のレジストリの名前とデータを列挙させているの ですが。 RegEnumValueがERROR_NO_MORE_ITEMSを返したらwhile(1)ループから 抜けだすようにしているのですが。 レジストリエディタでみるとまだまだ列挙できるはずのレジストリはたくさん あるのに。なぜか四つほど列挙しただけで ERROR_NO_MORE_ITEMSを返しているようです。 なぜなんでしょう?
755 :
デフォルトの名無しさん :03/12/31 13:35
>>754 ごめんなさい
表示部分のプログラムであほやってました(汗
ちゃんと列挙できてます。
>>731-732 で紹介しているlistexp2を使ってgdi32.dllをDigital Mars C/C++ compiler
を使ってDLL作成しようとしたら、リンクの段階で失敗。↓
sc _di32.cpp _di32_dummy.cpp _di32.def -WD -w
VC++が無いんで、解決する方法があればどなたか教えていただきたい。
エラーを書き忘れていました。 OPTLINK : Error 180: No Match Found for Export/ENTRY - : d_AbortDoc などと、 _di32.defが悪いじゃないかと思うが、オブジェクトファイルの作成も警告が出る程度 なんで大丈夫だと思うんですが、リンクでは失敗してしまいます。
>>756 大晦日なんだし、そんなこと気にするな。
>>758 そーですね、棚の置くからVC++4.0を探してくるべきですね。
失礼しました。
2004年も宜しくお願いいたします。
あの、そこの天才プログラマさん教えてください。。 waveoutopenで開いてwavprocを使うようにしたんですけどwaveout prepareheaderが失敗するんです。errorcode1で。 wavprocのMMopenでやってもopenの直後でやってもどこでも失敗するんです↓ なにが原因でしょうか??ちなみにxpです。win98で動かすとちゃんと動くんですけど。。。
スピンコントロールを使いたいのですが アップ・ダウンボタンを押したときに0.5ずつ インクリメント/デクリメントしたいのですが デフォルトでは1ずつになっています。 どのようなメッセージを投げればよいでしょうか?
>>762 waveout・・・()関数はコールバック内で使っちゃいけないよね、確か。
win98で動くのは奇跡かと。
コールバックはあまり使えないから、ウィンドウプロシージャかスレッドで
処理させたほうがいいと思う。
>>763 WM_VSCROLL(WM_HSCROLL)を自動で処理する
>>765 ありがとうございます。
猫さんのページを参考にしてWM_VSCROLLを処理しようと思ったのですが
アップを押されたのかダウンを押されたのかわからず
どのように処理してよいのかわかりませんでした。
スクロールバーにはSB_LINEUPなどのメッセージがあったのですが
スピンコントロールの場合はどのように取得すればよいのでしょうか?
なにとぞご教授お願いいたします。
case WM_VSCROLL:
if ((HWND)lParam == hUpdown1) {
wsprintf(str, "%03d", HIWORD(wParam));
SetWindowText(GetDlgItem(hDlg, IDC_EDIT), str);
}
break;
768 :
デフォルトの名無しさん :04/01/02 22:30
指定した時刻にスタンバイ(出来れば休止状態)から復帰する プログラムを作りたいんですけど、何てAPI使えばいいですか? 環境などにも依存するのならそれも合わせて教えてください
>>768 そういうのはOSのタスクの機能を使ったほうがよいのでは?
ウチのカノープスのTVチューナーボードはタスクを利用して
録画処理を起動してるよ。
タスクに実行時にスリープ中だったら解除するという設定がある。
というかスタンバイ中ってプログラム停止させられちゃうのでは?
Sleepじゃだめか
>>769 それじゃ「タスク」はどのような処理をしてるのかという話になるんだが。
いや、俺も知らないんだけどね。
>>771 別にどんな処理してるかなんて知る必要ないでしょ。
単にタスクに起動したい時刻のスケジュールを登録すればいいのでは。
うまくいけば「コントロールパネル」の「タスク」で確認できるはず。
ただ環境依存としてヘルプによるとWin95,WinNT4.0は駄目見たい。
いや、俺もやったことないんだけどね。
SleepもWaitableTimerも精度に問題があると思う。 時刻を監視するスレッドを作ったほうが
775 :
名無し@沢村 :04/01/03 00:20
ヌヒ等はITaskSchedulerも知らんのか
沢村キター
>>775 調べてみたけど、ITaskSchedulerはCOMじゃね?
と、言うわけで768はCOMスレ行きケテーイ。
このスレの香具師は基本的にはCOMは使わんの?
Win32だから使っても不思議はないけど?
>>779 使うだろうけど、ここで話題にするのはスレ違いだろう。
Win32 Platform SDK に含まれているからスレ違いではないだろう
>>782 議論の的はCOMがWin32APIかどうかであって、
Win32 Platform SDKに含まれているかどうかではないだろう。
それともWin32 Platform SDKに含まれていればWin32APIと呼ぶわけ?
お、ということは IWebbrowser2 についても聞いていいわけですか? IWebbrowser2 って、そのままだと XP の Visual Style が 反映されないみたいなんだけど、どうすればいいんでしょう? 前にどこかのスレで聞いてみたんだけど反応なかったので…
IEコンポーネントを使い倒す・・・とかいうスレ無かったっけ?
>>783 > それともWin32 Platform SDKに含まれていればWin32APIと呼ぶわけ?
それで構わないんじゃない?
Plattform SDK | Reference | Win32 Functions in Alpha Order に含まれているもの
>>783 Win32のBase Service以下に含まれていればWin32APIでいいんじゃないの?
そうか。 もう面倒だからそれっぽいやつ全部Win32APIでいいや。
論点がCOMならCOMスレの方がいいレスもらいやすいってだけだろ 使ってる道具だけで判断しようとするから無理が出る
>>762 waveOutPrepareHeader に渡すバッファは
GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, 確保するサイズ)
で確保してる?
malloc だと環境によっては失敗するよ。
>>764 コールバック関数内で使って良いAPIはあるよ。
waveOutPrepareHeader をコールバック内で呼べなければ
コールバック関数用意している意味ないし。
コールバック関数がもっともコストの低い呼び出し方法で、それ故
制約が多いけど、この方法をマスターすればさらにタイミング的に
厳しい ASIO なんかにも対応できるようになるから、勉強にはなる。
>>791 タイミングが重要ならEventでいいじゃん
>>791 EnterCriticalSection, LeaveCriticalSection, midiOutLongMsg, midiOutShortMsg,
OutputDebugString,PostMessage, PostThreadMessage, SetEvent,
timeGetSystemTime, timeGetTime, timeKillEvent, and timeSetEvent.
MSDNに↑以外のAPIをコールバックで使うなと書いてあるぞ。
794 :
デフォルトの名無しさん :04/01/03 19:37
マインスイーパの自動攻略ツールを作ろうとしています。 マインスイーパのウィンドウをmouse_event関数などで操作する様にしようと考えています。 それにあたって、ゲーム中のマス目の情報を取得するための方法を探しています。 今のところ、「マインスイーパのウィンドウを静止画としてキャプチャして、それを解析する」 という方法しか思いつかないのですが、他に効率的な方法がありますでしょうか。
キャプチャせずに、直接 GetClientRect()とGetPixcel() でいけると思う。
797 :
デフォルトの名無しさん :04/01/03 20:56
同一の物理メモリ領域を単一プロセスの仮想メモリ空間上に複数回マップすることはできますか? 何も考えずにMapViewOfFileEx使うとAttempt to access invalid address.って怒られます。
できました。正直タイプミス。スマンカッタ。
エクスプローラなどのツリービューみたいなのを作ろうとしているんですが どうやって項目が選択されているかを調べるんでしょう? 猫でも分かるとか見てもそんな感じの文章はないですし そんな割には、ギコナビの左側だってツリーじゃねーかよーヽ(`Д´)ノ ウワァーン というわけで、ヒントまたは解決法をお教えください。
ListView_GetItem
間違えた。スマソ。まぁ似たようなもんだ。
サンクス。TreeView_GetItemでつね 実行するのは明日になりますが、これで安心して夢の中に逝けます。
>>764 ,791
ありがとうございます。
渡すbufferはcの静的変数にしてました。
GlobalAllocにしてみます(^^)
>795 >796 レスして頂いてどうもありがとうございます。 >796のリンク先のプログラム見てみたのですが、ゲーム開始時点で全ての 地雷の位置が分かっていますよね。これはマインスイーパの変数値などを 直接取得しているということですか?ヒントを貰えないでしょうか。 よろしくおねがいします。
そんな裏技があったとは・・・・・。
>>791 Win32でサウンドカードからの通知を受けるのに
コールバックを利用する意味はほとんど失われてると思うが。
Win3.1ではプロセススケジュールを無視してコールバックが呼び出されていたけど
Win32のコールバックは単なるスレッドだし。
Win9xではそうでもない
>>792 >>793 >>810 さて…風邪で寝込んでた。
で、自分の書いてたソース見直してみたら直接コールバックでは駆動してなかった。
コールバックで来るパラメータだけ処理して自分でイベントを…(--)
熱でボケてたか。大変失礼した。
irvineのように、 IEで文字列を範囲選択して右クリックメニューで、 自作アプリに選択範囲を渡したいのですが、 方法がわかりません。スレも板も違ったら申し訳ない。 マウスで範囲選択したあとに キー入力とウィンドウ制御を行うランチャのショートカットキーを 入力するだけでも実現できそうですけども。
事情で, IEのcontextmenuを使わないことにしました. 普通に別の手段で自作します. スレ汚しスマン
815 :
デフォルトの名無しさん :04/01/05 07:32
リムーバブルメディアを取り出された時に、 そのことを検出する方法はあるのでしょうか? もし、ありましたら教えて頂けませんでしょうか? Google検索やMSDNじゃうまくみつけられなかったので 質問させて頂きます。
メディアの取り出し検出... 専用デバイスで通知できるようなドライバがなければ出来ないかもしれない
定期的にGetDiskFreeSpace()を呼ぶとか
>>813-814 なんだ・・・一応フォローっとくと、
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt
をキーに検索するといろいろ出てくる。実際にIrvineとかがなにやってるかは
コンテキストメニューで実行しているスクリプトファイルを直に開いてみれば分かる。
case WM_DEVICECHANGE: // デバイス状態が変更された switch((UINT)wParam){ case DBT_DEVICEREMOVECOMPLETE: // デバイスが取り出された db = (DEV_BROADCAST_HDR *)lParam; if(db->dbch_devicetype == DBT_DEVTYP_VOLUME){ // 取り出されたのは物理的なデバイス MessageBox(0, "メディア取出", "OK", MB_OK); } } これ?
821 :
デフォルトの名無しさん :04/01/05 12:04
"int LineDraw" (?LineDraw@@3HA) は Main.obj で定義されています; 2 つ目以降の定義は無視されます って警告が出るんだけど、どすればいいの?
main以外でも定義されてるってこと ヘッダーincludeしまくると出るよ
>>816 FindFirstChangeNotificationでできないかな?
>>822 でもインクルードしないと定義されていませんってエラーが出るよ。
>>821 多重インクルードってヤツだっけ。
#ifndef _???_INCLUDE_H_
#define _???_INCLUDE_H_
//いろいろ
#endifを使ってみ。
>>827 やってるのか・・・・。
"int LineDraw"を検索したらどうかな。スマンが分からん。
というか、複数のcppファイルからVariable.hという自作のヘッダーをインクルード していて、このヘッダーファイルの中には静的変数が定義されているので #ifndefとかやっているけど、やっていないときと同じ結果になる。
externは?
exturnって、書かなくてもいいんじゃないんですか?
> exturnって、書かなくてもいいんじゃないんですか? ↑extern
externつけたら error LNK2001: 外部シンボル ""int LineDraw" (?LineDraw@@3HA)" は未解決です ってエラーが出る。
835 :
デフォルトの名無しさん :04/01/05 13:31
静的変数ってグローバル領域の変数? 同じエラーメッセージの出る一番シンプルなソースを 貼り付けたらどう?
静的変数っていうから語弊がある 変数定数のヘッダーでしょ?
//main.cpp #include <stdio.h> #include "timpo.h" int main(void) { unco(); printf("%sぷらぷら",str); return 0; } //timpo.h #ifndef _H_TIMPO_H_ #define _H_TIMPO_H_ void unco(void); char str[20]; #endif /* _H_TIMPO_H_ */ //hage.cpp #include <stdio.h> #include "timpo.h" void unco(void) { scanf("%s",str); }
838 :
デフォルトの名無しさん :04/01/05 13:42
>>834 これは全部にexternを付けている状態では?
・extern は変数を定義している翻訳単位では付けない。
・別の翻訳単位で定義された変数を利用するのに extern を使った宣言をする。
こういう感じだったと思うけど。
839 :
デフォルトの名無しさん :04/01/05 13:46
>>837 ヘッダは単にインクルードされるだけだから、
main.cppの char str[20]; と
hage.cppの char str[20]; は
別の変数として認識されるんじゃなかろうか?
>>837 で、問題のint LineDrawはどこへいったんですか?
>>837 動かすだけなら・・・
こんなんで動くんじゃなかろうか?
//timpo.h
#ifndef _H_TIMPO_H_
#define _H_TIMPO_H_
void unco(void);
char str[20];
#endif
#ifdef _H_TIMPO_H_
extern char str[];
#endif /* _H_TIMPO_H_ */
>>841 それならhage.cppに
char str[20];
あればいいんじゃないの?
>>841 コンパイルは別々にされるから、やっぱ
これじゃ動かないかな?
>>837 //main.cpp
#include <cstdio>
void unco( );
char str[20];
int main( )
{
unco();
printf("%sぷらぷら", str);
return 0;
}
//hage.cpp
#include <cstdio>
extern char str[];
void unco ( )
{
scanf("%s", str);
}
ヘッダに拘らなければ、これで動くんじゃなかろうか。
変数をヘッダに入れて、それを複数のcppファイルからインクルードは できないということですか?
>>846 stroustrupの本だと、ヘッダには
extern str[];
と宣言するに留めて、定義は *.cpp の方で
行っているようですが。宣言は何度やっても
OKだからね。
たまにでかい配列でデータ宣言されてるヘッダーとかあるけど それを複数ファイルからincludeする必要もないと思うし 出来る出来ないのまえに設計が悪いのでは?
スレ違いだから初心者スレでやってよ。
サンキュ!エラーも警告も出なくなったよ!
>>850 初心者つーか、C/C++初心者のスレッド行きだね。
Win32APIとは何の関係もない。
Limechatのチャットログウインドウの内容を他プロセス(他プログラム) から参照して処理するpgを書いてますが、取得できなくて困ってまする。 spy++でみるとチャットログコントールは"ZrichView"というclass名から リッチテキストコントロールと推察しますが、 WM_GETTEXT等で取り込む WM_EMSESELで全選択してWM_EMGETSELで取り込む WM_EMGETLINEで取り込む 全部だめでした。 リッチテキストコントロールではないのか・・。 どなたか情報もってませんかねえ
>>853 LimeChat掲示板で聞いた方が良いだろうな。
作者さんがちょこちょこレスしているし、ヒントをくれるかも。
WM_GETTEXTWでないとだめぽとか
857 :
デフォルトの名無しさん :04/01/06 03:02
>>853 おれはメモ帳を相手におなじことやったけど、GetWindowText()を使えば
うまくいった。
Limechat内部のメッセージ処理を考えればわかるが、WM_GETTEXTなどで返されるwParam,lParam
はLimechatのプロセスにおける文字列のアドレス。プロセスが違うから、
こっちのアプリでその文字列のアドレス拾っても無意味。メモリ空間は
プロセスごとに独立しているから。
>>857 WM_SETTEXT/WM_GETTEXTに関してはWindowsが内部的にメモリマップトファイルを
使って受け渡しするのでプロセス跨いでも使えるはずだが。
860 :
デフォルトの名無しさん :04/01/06 11:10
画面の明るさを変更するAPIを探しています。 ChangeDisplaySettingsExだと解像度しか変更できないみたいで、 ぐぐっても見つからなかったので、ご教授お願いします。
冬休みの間、ずっとひきこもってプログラミングしていました。 今、任意のウインドウをレイヤードウインドウにするプログラムを書いています。 GetForegroundWindow()を使ってハンドルを取得し、 GetWindowLong()→SetWindowLong()→SetLayeredWindowAttributes()で変更しています。 問題は、ウインドウが何も選択されていないとき(どのタイトルバーも色が付いていないとき) GetForegroundWindow()は、恐 らく、デスクトップ全体のハンドルを返してくるのですが、 そのハンドルに対してレイヤード化をしてしまうと、大変スバラシイ事になってしまいます。 これを回避するために、GetDesktopWindow()の戻り値と比較してみたのですが、 どうもうまくいきません。 取得したハンドルの値を表示してspy++で調べてみたところ―― タイトル :Program Manager ウインドウクラス名 :Progman ――でした。とりあえず、今はクラス名を調べて、ハネています。 この方法は、Win2Kでもできるのでしょうか? また、9x系ではどうなるのでしょうか?(レイヤードウインドウ使えないけど) それと、ハンドルがデスクトップのものかを判定する、 もっとましな方法はないのでしょうか?
もう一つ質問です。 >> のプログラムを書いている途中にできた副産物として、 任意のウインドウに、WS_THICKFRAME、を付加するプログラムを作りました。 これをいろんなプログラムに試していたのですが、 某社のゲームは、スタイルにWS_THICKFRAMEが付加されたにもかかわらず、リサイズできませんでした。 カーソルは縮小/拡大のものに変わるのですが、ウインドウのサイズはそのままです。 これはどうやっているのでしょうか? それらしいメッセージをDefWindowProcに渡さないようにしてみたのですが……。どうもうまくいきません。 それからもう一つ、プログラムのショートカットから、最大化、を選択されて起動された場合、 どうやって最大化するのを防げばよいのでしょうか? 某社のゲームも、これには対処できていませんでした。 ShowWindow()の引数をnCmdShowにしないという方法でもうまくいきませんでした。
>某社のゲームは、スタイルにWS_THICKFRAMEが付加されたにもかかわらず、リサイズできませんでした。 たぶんリサイズメッセージを受け取ったときに何もせずに終了しているんじゃない? OnSize(){return 1;} みたいな >GetForegroundWindow()は、恐 らく、デスクトップ全体のハンドルを返してくるのですが、 >そのハンドルに対してレイヤード化をしてしまうと、大変スバラシイ事になってしまいます。 詳細キボン
>某社のゲームは、スタイルにWS_THICKFRAMEが付加されたにもかかわらず、リサイズできませんでした。 WM_GETMINMAXINFO とかかな?
すみません。自己解決しました。
>>860 お前は俺か?今
BOOL WINAPI SetDeviceGammaRamp( HDC hDC, LPVOID lpRamp );
について調べてたとこだよ。
これをホットキーでサクサク変更したいなー。できたら遊べるだろなー。
自己解決したときは解決法も書くもんでしょ。 検索でヒットしたのに「自己解決」だけだったら寂しいよ。
自己解決したときも、その解決内容の要点だけ書いておけば、 同じ問題にぶつかった人への手助けになるものね。
あと、もっと良い方法があるかもしれないしね
デスクトップ画面のガンマ曲線はこれで得られるようだ > #include <windows.h> > #include <systypes.h> > int PASCAL WinMain( HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int cmdShow){ > HDC hDC; LPVOID ldRamp; int16 foo[256*3]; ldRamp = foo; > hDC = CreateDC("DISPLAY",NULL,NULL,NULL); > GetDeviceGammaRamp(hDC,ldRamp); > } でも、SetDeviceGammaRamp()はエラーになる。
わかった
ガンマ曲線用テーブル(ldRampの示す実体 :
>>870 のfoo)は
綺麗な曲線になってないといけないんだ。
グラデのかかった綺麗な絵がマンデルブロに染まるようなガンマテーブルはダメってこと。
なんでかはシラネ
画面をちょっと暗くする程度の変換をかけようと思って加工してたら
それがbugbugで、テーブルが腐って、そのためにset〜ではねられてたってことらし
debug力の無い証拠だチクショウ
SetDeviceGammaRamp は全てのガンマ曲線を許可するわけではありません。 例えば有名な3Dアクションゲーム「Quake」でプレイヤーが撃たれた時のように 画面を赤く発行させるような複雑なガンマ曲線の場合にはエラーとなります。
微妙に遅かった_| ̄|○
指定色だけを描写しないように したいんですけど・・・
>>873 英語のできる巨乳の保健室の先生、ありがとう!
ゲームの演出で瞬間的に色をいじる場合と違って、
普段のデスクトップが操作できないくらい真っ赤に染まったらマズーってことで
ヘンな色にできないようになってるんだね。
基本的にはガンマ曲線が与える0.5〜1.5程度のカーブに近ければ拒否されないんだろうな。
これを何度も実行すると画面がサイケになって面白いよ。戻す場合は簡易ガンマ値設定ツールがいける。
>#include <windows.h>
>#include <systypes.h>
>int PASCAL WinMain( HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int cmdShow){
> HDC hDC; LPVOID ldRamp; int16 foo[256*3]; BOOL r; ldRamp = foo;
> hDC = GetDC(NULL); if (!hDC){ MessageBox(NULL, "取得失敗", "GedDC", MB_OK); return 1; }
> r = GetDeviceGammaRamp(hDC,ldRamp); if (r==FALSE){ MessageBox(NULL, "取得失敗", "GetDeviceGammaRamp", MB_OK); return 1; }
> { int i; for (i=0;i<256*3;i++){ foo[i] = foo[i]*17/16; } } //0から遠ざける
> r = SetDeviceGammaRamp(hDC,ldRamp); if (r==FALSE){ MessageBox(NULL, "色設定が拒否されました", "SetDeviceGammaRamp", MB_OK); return 1; }
> return 0;
>}
ガンマ値を最初に保存しておき、while(1)でSleep(100)くらいで回してから、 拒否されたら復帰させる、くらいは最低限やっといたほうが良かったか。スマン
サイケになる理由がわかった。 >#include <systypes.h> >typedef struct { > uint16 red[256]; > uint16 green[256]; > uint16 blue[256]; >} gammaRampTable; こう扱うのが正しいのに、符号ありとして扱ってた。 WORDは符号なしなんだよな。 落第
>854 limechat掲示板は最近は放置っぽいですなあ。 実はもうきいてるんだけど、ノーレスです。 >857 WM_GETTEXTは使えますよ、プロセスまたいでも。 859の言うようにMSNにも書いてあるし、実際使えるし。 chocoaにも対象として同じ処理してるけど WM_GETTEXTで取り込めてるし。 ただWM_EMxxはrichtextの場合プロセスまたいではダメなのかな。 メモ帳みたいなテキストコントロールには有効だけど chocoaに対してはだめだった。
ビットマップについて質問。 1.BITMAPV4(V5)HEADER型のDIBからDIBSection型のHBITMAP を作成したとき、BITMAPINFOHEADER型に変換されるのですが、 このときV4(V5)で拡張されたフィールドはどこへ行ってしまうのでしょうか?。 2.BI_BITFIELDS時のBITMAPINFOHEADERのケツについてるカラーマスキング値は DIBSECTION構造体のdsBmih.Bitsfields[3]に格納されるであっていますよね?。 3.あとPetzold本にDIBSectionを作るときに確保したビットマップピクセルビットへの ポインタを破棄したら取得することが出来ないと書いてあるのですが、BITMAP構造体 のbmBitsフィールドが思いっきりピクセルビットへのポインタになっているので、これを取得 して操作できますよね?。 4.DIBSection型のビットマップをBitBlt, StretchBltで使うとき、圧縮タイプがBI_JPEGまたは BI_PNG形式でも動くのでしょうか?。 英語よめないのでMSDN英語版読んでもわかりませんでした、逝ってきます。
>>880 2, 3, 4はやってみればわかるよな。
>>866 ガンマコレクターだね。
もう公開終了したみたいだけど。
単純な物ならすぐ出来そうだから作ってみるかな。
>>871 whidbeyで開発しているのか・・・
仕様はこんなもんかな ---------------------------------------- ショートカットキーは固定 設定ファイルは手書き Alt + Num0 〜 Num9指定したガンマ値に設定 Alt + "+" ワンランク明るく Alt + "-" ワンランク暗く 指定解像度に変更されたらガンマ値を変更 終了時にデフォルトのガンマ値に戻る 設定できるガンマ値は0 〜 40 数値が小さいほど明るくなる -1でデフォルトの値に戻る
>>883 >>885 そうか。解像度変更に合わせて動作したほうがいいよな。
その仕様を組み込んでなくて
輝度ワンランクup/downのみ、しかもガンマ曲線は1固定だけど、
書いたので貼ってみる。
>#include <windows.h> >#include <systypes.h> >#include <stdio.h> > >//汎用:数値制限 >int Lim(int v,int min,int max){ > if (v>max){ v = max; } > if (v<min){ v = min; } >} >#if 0 >//汎用:OutputDebugStringを用いたdebug用出力関数 for BCC developer >void D4(char *p,int d0,int d1,int d2,int d3){ > char str[1024]; > sprintf(str, "%s (%d,%d,%d,%d $%x $%x $%x $%x)",p,d0,d1,d2,d3,d0,d1,d2,d3); OutputDebugString(str); >} >#endif >//ガンマ設定用輝度テーブル >typedef struct { > uint16 mRed[256]; > uint16 mGreen[256]; > uint16 mBlue[256]; >} GAMMA_RAMP_TABLE; >//本appli専用引数 >typedef struct { > BOOL mF; //TRUE絶対, FALSE加算 > int mBrightness; //百分率 > int mGamma; //reserve. 100でガンマ1の予定 >} MYARG; >//GAMMA_RAMP_TABLEの要素1つに書き込み >//0〜65535にclip >void GammaParamSet(uint16 *out_p, int i, int v){ > out_p[i] = Lim(v,0,65535);
>}
>//GAMMA_RAMP_TABLE直接加工:輝度変化
>//in : 65536を100%とした倍率
>void GammaEffMul(GAMMA_RAMP_TABLE *ioP, int inR, int inG, int inB){
> int i;
> for (i=0;i<256;i++){
> GammaParamSet(ioP->mRed, i, (ioP->mRed[i] * inR)
>>16 );
> GammaParamSet(ioP->mGreen, i, (ioP->mGreen[i] * inG)
>>16 );
> GammaParamSet(ioP->mBlue, i, (ioP->mBlue[i] * inB)
>>16 );
> }
>}
>//GAMMA_RAMP_TABLEに上書き
>//brightness的に設定. ガンマは1
>//in:パーセンテージ
>//備考: i*65535/255=i*257 : 手元環境はこのtableであることをgetしてdumpして確認済
>void GammaSetBright(GAMMA_RAMP_TABLE *outP, int inR, int inG, int inB){
> int i;
> for (i=0;i<256;i++){
> GammaParamSet(outP->mRed, i, i * 257 * inR / 100);
> GammaParamSet(outP->mGreen, i, i * 257 * inG / 100);
> GammaParamSet(outP->mBlue, i, i * 257 * inB / 100);
> }
>}
>//in:元GAMMA_RAMP_TABLEへのptr
>//out:GAMMA_RAMP_TABLE書き換え
>void Myfunc(GAMMA_RAMP_TABLE *io_psG, MYARG *in_psMyarg){
> GAMMA_RAMP_TABLE sTheGamma;
> int destBri, bri, briall, i;
>
> //基本ガンマ1で輝度100%のtable作成
> GammaSetBright(&sTheGamma,100,100,100); > //取得済table(from画面)から中心輝度算出 > briall = 0; > briall += io_psG->mRed[128]; > briall += io_psG->mGreen[128]; > briall += io_psG->mBlue[128]; > //パーセンテージ取得 > bri = briall*100/(257*128*3); > //値決定 > if (in_psMyarg->mF==TRUE){ //絶対値指定 > destBri = in_psMyarg->mBrightness; > }else{ //相対値指定 > destBri = bri + in_psMyarg->mBrightness; > } > //設定 > GammaSetBright(io_psG,destBri,destBri,destBri); >} >//コマンドライン解析 >//本appli限定 >// /add10 なら+10, /sub5 なら-5, /set75 なら絶対値75 >// 解釈できない引数なら, 先頭文字code奇数+5, 偶数-5 >// 引数なしは, /set100 と同じ >void GetMyarg(MYARG *out_psMyarg, LPSTR szCmdLine){ > BOOL theF; int theBri; > theF = FALSE; //相対値で指定 > if (!memicmp(szCmdLine,"/add",4)){ //引数解釈可 > theBri = atoi(szCmdLine+4); > }else if (!memicmp(szCmdLine,"/sub",4)){ > theBri = -atoi(szCmdLine+4); > }else if (!memicmp(szCmdLine,"/del",4)){
> theBri = -atoi(szCmdLine+4); > }else if (!memicmp(szCmdLine,"/set",4)){ > theF = TRUE; //絶対値指定 > theBri = atoi(szCmdLine+4); > }else if (szCmdLine[0]==0){ //引数なし > theF = TRUE; //絶対値指定 > theBri = 100; //100 > }else if (szCmdLine[0]&1){ //引数あり,解釈不可,odd > theBri = 5; //加算5 > }else{ //引数あり,解釈不可,even > theBri = -5; //減算5 > } > //output > out_psMyarg->mF = theF; > out_psMyarg->mBrightness = theBri; >} > >int PASCAL WinMain( HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int cmdShow){ > MYARG sMyarg; > HDC hDC; > LPVOID ldRamp; > GAMMA_RAMP_TABLE sGamma; > BOOL r; > > //引数解析 > GetMyarg(&sMyarg, szCmdLine); > > //出力deviceのハンドラ取得 > hDC = GetDC(NULL); > if (!hDC){ MessageBox(NULL, "取得失敗", "GedDC", MB_OK); return 1; }
> //ディスプレイのガンマ値取得 > ldRamp = &sGamma; r = GetDeviceGammaRamp(hDC,ldRamp); if (r==FALSE){ MessageBox(NULL, "取得失敗", "GetDeviceGammaRamp", MB_OK); return 1; } > //ガンマ値設定テーブルを加工 > Myfunc(&sGamma,&sMyarg); > //ディスプレイに反映 > ldRamp = &sGamma; > r = SetDeviceGammaRamp(hDC,ldRamp); > //反映を拒否されたとき > if (r==FALSE){ > if(sMyarg.mF==TRUE){ > MessageBox(NULL, "色設定が拒否されました", "SetDeviceGammaRamp", MB_OK); > }else{ > //拒否dialogでなく,100にreset > sMyarg.mF = TRUE; > sMyarg.mBrightness = 100; > Myfunc(&sGamma,&sMyarg); > r = SetDeviceGammaRamp(hDC,ldRamp); > if (r==FALSE){ MessageBox(NULL, "色設定が拒否されました", "SetDeviceGammaRamp", MB_OK); } > } > } > > return 0; >}
以上。BCC5.5+BCCdeveloperのreleaseでbuild確認。 常駐物じゃない点がまず致命的。 解像度, 現在activeなwindowのwindowtitle, 常駐中の(自分がactiveでないときの)ホットキー受け付け, などはスキルが足りなくて組み込めなかった。
>>884 実はgoogleでMSDN検索しただけ。なぜかwhidbeyのサイトがhitした
>>892 実装が完了したとおもたら、
すでに作っている香具師がいた・・・_| ̄|○
あとガンマコレクターも探せば落とせるね・・・
>>892 に書いてある問題点をクリアーした、ガンマコレクターを超えるフリーソフトの誕生に期待
常駐できるようになるだけでも格段にレスポンス向上するからなあ
単純輝度テーブルだけじゃなく、暗いところだけexpandするようなフィルタリング手法を
採用すれば、明るいシーンを犠牲にすることなく暗い場所を見られるだろうし
>>892 そうか。ゲームごとにガンマ値を設定できるようにするには、
ウィンドウタイトルで判定すれば良かったんだ。
・解像度が変更されたとき、アクティブなウィンドウのタイトルで設定する値を判定
こんな感じ?
”ゲーム名”のフォルダが最前面の時ガンマ値自動変更! つーか、通常のゲームなら変更する機能が付いているはずだが。
>>899 フォルダってのがよくわからない。
アクティブなウィンドウが変更された場合にガンマ値をかえる?
>つーか、通常のゲームなら変更する機能が付いているはずだが。
例えばUTだと、それでも最大までは明るくできない。
漏れは、ゲーム側がガンマ値を変更 → ガンマコレクターでさらに明るく
という風に使ってた。
>>883 ソースを晒してるの?
バイナリ晒されてもこのスレでは意味ないと思うけど
>>863 戻り値をspy++で調べると、やはりデスクトップ全体のハンドルでした。
それに対して、
GetWindowLong()で取得した拡張スタイルに
Style = style | WS_EX_LAYEREDして、
SetWindowLong()して、
SetLayeredWindowAttributes()しました。
アルファを128にすると、画面の色が反転したようになります。
うまく説明しづらいのですが、とにかくグチャグチャになりました。
ウインドウのスタイルを元に戻しても、デスクトップは元に戻りませんでした。
デスクトップ全体にInvalidateRect()をかけて、何とか元に戻りました。
アルファを0にすると、アイコンの類が全て、消えました。
904 :
デフォルトの名無しさん :04/01/07 18:02
任意の一般的なアプリのツールバーを、 自作のプログラムで表示/非表示の状態をしらべ、さらに状態を切り替えたいと思います。 APIを調べたところ、IsWindowVisible で状態がわかりそうな気がして、 ツールバーのハンドルを得ようと考えました。 ところがそのアプリのハンドルはタイトルから取得できるのですが、 ツールバーのハンドルの取得の方法がわかりません。 どのようにすれば実現できるでしょうか?
883のツール便利だね。ソースがあればこのスレらしいな
>>904 そのウィンドウの子ウィンドウを調べる。
クラス名が"ToolbarWindow32"なら多分ツールバー。
左クリックのしすぎで指が痛くなり、ひとつマウスホイール上回転を 左クリックに置き換えてみようと思ったのですが、上手くいきません。 DirectXを使ったゲームで、単純なPostMessageやmouse_eventでは 効かないものに、マウスメッセージを送る方法はあるのでしょうか?
>>905 ソースの肝の部分は
>>882 とほぼ同じです。
かってに流用しているので、さらすのはまずいかなと思ったんで
バイナリだけです。
>>882 と”グローバルフック”でぐぐって見つかったソースを合わせれば、
どなたでも作れるかと。
正直Win32APIとは関係ないんだけど関連が無くも無いんでここで教えてくだされ DIBを扱うときのお約束として横1ラインのデータ長は4の倍数に切り上げるってのがあるけど、 この切り上げ処理を1行で書くやり方を完璧にド忘れしてしまいました。 もう歳かのうゲホゲホ… dwsize += (dwsize % 4)?(4 - (dwsize % 4)):0; 確かこんな感じでしたっけ? もっと簡単に書く方法はありますでしょうか?
((x+n-1)/n)*n
>>911 おぅ、バッチリですな。
マリガトウ!!
>>910 1ラインのバイト数=((幅*色のビット数+31)&~31)/8*abs(高さ)
まちゃがえt
882のサイトのソースは登録が必要だとかで、落としてないや
>>906 spy++ で、そのツーrルバーのクラス名はToolbarWindow32だとわかっていたのですが、
FindWindow でゲットした任意のアプリのウインドウのハンドルを用い、
FindWindowEx にてそのクラス名を入れて探そうと思ったのですが、0しかかえってきません。
ほかのAPIを使わないとだめなのでしょうか?
そして報告するんだ 報告をするんだ
HWND hw1; HWND hw2; hw1 = FindWindow("クラス名", "ウインドウ名"); hw2 = FindWindowEx(hw, NULL, "ToolbarWindow32", ""); printf("%d\n", hw2); ごめんなさーい。初歩的ミスでした。 上記のでなんとかできました。
>>864 WM_GETMINMAXINFOをDefWindwoProc()に渡さないようにしてみたのですが、
相変わらず、サイズを変更できてしまいます。
誰か、スタイルにWS_THICKFRAMEが付加されたにもかかわらず、
ウインドウのサイズ変更が出来なくなるようにする方法を知りませんか?
SYSCOMMANDで調べてみるとか。
WM_WINDOWPOSCHANGINGでしょ
Accessの子ウィンドウのコントロールボックス無効化にする方法を教えて下さい。 フォームプロパティのコントロールボックス『いいえ』だけでは、 タスクバーにあるボタン化されたウィンドウに対して右クリックすると メニューが表れ『閉じる』やサイズ変更が可能なままとなってしまいます。 Access本体の『閉じる』やサイズ変更の無効化はわかるのですが…
WM_WINDOWPOSCHANGINGかぁ。 漏れもウィンドウのリサイズ禁止にしようとしてやってたことあったが、ソレでよかったのか。 SC_SIZEずっといじってたよ。_| ̄|○ イチオウキンシデキタケド
他アプリのツールバーのハンドルを得ることはできましたが、 表示・非表示切り替えがうまくいきません。 ShowWindow(hw, SW_HIDE) を行うと、この時点では消えず、このあと親ウインドウのサイズを変更した時にしか消えないのです。 UpdateWindowとかRedrawWindowとか試してみましたがうまくいきません。 なにか間違っているのでしょうか?
927 :
デフォルトの名無しさん :04/01/08 17:54
スタートメニューの高さを取得するAPIを教えてくださ
現在チャットで話していいる女が、ネカマかどうか判断するAPIを教えてください。
>>916 フリーメールでもOKっぽい。
かなり有用なサイトなので登録しておいて損はないかと思う。
>>921 WM_GETMINMAXINFOならMINMAXINFO構造体の
ptMinTrackSize;
ptMaxTrackSize;
に同じ数値を設定すればいい。
CodeProjectにあるドキュメントはCodeGuruにもあったりするのでCodeGuruから落とすこともできたりする。CodeGuruは登録しなくてよい。
>>926 多分ツールバーは消えたけどその画像が残ったまま、という状態。
フレームウィンドウのクライアント領域が露出した状態。
フレームウィンドウがクライアント領域に(背景ブラシを含め)何も描かなければ、再描画させても無駄。
サイズが変われば再レイアウトしてくれると思うので、いったんサイズ変更して元に戻すとかすれば?
BITMAPV4HEADERのbV4GammaRedの説明で MSDNでは >Specified in 16^16 format. と書いてあります。 この 16^16 format ってどういう意味でしょうか? 整数部16bit、小数部16bitの固定小数点という意味?
CreateThreadで立てた副スレッドが、ExitThreadを呼んだのに GetExitCodeThreadでSTILL_ACTIVEを返すのは仕様ですか? ちなみにWin98SEでふ
>>935 ExitThreadでSTILL_ACTIVEと同じ値を渡してるというオチではあるまいな?
引数にGetCurrentThread()の戻り値を使ってるというオチではあるまいな?
そういう可能性も考えて、ちゃんと確認した値を渡したんですがね。 returnで同じ値を渡して終わらせたら、前述の症状はありませんでした。 exeのサイズを減らそうとして、Cランタイムを削ったのが なんかマズかったのかなぁとも思いましたが。
呼び側にてWaitForSingleObject()とかで同期とってみたら?
VFWで質問です AVI作成時にAVIFileOpenでOF_CREATEを指定すると、 「新規にファイルを作成する、ファイルがすでに存在する場合その大きさは0になる」 とのことですが、いくらやっても0になりません。 実験として、1)大きなAVI作成 2)小さなAVI作成をすると、大きなAVIのサイズの ままです。これは既出のバグでつか?