■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

Win32API質問箱 Build40
751 名前:デフォルトの名無しさん :2006/02/26(日) 17:03:41
タイーム( ゚д゚)ボカーン

752 名前:デフォルトの名無しさん :2006/02/26(日) 18:01:03
リソースのpng画像をロードして、HBITMAPの形にするAPI
(LoadImageのpngバージョン)がありましたら教えてください。
使用コンパイラは、VC6、BCCです。

753 名前:デフォルトの名無しさん :2006/02/26(日) 18:06:58
ヒント:ライブラリ

754 名前:デフォルトの名無しさん :2006/02/26(日) 18:07:42
pnglib

755 名前:752 :2006/02/26(日) 18:22:33
ありがとうございます。
imgctl.dllは知っていたんですが、
外部ファイル名専用みたいなので、
リソースの場合はどうすればいいのかなと。
pnglibを調べてみます。

756 名前:デフォルトの名無しさん :2006/02/26(日) 18:25:17
libpngじゃなかったか?

それはともかく、gdiplusというものもある。

757 名前:752 :2006/02/26(日) 18:31:37
ありがとうございます。

758 名前:デフォルトの名無しさん :2006/02/26(日) 18:33:20
libpngはいつからリソースを扱えるようになりましたか?

759 名前:デフォルトの名無しさん :2006/02/26(日) 18:40:24
最初から。

760 名前:デフォルトの名無しさん :2006/02/26(日) 18:41:19
>>759
kwsk

761 名前:752 :2006/02/26(日) 19:06:54
んっ、無理なんですかね。
imgctlを作るのにlibpngを利用したみたいですので、
多機能なimgctlにその機能がないという事は、
元のlibpngにもなかったらからとも考えられる。

762 名前:デフォルトの名無しさん :2006/02/26(日) 19:09:10
全然無理じゃないからやってみろ。

763 名前:デフォルトの名無しさん :2006/02/26(日) 19:14:50
>>762
むりです(><)

764 名前:デフォルトの名無しさん :2006/02/26(日) 19:19:55
リソースから読み取ったバイナリを、ストリームに流すだけで展開できる。
直接読み取る関数が無いかだけで、出来ないと決めつけるのは無能にも程がある。

765 名前:デフォルトの名無しさん :2006/02/26(日) 19:20:14
見当違いの考察は無用。
さっさと手を動かせ。

766 名前:752 :2006/02/26(日) 19:21:46
むりです(><)
俺の頭のスペックではむりです(><)

767 名前:デフォルトの名無しさん :2006/02/26(日) 19:22:05
libpngでメモリ上のPNGイメージを展開する例。
ttp://www.kcrt.net/program/uselibpng_read.html

768 名前:752 :2006/02/26(日) 19:38:41
>>764
ありがとうございます。LPVOIDを渡している
関数がありますが、そこら辺りですかね。

769 名前:752 :2006/02/26(日) 19:40:18
>>767
ありがとうございます。

770 名前:デフォルトの名無しさん :2006/02/26(日) 20:09:50
ちと大雑把で迷惑な質問かもれしませんが…。
SPY++とかウィンドウエクスプローラ(WINMAP.EXE)のように
画面上のオブジェクトを細かく追っかけていくには
どのようなAPIを用いればいいでしょうか?
何がしたいかと言うと、例えばヤフーメッセンジャーとかの
Internet Explorer_serveクラスのrコンポーネントを弄りたいのです。
よろしくお願いします。

771 名前:デフォルトの名無しさん :2006/02/26(日) 20:22:52
弄るな

772 名前:デフォルトの名無しさん :2006/02/26(日) 20:30:49
弄ぶ

773 名前:デフォルトの名無しさん :2006/02/26(日) 20:33:08
>>770はイジリー岡田

774 名前:デフォルトの名無しさん :2006/02/26(日) 20:44:01
何この流れ。

775 名前:デフォルトの名無しさん :2006/02/26(日) 21:10:58
現在、特定のプロセスを監視するプログラムを作ろうと考えています。
具体的には、ゲーム等のexeが起動したら、それを強制終了させるものです。

そこで、質問なのですが
どうすればプロセスを特定できるでしょうか?
よろしくお願いいたします。


776 名前:デフォルトの名無しさん :2006/02/26(日) 21:33:58
PSAPI か パフォーマンスモニタ か

777 名前:デフォルトの名無しさん :2006/02/26(日) 21:39:15
>>775
ポリシーで起動禁止にする手もある

778 名前:760 :2006/02/26(日) 21:51:23
>>764
なるほど、「libpngで」リソースから読めるわけじゃないのね。
#それなら余りに当たり前だ。
##てっきり、元質が>752だからリソースから直接読めるのかと思っちまったぜ。

779 名前:デフォルトの名無しさん :2006/02/26(日) 21:58:23
>>775
っ[WMI使ってみる?]

WinAPIなのにWMIをすすめる俺の凄さ

780 名前:デフォルトの名無しさん :2006/02/26(日) 22:14:54
direct*なDLLをみんなつぶしてしまう

781 名前:デフォルトの名無しさん :2006/02/26(日) 22:52:19
>>746
InvalidateRect()の最後の引数をTRUEにするとWM_PAINTが呼ばれた
瞬間に内容を消去するからじゃない?ここをFALSEにしてみては。

782 名前:デフォルトの名無しさん :2006/02/26(日) 22:56:10
質問です。XP、VC++ 2005 です。
C/C++ スレから誘導されて着ました。

フォントのビットデータを取得しようとしています。
以下のコードは、まずデータ取得に必要なサイズを調べているところですが、
GetGlyphOutline に失敗します。

 UINT uChar = 'a';

 GLYPHMETRICS gm;
 uChar &= 0x0000ffff;
 MAT2 mat = {{0,1}, {0,0}, {0,0}, {0,1}};

 // フォントを取得
 HDC hDC = CreateCompatibleDC(0);
 DWORD size = GetGlyphOutline(hDC, uChar, GGO_GRAY8_BITMAP, &gm, 0, NULL, &mat);
 if (size == GDI_ERROR)
  return false; // ここで失敗

GetGlyphOutline を呼び出す直前に各変数の値を調べてみましたが、特に異常な値は見当たりません。
にも関わらず、GetGlyphOutline がエラーを返してくれます。
何が原因か分からないでしょうか。
よろしくお願いします。

783 名前:デフォルトの名無しさん :2006/02/26(日) 23:00:07
>>781
ウィンドウを動かさない、かつ他のウィンドウを被せない、って事ならそれでもいいだろうけど…

784 名前:デフォルトの名無しさん :2006/02/26(日) 23:03:26
>>782
フォントを設定しないと駄目なんじゃない?

785 名前:782 :2006/02/26(日) 23:06:53
>>784
しまった、デフォルトのフォントが選んであると思い込んでました。
やってみます。ありがとうございました。


786 名前:デフォルトの名無しさん :2006/02/26(日) 23:08:24
こんばんは。
ウィンドウの削除をしてもプロセスが残ってしいます。

WinMainからメイン処理用関数を呼んでその中で
永久ループを回しているのですが、ループの中で

while(1){
(いろんな処理)
if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}

としてWINDOWSメッセージを受け取れるようにして
処理を行っています。

コールバックの部分での終了処理は

case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;

としています。

プロセスが残る原因がわからないのですが、永久ループを抜ける
処理を何か入れてあげなければならないのでしょうか?
原因がわかる方いらっしゃいましたらお願いいたします。


787 名前:デフォルトの名無しさん :2006/02/26(日) 23:09:42
で、そのwhileループを抜ける処理はどこにあるんだ?

788 名前:デフォルトの名無しさん :2006/02/26(日) 23:16:36
>>781
いえ、前の図形は消したいので、現状の動きが実現したい動きでいいんです。

ただ、クリックが検知された時、一回目のInvalidateRect()のredraw_rectの
値は前にクリックした場所で、実際に○や□があるところ。
ここでWM_PAINTが呼び出されても、消すような処理はしてないように思えて……。
ちなみに第3引数をFALSEにしても同じで、前までの位置の図形はきえます。
>>747では非同期ということですが、だから「消える」という理由になっている
のでしょうか……。
混乱してきました。NULLで全画面描画にすれば悩むこともなかったのに……。


789 名前:デフォルトの名無しさん :2006/02/26(日) 23:27:08
>>787
やはり抜ける処理がいりますよね?
PostQuitMessage(0); でそこらへんも勝手に抜けて
終わらせてくれるのかなぁと思ったのですが・・・。

永久ループのとこのPeekMessageでWM_CLOSEが着てたら
抜けるように良いのかな…。

790 名前:・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/02/26(日) 23:33:23 ?
else { break; }


てか、なんでそこで「いろいろな処理」やる必要あるんだ

791 名前:デフォルトの名無しさん :2006/02/26(日) 23:33:39
>>788
第3引数って片方のInvalidateRectだけFALSEにしたとか?

792 名前:デフォルトの名無しさん :2006/02/26(日) 23:37:21
>>789
WinMainでやる場合には、PeekMessageを使わずにGetMessageを使って
while (GetMessage(....
とするのが簡単。
PeekMessageを使う場合には、WM_QUITが来たらループを抜ける。

793 名前:デフォルトの名無しさん :2006/02/27(月) 00:02:57
>>785
モノクロビットマップなのに、第3パラメータでグレースケールの指定をしているからかもしれん。
試してみんとわからんけど。

794 名前:デフォルトの名無しさん :2006/02/27(月) 00:03:20
>>788
WM_ERASEBKGND

795 名前:デフォルトの名無しさん :2006/02/27(月) 00:09:00
>>790
ゲームのメインループでここでタイマーの計算とかして
一定時間起きにInvalidateRectして画面更新、とかやって
いるのです。

>>793
PeekMessageのあとにmsg.messageの内容見てbreak;
させるようにしたらちゃんと終了できるようになりました。

どうもありがとうございました。

796 名前:デフォルトの名無しさん :2006/02/27(月) 00:46:05
>786
伝統的なPM_NOREMOVE + GetMessageも薦めてみる
while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
 int gmr = ::GetMessage(&msg,NULL,0,0);
 if ((gmr == 0) || (gmr == -1))
  return msg.wParam;
 ::TranslateMessage(&msg);
 ::DispatchMessage(&msg);
}

797 名前:746 :2006/02/27(月) 01:57:58
>>794
なるほど……!
私の疑問を解決するのに、その一言で必要十分でした。
InvalidateRect()を行うと、WM_ERASEBKGND→WM_PAINTの順番でメッセージが
来るんですね。そのメッセージを掴んでなかったからDefWindowProc()にて
背景塗りつぶしが行われて……。
勉強になりました。感謝感謝です。

798 名前:デフォルトの名無しさん :2006/02/27(月) 03:01:13
昨日始めたばかりの者です。
「未解決の外部シンボル_imp_MessageBoxA@16が関数_WinMain@16で参照されました。」
とエラーがでたのですが、解決方法がわかりません・・・
winmainの中は
{MessageBox(NULL , TEXT("message") , TEXT("message") , MB_OK);} だけです。
何がいけないのでしょうか?
ちなみに、使っているのはVisualStadio2005でc++です。

799 名前:デフォルトの名無しさん :2006/02/27(月) 03:12:40
何を参考にしているのか知らんが、参考書が悪いか、ちゃんと読まないお前が悪いかのどちらかだ。

800 名前:デフォルトの名無しさん :2006/02/27(月) 03:27:23
1. カーソルキーを押し続けると滑らかにスクロール(キーリピート時のようにカクカクせずに)、
2. カーソルキーを離すと滑らかにスクロールストップ(現在位置が目標位置に漸近するように)、
3. カーソルキーを短く押して離すと1コマ分スムーズにスクロールしてストップ、
ということをやりたくて以下のようにしてみたんですが、
概ね実現できたものの、3のときに例えばカーソルキーを連打すると、
「連打した回数」滑らかスクロール&ストップを繰り返してウザイデス。
このキーリピートのような振る舞いをなくしたいのですが、いい知恵ないでしょうか。

case WM_TIMER: {
 switch (wp) {
  case TIMER_KEYACCEPT: { // 例えば100msec間隔
   if (HIBYTE(GetAsyncKeyState(VK_UP))) scroll(VK_UP); // カーソルキーを押し続けるとスクロール
   else if (HIBYTE(GetAsyncKeyState(VK_DOWN))) scroll(VK_DOWN);
   break;
  }
 }
}

case WM_KEYUP: {
 switch (wp) {
  case VK_UP:
  case VK_DOWN: {
   while (!smooth_stop(wp)) { // ←カーソルキーを離したら滑らかにスクロールストップ
    InvalidateRect(hwnd, 0, true); // 「少し移動して描画」を繰り返す。移動幅は段々小さく。
    UpdateWindow(hwnd);
   }
  }
 }
}


801 名前:デフォルトの名無しさん :2006/02/27(月) 03:46:24
>>798
うわ〜こりゃひどいわ。直すべきところはいろいろあるけど、
まずすぐ質問すればいいやという根性を直すのが最初だな。
・・・MSDNでMessageBoxを調べてみるんだね。十分に調べて、
それでわからなかったら、おまいさんにはまだ早すぎたってことだ。

802 名前:デフォルトの名無しさん :2006/02/27(月) 03:56:40
>>800
スクロール停止処理後に
while( PeekMessage(&msgtemp,hwnd,WM_KEYFIRST,WM_KEYLAST,PM_REMOVE) );
でキーメッセージを握りつぶすとか。

803 名前:800 :2006/02/27(月) 04:49:07
>>802
どうもありがとう。
そういう風にするのって普通にアリなんでしょうか(ひょっとして定石!?)
そもそもWM_KEYUPが続けて呼ばれる理由がよく分からないので
その辺はっきりさせる必要がある気もしつつ。


804 名前:デフォルトの名無しさん :2006/02/27(月) 05:22:19
WM_TIMERを使わないと無理じゃないか?
滑らか処理を始めるかどうかを知るためのタイマーと、
滑らか処理そのもののタイマー。
タイマーコールバック内でGetAsyncKeyState()を使い
キーアップされたかどうか調べてキーアップしているようならタイマー削除。

805 名前:デフォルトの名無しさん :2006/02/27(月) 06:10:21
>>803
キーを押して離したらその回数だけメッセージが来る。
処理してなかったら後から当然のように呼ばれるだけで。

806 名前:798 :2006/02/27(月) 09:08:13
>>799 >>801
けっこう調べたんだけどわかんないってことは、自分にはまだ早いってことですね。
出直してきます。ありがとう

807 名前:デフォルトの名無しさん :2006/02/27(月) 12:57:46
>>803
メッセージがキューに溜まっているからじゃないかな?
>>806, 798
見ているかわからんけど、MSDNにはどんなライブラリが必要か書いてあったよね?
過去にC++でコードを書いたことがあれば、SDKを使ったことなくても、あんな感じのエラーが
どういう状態ででるか経験するはず。VS使わずエディタとコマンドラインからコンパイルしながら
練習してごらん。

808 名前:デフォルトの名無しさん :2006/02/27(月) 13:12:06
※厨房に武器は与えないようにしましょう

809 名前:デフォルトの名無しさん :2006/02/27(月) 13:24:42
転職システム

厨房LV5以上 → 知ったか厨

810 名前:デフォルトの名無しさん :2006/02/27(月) 13:37:19
Lv1 → Lv2 (環境整備) 必要Exp 4,294,967,295

811 名前:デフォルトの名無しさん :2006/02/27(月) 18:17:17
>>771-773
ネタじゃないんですが…。
よろしくお願いします。
WSHとかじゃうまく掴んないんでAPI使って捕まえたいんですよ。

812 名前:デフォルトの名無しさん :2006/02/27(月) 18:22:39
何が目的でそういうことをしたいのかを書くと
もっと有益なレスが得られるかもしれない。

813 名前:デフォルトの名無しさん :2006/02/27(月) 18:36:09
>>811
誰がネタって言ったよ
弄るなって言ってんだ

814 名前:デフォルトの名無しさん :2006/02/27(月) 18:37:27
>>811
>>770見ても意味がよくわからんかったんだけど、
・EnumChildWindows, GetWindowなんかで子ウィンドウをなめていく
・GetClassName, GetWindowLongなんかでそのウィンドウの情報を取得
ってことか????

815 名前:デフォルトの名無しさん :2006/02/27(月) 19:35:06
自分のIPアドレスを設定(変更?)するにはどういう関数を使ったらよいのでしょうか?
OSはwindowsXP、開発環境はwindows2000かXPで、
コンパイラはVC++6かボーランドCです。
ググって見たけど、うまい検索ワードがわからなくなて見つからず、
WSAStartup()した後に、gethostbyname()して、
strcut hostentのh_addr_listを直接書き換えるのも駄目だったので。
よろしくお願いいたします。


816 名前:デフォルトの名無しさん :2006/02/27(月) 19:42:50
ローカルかグローバルかも書けないクズはもうくんなよ
//ローカルかグr−バルか改めて書き込まなくてもいいからな、吊れよ

817 名前:デフォルトの名無しさん :2006/02/27(月) 19:45:11
>>816
今月最高のバカ

818 名前:デフォルトの名無しさん :2006/02/27(月) 19:47:07
悔しそうだな

819 名前:デフォルトの名無しさん :2006/02/27(月) 19:48:32
釣りかと思ったら、マジでこんな間抜けなこと書いてるのか。

820 名前:デフォルトの名無しさん :2006/02/27(月) 20:00:08
>>815
ネットワークアプリの経験はあまりないんだけど、ググッて5分以内に
目的の関数が見つかったんだけど・・・
それ用のAPIがあったよ。Aから始まるAPIで。ググれば見つかるから、
もうちょっと頑張ってみたら?特別なキーワードじゃなくて見つかるよ。

821 名前:デフォルトの名無しさん :2006/02/27(月) 20:05:48
AddIPAddress

822 名前:デフォルトの名無しさん :2006/02/27(月) 20:08:50
IEコンポーネントのウィンドウをロード中に閉じようとすると
たまにメモリリークを起こすのは仕様ですか?

823 名前:デフォルトの名無しさん :2006/02/27(月) 20:41:43
>>810
知ったかは環境持ってなくても聞きかじりの知識で首を突っ込んでくるぞ

824 名前:デフォルトの名無しさん :2006/02/27(月) 21:06:20
>>822仕様なのでしょうがないです

825 名前:デフォルトの名無しさん :2006/02/27(月) 21:06:58
それはそれは
どうしようもないでしね

826 名前:デフォルトの名無しさん :2006/02/27(月) 21:08:11
我慢しよう

827 名前:デフォルトの名無しさん :2006/02/27(月) 21:09:29
イヤです。

828 名前:デフォルトの名無しさん :2006/02/27(月) 21:10:19
ちくしよう

829 名前:デフォルトの名無しさん :2006/02/27(月) 21:15:22
自己解決しました

830 名前:デフォルトの名無しさん :2006/02/27(月) 21:26:59
すげー

831 名前:デフォルトの名無しさん :2006/02/27(月) 21:39:42
やっぱり駄目でした

832 名前:デフォルトの名無しさん :2006/02/27(月) 21:55:12
やっぱり、事故解決していました

833 名前:デフォルトの名無しさん :2006/02/27(月) 22:02:12
>>820 >>821
ありがとうございました。
検索の仕方が下手なのか、結構頑張ったつもりなのですが・・・
windowsとIPアドレスと設定で検索かけると、
普通にネットワークのプロパティから設定しているものが沢山かかったので、
それを見ているだけで時間を食ってました。
APIとかwin32とかwinsockとかを検索ワードに入れればよかったんですね

834 名前:820 :2006/02/27(月) 22:18:08
>>833
そっかー自力で見つかった方がいいかなって思ったんだけど、
うまくいかなかったら仕方なし。検索は慣れなのかな?
使ったキーワードは、"windows api ipアドレス 変更"そのまんま。
2ページ目に「ソフトでPCのIPを変更〜」みたいなのが出てくるから、そっから辿ればよし。

835 名前:デフォルトの名無しさん :2006/02/27(月) 22:21:32
ちょっと困ってます。

836 名前:デフォルトの名無しさん :2006/02/27(月) 22:31:16
だからなに!

837 名前:デフォルトの名無しさん :2006/02/27(月) 22:58:26
生活に困ってます

838 名前:デフォルトの名無しさん :2006/02/27(月) 23:00:50
それじゃあ、仕方がないな。

839 名前:デフォルトの名無しさん :2006/02/28(火) 01:30:10
windows api ipアドレス 変更
ttp://www.geekpage.jp/programming/iphlpapi/
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=24302&forum=11&start=8&12

840 名前:デフォルトの名無しさん :2006/02/28(火) 01:38:06
API は大文字でなきゃイヤです ><

841 名前:デフォルトの名無しさん :2006/02/28(火) 04:46:41
>>814
サンクス。それやってみます。

842 名前:デフォルトの名無しさん :2006/02/28(火) 10:40:11
ファイルが他のプロセスが使用中の為コピー出来ない場合があって、それを次回リセット後コピーするようにしたいんですけど、
APIでサポートがありますか?
よろしくお願いします。


843 名前:デフォルトの名無しさん :2006/02/28(火) 10:45:39
リセットって何よ


844 名前:デフォルトの名無しさん :2006/02/28(火) 10:55:33
>>842
MoveFileEx()


次回起動時、という意味でリセットを使っているのならな。

845 名前:842 :2006/02/28(火) 11:21:12
>844
レスありがとうございます。
>次回起動時、という意味でリセットを使っているのならな。
そうでした、説明不足ですいません。

MoveFileEx()
まさにこれでした、ありがとうございます。


846 名前:デフォルトの名無しさん :2006/02/28(火) 11:24:00
>>845
本当に説明不足だと思っての? 脳が足りないだけだろ 氏ねよ

847 名前:デフォルトの名無しさん :2006/02/28(火) 12:09:51
mutexについてなんですが、
CreateMutex(NULL,TRUE,"unique");
こんな感じでmutexを作成後、エラーなどでmutexを解放しないでプロセスが終了した場合、mutexはどなってしまうんでしょう?


848 名前:デフォルトの名無しさん :2006/02/28(火) 12:23:09
>>847
一度プロセス無理矢理終了させた後もう一度作り直してみれば分かる。

849 名前:デフォルトの名無しさん :2006/02/28(火) 12:39:11
>>847
解放されると思うけど、試してみるのが早い

850 名前:デフォルトの名無しさん :2006/02/28(火) 13:47:07
>>846
なぜそんなに怒っているんだ・・

851 名前:デフォルトの名無しさん :2006/02/28(火) 14:34:24
Visual Studio .NET (C++)。
ある無料アプリケーションのオマケ機能で、アプリケーションの主機能でできたデータを CD/DVD に焼く機能を付けようとしています。
CD/DVD 双方書き込めるドライブの情報を取得しようとすると、CD のほうしか取得できていないようです (実際、CD でしか焼けません)。
「CD のほうしか」というのは、ドライブの ID のうしろに「CD-R/RW」と付くのです。
市販の焼きアプリケーションなどでは、同じ ID のうしろに「CD-R/RW」が付く場合と「DVD-RAM」が付く場合とあるので、
恐らく別々に取得できるのではないかと憶測しています。
憶測を含め、間違いがあったら、忌憚なく訂正してください。
お願いします。

852 名前:デフォルトの名無しさん :2006/02/28(火) 14:51:48
DVD焼く機能はOSに付いていないはずだが。
オマケ機能なら、CD-Rに限定しておく方が吉。

853 名前:デフォルトの名無しさん :2006/02/28(火) 14:52:28
ReadProcessMemoryで他プロセスから4byte取得しているのですが

int A;

ReadProcessMemory( hWnd , (LPCVOID)0x... , A , 4 , &Read );
printf( "%d" , A );
これだとうまく数字が表示されます。しかし

int A;
char buf[256];

ReadProcessMemory( hWnd , (LPCVOID)0x... , A , 4 , &Read );
wsprintf(buf , "%d" , A);
MessageBox(NULL , buf , "" , MB_OK);
で表示させてやると正常な値が出力されません。
何か根本的なところで詰まっているのでしょうか・・・。

854 名前:デフォルトの名無しさん :2006/02/28(火) 14:55:44
すみません、正しくは
ReadProcessMemory( hWnd , (LPCVOID)0x... , &A , 4 , &Read );
です。スレ汚し申し訳ない。

855 名前:デフォルトの名無しさん :2006/02/28(火) 14:58:17
>>853
読み取ったメモリ内容を表示させたいのだったら、
どちらもうまく表示されないと思うけど。

>ReadProcessMemory( hWnd , (LPCVOID)0x... , A , 4 , &Read );
hWnd ってのも何だか変だし、A じゃなくて &A としないとダメだし。

856 名前:デフォルトの名無しさん :2006/02/28(火) 15:26:41
レスありがとうございます。
〜の部分はGetWindowThreadProcessIdとOpenProcessでハンドルは取得しています。
前者のソースではうまく表示されているのですが・・・。後者のソースを

char A[4];
int B;
char buf[256];

ReadProcessMemory( hWnd , (LPCVOID)0x... , A , 4 , &Read );
memcpy(&B , A , sizeof(int));
wsprintf(buf , "%d" , B);
MessageBox(NULL , buf , "" , MB_OK);
にしてもダメでした。


857 名前:デフォルトの名無しさん :2006/02/28(火) 15:29:33
なんか君は色々とダメだなあ

858 名前:デフォルトの名無しさん :2006/02/28(火) 15:34:09
>>856
全く同じプログラムで、前者の
>printf( "%d" , A );

>char buf[256];
>wsprintf(buf , "%d" , A);
>MessageBox(NULL , buf , "" , MB_OK);
にすると表示が変ということですか?

他所のプロセスなので実際に値が違っている可能性も
あると思いますが、そこは確認しましたか?

859 名前:デフォルトの名無しさん :2006/02/28(火) 15:40:19
wsprintf使うならTCHAR buf[256]にしとけ。

860 名前:デフォルトの名無しさん :2006/02/28(火) 16:27:07
>>847
カーネルによって、自動的にミューテックスオブジェクトの参照カウンタがデクリメントされる。
ほかに、"unique"という名前のミューテックスオブジェクトを参照しているプロセスがない場合、
自動的に破棄される。

CloseHandle()せずにプロセスが終了すると、リークするんじゃないか、
などという心配は無用。

861 名前:デフォルトの名無しさん :2006/02/28(火) 16:29:32
解決しました。そしてレス下さった方ありがとうございます。
下記のソースでハンドルの取得にミスがありました。
プロセスハンドルhWndと書いていることからお察し下さいorz お騒がせしました。

862 名前:デフォルトの名無しさん :2006/02/28(火) 18:03:50
>857
ワラタ。

863 名前:デフォルトの名無しさん :2006/02/28(火) 18:07:49
>859
>wsprintf使うならTCHAR buf[256]にしとけ。
wsprintf使うならwchar_t buf[256]にしとけ。
_stprintf使うならTCHAR buf[256]にしとけ。
なのでは?


864 名前:デフォルトの名無しさん :2006/02/28(火) 18:12:32
>>863
wsprintfはWindowsAPIだ

865 名前:デフォルトの名無しさん :2006/02/28(火) 18:13:17
>>863みたいなのが絶えないのは、
MSが安直にwsprintfなんて*API*を作ってしまったせいだ。

866 名前:デフォルトの名無しさん :2006/02/28(火) 18:15:41
>>863

int wsprintf(
  LPTSTR lpOut, // 出力バッファ

867 名前:デフォルトの名無しさん :2006/02/28(火) 18:21:22
wsprintfとswprintfは紛らわしいな。

868 名前:デフォルトの名無しさん :2006/02/28(火) 19:53:05
ATL/WTLのスレから誘導されてきました。
質問は次の内容になります、何方か情報ありましたらよろしくお願いします。

> VBやJScriptのようCOMを#importなどを使わずに動的に呼び出したいんですけど、例えば次のように、
>
> VBの場合、
> Set fso = CreateObject("Scripting.FileSystemObject")
>
> JScriptの場合、
> fso = new ActiveXObject("Scripting.FileSystemObject");
>
> 方法ご存じでしたらよろしくお願いします。


869 名前:デフォルトの名無しさん :2006/02/28(火) 20:07:35
CoCreateInstanceは動的ではなかったのか・・・


870 名前:デフォルトの名無しさん :2006/02/28(火) 20:46:37
LoadLibraryして、DllGetClassObjectから始めるのかもしれない。

871 名前:デフォルトの名無しさん :2006/02/28(火) 22:07:05
>>868
COMのディスパッチインターフェースとオートメーションを勉強してきてね。

872 名前:デフォルトの名無しさん :2006/02/28(火) 22:14:31
>>868
#import でも多分>>868が必要としている程度には動的だから、
おとなしく #import を使うのが良いと思う。

873 名前:デフォルトの名無しさん :2006/02/28(火) 22:34:02
>>868
もちろんそれ以上に動的になんでもやれる方法はある。(>>871)
しかしあまりにも面倒すぎてわけわからないから、
868が混乱をきたさないよう敢えて皆触れずにいるということに気付け。

874 名前:デフォルトの名無しさん :2006/02/28(火) 22:35:20
お前らは868サンの凄さを知らない…

875 名前:デフォルトの名無しさん :2006/02/28(火) 22:38:50
>>871
IDispatchは簡単でよいけど、C++ が VB に負けるのはシャクだから
ここはやはりITypeInfoからインタフェイス情報を得てアセンブラコード経由で
vtableインタフェイスで呼び出すべき。

ん?VBのvtable呼び出しはearly bindingだったか・・・

876 名前:デフォルトの名無しさん :2006/02/28(火) 22:53:19
>>868
こ、こうかな・・・

ifstream vbs("com.vbs");
vbs << "Set fso = CreateObject(\"Scripting.FileSystemObject\")" << endl;
vbs.close();
system("com.vbs");



CoInitializeとかCoCreateInstanceとかのあたりかな・・・

877 名前:デフォルトの名無しさん :2006/02/28(火) 22:53:47
メニューやツールバーのボタンの上にマウスを持って行くと、
ステータスバーに説明が表示されるアプリが良くありますが、
あれってどうやって実装してるんでしょうか?


878 名前:デフォルトの名無しさん :2006/02/28(火) 22:57:47
>>875
IDispatch経由でしかメソッド・プロパティを公開しないdispinterfaceというものもある。

879 名前:デフォルトの名無しさん :2006/02/28(火) 23:00:46
>>877
ツールチップ

880 名前:デフォルトの名無しさん :2006/02/28(火) 23:04:57
>>877
SB_SETTEXT
かなあ…

881 名前:デフォルトの名無しさん :2006/02/28(火) 23:21:33
>>879
いえ、それはまた別のものです、はい

>>880
SB_SETTEXTでステータスバーに文字列を出す部分は分かるのですが、
問題は、そのタイミングをどうやって知るのかわからなくて
WM_MENUSELECTはポップアップメニューを開いた時しか来ませんでしたし・・・
NOTIFYメッセージも数有りすぎて良く分からないのが現状です・・・orz

882 名前:デフォルトの名無しさん :2006/02/28(火) 23:38:19
>>881
>WM_MENUSELECTはポップアップメニューを開いた時しか来ませんでしたし・・・

普通のコマンドメニューでもセパレータでも来ますよ。
前に使ったことあるし、今Spy++でも確認しますた。

883 名前:デフォルトの名無しさん :2006/02/28(火) 23:55:28
>>877
MFCのソース見れ

884 名前:800 :2006/03/01(水) 00:03:18
>>802-807

結局以下のようにして解決ということにしました。
どうも〜。

TIMER部分
if (HIBYTE(GetAsyncKeyState(VK_UP))) scroll(VK_UP), flag=false;

KEYUP部分
if (flag==false) {
 while (!smooth_stop(wp)) {
  ...
 }
}
flag=true;


885 名前:・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/01(水) 00:03:46
MFCのソースってPro以上じゃないと見れなくね?

WTLでも使えるがソースよく読んだことないや

886 名前:デフォルトの名無しさん :2006/03/01(水) 00:11:24
>>877
MenuHelpっていうAPIで全部勝手にやってくれる。

887 名前:デフォルトの名無しさん :2006/03/01(水) 01:00:53
そのアプリがアクティブになっていなくても
マウスやキーボードの入力を監視して
必要なら自分で処理してその入力を握りつぶすような処理は
どうやってやればいいんでしょうか?

888 名前:デフォルトの名無しさん :2006/03/01(水) 01:01:10
>>885
2003スタンダード版には付いてたぞ。

889 名前:デフォルトの名無しさん :2006/03/01(水) 01:30:15
インスタンスハンドルって、EXEを実行した毎に変わるもんじゃないの?
同じEXE複数同時に実行しても同じ値しかでないんだけど。気のせいかな。

ソースはこんな感じです。

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{

char A[10];

sprintf(A,"%d",hInstance);
MessageBox(NULL,A,"インスタンスハンドルの値",MB_OK);

return 0;
}


890 名前:デフォルトの名無しさん :2006/03/01(水) 01:31:55
そのインスタンスハンドルが変わってたのはWin16まで。

891 名前:デフォルトの名無しさん :2006/03/01(水) 01:45:59
>>890
Win32ではインスタンスハンドル変わらなくていいんですか?
売ってた本には
「インスタンスハンドルはOSがそれぞれのインスタンスを識別するために〜」
的なことが書いてあったんですが。


892 名前:デフォルトの名無しさん :2006/03/01(水) 02:24:19
>>887
フック

893 名前:デフォルトの名無しさん :2006/03/01(水) 02:27:34
OSはXPsp2で処理系はBCC5.5.1です

エントリーポイントがWinMainではなくmainの場合
どうしてもDOS窓が出現してしまいます。
もしmainの場合このDOS窓を出現させる事をさせなくする手法はありますか?

894 名前:デフォルトの名無しさん :2006/03/01(水) 02:33:13
windowsでウィンドウをクラス化する時に、GetWindowLongPtrの、GWLP_USERDATAに
自分のポインタを突っ込む方法が使われてたと思うのですが、
64bit版では使えなくなってしまいました。

他の何か良いアイデアで解決された方居ませんか?

895 名前:デフォルトの名無しさん :2006/03/01(水) 02:38:00
>>893
すまんが意味がまったく分からん
もうすこし説明を頼む

896 名前:デフォルトの名無しさん :2006/03/01(水) 02:42:10
>>894
Set/GetProp

897 名前:・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/01(水) 02:45:26
>>893
コンソール上で動くからコンソールアプリケーションなの。
素直にWinMainで始まるアプリ使いましょう。

mainの前処理に、コンソールウィンドウを作成・割り付ける処理が入ってるから
それをどうにかするのは無理。

ただ、あとで隠す方法はあるにはある。


ただし、こんなことやったら大目玉食らうぜ

   ShowWindow(GetForegroundWindow() , HW_HIDE);

まさに邪道

898 名前:894 :2006/03/01(水) 02:47:04
>>896
ありがとうございました。

899 名前:・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/01(水) 02:48:09
訂正

ShowWindow(GetForegroundWindow() , SW_HIDE);


こんなことやったら、自分でコマンドプロンプト開いてコマンドラインから呼び出した時に
コンソール画面が消えちゃうからね。
だから、絶対やらないの。

900 名前:デフォルトの名無しさん :2006/03/01(水) 02:48:43
>>897
はぁそうですか

901 名前:デフォルトの名無しさん :2006/03/01(水) 02:52:47
>>899
はいはい、ワロスワロス

902 名前:デフォルトの名無しさん :2006/03/01(水) 03:12:40
>>891
インスタンスハンドルってのは、実はモジュールのベースアドレスを指す
ポインタそのもの。

Win16では全てのプロセスが同じメモリ空間で動いていたから、各プロセスは
お互いに重なり合わないように別のアドレスにロードされていたので、
プロセスごとにインスタンスハンドルが異なっていた。

Win32ではプロセスは自分専用のメモリ空間を持っていて、プロセスごとに
リロケート(再配置)する必要がないので、通常は実行可能ファイルに記載された
ベースアドレス通りに読み込まれる。

インスタンスハンドルはプロセス内でのモジュールを識別するためのもので、
異なるプロセス間でのやり取りに使われる物ではないので、同じプロセス内で
一意であれば問題ない。

同じ実行ファイルの別インスタンスを識別するには、プロセスハンドルを使う。
(プロセスハンドルまで必要になるのは稀で通常はウィンドウハンドルで十分)

903 名前:デフォルトの名無しさん :2006/03/01(水) 08:28:52
>>882
あれ、そうですか・・・?
やり方悪かったかなぁ・・・
もう一度やってみます

>>886
MenuHelpは、Inset表示にしてても勝手にプレーンな表示されちゃうんでちょっと・・・

904 名前:デフォルトの名無しさん :2006/03/01(水) 12:39:01
>>877
うろ覚えだけど
WM_NCHITTEST
じゃねーの?
これのHITTESTCODEみる
自前処理ならって前提

905 名前:デフォルトの名無しさん :2006/03/01(水) 12:41:53
>>894の話は本当?
俺は使えなくなったなんて話、聞いたことがない。

906 名前:デフォルトの名無しさん :2006/03/01(水) 12:50:35
>>897
せめてFreeConsole()を使おうぜ……。

907 名前:デフォルトの名無しさん :2006/03/01(水) 12:51:11
>>894みたいに勝手に勘違いしてデマを広める救いようのない人間が、
堀江メール事件のような事件を起こすんだろうな。

908 名前:デフォルトの名無しさん :2006/03/01(水) 12:54:49
>>893
BCCでできるかは知らんけどsubsystemとエントリーポイントが
別々に指定できるのなら可能。

909 名前:デフォルトの名無しさん :2006/03/01(水) 13:59:04
あるプロセスに DLL から SetWindowsHookEx(WH_GETMESSAGE, GetMessageProc, ...) で
フックを欠けたのですが、この場合、まずプロセスの本来のメッセージ処理ルーチンを通ってから、
フックした GetMessageProc に来るので正しいでしょうか?
だとしたら、この順番を逆に、まず自前の GetMessageProc を通るようにすることはできますか?

910 名前:デフォルトの名無しさん :2006/03/01(水) 13:59:07
>>893
ILINK32を使い、C0X32.OBJを渡しておきながら/aaを指定すればよい。
BCC32からは無理だと思う。

こういうことは本当はBCCのスレへ行け。

911 名前:デフォルトの名無しさん :2006/03/01(水) 14:02:08
>>909
それ、逆


912 名前:デフォルトの名無しさん :2006/03/01(水) 14:14:52
main()ではじめてもコンパイラ(リン化)へのオプションで
コンソールアプリじゃなくできないのか?
てかランタイムやローダの問題と思うのだが…。
WinMainはやっぱ不自然。

913 名前:デフォルトの名無しさん :2006/03/01(水) 14:17:50
>>912
だからできるってば。

914 名前:デフォルトの名無しさん :2006/03/01(水) 14:53:16
>>912
> WinMainはやっぱ不自然。
そうは言ってもな、おとなしくWindowsの流儀に従っておくが吉。
argc,argvが使いたいというのなら、VCの場合は、それと同じ
内容を持つグローバル変数がある。(__argc,__argvだっけ?)
BCは知らん。

915 名前:251 :2006/03/01(水) 14:54:14
レスが貰えず、自力でも解決できなかったので
もう一度だけ書き込みます。
何か分かることがあればご教示願います。

> アクティブウインドウにキー入力を送信するのに
> SendInput や keybd_event などがありますが、
> 一部のウインドウに対しては全く動作してくれません。
> SendMessage WM_KeyDownなどでもだめでした。
> (おそらくDirectInputで入力を拾っているためだと思います)

> しかし、JoyToKeyというフリーソフトではそのようなウインドウに対しても
> キー入力を送信できているので、なにかしらいい方法があるはずです。
> どのような方法を使えばキー入力を行うことができると思いますか?


916 名前:デフォルトの名無しさん :2006/03/01(水) 14:56:48
>>915
JoyToKeyの作者に聞くという方法はどうだろう。


917 名前:デフォルトの名無しさん :2006/03/01(水) 15:05:30
>>912
嫌ならそうMSに要望でも出しとけば?
他人の作ったもの使っておいてその流儀が嫌だとか言われてもな

918 名前:デフォルトの名無しさん :2006/03/01(水) 15:19:08
>>915
それね、
JoyToKeyは、keybd_eventを使っているが、
まあ、これからはそういうコードを書くべきではない。
SendInput()を使うべき。


で、DirectInputとかはどうすればいいのかって話だけど。
KEYBDINPUT構造体の説明をしっかり読んでいれば、簡単にわかるはず。
まあ、ここは自分も苦労したしね。

答えは、スキャンコードで指定すること。
Windowsで、普通使うのは、仮想キーコードだから、
スキャンコードに変換してやらなければならない。
直接やってもいいけど、MapVirtualKey()というAPIがある。

919 名前:デフォルトの名無しさん :2006/03/01(水) 15:22:52
>>918
え? JoyToKey は keyboard mini driver 経由じゃないのか?

920 名前:918 :2006/03/01(水) 15:26:00
>>919
昔、ごにょごにょして調べてみたら、keybd_event()使っていた。
で、引数に渡している値が変だったから、調べてみたら、スキャンコード使っていた。

keybd_event()でスキャンコード指定ができるというのは、
確かMSDNには書かれていないんだけどね。

ちゃんと明示されている、SendInput()を使うのか吉。

921 名前:デフォルトの名無しさん :2006/03/01(水) 15:29:26
>>920
おお thx

>keybd_event()でスキャンコード指定ができるというのは、
>確かMSDNには書かれていないんだけどね。
平気でスキャンコードおくってたけど…
確かに載って無いなw (bScan が NOT USE になってるし)


明示されてる SendInput() を使うべきだろうね

922 名前:デフォルトの名無しさん :2006/03/01(水) 15:33:34
>>918
そういえば、MapVirtualKey()ってカーソルキーが上手く
変換できなかった記憶があるけど、なんでだろう?

だいぶ前の記憶なんて曖昧だが、たしかVK_RIGHT等を渡すと
テンキーのコードが返ってきた気がする。

923 名前:デフォルトの名無しさん :2006/03/01(水) 16:18:09
>>922
NumLock との兼ね合いで 多対1対応 になるからじゃね?

924 名前:デフォルトの名無しさん :2006/03/01(水) 16:28:23
困ります

925 名前:デフォルトの名無しさん :2006/03/01(水) 16:40:19
勝手に困ってろ

926 名前:915 :2006/03/01(水) 16:55:47
回答ありがとうございます。
頂いた情報を元にコードを組んでみたのですが、万事解決とまでは行きませんでした。
delphiで申し訳ないですけど、下記のように書いたところ
一般のプログラムではキー入力が行われますが、DirectInputっぽいソフトでは
うまく動きません。何かおかしいでしょうか?

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i: Integer;
  a: array[0..1] of TInput;
begin
  for i := 0 to 1 do begin
    a[i].Itype := INPUT_KEYBOARD;
    a[i].ki.wVk := Ord('C'); // SCANCODE使用時は無視される
    a[i].ki.wScan := MapVirtualKey(Ord('C'), 0);
    a[i].ki.dwFlags := $08; //KEYEVENTF_SCANCODE
    if i = 1 then a[i].ki.dwFlags := $08 or $02; //KEYEVENTF_SCANCODE or KEYEVENTF_KEYUP
    a[i].ki.time := 0;
    a[i].ki.dwExtraInfo := GetMessageExtraInfo();
  end;
  SendInput(2, a[0], SizeOf(a[0]));
end;

927 名前:894 :2006/03/01(水) 17:34:49
>>905
>>907
ポインタでもハンドルでもない、GWLP_USERDATAの値が64ビットに拡張されたという情報は見つけられませんでした。
もし情報があるなら教えて頂けると助かります。

928 名前:デフォルトの名無しさん :2006/03/01(水) 17:44:51
>>927
ttp://windowssdk.msdn.microsoft.com/library/default.asp?url=/library/en-us/win64/win64/rules_for_using_pointers.asp

929 名前:デフォルトの名無しさん :2006/03/01(水) 18:07:34
>>927
なんのためのGet/SetWindowLong「Ptr」だと思っている。

930 名前:918 :2006/03/01(水) 18:13:02
>>926
よりによってDel厨か……。
個人的に、PASCALの文法は、あまり好きになれないな。

文法をよく知らないから、間違っているのかもしれないが……

 >if i = 1 then a[i].ki.dwFlags := $08 or $02; //KEYEVENTF_SCANCODE or KEYEVENTF_KEYUP
これが気になる。
これひょっとして、

if (i == 1)
  a[i].ki.dwFlags = KEYEVENTF_SCANCODE ;
else
  a[i].ki.dwFlags = KEYEVENTF_KEYUP ;

こういう意味なんじゃないのか?
だったら、動かないのは当然だが。

>dwFlags
>Specifies various aspects of a keystroke. This member can be certain *combinations* of the following values.

キーをあげるときは、こうする。
dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP ;

それからもひとつ。
キーを押し下げてから、あげるまでに、ディレイが必要なこともある。
特に、ゲームなどだと、キーが押し下げられた時間などが、必要なことが多いし。


931 名前:デフォルトの名無しさん :2006/03/01(水) 18:16:26
横からだが or は論理or だろ

932 名前:デフォルトの名無しさん :2006/03/01(水) 18:17:23
> 文法をよく知らないから、間違っているのかもしれないが……
ああ、間違ってる

933 名前:918 :2006/03/01(水) 18:20:57
間違っていたから無視してくれ。

キーの押し下げ押し上げの間に、適当にディレイをはさんでもダメだったら、わからない。

934 名前:デフォルトの名無しさん :2006/03/01(水) 19:22:42
>>926
SendInputの戻り値は?

935 名前:デフォルトの名無しさん :2006/03/01(水) 19:31:01
>>927
間違えたときには誤ろうよ。

936 名前:デフォルトの名無しさん :2006/03/01(水) 19:43:27
間違えたのならそれはすでに誤っている。

937 名前:926 :2006/03/01(水) 20:59:43
>>934
SendInputの戻り値は 0 なので、「ほかのスレッドによって入力が
すでにブロックされている」らしいですが、具体的な意味が分かりません。

適当にDelayを入れてみたり、得意じゃないけどC++で
書き直してみたりしたんですが、やはり思ったようには動作していないです。
GetLastErrorを呼ぶと 127 が返って来ていたので
エラーメッセージを取得しようとFormatMessageの使い方を
調べていたというのが今の状況です。

938 名前:デフォルトの名無しさん :2006/03/01(水) 21:16:46
>>911
あれ、逆でしたか。実際にDLLつくって試したところ、
本来来ているはずのWM_ACTIVATEやWM_KILLFOCUSなどが全然捕まらなかったので、
てっきり元のプログラムが吸い取っているのかと・・。
なにか勘違いしているようなので、調べ直してみます。
ありがとうございました。

939 名前:デフォルトの名無しさん :2006/03/01(水) 21:19:28
>>937
winerror.h
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/randz/protocol/winerror_h__part_1.asp

940 名前:デフォルトの名無しさん :2006/03/01(水) 21:36:02
>>937
127 : 指定されたプロシージャが見つかりません。

941 名前:デフォルトの名無しさん :2006/03/01(水) 23:01:46
>>938
>本来来ているはずのWM_ACTIVATEやWM_KILLFOCUSなどが全然捕まらなかった
それはメッセージがsendされるか、postされるかの違いかと思われ。
確か、WH_GETMESSAGEはpostされるメッセージを補足する
ようだった気がする。

942 名前:デフォルトの名無しさん :2006/03/01(水) 23:14:50
あるウィンドウが受け取る全てのメッセージに絡みたいなら、SetWindowsHookExで目的のウィンドウが属するプロセスにDLLを仕込んだ後、
適当なメッセージをPostMessageし、そのメッセージ処理で目的ウィンドウをサブクラス化。

じゃなかったか?

943 名前:デフォルトの名無しさん :2006/03/02(木) 02:27:56
キーの組み合わせで登録したアプリケーションを起動するランチャーを作っています
今はPeekMessageでメッセージループを回して、メッセージがないときに
GetAsyncKeyStateでキーボードの状態をチェックしていますが、
この方法ではCPUにかなり負荷がかかってしまいます。
適当にSleepさせればある程度押さえられるのですが、この場合
キーボードの状態をチェックし損なう確率が高くなってしまいます。
何かいい方法はありませんでしょうか?

944 名前:デフォルトの名無しさん :2006/03/02(木) 02:35:59
アクセラレータじゃ駄目なんか?

945 名前:デフォルトの名無しさん :2006/03/02(木) 02:54:24
フック、ストレート、アッパー!

946 名前:デフォルトの名無しさん :2006/03/02(木) 03:23:19
MDIについて質問です。
子ウインドウを新規で作るときに最大化しようと重いmdicreate.styleにWS_MAXIMIZEを指定しました。
そうすると、メニュー書き換えのときに子ウインドウのアイコンが2個表示されたりします。

メニューの書き換えは子ウインドウプロシージャにWM_MDIACTIVATEがきたら
WM_MDISETMENUで書き換えてます。

なにか解決策はないでしょうか?

947 名前:デフォルトの名無しさん :2006/03/02(木) 03:28:43
基本はジャブ

948 名前:デフォルトの名無しさん :2006/03/02(木) 03:58:18
>>943
ランチャがアクティブでないときにもキーを受け付けたいなら
RegisterHotKey()を使うといいかと。

949 名前:デフォルトの名無しさん :2006/03/02(木) 12:44:28
>>943
キーフックと言う手も

950 名前:デフォルトの名無しさん :2006/03/02(木) 13:01:33
>>948
ありがとうございます!
それならなんか出来そうな気がするのでやってみます
>>949
キーフック、聞いたこないですけどとりあえずググって試してみようと思います。。

951 名前:デフォルトの名無しさん :2006/03/02(木) 19:48:17
自前アプリをタスクマネージャで監視すると、常に「Page Fault Delta」が発生していてパフォーマンスが著しく低下してしまうんですが
回避方法はありませんか?
よろしくお願いします。


952 名前:デフォルトの名無しさん :2006/03/02(木) 19:57:13
SetProcessWorkingSetSize

953 名前:デフォルトの名無しさん :2006/03/02(木) 20:05:46
メモリをもっと積むんだ。
んでもって、ページファイルの設定をなしにするんだ。

954 名前:デフォルトの名無しさん :2006/03/02(木) 21:17:30
疑問なんですが、上のほうにちらっと出てきたキーフックだけど、グローバルフックしてる最中にアプリがシボンヌしたらどうなるんでしょ。
その辺の回避策として、アプリが死んでもちゃんとデタッチできる様にDLLじゃないとできなくなってるんでしょうか?

955 名前:デフォルトの名無しさん :2006/03/02(木) 21:42:35
そういうこと

956 名前:デフォルトの名無しさん :2006/03/02(木) 22:09:59
LONGLONGの変数をLONG2つ(上位と下位)に分けるときってどうやってる?

957 名前:デフォルトの名無しさん :2006/03/02(木) 22:14:45
manifestがあると、
ユーザの側でLUNAが有効無効にかかわらず、GetBkColor()が白を返すです。

どうして表示されてるダイアログは灰色なのに白が返ってくるですか?

958 名前:デフォルトの名無しさん :2006/03/02(木) 22:17:07
>>956
LARGE_INTEGER

959 名前:デフォルトの名無しさん :2006/03/02(木) 22:45:38
HILONG LOLONG

960 名前:デフォルトの名無しさん :2006/03/02(木) 22:58:27
POTELONG

961 名前:デフォルトの名無しさん :2006/03/02(木) 23:35:58
どなたか>>946の解決策わかりませんでしょうか?

あと書き忘れてましたが、プログラミングWindows第\5版についてたMDIサンプルプログラムで同様のことをためしても同じ現象が発生しました。

962 名前:デフォルトの名無しさん :2006/03/02(木) 23:56:47
タスクトレイのアイコンって16*16以上のものを表示するのは無理でしょうか?
たとえば、32*16のように横長表示にして、6文字くらいの文字列(主に数字)をしたいのですが。

963 名前:デフォルトの名無しさん :2006/03/03(金) 00:09:02
TOPMOSTなウィンドウ作った方が使いやすいだろ。
あるいはTClock2chのエリアを間借りさせてもらうとか。

964 名前:デフォルトの名無しさん :2006/03/03(金) 00:36:24
わっかりました、親方。

965 名前:デフォルトの名無しさん :2006/03/03(金) 00:40:38
>>964は左官屋のタメ

966 名前:デフォルトの名無しさん :2006/03/03(金) 00:51:46
>>963
やはりフックしないと無理ですか・・・。
なるべく目立たないプログラムを作ろうとしてたんですが、
TOPMOSTなウインドウで我慢します。

967 名前:デフォルトの名無しさん :2006/03/03(金) 00:53:14
シンナーに気をつけてフックしな

968 名前:デフォルトの名無しさん :2006/03/03(金) 05:07:57
GetIconInfo()について質問です。

GetIconInfo()で取得したICONINFO構造体のhbmMaskとhbmColorは
DeleteObject()しないといけないんでしょうか?

969 名前:デフォルトの名無しさん :2006/03/03(金) 08:53:23
>>957
っmanifestを削除する

970 名前:デフォルトの名無しさん :2006/03/03(金) 11:02:51
>>968
MSDNに書いてあるがな

971 名前:デフォルトの名無しさん :2006/03/03(金) 11:05:08
質問させていただきます。

既製のゲームの補助ツールを作りたいと考えています。
ツールからでゲーム内の情報を参照したい (所持金、現在位置など) と
思っているのですが、検索エンジンで調べてみても、他プロセスの変数は
基本的に参照できないという情報しか得られませんでした。
しかし、実際にそのようなツールは存在するわけでして……

自分で作ったプロセス間で通信する方法はわかるのですが……

どのようにして実装しているのか、わかる方がいらっしゃいましたら、
どうかご教授お願いします。

972 名前:デフォルトの名無しさん :2006/03/03(金) 11:33:44
そういうツールは人に質問しなきゃ作れないやつが手を出す物ではないな。

973 名前:デフォルトの名無しさん :2006/03/03(金) 11:35:06
>>971
変数は参照できないわな

逆アセンブルとかで
見たい変数がどこのアドレスにあるかを調べて、
ReadProcessMemoryかけてるだけ

974 名前:971 :2006/03/03(金) 11:45:21
ありがとうございます。
方法すらわからなかったもので……

もっと精進します。ありがとうございました。

975 名前:デフォルトの名無しさん :2006/03/03(金) 12:57:02
>>974
間違った方向に精進するなよ。

976 名前:デフォルトの名無しさん :2006/03/03(金) 13:12:18
>>970
すみません、日本語の方しか見ていませんでした。
英語の方にちゃんと書いてあるとはorz

977 名前:デフォルトの名無しさん :2006/03/03(金) 13:37:23
ウインドウの形状を変えたいのだけど、レイヤーウインドウでなくて、98やMEでも動くマスクウインドウみたいのがあったと思うんですけど、
情報ありましたら教えてください、サンプルなどあると助かります。
よろしくお願いします。


978 名前:デフォルトの名無しさん :2006/03/03(金) 13:40:55
WMP9みたいなのか?うざす。
よけいなお世話だと思うが。

979 名前:977 :2006/03/03(金) 13:46:13
>978
だいじょぶです、うざく無いの作りますから。
そして、僕もうざく無いです。


980 名前:デフォルトの名無しさん :2006/03/03(金) 13:47:59
>>977,979
SetWindowRgn()でどうだ?

981 名前:977 :2006/03/03(金) 13:52:32
>980
>SetWindowRgn()でどうだ?
GIFとかの抜きカラーみたいにして抜けるやつがいんですが。
ご存じないでしょうか?


982 名前:デフォルトの名無しさん :2006/03/03(金) 13:55:44
>>981
自前でシコシコどうぞ。

というか、いまさら9xなんて考えたくないな。
MSすら捨てているし。

983 名前:977 :2006/03/03(金) 14:12:51
>980
失礼!、SetWindowRgn()で実現できそうでした。
これ参考になりそうです。
http://www.codeproject.com/dialog/CRegionCreator.asp
http://www.codeproject.com/dialog/BitmapHandling.asp


984 名前:980 :2006/03/03(金) 14:13:17
>>981
マスクカラーで型抜きするのは自分で実装するのでは?
ビットマップでスキン画像用意して
それを走査してリージョン作ってSetWindowRgn()するんだと思うけど。

codeprojectでSetWindowRgnで検索
ttp://www.codeproject.com/dialog/CRegionCreator.asp
ttp://www.codeproject.com/dialog/BitmapHandling.asp
ttp://www.codeproject.com/gdi/rgncreator.asp
中身確かめてないけどたぶん参考にはなるでしょ


985 名前:977 :2006/03/03(金) 14:21:25
↑すげぇ、偶然にも同じとこ見てた。
980さん、ありがとうございます。


986 名前:デフォルトの名無しさん :2006/03/03(金) 14:28:02
おれは>>981を見た時点で、SetWindowRgn()でいけるのに、うざいやつだな


と思った

987 名前:デフォルトの名無しさん :2006/03/03(金) 17:45:08
ウインドウスタイルの「WS_EX_TOOLWINDOW」でタスクバーへの表示を、on/off出来るようにしたんだけど直ぐには反映されず、
ALT+TABでアプリ切り替えなどをすると初めて表示される、これをたちどころに反映させるようにしたいんですけど、
どのようにすればいんでしょうか?
あと、これも同じ現象なんですが「WS_VISIBLE」でも同じような事が発生します。
よろしくお願いします。


988 名前:デフォルトの名無しさん :2006/03/03(金) 18:40:35
よくわからんけど、
hide/showしてみるとか
SHChangeNotify投げてみるとか
多分違うけどSHAppBarMessage

989 名前:デフォルトの名無しさん :2006/03/03(金) 18:55:04
SetWindowLong() を使っているんなら、解説に書かれていることは問題ないかい?
「SetWindowPos 関数を呼び出すまでは〜」ってあたり。

990 名前:9xユーザ :2006/03/03(金) 20:37:53
>>982
(´・ω・`)

991 名前:デフォルトの名無しさん :2006/03/03(金) 20:51:29
スレ残り少ないですが・・・
Unicode変換で困っています。
SJISのfromからUnicodeのtoへ変換はできたのですが、
動的確保したtoの解放でエラー(HEAP CORRUPTION DETECTED)が発生してしまいます。
これは別に解放する必要はないってことでしょうか?

詳しい方教えてください。
以下プログラムの一部です

DWORD len;
char from[] = "変換対象";
LPTSTR to;

len = MultiByteToWideChar(CP_ACP, 0, from, sizeof(from), NULL, 0);
to = (LPTSTR)malloc(len);
MultiByteToWideChar(CP_ACP, 0, from, sizeof(from), to, len);
free(to);

992 名前:デフォルトの名無しさん :2006/03/03(金) 20:58:53
>>991
ヒープをぶっ壊してる。
to = (LPTSTR)malloc(len * sizeof(WCHAR));

993 名前:デフォルトの名無しさん :2006/03/03(金) 21:17:34
>>992
あ、すっごい初歩的なミスでした・・・
どうもすみません。

994 名前:デフォルトの名無しさん :2006/03/03(金) 21:39:30
sizeof(from)も微妙に気になるな。

995 名前:デフォルトの名無しさん :2006/03/03(金) 21:58:42
strlen(from)

996 名前:デフォルトの名無しさん :2006/03/03(金) 22:04:55
CP_ACP, CP_OEMCPの使い分けが分からない。
コードページは何を指定するのが普通?

997 名前:デフォルトの名無しさん :2006/03/03(金) 22:05:50
sizeof(from)がダメな理由がわからへんので教えてよん

998 名前:デフォルトの名無しさん :2006/03/03(金) 22:09:45
sizeof(from) で合っている。
char *from = "変換対象"; だったら、sizeofじゃだめだけどな。


999 名前:デフォルトの名無しさん :2006/03/03(金) 22:11:25
合ってないよ。

1000 名前:1000 :2006/03/03(金) 22:13:36
>>1-999
とりあえず「Advanced Windows」嫁♥


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.