スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
過去スレ、関連リンクは
>>2-5 くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(
http://msdn.microsoft.com )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvencedWindowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで。
/ ̄/ /  ̄/  ̄/ / / / ̄ / ̄  ̄/ / ̄/ / ̄/ / / / / ̄  ̄/  ̄/  ̄/ / ̄/ / / ̄/  ̄/  ̄  ̄  ̄  ̄  ̄  ̄
母「おい、おまいら!!夕食ができますた。リビングに集合しる!」 父「詳細キボーヌ」 母「今日はカレーですが、何か?」 兄「カレーキターーーーーーーーー」 妹「キターーーーーーーーーー」 姉「カレーごときで騒ぐ奴は逝ってヨシ」 母「オマエモナー」 父 --------終了------- 兄 --------再開------- 妹「再開すなDQNが!それより肉うpキボンヌ」 母「ジャガイモうp」 姉「↑誤爆?」 兄「タマネギage」 父「ほらよ肉>家族」 妹「神降臨!!」 兄「タマネギage」 母「糞タマネギageんな!sageろ」 兄「タマネギage」 姉「タマネギage厨uzeeeeeeeeeeee!!」 母「ageって言ってればあがると思ってるヤシはDQN」 セールスマン「イタイ家族がいるのはこの家ですか?」 母「氏ね」 父「むしろゐ`」 兄「タマネギage」 妹「兄 、 必 死 だ な ( 藁 」
winsockのrecv関数を使ってWebサーバからデータ受信したら CrLfがCrCrLfに変換されているように見えますが 生データを受け取ることは出来ないの?
勝手に変換なんかされねーよ てめーで使ってるファイル入出力ライブラリが変換してるだけだ おめーはprintf("\r\n")でCRLFLFが出力されるのが不満なのか?
イヤです
>>旧スレ995 もう見てないか・・・・ >ファームアップデートした段階で応答なくなっちゃうんです(死 >で、再起動するには抜き差し……と。 実際にデバイスマネージャからやってみればわかるが、デバイスの無効・有効や、削除・変更 スキャンでは、デバイスの電源は落ちない。 したがって、デバイス側マイコンのパワーオンリセットを期待しているならNG。 デバイスドライバでPoRequestPowerIrp()を用いて電源をオフする手法もあるが、一部ハブや ルートハブでは、電源オフされないものあり。 したがって、 >ファームアップデートした段階で応答なくなっちゃうんです(死 をなんとかするしかない。
ちょっくら他プロセス(自作、ウィンドウあり)から、少量の情報が欲しい状況です。 SendMessageをネストさせて 1. 情報が欲しいと思った 2. 自分=>相手に適当にSend 3. 相手=>自分にWM_COPYDATAをSend 4. 自分のCOPYDATAハンドラでデータを保存 5. 処理続行 とすると名前付きカーネルオジェクトも不要で、簡単で良いと思いました。 3.と4.の処理が重いと危険な匂いがしますが、これらが充分少量な処理ならば これは設計としてアリでしょうか?
>>11 4は3への返答をさっさとしてからゆっくりやればいい。
安定性を過度に求めるんでなければ別に問題はないぞ。
アリじゃねーの? 昔っから使われてる手法だし
15 :
11 :2006/02/03(金) 18:18:48
>>12 >>13 お返事ありがとうございます!
ネストするのはちょっと不安だったんですが、安心しましたです
親ウィンドウの中に別スレッドで子ウィンドウを作成することは出来ますか?
>11 自分と相手が別スレッドだとデッドロックしないか?
VS.net(VC)でIWebBrowser2つかってプログラム作ろうとしてるんですが、 Debug構成でコンパイルして実行すると下のようなエラーが出て動作しません。 ------------------------------------------------------------------------------ Debug Assertion Failed! Program: ...ttings\umimi\デスクトップ\test\test2.exe File: c:\program files\microsoft visual studio .net\vc7\atlmfc\include\atlcom.h Line: 3534 Expression: !InlineIsEqualGUID(*m_plibid, GUID_NULL) && "Did you forget to pass the LIBID to CComModule::Init?" For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. (Press Retry to debug the application) ------------------------------------------------------------------------------ Release構成だと全く正常に動くんですが・・・。 これ解決法ないですか? デバッガ使えないのはイタイ
GetForegroundWindowで取得したウインドウ内でフォーカスの当たってる コントロールを取得するにはどうすればよいのでしょうか?
>>20 >File: c:\program files\microsoft visual studio .net\vc7\atlmfc\include\atlcom.h
>Line: 3534
ここ見ろよ。
>Release構成だと全く正常に動くんですが・・・。
正常に動いているように見えるだけ。
assertが出るって事は、何かミスしてる事を知らせてる。
24 :
20 :2006/02/03(金) 20:38:20
>>22 ,23
できました。
どうもありがとうございます。
ここで聞いていいのか分かりませんが、 IE7のBeta2が出ているらしいんですが、 IE7が正式リリースされると、コモンコントロールが更新されたり、 PSDKが更新されたりするんでしょうか。 何か面白そうな機能は付かないかな。
MSDNの更新API一覧みればいいんじゃね?
27 :
デフォルトの名無しさん :2006/02/03(金) 23:02:52
>>11 >ネストさせて
2.と3.がネストしてて同一スレッドで投げ受けだと
固まるよね?
やっぱり Linux で遊ぶより、 Win32API の使いかたとか 勉強してた方が飯の種になるのかな。
スレタイy… えーと 生活相談もありか?
師ね
>>30 師を探すことにします。どうもありがとうございました。
コマンドプロンプトの画面を消去しないで上書きするにはどのようにすればいいでしょうか?
>>34 同じ行ならputchar('\r');で先頭カラムに戻る。
#後はしらね。
>>35 どうも ん〜なんとかやってみます
わからなかったらまた来るかもしれません
37 :
前869 :2006/02/04(土) 14:27:30
前872
|
>>869 |英語版も合わせてよく読め。SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE を
|指定するのは、SetForegroundWindowの動作を、95,NT4と同じようにするために
|アプリのインストール時に恒久的に変更する場合のことだ。
アプリのインストール時に恒久的に変更する必要は無い、SetForegroundWindowを
呼び出す直前にFOREGROUNDLOCKTIMEOUTを一時的に変更する方法で問題無いという
指摘と思います。
英語版 KB97925
On Microsoft Windows 98 and Microsoft Windows 2000, SetForegroundWindow
is subject to limitations.
If an application requires that SetForegroundWindow behave the same
on all platforms, the foreground lock timeout value should be changed
when the application is installed.
On Windows 2000, the SystemParametersInfo call fails unless the
calling thread can change the foreground window, so this must be
called from a setup or patch application.
私はこれは、Windows 2000ではSystemParametersInfoでFOREGROUNDLOCKTIMEOUTを
変更するためには呼び出し元のスレッドでフォアグラウンドウィンドウを変更
できる必要があり、そのためにはアプリのインストール時にFOREGROUNDLOCKTIMEOUT
値を恒久的に変更する必要がある(SetForegroundWindowを呼び出す直前に一時的
に変更する方法では駄目)と読み取りました。
そう考えたのは一時的に変更するタイミングでアプリがフォアグラウンドウィンドウ
を変更できる保証は無いが、アプリのインストールプログラムは使用者によって
フォアグラウンドウィンドウにされている状態が必ずあるはずなので
SystemParametersInfoを成功させることができると考えました。
恒久的に変更する必要は無いというのはなぜでしょうか。
>>17 デッドロックはしない。
他スレッドへSendしている最中のスレッドがSendされると
Windowsがウィンドウプロシージャを直に呼び出す。
詳しくはAdvanced Windows読め。
>>35 >>38 いろいろやってみたんですが
どうもうまく行きません
カーソルの位置が問題だと思うんですけど・・カーソルのを特定の場所に持ってくるような
エスケープシーケンスがどうもうちの環境じゃあ使えないようです
図というかMAPみたいのを直接上書きとかは無理なんですか?
また、ググってきます
>>34 SetConsoleCursorPosition()
>>41 凄いほとんどちらつかなくなりました
ありがとうございました
Advanced Windowsに、 「GUI関係の仕事が無い時、GetMessageはスレッドを眠らせる」 とあるんですが、内部的にはWaitForSingleObjectしてると考えて 良いのでしょうか? というのは、ウィンドウを必要としないスレッド間(別プロセス)で 同期とって作業しようと思っていて、 (a) イベントオブジェクト(とか) + WaitForSingleObject (b) あえてウィンドウ作成(不可視) + SendMessage なんかを思いついたんすけど、(b)を選ぶメリットってあるのかなー と思っておるのです。(内部動作が等価なら、あえて選ぶ必要はなさそう)
内部実装はしらんが、きっとそんなもんじゃなかろうか。 > 内部動作が等価なら メッセージキューを自作するぐらいなら、 WindowMessage使ったほうがマシだと思う。
内部的っつーか WaitForもGetMessageも、(もちろんその他のI/Oもだけど) スレッドを「待ち状態」にしてるだけでしょ。 スレッドを待ちにするために わざわざWaitForなどのユーザーランドから呼び出すAPIを使ってるとは (俺には)思えないけどね。
>>44 不可視のウィンドウを作ってやり取りするのは
Windowsアプリケーションではよく使われる手。
それと、どうしてもウィンドウを作りたくないのならば
ウィンドウ無しでメッセージキューを持つこともできるよ。
49 :
44 :2006/02/05(日) 18:58:13
みなさん、お返事ありがとうございました!
>>45 ええ、「俺キュー」を自作するつもりは毛頭ないです。
処理が比較的単純なんで、キュー(WindowMessage)を使うのは
「襷に長し」かなあと感じたのでした。
>>46 なるほどです。「WaitFor...は、待機状態を実現する唯一の低レベルAPI」という
浅はかな思いこみが私にあった事に気づきました。
最終的に実現される『待機状態』は、GetMessageもWaitFor...も変わりはないですよね?
>>47-48 不可視ウィンドウは常套手段なのですか。ならためらう必要もなさそうです。
ウィンドウ無しのメッセージキューについてですが、PostThreadMessageでも
作られる事を学びました。メッセージループは以下の感じでよろしいでしょうか?
#define MYMSG 0
/* ウィンドウが無いので、TranslateもDispatchも不要 */
while(GetMessage(&msg,NULL,0,0)){
if(msg.message==WM_USER+MYMSG) { /* 俺処理 */ }
else if(msg.message==WM_QUIT) { break; }
}
CreateProcessからvbsのファイルを実行するってできますか? 単にvbsのファイル名のみの指定と 「wscript.exe 」を前に付けて実行を試したのですが、実行できません。
当然エラーコードは調べたんだろうな?
>>50 起こらなかったことじゃなくて起こったことを書かないと
あっそう、で終わる
53 :
デフォルトの名無しさん :2006/02/06(月) 01:54:10
>>49 GetMessageはWM_QUITがきたら0を返すので else if... はいらないと思う
あと、
#define MYMSG 0
の後に
WM_USER+MYMSG
するくらいなら
#define MYMSG WM_USER+0
とした方がソース的に見やすいと思う
>>54 かっこつけてみた
(#define) WM_USER+0
格好つけるな!
こうだろが #define MYMSG WM_USER+(0)
いや、こうかな? #define MYMSG WM_USER+0 (笑)
59 :
49 :2006/02/06(月) 04:10:32
またまた皆様お返事ありがとうございました。
>>53 おっしゃる通りです、お恥ずかしいです。(普段のコピペがバレバレ)
>>54-58 どうもです(なんだそれ)
久々のGetMessageネタなのに、 誰も、GetMessageがエラーのときに-1を返すと突っ込まないなんて!
WM_USERって南下と衝突してるんじゃなかったっけ??あいまいだけど。 WM_APPのあと幾らかはユーザー定義しても安全だった気がする。
コモンコントロールが WM_USER〜0x2000ぐらいまで使ってた希ガス
64 :
デフォルトの名無しさん :2006/02/06(月) 07:40:22
アクティブアプリケーションのIMEの状態を取得する方法を教えてください
WM_APP以降にしろよ
ぶっちゃけ、ウィンドウを持ってないスレッドのメッセージなんて どうでもいいけどな。
>>60 GetMessage() が-1を返すのは、ウィンドウハンドルが不正とか
呼び出し側が指定した引数に問題がある場合だけだから、
防御的プログラミングに走る場合以外はチェックしないんじゃないかな。
while (GetMessage(&msg, NULL, 0, 0) > 0) { うーん。場当たり的だ。
69 :
デフォルトの名無しさん :2006/02/06(月) 17:31:47
while ( (GetMessage(&msg, NULL, 0, 0)-1) !< 0) だっけな。
下げ忘れた・・・。
何やねん、その演算子は。
74 :
デフォルトの名無しさん :2006/02/06(月) 18:10:04
while ( (GetMessage(&msg, NULL, 0, 0)-1) > 0); こっちだっけな??
また下げ忘れた・・・。
おまいそれじゃ
>>68 タンと一緒じゃまいか・・・(V)(´Д`)(V)
ぱぱぱぱ、ぱくりじゃないぞ。 -1がちょっとだけ主張してる。はず。
(V)( )(V) カサカサ・・
あ、それあかんわ。 もうぐだぐだ。。。
(V)(´Д`)(V) よし認めよう
(V)(´Д`;)(V) ぇえええええええええええぅ
>>74 それGetMessageがTRUE返してもループ抜けちゃうやん。
何で関西弁で進行
そやな!
GetLastErrorは無しなん?
指定のリムーバブルディスクがEJECT対応しているかどうか調べる事って可能ですか?
見当が付かないなら、そのソフトを落としてみればいいじゃない。 dumpbinやdependency walker等でインポートしているAPIが分かる。
92 :
デフォルトの名無しさん :2006/02/08(水) 11:31:00
サブディレクトリを含むディレクトリをコピーするAPIってありますか? また、サブディレクトリを含むディレクトリの削除はありますか?
>>92 SHFileOperationでできそうな気がする
SHFileOperationとか。
QueryPerformanceCounter/Frequencyってクロック可変な環境で 正しい時間が計測できないという可能性が指摘されてるんですが、 現実問題そういう環境は実在するんでしょうか? 一般論としてもう使うべきではないんでしょうかね。
>>97 SpeedStepとかPowerNowとか。
100 :
デフォルトの名無しさん :2006/02/08(水) 14:58:33
スタンバイ状態にする方法を教えてください
>>100 SetSuspendState自信無し
もう一つのハンガリー表記 実は、ハンガリー表記には未公開の別の表記法が存在(中略)伝統に従って uType だが、実は内部では fuMB_、つまり、MB_ で始まるフラグ値集合の UINT 型。 この未公開のハンガリー表記が使われた未公開のヘッダを使えば、 エディタで MB_ を入力するだけで(中略)ツールにより文書化を効率化できる。 エラーコードをセットする処理は、配布時には不必要かもしれない。 Won98では、エラーコード設定に以下の関数を使う。
WON_NOIMPLマクロは、コンパイル時に実装されていないという(中略) 英語圏の人は、この変数名の意味が読める。 #define WON_NOIMPL(it) \ typedef char it##_is_not_implemented_in_this_API; \ typedef int it##_is_not_implemented_in_this_API; WON_NOIMPLFAIL マクロはエラーコード ERROR_CALL_NOT
(略)これらのマクロは、WINVER、_WIN32、_WIN32_IE などのマクロと 対をなして、プログラムの下位互換性を定義する。 型変換時の間違いを防ぐため、新たにLOWORD_INTとHIWORD_INTが追加された: #define LOWORD_INT(dw) ((INT)(SHORT)LOWORD(dw)) ... MR は、Won2K 以降 UniBulls をサポートしていません。 MR は、法令を遵守する極めて「ノーマルな」集団であり、2006年1月現在、RudeEvilとは無関係です。 MR は、「間違った手段」による Counter Smith Revolution を支持しません。 ソフトウェア開発は、日々進化しています。美しく勝利してください(ajax!)。
105 :
デフォルトの名無しさん :2006/02/08(水) 17:13:14
SetDIBitsToDevice()って(0,0)以外から転送するとおかしくならない?
ならない。
107 :
105 :2006/02/08(水) 17:21:48
BitBltとおなじパラメータでやると変になるんだ
109 :
105 :2006/02/08(水) 17:42:45
111 :
105 :2006/02/08(水) 17:58:55
スレが見れないってこと?コピペでもだめですか? ソースは添付ファイルです
113 :
105 :2006/02/08(水) 18:09:00
それです
>>100 呼び出し側プロセスには SE_SHUTDOWN_NAME特権が必要。
@NT、2000などでExitWindowsEx() or ExitWindows()するサンプルをどっかから
拾ってくる
A以下の一行書き換える。
//ExitWindowsEx( ... );
SetSystemPowerState( TRUE, FALSE );
115 :
デフォルトの名無しさん :2006/02/08(水) 18:12:41
特定アプリ(例えばメモ帳など)のキーをフックするにもdllからじゃないとできませんか?
ハンドル捕まえてサブクラス化は?
117 :
デフォルトの名無しさん :2006/02/08(水) 18:19:01
他のアプリのボタンをクリックしたいのですが、 SendMessageで送るメッセージは何にすれば良いのでしょうか? WM_???
>>117 PostMessage(hButton, WM_LBUTTONDOWN, 0, 0);
PostMessage(hButton, WM_LBUTTONUP, 0, 0);
これでやったらできたけど正しいかはわからない
>>117 SPYで捕まえて、それと同じやつを送れ
120 :
117 :2006/02/08(水) 18:39:01
>>118 でけました。
WM_LBUTTONUPは盲点でした。
それが盲点なようじゃまだまだだな
人の盲点を予測できないようじゃまだまだだな
>>122 とりあえずレーザーで盲点は作れるからおk
自分が開始した訳でもないフックDLLを止めるにはどうしたらいい?
125 :
デフォルトの名無しさん :2006/02/08(水) 19:13:24
>>116 あ、すみません、それするとdllいらずでできそうですか?
ちなみにどんなふうにかけばいいですか?
キーボードのグローバルフックはプロセスに注入することなく使えるからDLL使わなくてもできる・・・ というのをどこかで聞いたことがある
>125 サブクラス化でぐぐれ!
128 :
デフォルトの名無しさん :2006/02/08(水) 19:21:57
どこだか教えてください!!!
GetAsyncKeyStateを使ってキー情報をタイマーで監視し続けるんだ!
別プロセスのウィンドウはサブクラスか出来ないけどな
SetTimerでTimerProcを設定しました、 その後TimerProcのVBでいうIntervalを変更したいんですが、 なにか方法があれば教えてください。
>>132 SetTimer()とKillTimer()しかないわけだから、KillしてSetしなおすしか
ないだろうね。
>>132 KillTimerして再度作るのが妥当かと
KillTimerする必要は無いな。
>>135 kwsk
削除しないと永遠に発生するもんじゃなかったっけ・・・?
kwskもへったくれも無い。ヘルプ嫁。
138 :
133 :2006/02/08(水) 23:18:58
>>136 同じWindowで同じIDを指定すれば、上書きされる。
132です。 TimerProc内でSetTimerを再定義したらそれらしくなりました、 どうもありがとうございます。
初歩的な質問ですいません。 WM_COMMANDは、コントロール作成時にも送られてくるのですか?
クリップボードの変更は取得できたんですが ペーストを検出する方法を教えてください。
>>126 GetKeyStatとかでできるが、どのキーがどのプロセスで押されたか判断するのは多分無理。
>>129 どうやってプロセスを判断するのかな??^^
>>142 キーイベントはプロセス相手ではなくスレッドに属するウィンドウ相手じゃまいか?
getforegroundwindow()でどのウィンドウが対象か調べればいいかとおもお
WININETってどうなん?
どちらかといえば道北
>>150 何故、道央・道東を差しおいて「どちらか」と言うのか?
道産子、道産子言うからどさん子ラーメン食べたくなったじゃねーか
154 :
105 :2006/02/09(木) 12:22:00
急激にスレのしt(ry
嫉妬
SendInputを使って絶対座標でマウスカーソルを動かしてるんですが、 マルチモニタ環境での場合の絶対座標の指定方法がよくわかりません。 SendInput に渡す MOUSEINPUT 構造体の x, y には 0 から 65535 の数値を指定するようにされているのですが、 その範囲ではプライマリモニタ内でしかカーソルは移動しません。 その値を +65535 するとセカンダリモニタ内でカーソルが移動したり するのですが、そういう考え方でいいのでしょうか? つまり、0-65535 の値はプライマリモニタの物理座標(例えば 1024x768) にマップされ、セカンダリモニタなどはそのプライマリにマップされた 大きさで計算する必要があるという事でしょうか? 説明が下手ですみません。
SetPixel(またはSetPixelV)を使うより、メモリを直接制御したほうが早いと、どこかのサイトで見たのですが そのサイトでは、詳しくは説明されておらず、自分でもできる限り検索などしてみましたが解決できませんでした SetPixel(またはSetPixelV)が内部的にどのような動作をしているのかを解説したサイトなどご存知の方おられませんか… よろしくお願いします
162 :
160 :2006/02/09(木) 21:42:21
>>161 失礼しました、SetPixelの実際の使用は
HDC hdc=CreateDC("DISPLAY",NULL,NULL,NULL);
SetPixelV(hdc,1,1,color);
といった感じなので、DIBSectionでは解決できそうにないです。
失礼しました
たしかにDIBSectionじゃ画面に直接はかけない罠。
何やってんのこのバカ・・・
一旦DibSectionに書いてからコピー。 つーか、DibSection相手だとSetPixelしてもそこそこ速かったりするんだけどな。
DDB < DIBだから、DIBの方でやった方がいい。 ロードする時、ピクセルにアクセスする場合は、 DDBだけじゃなく、DIBとしてもロードしておく。
その不等号は何を比べているんだ?
縮小転送するときStretchDIBits関数やSetDIBitsToDevice関数を使うとドライバによってノイズのような輪郭線が出てしまうのですがこれも一旦DIBSectionに自前の縮小アルゴリズムで描いて転送という方法をとるのが一般的なんでしょうか
>>169 SetStretchBltMode使って気に入らなきゃ自前でやっちゃって良いんでない?
171 :
169 :2006/02/10(金) 14:59:47
>>170 SetStretchBltModeでHALFTONEを指定してブラシ原点の設定(0,0)を行ってもだめでした
表示内容の変更のたびに一度転送を挟むのは無駄な気もしますけど
しょうがないんですね…
強いんだよ
環境はXPsp2で処理系はBCC5.5.1を使用しています ところで、デバッグの為にDOS窓を出してそこに結果を出力させたいのですが fprintf(stderr,"....");としても何も得られません そこでDOS窓を制御するにはどの様なAPI、または手法が考えられるのでしょうか
>>173 AllocConsole();
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
wがイヤです
w
freopen("CONOUT$", "a", stdout);
#define wwwwwwww "w"
質問です。 ヤフーメッセンジャーの話すボタンを押しっぱなしにするツールがありますが あれはどうやってやってるんでしょうか? ボタンにWM_LBUTTONDOWNメッセージを送ってやってもマウスをぐりぐり やってると解除されてしまいます。親ウィンドウにマウスオーバすると確実に駄目。 ボタンへのメッセージを全てフックしてフィルタかけるとか面倒な事をやらなければ 駄目なんでしょうか? よろしくお願いします。
>>180 つ spy++
でまあ、気になったから自分でも調べてみたわけだが、
"話す"ボタンに、BM_SETSTATEを投げているみたい。
実際にメッセージ投げて確かめたわけじゃないけど。
>>181 サンクス。
それやって見ます。
あと、SPY++使ってみます。
ヤフーメッセンジャーって使ったことないけど 「話す」ボタンが押下された状態はどういうタイミングでクリアされるの? それを外部から判断できれば、クリアされるたびにメッセージ送れば 押しっぱなしの状態になるけど・・・
>>183 それがあんまりハッキリしないみたい。親ウィンドウにマウスオーバすれば確実に
ボタンは戻るんだけど、そのままボタンのうえにもっていくと押された状態になる。
親ウィンドウにマウスオーバしなくても勝手に戻ったりもする。内部的なイベントが
いろいろ有ると思うし…。
>>185 サンクス。
たまたまヤフーメッセンジャーのIMの話すボタンの実装がそうなっていたとか
使われているRADツール?のボタンコントロールのデフォルトコードがそうなってるのか
とかそんなような事ですかね?
サンクス>>ALL
187 :
デフォルトの名無しさん :2006/02/11(土) 06:45:38
プロセスのメインモジュールのファイル名が与えられた場合にその保持する全ウィンドウのハンドルを取得する方法にはどのようなものがあるでしょうか? 私が今やっている方法は以下の通りです。 1.まず、ツールヘルプで全プロセスを列挙してその中から該当のもののプロセスIDを取得する。 2.GetWindow()を使ってDesktopWindowの子すべてにGetWindowProcessThreadId()をして調べる。 3.2.で見つかったウィンドウの子孫すべてをGetWindow()で取得。 もっといい方法はあるでしょうか?
つ EnumThreadWindows
189 :
デフォルトの名無しさん :2006/02/11(土) 18:46:46
エクスプローラ等で選択したファイル名をコンテキストメニューからDragQueryFileを 通じて取得しているのですが、.lnk等のショートカットだとリンク先のファイル名 になってしまいます。.lnkのファイル名を取得する方法を教えてください。 現状は↓の動作結果になっています。 1: .lnk一つだけ選択 → リンク先のファイル名 2: .lnkとそれ以外の拡張子を選択し、.lnk上で右クリック → リンク先のファイル名のみ 3: .lnkとそれ以外の拡張子を選択し、.lnkでないファイル上で右クリック → .lnkのファイル名とそれ以外のファイル名
>コンテキストメニューから ? WM_DROPFILESのハンドラから取得すると普通にC:\... .lnkになってるけど。 逆にリンク先のファイル名にする方法聞きたい。
WM_DROPFILESのハンドラじゃなくて
IShellExtInit::InitializeでCF_HDROPを取って、DragQueryFileすると
>>189 のようになってる希ガス
SetForegroundWindow SetActiveWindow SetFocus BringWindowToTop の違いとはなんでしょうか?
SetForegroundWindow→スレッドごと一番前に持ってくる SetActiveWindow→呼び出し元アプリ内でのみアクティブになる(フォアグラウンドになるとは限らない) SetFocus→SetActiveWindowと似たような動きだが、ウィンドウに送られるメッセージが違う BringWindowToTop→よくわからんけどSetForegroundWindowとたぶん似た感じ
つれますか?
次のコードが手元のWin2kでは動くのに、Win98では動きません。 int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { HDC hdc = CreateCompatibleDC(NULL); HFONT font = CreateFont(32, 0, 0, 0, 400, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "MS ゴシック"); HFONT fontOld = (HFONT)SelectObject(hdc, font); GLYPHMETRICS gm; ZeroMemory(&gm, sizeof(gm)); static const MAT2 mat = {{0,1}, {0,0}, {0,0}, {0,1}}; DWORD size = GetGlyphOutline(hdc, 'A', GGO_GRAY8_BITMAP, &gm, 0, NULL, &mat); if(size == GDI_ERROR){ MessageBox(NULL, "GDI_ERROR!!", "ERROR", MB_OK); } SelectObject(hdc, fontOld); DeleteObject(font); DeleteDC(hdc); return 0; } ちなみにMAT2の前のconstを消すと動きます。これって何なんでしょう。 環境はVS2005とVC6で確認しました。
SendNotifyMessageとかPostMessageでウィンドウに送ったメッセージって たまに届かないとき無いですか? ウィンドウを移動中とかに送ると届いて無いことが結構ありますよね?
199 :
198 :2006/02/12(日) 00:33:57
たぶんメッセージキューがあふれてメッセージが削除されてしまったのだと思うのですけど こういう場合ってどうしたらいいでしょうか? 別スレッドから重要なメッセージを送ったのに勝手に削除されたら困るんですが
NT系だとメッセージキューのキャパはデフォで10000位あって そう簡単に溢れないと思ったが。
ウィンドウ移動終了後に遅れて届いているんじゃね?
>199 戻値を確認すればいいんじゃ?
203 :
189 :2006/02/12(日) 14:55:28
>>190 >>191 の説明通りです。説明不足ですみません。
>>191 仕様ですかね…?
でもこれって条件次第では、例えばユーザが選択したファイルのウィルスチェックが
出来ないことになるわけで(実際に某ソフトで確認済み)、「穴」な気がしますが。
…これでいいのかWindows?
>>203 Win の責任なのか?
ある程度知識がある人にはショートカットとリンク先が別物なのは常識だし、
無い人は AutoProtect とか使ってるだろうから、リンクを逆参照した時点で発見出来るじゃん。
>>203 WM_DROPFILES を使えばおっけーって事じゃないのか?
わざわざショートカット先のファイル名を取得する方法でやっといて、 これでいいのかWindowsも無いもんだ
話がかみ合ってない気がする
WIN32_STREAM_ID sid; ZeroMemory(&sid, sizeof(WIN32_STREAM_ID)); DWORD dwStreamHeaderSize = (LPBYTE)&sid.cStreamName - (LPBYTE)&sid+ sid.dwStreamNameSize; これっておかしくないですか?
209 :
デフォルトの名無しさん :2006/02/12(日) 23:50:29
質問です。 「すれ立てるまでもない〜」でも書き込ませていただきました。 特定のプロセスの起動を制御したいのですが、 そのスマートな方法が思いつきません。 私としては、このプロセスが起動するとき、はじめからスレッドを止めておき、 ユーザーに許可を求めてからスレッドを走らせるようなことをしたいのです。 自分で思いついた方法は Kernel32 の代わりのライブラリ Xernel32 をインポートさせる このとき、この特定のプロセスはクラック Snapshot によってまず起動しているプロセスを取得し、 その全てのプロセスの CreateProcessA/W を DLL遠隔実行+NTヘッダ書き換え方式でフックして、監視する方式 というものですが、上はプログラムに直接手を加え、 下はシステムの誤動作につながる可能性があることからできれば使いたくないと考えております。 どなたか上記以外の方法をご教授願えませんでしょうか? よろしくお願いいたします。
>>208 なにが???
DWORD dwStreamHeaderSize
= ( (DWORD)(&(sid.cStreamName)) - (DWORD)(&sid) + sid.dwStreamNameSize );
にしろってこと?
何?ウイルススキャナの出来損ないでも作ってるの? そのプロセスのEXEのエントリポイントでも書き換えれば。
>>211 先にクラックしておくという意味でしょうか?
それをクラックと称するのはどうかとも思うが、そういうこと。
>>213 ファイルシステム 上のプログラムは手を加えたくないのです。
わがままですが…。
できれば、そのプログラム起動時には命令を一つも実行させず、
スレッドを止めた状態でユーザーに確認を求め、スレッドを走らせるということをしたいのです。
そのため、CreateProcessA/W、Kernel32 プロキシによるフックを思いついたのですが、
その特定のプログラムが、どのような方法で起動したとしても、
ユーザーの確認を求めることができる状態にしたいのです。
やはりこれ以外の方法はないのでしょうか?
で、どのネットゲーをクラックしたいのか
話の腰を折るかもしれませんが二つ質問です。 @別のプロセスにある Rich Editに色やフォントを指定して、 文字列を(クリップボード経由ではない方法で)転送するやり方が 知りたいのですが、わかれば教えてください? ただ文字列を転送することはできましたが、これ以上進みません。 例:ワードパッドに明朝体で青い字を表示させる。 A別のプロセス中でサブクラス化されたコントロールを 解除する方法がわかれば教えてください。 例:「スタートボタン」はサブクラス化されていますが、これを解除する。 両方とも高度な質問だとはわかっていますがよろしくお願いします。
>>208 先に0で埋めてるでしょ
0をいくら計算しても0では
>>209 要件満たさないけど、ポリシーいじれるなら
起動の抑止は出来たと思う。
ポリシーって内部で何やってんだろうね。
足す意味がないってことか
WIN32_STREAM_ID構造体のcStreamNameの直前までのサイズは正しく求められてるけど、 確かに、最後の「+sid.dwStreamNameSize」は意味が無いな
ListViewにFocusが北のを簡単に知るには サブクラス化してWM_SETFOCUS捕まえる以外は方法茄子?
つ NM_SETFOCUS
ぬああああ、そうだった、そう言えばそんなのあった どう考えても健忘です 本当にありがとうございました
227 :
デフォルトの名無しさん :2006/02/13(月) 16:50:34
atomとmutexとsemaphoreがあるけど、それぞれどんな用途に使うべきなのか? 二重起動チェックにmutex使ってるけど、いんだろうか?
別に悪いことはない
229 :
デフォルトの名無しさん :2006/02/13(月) 19:55:33
こんばんは、 EPSファイルを、GIFファイルに、変更するフリーのDLLないでしょうか。 できれば、EPSを読み込んだあと、GetPixel()とかできるのがよいです・・。 (初心者にC++を教えるスレとの重複投稿です。解決したら、両方のスレに報告させていただきます)
(゚д゚)
231 :
デフォルトの名無しさん :2006/02/13(月) 20:00:42
ぼくはまるちしたけどわるくないもん!
ぼくはうんちしたけどわるくないもん!
うんちした子は家には入れません! 外で反省しなさい!!
うんちぽすと
>>227 マルチスレッドプログラミング相談室で質問した方が良いんじゃないかとは思うが…。
ttp://pc8.2ch.net/test/read.cgi/tech/1130984585/l50 atomってのが何か知らないけど(critical section?)
mutex
1つのスレッドだけでロックしたいところが複数あるとき使う。
複数のスレッドで共有している連結リストに追加する関数と削除する関数がある場合とか。
semaphore
例えば3つしかないリソースがあって
A,B,Cがそれぞれ持ってった後にDが欲しいって言ってきたら
A,B,Cの誰かが返しに来るまで待たせるとか。
つか、本買え、本。
>>229 マルチ云々よりスレ違いの方が問題だろう(しかも両方!)。
>232-234
うんちうんちってそんな楽しいか?ガキだな…。
誰だって誰かの子供だよ!
>>235 Win32APIのスレに居るくせにATOMってのが何かわからないって・・・本気かおまえ
RegisterClass(Ex)とか使ったことねぇのか
正直ATOMはWIN16の範疇だとおもう。
>237 は?atomとmutexとsemaphoreが並んで書かれてたから マルチスレッド絡みの単語で知らないのがあるのかと思っただけだろ。 小文字で書いてあるしな。 大文字小文字の区別は言語仕様の範疇だぞ。
うはwwww
すごい言い訳w
てつわん
うんこは寝て食えってば
>>229 マルチに回答するのはアレだが、ちょっと気になる話題なので・・・。
GIFに直接変換するものは知らないが、ifepsgs.spiというSusieプラグインならある。
動作にはGhostscriptが必要。ファイル名を渡した場合には一応動くが、
メモリ上のファイルイメージを渡したときにはバグって動かない、
メモリを2回deleteするバグあり、プレビュー付きEPSだと扱えないなど
いくつか問題があった。
しょうがないので、自分でパッチを書いてみたが・・・まあ、マルチだし。
246 :
デフォルトの名無しさん :2006/02/14(火) 00:35:56
チョコのAPI下さい
SetProcessWorkingSetSize関数について質問があります。 第2第3引数に-1を指定してすることによりメモリの使用量を一時的に減らすことが出来たのですが これはMSDNに書かれているようにスワップアウトしているだけで 実際の使用量については一切変わっていないのでしょうか? それとも不必要な部分を解放してくれているのでしょうか?
そう書いてあるんだからそうなんだろ
質問です。 アクティブウインドウにキー入力を送信するのに SendInput や keybd_event などがありますが、 一部のウインドウに対しては全く動作してくれません。 SendMessage WM_KeyDownなどでもだめでした。 (おそらくDirectInputで入力を拾っているためだと思います) しかし、JoyToKeyというフリーソフトではそのようなウインドウに対しても キー入力を送信できているので、なにかしらいい方法があるはずです。 どのような方法を使えばキー入力を行うことができると思いますか?
252 :
249 :2006/02/14(火) 01:10:05
>>250 いやまあそうなんですけど
色々な人がメモリの使用量を抑えるために使っているので
内部では何かされているのかなと。
ようするにdeleteやfreeでプログラムからは開放したつもりでも Windowsからはまだ割り当てたままのヒープブロックがあるわけだ。 スワップアウトする時はそれを最適化する作業がおまけで付いてくるってこと。
>>252 > 色々な人がメモリの使用量を抑えるために使っているので
それは、どこでどれだけのサンプルを取って言っているのだ?
最低限、統計学的に見て問題のないサンプル数を取ってのセリフか?
お世話になりました
お構いもしませんで
257 :
デフォルトの名無しさん :2006/02/14(火) 10:57:47
システムへの負荷度合いを測るAPIって無いですか? いま、タスクマネージャで計ってるんですが、わかりづらくて。 出来れば時間を追ってログに吐き出したりしたいんですけど。 どうでしょう?
>>257 つ NtQuerySystemInformation
ご苦労
セロで割った例外とかはどうすれば捕まえられますけ?
セロで割るってなんだ?
on error goto でエラートラップ掛けられます
>>263 昔、EL&Pとかのプログレバンドが演奏後にギター叩き壊したりしてたろ。
あれのセロ版。オーケストラのチェロ奏者が演奏後に叩き割るんだよ。
ELPは鍵盤にナイフを刺す。
EL&Pはキーボード、ベース、ドラムの3人組だよ
>>267 オーケストラのチェロ奏者が演奏後に(セロで他の楽器を)叩き割るんだよ。
マジレスするとロマンス諸語の一部では0をCeroと読む。
272 :
デフォルトの名無しさん :2006/02/14(火) 19:00:00
StretchBltで縮小すると、画像がめちゃくちゃ汚いいんですが、こんなときどうしましょう?
>>272 プログラム作る前にグラフィックソフトの使い方勉強しれ
>>272 StrechBltModeを変更しよう
275 :
272 :2006/02/14(火) 19:11:06
>273 >プログラム作る前にグラフィックソフトの使い方勉強しれ このような的を得ていないつっこみへの対処は、どうしましょう?
>>275 手前で的知ってるなら わざわざ質問するなってことだ
きたな・いい 【汚いい】 (形) (1)よごれていていい感じを与える。 「画像がめちゃくちゃ―」 民明書房提供「大痔林 第二版」より
DirectMusic使いたいんですが、 サンプルをコンパイルしようとすると、 未解決の外部シンボル __imp__CoInitialize@4 が… のエラーが出ます。 CoInitialize()使うのに必要な.h or .lib って何ですか?
279 :
272 :2006/02/14(火) 19:25:02
>274 >StrechBltModeを変更しよう 「SetStretchBltMode」で「HALFTONE」を与えることで綺麗になりますた。 ありがとうございます。
そもそもSDKのサンプルにはプロジェクトファイルも付いてないか?
282 :
278 :2006/02/14(火) 19:45:04
>>280 MSDN内も探しているのですが、どうも見つかりません。。。
>>281 サンプルをビルドしてみたんですが同様のエラーが…。
283 :
278 :2006/02/14(火) 19:50:42
すみません。自己解決しました。 ole32.libなんですね。 どっかに.libの一覧表とか無いんでしょうかねぇ。。。
MSDNのCoInitializeのところにしっかり書いてあるけど
MSDNからCOMのドキュメントがなくなったのかと思って慌てて 見にいっちゃったよ。ちゃんとあってよかった。ε-(´ー`;) 逆にどんな探し方したら見つからないのか知りたい。
すみません。教えてください。 今、メインのウィンドウ(ダイアログでない)にチェックボックスをベタ貼りするプログラムを書いています。 チェックボックスはCreateWindowでウィンドウクラスを"BUTTON"として生成できることはわかりました。 またスタイルの指定でチェックボックスになることもわかりました。 ただ、どうしても背景色が灰色になってしまうのです。 俺はメインのウィンドウの背景色に合わせたいのですが。 このような場合、チェックボックスの背景色を変える(もしくは透明にする)方法はないのでしょうか。 メインのウィンドウのWM_CREATE:でチェックボックス(hButton)を生成後 HDC hdc = GetDC(hButton); SetBkColor(hdc, RGB(0,0,0)); のようなことをしても背景色は変わりませんでした。 調べてみるとオーナードローという方法が使えそう(?)ですが、ちょっと大変そうです。 どなたか、簡単に背景色を変える方法を、ヒントだけでも教えてもらえないでしょうか。 よろしくお願い致します。
288 :
287 :2006/02/14(火) 22:00:50
すみません。書き忘れました。 環境はWindowsXP、VS2003です。 また、MFCは使わず、SDKで作っています。
>>287 「コントロール 背景色 変更 Win32」でググるとかしないの?
290 :
デフォルトの名無しさん :2006/02/14(火) 22:03:01
Windows Picture and FAX Viewer をコントロールしたいのですが、 Preview 1.0 Type Library(shimgvw.dll)を使ってできませんか。 メソッドの使い方はある程度予測つきますが、Previewクラスへ オブジェクトを得る方法が分かりません。 破損したファイルを読み込むと次の画像に進むボタンの位置が動いて うまく制御できないので困ってます。 VB板で聞いたらレスつきませんでした。
>>289 うるせー、この糞。わかんねーから質問スレで質問してんだろうがよ。
われこそ知らねーなら黙っときや。
そういえばgoogleの表紙、まだバレンタインだった? 怖くて見れないんだけど・・・
普通のに戻ってるよ
>>287 チェックボックスの文字の背景はスタティックコントールの色になってるみたい。
だからWM_CTLCOLORSTATICでブラシを戻すとよいようだよ。
297 :
287 :2006/02/14(火) 23:00:18
>>295 ありがとうございました。STATICでうまくいきました。
>>289 誰が読んでも、これは糞。もう出てくんなよ。
>>298 確かに答えになってるね。
287=291=292=297で、この時期googleが見れないから質問したってとこか。
キレる若者!多発する少年犯罪!眠らない街歌舞伎町!!!
誰かわかる方教えて頂けないでしょうか。 マウスカーソルについてなんですが、エクスプローラなどでctrlキーを押しながらドラッグアンドドロップするとカーソルに[+]記号が追加されますが、あれはどのように実現しているかわかる方いませんか?
298=299=300
303 :
299 :2006/02/14(火) 23:54:26
>>302 残念!299は別人でした。しかしそう見えるなw
これだけだとあれなので、ついでに回答。
>>301 LoadCursorとかじゃないかな。
>>301 追加されんるじゃなく、[+]がついたカーソルを使っているだけ。
普段は矢印で、ちょっと時間がかかる処理では、砂時計とかに変えたことは
ないの? SetCursor() だと思ったけど。
>>301 アレと同じ形のカーソルリソースを用意して
WM_SETCURSORでSetCursorを呼び出す
MessageBoxのOKだけ出るダイアログに独自のボタンを一つ追加して、 そのボタンを押したら何かこちらで処理できるようなことは可能ですか?
>>304-305 [+] は*.lnkと一緒であとから追加されてると思われ。
そんなカーソル見当たらんし。
>>306 MessageBoxを独自に作るのが一番早いかと
>>308 わかりました。
ありがとうございました。
311 :
301 :2006/02/15(水) 00:22:33
>>304 , 305
システム標準のマウスカーソルの形を変えても、
エクスプローラでは、その変えたカーソルにも[+]記号が追加されるので、
ImageListかなにかかと思ったんですけど違いますか?
ベッキー等では、システム標準のカーソルに関係なく、決まった形の
アイコンに[+]が付いてくるので、それはそのやり方なのかなと思いますが。。
わかる方いませんでしょうか?
312 :
デフォルトの名無しさん :2006/02/15(水) 01:23:28
Sleipnir2 みたいなマウスを重ねると青い枠が出てくるような ボタンとかメニューは自前での実装ですか? それともWindowsでそうゆうコントロールを用意してるんでしょうか?
314 :
デフォルトの名無しさん :2006/02/15(水) 03:01:28
ファイル名を渡してExplorerのコンテキストメニュー出すAPI教えてください。
315 :
デフォルトの名無しさん :2006/02/15(水) 08:43:06
質問です。 Handle= CreateWindowEx( WS_EX_CLIENTEDGE,WC_LISTVIEW,NULL, WS_CHILD|LVS_REPORT|LVS_EDITLABELS, PosX,PosY,Width,Height, GetDesktopWindow(),(HMENU)id, GetModuleHandle(NULL),NULL); でリストビュー作った後にSetParent( Handle, ParentHandle )で 親指定するとWM_NOTIFYメッセージを親に渡してくれないんですが なんか他にセットすることがあるんでしょうか? WM_PARENTNOTIFYは渡してるみたいなんですが……。
316 :
デフォルトの名無しさん :2006/02/15(水) 14:38:38
ネットワークの接続状態はどうやって確認したらいいの?
>>311 ショートカットのアイコンは編集しているみたいだから、カーソルも作ってるのでは
ないか。LoadCursorFromFile() などあるから編集してロードして表示できるのは
確か。編集は bitmap が作れれば、アイコンやカーソルにするのはそんなに面倒でも
ない。
メニューやウィンドウのタイトルバー等に使われている フォントについての情報を取得する方法はありますか?
GetFont
>>315 WM_NOTIFY は SetParent() の実行にかかわらずコントロール作成時の親に送信される。
WM_NOTIFY の送信先を変更する一般的な方法はおそらく存在しない。
>>316 IP Helperを使う。接続しているアダプタ一覧は以下のようにして得る
DWORD size;
GetIfTable(NULL, &size, FALSE);
PMIB_IFTABLE pIf = malloc(size);
GetIfTable(pIf, &size, FALSE);
for(DWORD i = 0; i < pIf->dwNumEntries; i++){
if (pIf->table[i].dwOperStatus == MIB_IF_OPER_STATUS_CONNECTED){
printf("CONNECTED Interface: %s\n", pIf->table[i].bDescr);
}
}
free(pIf);
322 :
315 :2006/02/15(水) 17:09:37
>>320 ありゃーそうなのか。
じゃあ親はあらかじめ渡すようにします。
モヤモヤが解消されたので安心。ありがとうございました。
なぜ最初から親を指定しないのか・・・
いいじゃないですか。
>>318 SPI_GETNONCLIENTMETRICS
326 :
318 :2006/02/15(水) 19:23:28
>>325 まさにそれです。ありがとうございました。
327 :
306 :2006/02/15(水) 20:27:31
>>310 ありがとうございます!
ばっちり使えました。
328 :
デフォルトの名無しさん :2006/02/15(水) 21:17:53
質問です。 アプリケーションのメインアイコンを変更するには そのアプリのリソースを追加・変更するしか方法がないのでしょうか? アイコンを外部ファイルとして持っておきたいのですが。
329 :
デフォルトの名無しさん :2006/02/15(水) 21:20:25
あ、質問の内容が不完全でした。 アプリケーションというか、 エクスプローラー等から見えるそのアプリのexeファイルの アイコンを変えたいのです。
>>316 ネットに接続されているか確認するだけなら、HTTPハンドルを使って適当なサイトに接続すればいい。
接続できればネットにつながってると。
サブストリームの名前がMAX_PATHを超えることはありますか?
333 :
287 :2006/02/15(水) 23:23:37
はげしく遅レスだしもうどうでもいいけど。
>>298 >それなりに質問の答えになってるような気がする・・・
答になってねーよ。どこにチェックボックスのことが書いてあるよ?マヌケ。
おまえ
>>289 だろ。心を入れ替えてくだらんレスはやめとけ。
>>333 遅漏の上に粘着と来たか・・・
そうとう腐ってるな?
指定のドライブが書き込み可能かどうか調べる方法ってありますか?
GetFileAttributes("c:\\")
>>331 それ使うのダイアルアップ接続の画面出たりしてマズくね?
341 :
デフォルトの名無しさん :2006/02/16(木) 10:55:05
>>339 でるの?俺常時接続なもんでわからなくて。
>>341 PPPoEなダイヤルアップで今試したら出た。
>>342 InternetGetConnectedState()だとどうでそ。
じゃぁおれはpingでも進めてみるka
316が求めてるのは
1)どのインターフェースでもいいからインターネットに接続されているか知りたい
2)各インターフェースのうちどれがインターネットかどうか関係なく接続状態なっているか知りたい
3)各インターフェースのうちどれがインターネットに接続されているか知りたい
どれなんだろ?
1)なら
>>342 、2)なら
>>321 じゃないかと思うんだが、とりあえず316を待ってみね?
本人はそんなこともわかっていないと思われ。
げ、アンカーミスった。1)なら
>>343 な。無駄レスすまん
ネットワークと書いてあるようだけど
349 :
デフォルトの名無しさん :2006/02/16(木) 20:17:36
MessageBoxのMB_ICONINFORMATION、MB_ICONSTOPとかで出てくるアイコンを自前作ったダイアログで表示させたいんだけども、 参考になるサンプルでもないでしょうか? よろしくお願いします。
ちょっと印刷のことで質問を。 Crystal Report 4.6の帳票印刷してるのですが、 指定した用紙サイズで印刷されない、フォントが急に大きくなるなどの現象に苦しんでいます。 環境は ・プリンタはドット ・帳票の種類が多く、用紙のサイズも多様。 ・共有プリンタで複数端末から印刷ジョブを送る。OSは2000/XP中心に色々。 印刷をする頻度もかなり高い。 ・印刷時にダイアログを出して用紙を選択させるのはNG SetPrinterで用紙を変更しているんですが、3行目に書いたような現象が出て死に掛けました。 用紙サイズの変更とかトラブルなく行うのってどうやればいいんですかね・・・ ちょっとしたアドバイスとか、参考文献の紹介とかでもいいのでなんかお願いします・・・
>>349 LoadIcon()のヘルプ見れ
例えばIDI_ASTERISKとか
そこでIDI_INFORMATIONと言わずIDI_ASTERISKというところがなんとも
354 :
デフォルトの名無しさん :2006/02/16(木) 21:27:51
>>332 上限無しじゃない
少なくとも512文字は作れた
ウィンドウを最小化する時 アニメーション(枠線がタスクバーに収まるやつ)させたくないんですが 何か方法ありますか?
>>356 デスクトップを右クリックしてプロパティ(以下略
>>357 APIでどうにかしたいんです
というか、
自己解決しかけてます
WM_COMMANDのSC_MINIMAIZEで
消せばいいかもしれない
>>358 そのアプリケーションだけUIが違うっていうのがそもそも間違いかと
もし不可視にしようとしてるなら、やめておいたほうが良いぞ
よく考えたら 最小化どうでもよかった。 DelphiかBuilderアプリってそんな感じなので 別にいいかと思った おしまい。
っ [タスクトレイ]
つ ダミーウィンドウ?
364 :
デフォルトの名無しさん :2006/02/17(金) 17:08:32
リストボックスで、現在選択中の項目が何番目かって、どう知ればいいですか?
何かと思った。「げっとかーせる」だなw
-1なのは未選択状態
369 :
364 :2006/02/17(金) 17:41:38
できた。ありがとう。
>>366 LB_GETCURSEL
Send an LB_GETCURSEL message to retrieve the index of the currently selected item, if any, in a single-selection list box.
LB_GETCURSEL
wParam = 0; // not used; must be zero
lParam = 0; // not used; must be zero
Parameters
This message has no parameters.
Return Values
In a single-selection list box, the return value is the zero-based index of the currently selected item. If there is no selection, the return value is LB_ERR.
371 :
364 :2006/02/17(金) 18:00:37
もう1つ聞きたいんだけど、 環境変数をセットする時みたいなリストって、 あれはなんていうの? 2次元配列的にリスト作れるやつ。
環境変数をセットするダイアログを見に行ってしまった・・・ あれはリストコントロールのレポートビューだよ
374 :
371 :2006/02/17(金) 18:25:59
375 :
371 :2006/02/17(金) 19:38:08
また質問。 コモンダイアログの「名前を付けて保存」で、 lpstrFileに保存名を入れると思うんだけど、 入力した文字列をどうやって取得したらいいですか?
ハァ? strcpyでもなんでもしろや
377 :
375 :2006/02/17(金) 19:50:13
>>376 何を参照すればいいのかわからないため、strcpyできんのです。
MSDN見ろよ
同じ物を参照汁
380 :
375 :2006/02/17(金) 20:06:27
>>379 同じものとは?すみません、本当にわからなくて困ってます。
Pointer to a buffer that contains a file name used to initialize the File Name edit control. The first character of this buffer must be NULL if initialization is not necessary. When the GetOpenFileName or GetSaveFileName function returns successfully, this buffer contains the drive designator, path, file name, and extension of the selected file.
ファイル名を含むバッファへの指針は以前はよくFile Nameエディット・コントロールを初期化していました。 初期化は必要でないなら、このバッファの最初のキャラクタがNULLであるに違いありません。 GetOpenFileNameかGetSaveFileName機能が首尾よく戻るとき、このバッファは選択された ファイルのドライブ指示子、経路、ファイル名、および拡大を含んでいます。
383 :
は@ c178.016.c3-net.ne.jp ◆cplnFO9T0I :2006/02/17(金) 20:21:16 BE:121046764-
指定したフォルダからファイルリストを取得する方法ってありますか? 出来たら作成日時とかも取得できるといいです。
>>383 王道としてはFindFirstFile方面>ファイルリスト
파일 이름을 초기화하기 위하여 이용되는 파일 이름을 포함하는 완충기에 포인터는 통제를 편집한다. 초기 설정이 필요하지 않으면 이 완충기의 첫번째 특성은 무효 이어야 한다. GetOpenFileName또는GetSaveFileName기능이 성공적으로 돌려보낼 때, 이 완충기는 선정한 파일의 드라이브 지명자, 경로, 파일 이름, 및 연장을 포함한다.
意味不明なきちゃない記号が表示されてるよ
389 :
デフォルトの名無しさん :2006/02/17(金) 22:14:31
エクスプローラーの機能を拡張することってできますか?
391 :
デフォルトの名無しさん :2006/02/17(金) 23:36:05
http://www.print-driver.com/ ここで販売されているような、
あたかも通常のプリンタで印刷するかの操作で、
GIFファイルを作成できるようなプリンタドライバ(?)を
作りたいと考えております。(スレ違いでしたら、申し訳御座いません。)
どなたか、上記のような所謂バーチャルプリンタとでもいいましょうか、
そのようなアプリケーション又はドライバ又はiniファイルなどの作り方、導入方法をご存知な方がいらっしゃいましたら、
教えてください。おながいします。
スレ違いでしたら、導いてください○rz...
393 :
は@ c178.016.c3-net.ne.jp ◆cplnFO9T0I :2006/02/18(土) 00:24:47 BE:282442087-
>>384 最初どの様に結果が出るのか解らなかったんですが、
2番目の引数に設定したWIN32_FIND_DATA型で帰ってくるんですね。
瞬答ありがとうございました。
VisualStudioで、非MFCで、C++なアプリの場合、文字列クラスはどうするもんなんですか? atlstr.h(CString) でも string でも好きな方使えやって感じでしょうか?
395 :
デフォルトの名無しさん :2006/02/18(土) 00:57:43
オープンしたソケットで利用中のNICのMACアドレスを得る方法はありますでしょうか? 接続元、接続先のMACアドレスどちらでもかまいません。
スレ違い。
WinAPIは永遠に不滅です。
398 :
は@ c178.016.c3-net.ne.jp ◆cplnFO9T0I :2006/02/18(土) 02:23:33 BE:70610472-
ふと気になったんですが、FindNextFileでファイルの情報を見ていった後 全部のファイルを列挙し終わったことを検知するのにはどうすればいいんでしょうか?
MSDNに書いてるだろ
もしくは、ぐぐれ
列挙中にディレクトリに新規ファイルを作成するなどしてハマッただけだろ。
402 :
デフォルトの名無しさん :2006/02/18(土) 07:53:09
リストビューコントロール(SysListView32)を単独でCreateWindowして使っています。何かの子ウィンドウにはしていません。 A) 現在選択されているアイテムのインデックス番号を取得するにはどうしたらよいのでしょうか? (LVS_SINGLESELでたった一つしか選択できないようにしています。) リストボックスの場合はLB_GETCURSELメッセージで取得できました。 でもリストビューにはそれに相当するものが見当たりません。 思いつくのはLVM_GETITEMメッセージで全アイテムを一つ一つstate & LVIS_SELECTEDチェックする、というものですが、ちょっとバカみたいな気がするのですが・・・ B) あと、カラムヘッダの部分を右クリックすると暴走してしまうんですが、これはCOMCTL32のバグなんでしょうか? リストビューを他のウィンドウの子ウィンドウにしていると暴走しないみたいなんですが・・・Win98+IE5.5でもWin2000+IE6.0でもそうなります。 以下、選択アイテム検出部がリストボックスのものになっています。 #include <windows.h> #include <stdio.h> #include <commctrl.h> void main(){ HINSTANCE hInst = GetModuleHandleA(NULL); InitCommonControls(); HWND hwnd = CreateWindowA("SysListView32", "LIST", WS_VISIBLE | LVS_REPORT | LVS_SINGLESEL, 20, 20, 200, 180, NULL, NULL, hInst, NULL); if (hwnd == NULL){ printf("CreateWindow() error\n"); exit(-1); }
403 :
デフォルトの名無しさん :2006/02/18(土) 07:57:03
SendMessageA(hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); LVCOLUMNA column; column.mask = LVCF_TEXT | LVCF_WIDTH; column.cx = 48; column.pszText = "No."; SendMessageA(hwnd, LVM_INSERTCOLUMNA, 0, (LPARAM)&column); column.pszText = "Name"; SendMessageA(hwnd, LVM_INSERTCOLUMNA, 1, (LPARAM)&column); LVITEMA item; item.iItem = 0; item.iSubItem = 0; item.mask = LVIF_TEXT; item.pszText = "0"; SendMessageA(hwnd, LVM_INSERTITEMA, 0, (LPARAM)&item); item.iItem = 1; item.pszText = "1"; SendMessageA(hwnd, LVM_INSERTITEMA, 0, (LPARAM)&item); item.iItem = 2; item.pszText = "2"; SendMessageA(hwnd, LVM_INSERTITEMA, 0, (LPARAM)&item);
404 :
デフォルトの名無しさん :2006/02/18(土) 07:57:38
item.iSubItem = 1; item.pszText = "a"; SendMessageA(hwnd, LVM_SETITEMTEXT, 0, (LPARAM)&item); item.pszText = "b"; SendMessageA(hwnd, LVM_SETITEMTEXT, 1, (LPARAM)&item); item.pszText = "c"; SendMessageA(hwnd, LVM_SETITEMTEXT, 2, (LPARAM)&item); MSG msg; for(;;){ GetMessage(&msg, NULL, 0, 0); TranslateMessage(&msg); DispatchMessage(&msg); if ((msg.message == WM_KEYDOWN) && (msg.wParam == VK_RETURN)){ LRESULT index = SendMessageA(hwnd, LB_GETCURSEL, 0, 0); } if (msg.message == WM_SYSCOMMAND){ if (msg.wParam == SC_CLOSE){ exit(0); } } } }
>>402 > A) 現在選択されているアイテムのインデックス番号を取得するにはどうしたらよいのでしょうか? (LVS_SINGLESELでたった一つしか選択できないようにしています。)
LVM_GETNEXTITEM
コンソールアプリとして作ってるとか、バカじゃねーの・・・
メッセージループも無駄が多いな
>>394 WinAPIスレとしてはstd::stringを使うなら、
それよりもstd::basic_string<TCHAR>を使えと言っておく。
413 :
デフォルトの名無しさん :2006/02/18(土) 19:42:30
// 画面消去 HBRUSH oldbr = (HBRUSH)SelectObject(g_hdcOff, g_hbrBg); SelectObject(g_hdcOff, GetStockObject(WHITE_BRUSH)); Rectangle(g_hdcOff, -1, -1, CLIENT_WIDTH+1, CLIENT_HEIGHT+1); SelectObject(g_hdcOff, oldbr); でうまく画像が消去できません」。 ヘルプ
>>413 左上は(0,0)の筈だが(-1,-1)ってどこから書きたいんだ?
ExtTextOut
まずは各APIの戻り値を調べるべきだな。
SetWindowsHookExのWH_SHELLを用いて ウィンドウの作成/破棄されたかどうか調べているのですが、 一部のアプリケーションについては、 HSHELL_WINDOWCREATEDは送られてくるのですが、 HSHELL_WINDOWDESTROYEDは送られてきません。 また、両方とも送られてこないアプリケーションも存在します (例えば cmd.exe)。 送られてこない原因は何なのでしょうか? また他の方法でウィンドウの作成/破棄を調べることはできるでしょうか?
419 :
418 :2006/02/18(土) 21:19:31
WH_SHELLの代わりにWH_CBTで試してみましたが、結果は変わりませんでした。
TextOut(g_hdcOff, i2*cs, i*cs, str, (int)strlen(str)); ↑ で文字が正常に表示されません! 低い確率で、ちゃんと表示さてるときはあります。 ヘルプー
帰れカス
>>420 引数のそれぞれが適切な値か確かめてみる。
GetLastErrorで何が返ってくるか確かめる。
これくらいをまずやってから来い。
あと「正常に表示されない」じゃなく、症状を具体的に他人にもわかるように書く事。 「腹が痛い」だけで原因を突き止められる医者はいないだろ?
CreateFontのパラメータが良くない可能性が高い。 特に理由が無い限りCreatePointFontを使う方が確実で簡単。
falseとFALSEを混同するのはよくないよ。
427 :
デフォルトの名無しさん :2006/02/18(土) 22:54:56
な直りましt!!!!!!!!!!!!!!!!!!!!! どうやら確保していた変数の量を超えていたらしいです! オーバーフローっていのかな? うぉぉぉぉ!!!! 俺っておばかチン! ハッハッハハハハハハッハア 正義は勝つ!!
( ゚キリル゚) ・・・
だから死ねって
430 :
デフォルトの名無しさん :2006/02/19(日) 00:06:09
窓出してメモコントロール表示するところまではいったんですが ウィンドウの下側に貼り付ける方法とスプリッターの出し方がわかりません。 これってどちらもウィンドウのリサイズとかを検出して 自前で実装する物なんでしょうか?
editコントロールで数字のみ入力を受け付けることができるようにするには、 どうすればいいですか?
すぐ上にSTATICコントロールを置いておき 「↓数字だけ入れてね」とでも書いておく
>>431 スタイルにES_NUMBER付けとけばとりあえず数字以外の入力の抑止はできるが
コピペは抑止できないので、後はごにょごにょする。
めんどくさければ432の如く
435 :
431 :2006/02/19(日) 01:14:13
432さん、433さんありがとうございます。 一応432さん提案のコメントも置いておきますが、 無法者もいるとおもいますので、 433さんにごにょごにょを教えていただきたいです。
サブクラス化
437 :
433 :2006/02/19(日) 02:09:24
>>435 貼り付けで考えられるのは
1.Ctrl+Vで貼り付け
2.右クリックメニューから貼り付け
3.別のプログラムからWM_SETTEXTで無理やり入力
1.WM_CHARで数字以外の入力は全てはじく
(CTRL+Vは抑止できるが、CTRL+C,CTRL+X,CTRL+Zも使えなくなるので
その動作を残したければその点も考慮にいれて書く)
2.WM_CONTEXTMENUで抑止してしまう(コピー等もできなくなるが・・・)
3.これは考えなくてもいいと思うけど一応
あと、EN_CHANGEでチェックするのもありか?
MFCベースのサンプルがいろいろあるから
あとは適当に参考にしてやってください。
ttp://www.codeproject.com/editctrl/
438 :
431 :2006/02/19(日) 02:23:46
ありがとうございました。 結構手間がかかるようですが、 なんとかやれそうです。
コントロールに表示されるフォントの種類やサイズはどうすれば変えられますかね? SelectObjectを使ってできたりするんでしょうか?
MFCや.NET Frameworkは使わず、 API直使用でMDIのアプリ(と言ってもMDIのフレームとドキュメントウィンドウが出るだけ)を作りました そのフレームにCreateToolbarExでツールバーをつけたのですが、 その状態でドキュメントウィンドウを作ると、初期位置でタイトルバーがツールバーの下に隠れてしまいます。 ツールバー付きのMDIアプリって、どうやって位置調整してるのでしょうか? やっぱりMDICLIENTのサブクラス化ですかね?
445 :
440 :2006/02/19(日) 14:51:53
>>443 猫でも分かる...に例がある。tool bar の高さで調整したと思う。
SizeWindow() で加味したはず。
この部分は何年も前のソースを今も使いまわしていて、どうしているか
気にもしなくなった。
447 :
443 :2006/02/19(日) 18:35:17
448 :
デフォルトの名無しさん :2006/02/19(日) 19:32:37
警告 W8057 first.cpp 31: パラメータ 'hPrevInst' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) 警告 W8057 first.cpp 31: パラメータ 'lpsCmdLine' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル '_main' が未解決(F:\PROGRAM FILES\BORLAND\BCC55\LIB\C0X32.OBJ が参照) 上のような警告やエラーが出てきてexeファイルが作られません。 どうすればいいでしょう。ソースは猫でもわかる...のwebサイトからとってきたので間違いはないと思います。
450 :
448 :2006/02/19(日) 19:46:11
>>449 ありがとうございました。解決しました。
>>448 その警告はC++ならこのように仮引数の名前を与えなければよい。
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, PSTR, int nCmdShow)
452 :
デフォルトの名無しさん :2006/02/19(日) 23:48:48
FILE, fopen, fgets, EOFに相当するAPIってありますか? Cなのにこれらの関数が使えません><
>>452 何故使えない?
それはともかくそれぞれAPIでやるとなると
HANDLE, CreateFile, ReadFile(行単位でなくfreadに近い), ReadFileを呼んで判断するとなる。
なぜ使えないのか凄く興味あるw #include<stdio.h>してる?パスは通っている? あと質問するは、なんてエラーが出てるか書こうね。
おそらくWindowsCEだな。 本見るとつかえるようなつかえないようなよくわからん表現になってるw だから、とりあえず使わないでおこうかってなるw
そういうコーディング規約のプロジェクトなのかも
HTMLのフレームの様にウィンドウを分割する方法を教えて下さい。 MFCにはそれっぽいものがあるようなのですが……。 ベタのAPIだと機能として提供はされていないのでしょうか?
458 :
デフォルトの名無しさん :2006/02/20(月) 12:43:20
素直にMFC使え。ウィザードで一発。
TSplitter
457じゃないけどWin32APIの素プリッ他のサンプルってないですかね
・ウィンドウAに子ウィンドウBと子ウィンドウCをフレーム分の間をあけて貼り付ける。 ・フレーム部分でマウスドラッグが発生したらBとCのウィンドウサイズ・位置を適当に調整する。 だけ。
>>462 まぁ、確かにその通りなんだが、
・スプリッタ自身がリサイズされた時の子ウィンドウの再配置
・上記のときのスプリッタの位置の調整
・3分割もサポートするか。3分割はスプリッタのネストにするか。
・子ウインドウのワクを、どのように(どんなデザインで)描くか。
とか考えながら再利用できるものにしようとすると、えらくめんどくさくなる。
この手のWidget、もう2,3回書いた気がする。
C++から使える、MFCじゃないウィジェットセット、どこかに無料で転がってないもんだろか。
look&feelはMFC互換で。
457です。
とりあえず
>>462 さんに従って適当にやってみます。
どうもありがとうございました。
Qtは大分違うしなぁ
>>457 VC のチュートリアルに載っているでしょ。
ダメでした。
>>469 人生はリセットボタンはなくても電源ボタンならあります
気が向いたら試してみてください
っ П
ぽちっとな
>>473 WTLは確かにすばらしいけど、ATLがなければ使えないから。
無料で〜という条件にあたらない。
まあ、Windowsな以上、
VCが、さまざまな点において、最適だとは思うけど。
VC Express に WTL つっこんで、サンプルビルド出来たんだが
MFCWTLATLなんてお呼びじゃねーんだよ
SDKだけでコーディングするのはいいんだけど、標準的なメッセージのハン ドラが記述してなかったり、時間のかかる処理をスレッド化してなくて、 ウィンドウが真っ白になるようなアプリケーションは組まないで頂きたい。 いまどき、クラスも理解できなくて、C+SDKで生産性の低いコーディング スタイルしかできないのを棚に上げて、MFCや、WTL,ATLの所為にされても なぁ。
MFCWTLATLみたいな生産性低いの使わないで.NET Framework使え。
>>478 あんなクソフレームワーク誰が使うか
自分で作ったほうが数倍軽いわ
論点なんて関係ありません
まずはもちついてスレタイ100回嫁と
はい、だから.NETなんてイラネといいました
暇人同士仲良くしろよ
GetModuleFileNameやGetModuleFileNameExを使って取得されるパスの長さって_MAX_PATHより長くなることってあるんですか? _MAX_PATH以内確定ってことでプログラムしてるんですが、まずいですか?
あるよん。 \\?\ で始まる形式のとき。 詳しくはmsdnみるよろし。 ま、普通は考慮せんでもええけどね。
いい加減Windowsから char[]とかchar*とか追放しろよ。 そんなことだからいつまでも安定動作しないんだよ。
ハァ?
char *shineyo490;
>>488 _MAX_PATHはCRTの定数。WindowsSDKはMAX_PATH。
Cの関数とWindowsAPIの両方とも使っているとき、 _MAX_PATHとMAX_PATHのどっちを使うべきか悩む。 _UNICODEとUNICODEとか・・・。
#define _MAX_PATH_ MIN(_MAX_PATH,MAX_PATH) #define _UNICODE_ _UNICODE&&UNICODE
>>495 #define _UNICODE_ _UNICODE||UNICODE
の間違いじゃないか?
つーかstdafx.hでどっちもdefineしときゃ問題ないねん
Windowsのどこかのヘッダにこんなことをしている箇所がある。 「_UNICODEが定義されているけれどUNICODEが定義されていなければUNICODEを定義する。 UNICODEが定義されているけれど_UNICODEが定義されていなければ_UNICODEを定義する。」 だから混同してもまあいいかという気持ちでいる。 またUNICODE(TCHAR)に関しては、CRTとWinAPIを比べたら まず間違いなくWinAPIでお世話になることが多いから、UNICODEを俺は使うことにしている。 どうせ<tchar.h>は標準でもなんでもないし。 それに合わせて_MAX_PATHではなくMAX_PATHを使う。 あと_MAX_PATHはVC++独自。標準C/C++に存在するのはFILENAME_MAX。
MSDNにかかれているWindowsAPIの引数で_TCHARを使ってるのなんてないだろ。いずれもTCHAR。 MAX_PATHもWindowsAPIでは標準なものだ。
CreateWindowの前でSetLastError(ERROR_SUCCESS)としておいて WM_CREATEメッセージでGetLastErrorでエラーコードを調べると ERROR_FILE_NOT_FOUNDが返ってくるのですが・・・。 これは気にしないで構わないでしょうか? ちなみにWinXP SP1だと問題なく(ERROR_SUCCESSが返ってくる)、 Win2k SP4で発生しています。
>>500 そのGetLastErrorの値は意味が無い。
GetLastErrorでエラー情報が取れると明記されたAPIの呼び出し直後のみ、意味がある値が取れる。
>>501 気にしないことにします。
ありがとうございました。
503 :
デフォルトの名無しさん :2006/02/21(火) 15:09:29
ファイルを完全に削除する方法はないですか? deletefile関数はダメでした。
>>503 何がやりたいかわからない
何がどうダメなのか書け
505 :
デフォルトの名無しさん :2006/02/21(火) 15:15:22
完全という意味がわからないか? 悲しいな、逝ってよし。
何時代の人間だ
>>503 NTなら、MoveFileEx()を使う。
9xなら、WININIT.INIを使う。
詳しくはMSDNのMoveFileExの説明に載っている。
508 :
デフォルトの名無しさん :2006/02/21(火) 15:20:33
説明不足でした、すみません。 deletefileを使用すると、ゴミ箱にはファイルは入らないのですが ファイル復活ツール(ノートンのゴミ箱)だとしっかり復活できて しまいます、早い話が復活できないようにファイルを削除したいのです。
sageもせず、大文字小文字の区別すら出来ないヤツは信用できん
ファイルのサイズ分だけ0で埋めてから消せば?
>>508 ノートンはいろいろと面白いことをごにょごにょしているからね。
だいたい、ノートンがなくても、結局HDDに残って入れば、復旧できる可能性はあるわけだし。
まずまず信頼性の高い方法
ファイル全体に対して、ランダムな値を何度か書き込んだ後、削除すること。
完全を求める場合
HDDを物理的に破壊する。
>>513 ワロス。少なくとも3か所にマルチポストか。
HM3さんよ、マルチポストはダメですよ。
ち、マルチかよ。 答えて損した
これは非道ぃ
517 :
デフォルトの名無しさん :2006/02/21(火) 17:02:50
一体マルチのどこが悪いのかわからない。 複数のスレに質問することでレイテンシが最小に抑えられるし 複数のレスが得られれば情報の確度も飛躍的に向上する。 忌むべきはレスをもらった後に放置することでありマルチ自体ではないはずだ。
はずれ
百歩譲ってマルチ自体が悪くないとしても、マルチするヤツは概して まともな後始末できないから結局ダメ。
いつか答える側になればわかる
523 :
デフォルトの名無しさん :2006/02/21(火) 17:20:59
一般的に言って質問する側は緊急度が高く 答える側はたいてい暇なことが多い。 また答えが重複したところでコミュニティの大きさが十分大きければ その無駄も相対的に0に等しい。 よってマルチの価値は高く、反面実害はほぼ0であることが証明された。
仮定の上に話を進めて何が証明か
2:ごくまれな反例をとりあげる 4:主観で決め付ける 20:条件の包含関係を間違える
528 :
デフォルトの名無しさん :2006/02/21(火) 17:31:54
>>526 掲示板、特に質問と冠されたもの質問する側の人間の為に存在する物だ。
そのような主客の転倒した論調には首肯しかねる。
ていうかパソコンの仕組みを勉強した方がいいような
同じ質問をいくつもの掲示板に投稿するのは、 その掲示板に集まる人を自分の質問に答えるための道具のように扱っていると思われても仕方ありません。 そのような扱いを受ければ誰だって気分を害します。 質問への回答は善意から行なわれるもの
質問は蓄積されて、後から見る人間に役に立てば良いんだが・・ ま、2chにあるうちは無理だろうなぁ
>>531 そんなの、513みたいな暇人が指摘しなければ気がつかんよ
かつてインターネットといえばネットニュースだった時代、同じ記事を複数のニュースグループに投稿するという行為は普通に行われていた。 しかしネットニュースにはクロスポストというシステムがあり、これを使っている限り複数のグループに投稿された記事は同じものとして扱われ、 適切なクライアントソフトを使っていれば何度も同じ記事を読まされるということはなかった。 マルチポストをするなというのはその時代の名残。決して同じ記事を複数の場所に投稿すること自体を禁じるものではない。
マルチタスクは体に良くないってのが起源だろ?
>複数のレスが得られれば情報の確度も飛躍的に向上する。 そんなことでしか情報の確度とやらを上げられない^^; >答える側はたいてい暇なことが多い。 回答者は日々勉強した知識で答えているのに、それを「暇」だって? 回答者やってみろよ。まともに答えたことないだろ?
マルチしても、それぞれ質問した場所で答えている人間に重複が多ければ それは無駄になる割合が高いと言える。(その割合と言うのがどれくらいかは知りようが無いけれど) 答える人間も答えたくてうずうずしていてあちこちを回っているかもしれない、というより俺がそうだ。 だからマルチしなくてもいいのに、と俺は思っている。
知ったかぶりの517を笑うスレだと聞いてやってきました。
505 :デフォルトの名無しさん :2006/02/21(火) 15:15:22 完全という意味がわからないか? 悲しいな、逝ってよし。 508 :デフォルトの名無しさん :2006/02/21(火) 15:20:33 説明不足でした、すみません。
WM_CREATE内に重い処理があったので、 最初ウインドウが現れるまでに時間がありました。 ウインドウが現れてからその処理をするように変えたいのですが、 どうしたらいいのでしょうか? ウインドウが表示されるタイミングっていつですか?
WM_CREATEで適当なメッセージを自分にPOSTするという手はある。 ただ、どっちにしろメッセージループを回さないと、ウインドウは固まってしまうけど。
スレッドを使え
543 :
540 :2006/02/21(火) 21:06:40
>>541 以下のようには試してみたんですが、
ダメでした・・・
(ウインドウが表示されるまでに時間がかかる)
なぜなんですかね?
541さんが言っているのは全然別のことですか?
switch (msg) {
case WM_CREATE:
SendMessage(hWnd,WM_PAINT,0,0);
SendMessage(hWnd,WM_USERDEFINE,0,0);
break;
case WM_USERDEFINE:
// 重い処理
break;
case WM_PAINT:
// 描画処理
break;
}
SendじゃなくてPostじゃね?
>>543 WM_CREATEからWM_PAINTをSendMessageすんなバカ
SendMessageは対象ウィンドウのウィンドウプロシージャを直接呼び出して、
メッセージの処理が終了するまで呼び出し元に返ってこないから、
それだとWM_CREATEに重い処理書いてるのと一緒だ
>>541 がわざわざPOSTすると言ってるのに何やってんだよ
ウィンドウが表示されるタイミングは、ShowWindowなどによってウィンドウの表示状態が「表示」にセットされた時
メッセージで知りたいならWM_SHOWWINDOW
546 :
540 :2006/02/21(火) 21:16:13
>>544 、545
ご、ごめんよ・・・
一つ賢くなったよ。
ありがとう
とりあえず、postで実装してスレッドに進化してみます。
>>546 今の貴方にスレッドは・・・
うーん・・・
>>543 あとWM_PAINTはSendするものでもPostするものでもない。
InvalidateRectなんかを使え。
処理を1つの関数にまとめといて、
CreateWindow → ShowWindow → 関数呼び出し
とやった方が今の
>>540 には優しいかもしらん
期待として(今WM_PAINTを処理したい)、それにプラス、UpdateWindow、なのかなー。
551 :
540 :2006/02/21(火) 21:38:48
スレッドってもしかして・・・ グローバル変数とか使えなくなりますか? メモリが共有できないとか?
共有できるからこそ問題にもなる。
553 :
540 :2006/02/21(火) 21:41:21
あれ、グローバルは使えますよね。 これまでWM_CREATEメッセージ時に呼んでた関数を、 スレッドから呼んだらエラーになるようになったんですけど・・・ あー、なんて質問していいのかもわかんね
554 :
540 :2006/02/21(火) 21:42:11
>>552 同期に関してはある程度分かってるつもりなんだけど、
これまで机上だったもんで、
スレッドわかんね
どーせC++のメンバ関数が呼べないとかそんな話だろ。
おまいのやりたいことは本当にスレッドで行うべきなのか? WM_CREATE 中の「重い処理」とやらを見直すべきかも知れない。 起動に時間が掛かることを許容すべきかも知れない。
>>540 はGUIより先にスレッドの使い方覚えろ。
両方同時に覚えたら収集付かないぞ。
558 :
540 :2006/02/21(火) 22:59:56
やってることはDDE通信なんです。 グローバル変数のクラスの関数内で、 DdeInitialize()を行うんですが、 それがエラーになってしまうようになりました。
CreateProcess でプロセスが作れ、作った方を親、作られた側を子と呼び、 親がCloseHandleすれば子と縁が切れる(デタッチ)ところまで理解しました。 デタッチすれば、親を先に終了しても子には全く関係無し(実行されつづける) つう理解でOKですか?
WIN32でデタッチといえば、デバッグ関係だとおもっていた。 CreateProcessで作られた子供が親の寿命と同期して自動的に 死ぬってことは、ないんじゃないかなー。
そもそもプロセスの親子関係なんてWindowsには無かった希ガス。
いや。CreateProcess()の説明読め。ちゃんと親子関係はある。
WIN32APIなんか詳しくなってもしかたねぇじゃん。 それで大金稼いだりできりゃ多少の救いは有るが 忘れたくても忘れられないまま墓まで付き合いたくねぇよ。 なるべく覚えないでかつうまく捜して使いこなすのがコツだな。
何か嫌な事でもあったのか
セディール効くなぁ…
>>564 =馬鹿の真骨頂
みなさん、真似しないように。
>>523 緊急度が高いならいつ返事が来るかもわからず信頼性も不明な掲示板で聞かずに、メーカーに直接聞けや
569 :
デフォルトの名無しさん :2006/02/22(水) 16:01:25
ずっと隠してた事をここで言います。 俺。中卒だから関数とか習ってません。 ありがとう。
その関数って、f(x) の関数か
中学でも関数は習うだろ。
Winsockについて聞いてもいい?
ネットワークスレ池
CreateThreadや_beginthreadで作成するスレッドにデータを渡さなくてもオケですか? _beginthread(Thread, 0, 0);とか
_beginthread を使っちゃいけない理由って何だったっけ?
CreateThreadでCRTの話か?
勝手にスレッドのハンドルをクローズしちゃうことじゃなかったっけ。
メモリリークだった気が
581 :
デフォルトの名無しさん :2006/02/23(木) 09:49:07
すみません、win32APIの初心者です。 ダイアログの中でCreateWindowを使って釦を作成しました。 その釦のタイトルフォントとサイズを変えたいのですが、どうすればいいのか分かりません。 .rcのソースリストからでは簡単に出来るのですが、APIではどうすればいいのでしょう。 ご存知の方、よろしくご教示ください。
WM_SETFONT
>>583 Sleep(1)を1000回ほど繰り返すロジック書いて実測しろと。
>>582 早速のご教示、ありがとうございます。
しらべて見ます。
窓の話だけど Sleepの精度が低い環境があるのは事実。 timeBeginPeriodで精度を上げられるのも事実。 timeBeginPeriodが他のプログラムに影響するのも事実。 他のプログラムが、精度の低いSleep(1)を期待している もしくは精度が低いとは知らずに利用している場合は問題となる。 Sleepは0以外の値が指定されたときに、 指定された時間"以上"スレッドを中断させる。
誤爆った
Win32APIなあたり、あながちゴバクとも言えないこの不思議
589 :
デフォルトの名無しさん :2006/02/23(木) 16:12:41
ディレクトリ内にファイルがいくつあるか返すAPIを教えてください
FindFirst/NextFileでカウント汁
591 :
デフォルトの名無しさん :2006/02/23(木) 16:29:10
やっぱそうかぁ〜 答えを見る前に既に作ってた
>>589 APIはないが、popen("dir <target directory>", "r")とでもして数えてみたらどうだろう。
ファイルがあるかどうかをチェックするだけなら、 PathIsDirectoryEmptyってのもあるな
594 :
デフォルトの名無しさん :2006/02/23(木) 17:57:39
VIP臭いお(;^ω^)
オマエモナー( ´∀`)
この板でもVIP臭いを導入したのかと思ってシマタ。
int iFileCnt = `ls -1 hogehoge | wc -l`;
600 :
デフォルトの名無しさん :2006/02/23(木) 20:30:04
あるアプリが、立ち上げ時にどんなファイルやどんなDLLをどんな順番で触っているかを ログファイルに書き出したい。 APIフックとか使えば何とかなるんでしょうが、 既存のツールでなんかないですか? なお、「あるアプリが」という条件がつくとキツい、というなら、 単に、NTFSのファイルリード関数をフックして、 すべてのファイルアクセスをロギングするツールでもOKです。 ただ、データファイルへのアクセスだけではなく、 DLLファイルや関連アプリファイルへのアクセスもロギングできるとうれしいです。
ここはツールをクレクレする板ではなく、自分でプログラムを作る板です。
602 :
デフォルトの名無しさん :2006/02/23(木) 20:46:45
windows2000上のVC++のVer6.0でプログラムしてます。 CWinThread *tAcFlash[TCP_SOCK_NO+1]; for( i=0;i<TCP_SOCK_NO+1;i++){ tAcFlash[i]=AfxBeginThread(AcceptSock,this,THREAD_PRIORITY_NORMAL,NULL,NULL,NULL); if(tAcFlash[i] == NULL){ Ercount++; sprintf(wkText,"%d番目のスレッドを開始できませんでした",i); AddLog(wkText); }else{ count++; Sleep(5); } } みたいな感じでスレッドを立ち上げていくんですが、 1992個でスレッドの開始ができなくなります。 マシンはCeleron 666MHz mem256MBとDuron1.2GHz mem128MBのマシンの 両方で実験してみましたけど、時間が違うだけで立ち上がる数は一緒でした。 スレッドの最大数って何によって制限されるのでしょうか? また、スレッドのエラーの取得方法はどうすればよいでしょうか?
603 :
デフォルトの名無しさん :2006/02/23(木) 20:57:50
>>601 イジワルいわずにおしえてよ。
つーか、このスレがスレ違いならどこがいーんだYO!。
604 :
デフォルトの名無しさん :2006/02/23(木) 21:04:31
605 :
デフォルトの名無しさん :2006/02/23(木) 21:05:59
visual c++.netというコンパイラがあるようですが無料ですか?有料ですか?
>>602 まずそんなにスレッドを起こして何をするのかはっきりしる
返答によっては当局に通報する
>>602 普通はOSのバージョンで変わるもの
ハンドル数とかもな
613 :
602 :2006/02/23(木) 22:29:12
>>600 の人気に嫉妬
>>607 ソケットのコネクトをポーリングで待ち受けてます。
1ポートでマルチコネクトを実現する場合、スレッドで立ち上げるものじゃないんでしょうか?
>>608 つ〜ことは、OSが起動しているスレッドやハンドルを減らさないと、
スレッドでマルチコネクトは1992までしか確率できないって事でしょうか?orz
windowsでマルチコネクトを実現する手法ってどんななんだろ?
>>613 それは同時接続数が少ないときのやり方。
同時接続数を大きく取りたいのなら、IOCP or 1つのスレッド当り32個くらいの
ソケットを同時に処理するように作ると世ろし。
>>613 基本的にはスレッドでいいと思うが、入り制御をしないと
死ぬほど接続しに来たときにそういうこと(スレッド生成不可)になっちゃうね
最大数を超える分はエラーで弾くか、キューイングするかかな
616 :
615 :2006/02/23(木) 22:42:53
ぬ かぶったスマソ
617 :
602 :2006/02/23(木) 22:47:56
>>614 IOCP調べてみた。難しそうだけど頑張ってみる
ありがとう
>>615 条件が2000コネクトで、サンプルで動いていると言われて貰ったプログラムが
1992個以降のスレッド作成でこけてたわけです。
(サンプルは、エラー出力してないからわからなかったんだと思う)
Linuxの場合は、無駄は多いけどワーッとプロセス立ち上げて対処できた気がする
とりあえず、ありがとう
>>613 I/O完了ポート なら個数制限に悩まない。
でも、切断でバグらないようにするのが大変だったりもする。
>Linuxの場合は、無駄は多いけどワーッとプロセス立ち上げて対処できた気がする Windowsでもできるがな
620 :
602 :2006/02/23(木) 23:18:28
>>618 IOCP難しい。とりあえず、サンプルプログラム探してる。
>>619 プロセスなら数に制限ないのか〜。
どうしても駄目ならそっちに逃げます。
>617 スタックサイズの制限はかけてる? スレッドひとつに1MB割り付けば、それで2GBいく。 仮想メモリの上限が2GB.
622 :
602 :2006/02/23(木) 23:31:06
>>621 前に調べてかけた気がするけど、現状、どこでかけるか忘れて試せない。
仮想メモリの上限が2Gとしても、同じプログラムで物理メモリが違うマシンで実行して
同じ数しか起動できないのは、別の問題な希ガス。
どっちにしろ、CPUが何千個もあるわけじゃないんだから、
現状で、スレッドを何十何百と作るのは間違っているだろ。
>>620 IO完了ポートについて解説した、ただで読める文章は、ほとんどない。
たしかCodeProjectに、サンプルコードがあったはず。。
それと、SysInternalsに、IO完了ポートの詳細な説明がある。
まあ、基本的にはスレッドプーリングという考えだから、
Advanced Windowsも多少は参考になるかと。
32bitの壁にぶち当たってるんだから、物理メモリの搭載量が4GBだろうが16GBだろうが関係ない。 ふつーの32bitプロセスが使えるメモリ量は2GB−α。
物理メモリの搭載量に関係なくWin32アプリケーションにはプロセス毎に4GBのアドレス空間が与えられる。 そのうち2GBはシステムが予約しているのでアプリ側で使用可能なのは2GB。 ただし、Windows Serverでは設定によってアプリが使用可能なアドレス空間を3GBまで拡張可能。 これとは別に、物理メモリ搭載量+ページファイルの上限サイズでシステム全体の使用可能なメモリ量が決定される。
626 :
602 :2006/02/24(金) 00:18:43
>>623 それも調べて見ます。
とりあえず間違いなのはわかったけど、サンプルの間違いを指摘するなら、
原因は別かなと思っただけです。
win32マルチスレッドプログラミングって本にもあるらしいから、
土日にでも本屋にいってみます。
>>624 なるほど。そういう事ですか。納得。
windows2000の仮想メモリは可変だったと思うけど、
最大値を超えて変更されたりしますか?
しないなら、32bitの壁以前に、物理メモリ+仮想メモリの限界が
32bitの壁以前に来るので、原因ではなさそう。
627 :
602 :2006/02/24(金) 00:22:23
>>625 通常であれば、メモリ128M、仮想メモリ最大値の設定256Mであれば
2G+128M+256Mがシステム最大のメモリ使用量と考えてOKですか?
ん〜、なんか難しいです。
単純に、メモリ不足のダイアログが出てないから全然疑っていませんでした。
>>627 っ[とりあえず仮想メモリを仲間にしてあげて]
っ[完全に誤爆した]
ポップアップメニューにフォーカスが無くなった時に閉じる方法ってありますか? どのようにすればいいかご教示ください。
631 :
630 :2006/02/24(金) 00:42:31
SetForegroundWindow(hwnd); でできました。すみません、ありがとうございました。
TLSの制限かなと思ったけど違うか>大量スレッド それだと1088が上限だしねぇ。
>>627 そのアドレス空間はアドレスの空間であって実際のメモリではない。
なるべくメモリ使用量の少ないアプリを作っています。 窓を開けただけで1800KBほどのメモリを食っているのですが、 メモリを削っていく方法ってないですか? Delphiで書いていてメモリを食うので、今はCで書いているのですが、 実行ファイルサイズは小さくなったのですが、メモリ使用量は あまり小さくなりませんでした。 このパラメータをこれにしたら小さくなるというようなのがあれば、 教えてください。
InvalidateRect関数を頻繁に使うと画面がちらつくのですが、 画面がちらつかない方法ってないですか? 画面上の更新したい部分だけ更新とかってできないものでしょうか?
InvalidateRect ~~~~~~
640 :
デフォルトの名無しさん :2006/02/24(金) 11:06:41
メッセージの送信元のスレッドを調べるにはどうしたらいいの?
ごめんちゃい。 もう一つ質問。 タイマーのイベントでタイマーの間隔以上の処理をしたらどうなりますか? 例えば、 1000ms間隔でタイマーを作っといて、 そのタイマーイベントで3000msの処理をした時など。 やりたいことは、 3000ms処理→1000ms休む→3000ms処理→1000ms休む・・・ メッセージ処理内でSleepなんか使うとメッセージ処理できなくなりますよね? スレッドを作ったりするしかないですか?
タイマーメッセージはその処理が完了しない限り、 新たなメッセージがキューに積まれないようになっている。 長時間占有するような処理を書くなら普通は別のスレッドを使う。
>>642 ありがとうございます。
スレッドを使ってやりたいのですが、
スレッド内でDDE通信を開始すると、
そこで登録した割り込みが入って来ないんです・・・
スタックが別であることが問題となっているのでしょうか?
DDEなんかじゃなくてもいいんじゃないの
そこでMsgWaitForMultipleObjects
>>644 すでにあるアプリと通信するためにDDE通信を使う必要があるんです。
>>645 どういう意味でしょうか?
スレッド内でDDE通信登録
↓
ホットリンクなので値が変わると割り込みがくるはずが来ない
別スレッド側からSendMessageを投げて、ユーザメッセージとして処理する。
>>646 DDE はウィンドウメッセージベースでの通信なので、
ウィンドウをCreateWindow したスレッドでしか使えません。
ウィンドウを持つほうのスレッド(UIスレッドなどと言う)側で
DDE の処理を行って、ワーカスレッドではそういうことは
しないようにしましょう。
っていうかDDEごと別スレッドにもっていったんじゃ、
結局時間のかかる処理中にDDEに反応できなくなって、
DDE ブロードキャスト使ってる他のアプリが迷惑する。
>>648 わかりづらくてすいません。
結局やりたいことは、DDE通信だけなんです。
ただTOPICが300ほどでITEMもできれば30000ほど登録したいと思ってます。
(これはDDE通信する相手のアプリの仕様です)
時間のかかる処理っていうのは、
DDE通信のための接続処理なんです。
だいたい20秒ほどかかってしまうので、
それをどうしたらスマートなのか悩んでいます。
645さんと647さんは同じことを言っているのでしょうか? ユーザメッセージとして処理するのは何の処理ですか? 割り込みで行う処理内でメッセージを投げて、 本来行いたい処理をユーザメッセージ処理内で行うという意味ですか?
652 :
640 :2006/02/24(金) 14:19:35
>メッセージの送信元のスレッドを調べるにはどうしたらいいの? これってどんなもんでしょ?
>>636 IMEを一切使わないのなら、ImmDisableIME。
654 :
636 :2006/02/24(金) 15:18:53
>>639 SetProcessWorkingSetSizeは有用ですね!!
400Kくらいで安定するようになりました!
ありがとうございます。
>>653 IME使わないだけで60%くらいにできました!
ありがとうございます。
655 :
デフォルトの名無しさん :2006/02/24(金) 16:21:24
SendMessageをコールするとたちどころに処理されてreturnされるけど、 これを、ワンクッション置いてから処理するようにしたいのだけど、可能ですか?
>>655 何やりたいのかわからん
とりあえずsendmessageを内部で呼ぶラッパー関数でも作ってみたら?
657 :
655 :2006/02/24(金) 16:47:45
説明ぶそくですいません。 今考えてるのは、SendMessageから受けたリクエストを即座に処理をするのではなくて、バッファに貯めて処理をせずにreturn タイマーで定期的にバッファを確認し、貯まってるようだとそれを処理する。 って感じで実装を考えてますけど、そのような事をやってるくれるAPIは無い物かと思いまして。 SendMessagePoolのようなものが無いかと。。。
658 :
655 :2006/02/24(金) 16:49:51
あれ、PostMessage でいいのかな?
>>657 そんなAPIは内と思う。自分でキューを作れ。
俺も無い(似たようなのはあるかもしれないけど、完全に仕様を満たすものは無い)と思う postmessage()使っても良いけど、その代わりポインタへ読み書きするようなメッセージは全てできなくなる そのためのsendmessage()なんだから
661 :
655 :2006/02/24(金) 17:28:48
>660レスどうもです。 そう、今それを質問しようとしたんですけど、パラメータでポインターを渡したとき誰がdeleteしてくれるのかと。。。 BSTRとか、ComPtrで渡せば勝手に解放してくれるのかしら?
>>660 > その代わりポインタへ読み書きするようなメッセージは全てできなくなる
それはプロセスを跨いだ時だろ?
>>661 > パラメータでポインターを渡したとき誰がdeleteしてくれるのかと。。。
メモリ管理はプログラマの責任で!
Window枠の、現在の色を取得するAPIって何でしたっけ 枠の色とは、XPより前のでいう、明るい灰色の部分(デフォルト)の事です GetSysColor(COLOR_3DSHADOW) だと思っていたのですが、今やってみたら微妙に違う感じで
664 :
デフォルトの名無しさん :2006/02/24(金) 18:33:55
VC++2005Expressにて、ポップアップメニューのオーナードローを行っています。 だいたい出来たんですが、メニューの外枠(3D)が邪魔だと思うようになりました。 これをどうにか消したいんですが、調べた所サンプルが見つかりませんでした。 もともと外枠のないポップアップメニュー(フラットなの)を作れたら一番良いのですが、ポップアップメニューのHWNDからGetWindowDCできれば何とかなりそうだと思いました。 ポップアップメニューのHWNDはどうやって取得したら良いでしょうか。 実験として、右クリックした時にGetCursorPosして、その時のPOINT構造体を元にWindowFromPointしてもだめでした。 CreatePopupMenuした後のHMENUからHWNDを逆引きするとか、そんなイメージで考えています。 よろしくお願いします。
>>633 COLOR_3DSHADOW
~~~~~~~~~
明るいわけないじゃん。
落ち着いた。すまなかった。
>>663 最も明るい色 COLOR_3DHILIGHT
ちょっと明るい色 COLOR_3DLIGHT
>>664 元々そういうことをするようにはできてないんで、1から自分でポップアップメニュー互換のウィンドウ作ったほうがはやい。
>>664 XPではメニューをオーナードローするときのDCはオフスクリーンDCで、
α付き透過ウィンドウとしてスクリーンに表示されます。
(メニューの影とふわっと出てくる視覚効果のため)。
メニューのHWNDが得られたからそのGetDCして何でも描けるかというと
それはかなり難しい。
>>669 そういう情報はどこから手に入れてくるのか希望します
そういう情報はどこから手に入れてくるのか希望します ↓ Such information is hoped for though doesn't know where to obtain it. ↓ もっとも情報が望まれているそのようなものは、どこでそれを得るかを知りません。
もっとも情報が望まれているそのようなものは、どこでそれを得るかを知りません。 ↓ As for such the one that information is hoped for, it doesn't know where to obtain it most. ↓ 情報が期待されるくらいのものに関して、それは、どこでそれを最も得るかを知りません。
日本語でOK
英語では王系
馬鹿ばっか
>676 一番バカっぽく見えるお
馬鹿ばっか ↓ Only foolishness ↓ 愚かだけ ↓ 只愚笨 ↓ ただ馬鹿なだけ
679 :
663 :2006/02/24(金) 20:30:30
>>665-667 失礼コピペミス。正しくは GetSysColor(COLOR_3DFACE) でした
COLOR_3DLIGHTと同じ色みたいです
GetSysColor(COLOR_3DFACE)で取った値を、そのままDIBのメモリに
入れていたら微妙に変だったのですが、ビットのRとGを入れ替えたら上手く行きました
スレ汚し失礼
680 :
デフォルトの名無しさん :2006/02/24(金) 20:50:57
681 :
664 :2006/02/24(金) 22:06:22
うーわー、やっぱ無理なんですか。惜しい所まで行ったのになぁ…残念です。 回答ありがとうございました。
GetSysColor(COLOR_3DFACE) ~~~~~~~ どう見ても表面の色です、本当にありがとう御座いました
スレ伸びるの早すぎ
684 :
デフォルトの名無しさん :2006/02/25(土) 07:21:04
Win98/Win2000を使っています。 Platform SDKなんですが、Win98用(?)とかWin2000用(?)はもう落とせないんでしょうか? あと、昔はPlatform SDKの各部分が必要なものだけ落とせるようになっていたと思うのですが、もうそういうことはないのでしょうか?(というか各CABの内容リストをどこかに書いておいてくれればいいのに・・・)
>Platform SDKなんですが、Win98用(?)とかWin2000用(?)はもう落とせないんでしょうか? SDKのヘッダファイルを覗いてみれば解決することでしょう。 >あと、昔はPlatform SDKの各部分が必要なものだけ落とせるようになっていたと思うのですが、 ダウンロードした後に自分が必用なものを抽出すれば解決することでしょう。
新しいPlatfrom SDKは以前のものを包容している。 WINVERなどを適切に設定してヘッダをインクルードすれば平気。
WindowsMeでは、GetKeyState(VK_LBUTTON)は使えないのでしょうか? マウスの左ボタンを押しても押さなくても、0が返ってきます。 WindowsMeのマシンが2台あり、両方で試してみたのですが、そうなりました。
688 :
687 :2006/02/25(土) 13:51:16
すみません、よく調べたらウィンドウプロシージャとは別のスレッドから GetKeyStateを呼び出していたのが原因のようです。
ウィンドウハンドルとかインスタンスハンドルって グローバル変数にしちゃっていいかしら?
イイヨイイヨー
あまりお勧めしない
スレ違い
693 :
デフォルトの名無しさん :2006/02/25(土) 18:36:58
DLL が2つあるとして、呼び出し側、 DLL それぞれが別々の処理系で作られているとして、 それぞれが自分のメモリ確保ルーチンとか使っても大丈夫なのでしょうか? 開放は、確保したDLL なりが行います(別のランタイムで開放したりはしません)。 bcc32 5.6.4 と、VC++ Express Edition で試したのですが、特に問題が無いようでした。 ランタイムのつくりによるのでしょうか? それとも、Win32 にそういうことを可能にする仕組みなり規約なりがあるのでしょうか? または適切なスレへの誘導をお願いします・・・
694 :
デフォルトの名無しさん :2006/02/25(土) 18:59:45
ダイアログボックスからテキストを入力して、それをウィンドウのクライアント領域 に表示したいのですがどうやればいいですか? 次のようにやってみましたが、駄目でした。表示したいテキストはSTLのリストに入れてます。 case WM_PAINT: hdc = BeginPaint(hwnd, &ps); if(!lst.empty()) { p = lst.begin(); TextOut(hdc, 1, 1, p->title, lstrlen(p->title)); } EndPaint(hwnd, &ps); break; 同じコードでWM_PAINTでなく、WM_COMMANDからメニューボタンが押されたら表示 みたいにすればうまくいったのですが、どこがまずいかお願いします。
つ 再描画
>>693 大丈夫。つーかそれがダメだったら、kernel32.dllとかuser32.dllとか使えないじゃん。
std::listにchar*を入れるのはどーなんだろーなー
698 :
694 :2006/02/25(土) 20:00:56
もうすこしヒントお願いします。 WM_COMMANDから表示したものも、最小化、最小化から復帰で 消えてしまうのでWM_PAINT内が機能してないみたいなんですが。。 UpdateWindow()は呼んでます。
700ゲット
701 :
694 :2006/02/25(土) 20:28:49
解決しましたTHX。InvalidateRect()は呼んでましたが、 仮想ウィンドウに書き込んで、WM_PAINT内でコピーにしたら出来ました。 WM_PAINT内でTextOut()って駄目なんですか。
702 :
デフォルトの名無しさん :2006/02/25(土) 20:35:18
WinInetを使用してPOSTを使用するプログラムを作っています。 その中で、InternetConnect関数を使用しているのですが、 第二引数が実際に存在してないサーバー名でも、 関数が失敗せずに値を返してしまいます。 エラー処理はできないのでしょうか?
>>701 >WM_PAINT内でTextOut()って駄目なんですか。
だめなわけ無いだろ。
おまいさんの処理がおかしいだけだよ。
まともなアプリなら、メモリDCに描き溜めといて WM_PAINT時はメモリDC→デバイスDCへのBitBltしか呼ばんと思うけどね
これはまた、とんだ「まともな」論ですな。
リモート接続ではかえって遅くなるから、ちゃんと判定してね、 ってレイモンドが言ってた記憶がある。
708 :
デフォルトの名無しさん :2006/02/25(土) 21:10:31
>>704 酷使してますね。
解決方法がいまいちよくわからないです。
結局、何か送らないことにはわからないってことですか??
>>708 存在しないアドレスを指定しても、何かポインタが返ってくるのは
proxy 経由の場合?それとも直接接続?
711 :
デフォルトの名無しさん :2006/02/25(土) 21:36:50
>>710 直接接続の場合です。
試しにProxy経由でもやってみましたが、
結果は同じで、ハンドルに値がかえってきました。
>>706 なるべくデバイスDCに直接描画しないのは当然だよ。
応答速度が速いアプリはみなメモリDC使ってるはず。
最近はVNCとかRDP経由で使う場合も増えてきたし、
データ転送量低減のためにも余計な書き換えはしない。
Officeとかダイアログ系アプリでよくあるけど直接描画していく
類のソフトは、通信でブロック転送される際に更新矩形が
正常に転送されず、イメージを取りこぼす場合が多い。
RDPソフト側のバグなのかもしれないけど
BitBltが安定してるのは確か。
713 :
デフォルトの名無しさん :2006/02/25(土) 21:43:27
メモリDCを使うのは問題ない 重要なのはそこではない
>>705 >>712 おれは706じゃないが、なんでもかんでも「メモリDC->BitBlt」というのには反対。
InvalidateRect()で必要なところだけ無効化し、WM_PAINTで必要なところだけ
再描画できるロジックが組める内容の場合には、そのほうがメモリDCより高速。
いまでこそCPUが早くなってビデオカードのアクセラレータなんて2Dではあまり
気にしなくなったが、メモリDCだとこれが効かない。
メモリDCが良いかどうかは、ケースバイケースでしょ。
715 :
694 :2006/02/25(土) 22:02:07
>>713 一応言っとくと、、上の方々は俺じゃないっすよ。俺がNOOBなのはわかってます。
>>705 世の中のどれだけのアプリケーションが「まとも」かどうかわからない。
ある、キー入力を受け付けるソフトがあるのですが、それにソフト的に 入力を与えたいです。 たとえば、「K」を入力すると、10ms間隔で順番にA,B,Cとそのソフトに 入力するなどです。 Win32APIを駆使してこのようなプログラムを作成する場合、 どのような方針、アルゴリズムで進めていけば良いでしょうか??
アルゴリズム・・・
Kを入力すると順番にA〜Kまでってことか?
720 :
717 :2006/02/25(土) 22:28:47
>>719 はい、そんなかんじです。
「K」を受けてタイマーで順番に「A」、「B」、「C」・・・と処理していけばイイとは思うのですが、
それを他のアプリケーションにどうやって渡せば良いか検討がつきません。
>>720 WM_KEYDOWN
WM_KEYUP
まぁ、PostMessageかSendInputだな
724 :
717 :2006/02/25(土) 23:12:37
CDドライブを開閉するにはどうしたらいいでしょうか? いろいろ探してみるとASPIやらなんやら出てきましたが、 肝心な情報にヒットしなくて困ってます
>>725 単純にあけたかったら、MCI使えばいい。
set cdaudio door open
こんなんだっけ?
ejectじゃないか
729 :
デフォルトの名無しさん :2006/02/26(日) 12:07:44
VisualC++6.0のSDK使ってるんですが Winampのスキンのように、ウインドウの外見を変える方法を教えてください
>>729 自前実装してください。
ただ、しっかりと作らないと、
Windowsが用意してくれているGUIより貧弱で、
使い勝手が悪いものが出来上がります。
Winampもそのひとつ。
はい、次の人
732 :
デフォルトの名無しさん :2006/02/26(日) 12:28:02
>>730 WS_POPUPで、縁やタイトルの部分は画像を使うっていう方法でいいのですか?
DirectXを使わないで(そこまで出来ないので・・)所謂オフスクリーン/ダブルバッファリングを実装したいのですが、 これはCreateCompatibleDC()関数なんかでメモリデバイスコンテキストを作成して、そこに描画してBitBlt()で転送 という形でいいんでしょうか
>>734 訊く前に自分なりにやってみて玉砕しろ。経験だ。
>>734 1つだけキーワードをあげよう
CreateDIBSection
馬鹿は答えなくていいよ
DIBSectionは必ずしも必要じゃないけどな。 便利だけど。
バッファ領域を直接操作(ポインタで)しないならOKと思う。
DirectXを出してきたから、画像処理系と勝手に脳内補完してしまったけど そんなことどこにも書いてないか。 たんにGDIの描画をバッファしたいだけなら、CreateCompatibleBitmapでいい。 ただ、これはメモリDC使って作成するとモノクロビットマップを作るから要注意。 俺はつい最近それでハマった。
hdc = BeginPaint(hWnd,&ps); memDC = CreateCompatibleDC(hdc); として 例えばFillRect(memDC , &rect , (HBRUSH)GetStockObject(BLACK_BRUSH)); としてhdcへBitBltしてみたのですが何故か転送されません ただしHBITMAPを取得してSelectObject(memDC, hBmp);と選択して転送するとそのビットマップがきちんとhdcに転送されているようです。(描画された) もう何なんでしょうか(´・ω・`)
描画結果を保存する先がないから。
>>742 試しに500x500のHBITMAPを作成してSelectObjectでメモリデバイスコンテキスト(以下memDC)に選択させてから
memDCにFillRectで矩形を描画してみたら上手くいきました。
しかしなんか無理やり感があるのでもっと調べたいと思います
すみませんでした
>>742 それは間違い。
1x1、モノクロのビットマップがある。
転送されていないんじゃなくて、気付かないだけ。
>>741 適切な大きさ、色深度のビットマップを作成し、Selectしろ。
>>744 わかりました、わざわざありがとうございます
ttp://www.uploda.org/uporg322480.c.html 左クリック・右クリックを検出して、その座標に図形を描画してます。
クリックされる毎にこれまで描画した位置の図形は消されます。
作れたのはいいんですが、改めて考えるとと、どうして図形が消されるのか
分かりません……。
確かにクリック時一発目のInvalidateRect()では図形のある位置に再描画要求
をかけてますが、「消える」のはおかしいような……。
二回目のInvalidateRect()でクリック位置に描画されるのは納得なんですが。
下らない質問ですいません。
ヒント つ InvalidateRectは、即座に再描画されるわけではない
>>746 WM_PAINTで描かないから消える。
( ゚д゚)ポカーン
( ゚д゚)ポンカーン
タイーム( ゚д゚)ボカーン
752 :
デフォルトの名無しさん :2006/02/26(日) 18:01:03
リソースのpng画像をロードして、HBITMAPの形にするAPI (LoadImageのpngバージョン)がありましたら教えてください。 使用コンパイラは、VC6、BCCです。
ヒント:ライブラリ
pnglib
755 :
752 :2006/02/26(日) 18:22:33
ありがとうございます。 imgctl.dllは知っていたんですが、 外部ファイル名専用みたいなので、 リソースの場合はどうすればいいのかなと。 pnglibを調べてみます。
libpngじゃなかったか? それはともかく、gdiplusというものもある。
757 :
752 :2006/02/26(日) 18:31:37
ありがとうございます。
libpngはいつからリソースを扱えるようになりましたか?
最初から。
761 :
752 :2006/02/26(日) 19:06:54
んっ、無理なんですかね。 imgctlを作るのにlibpngを利用したみたいですので、 多機能なimgctlにその機能がないという事は、 元のlibpngにもなかったらからとも考えられる。
全然無理じゃないからやってみろ。
リソースから読み取ったバイナリを、ストリームに流すだけで展開できる。 直接読み取る関数が無いかだけで、出来ないと決めつけるのは無能にも程がある。
見当違いの考察は無用。 さっさと手を動かせ。
766 :
752 :2006/02/26(日) 19:21:46
むりです(><) 俺の頭のスペックではむりです(><)
768 :
752 :2006/02/26(日) 19:38:41
>>764 ありがとうございます。LPVOIDを渡している
関数がありますが、そこら辺りですかね。
769 :
752 :2006/02/26(日) 19:40:18
ちと大雑把で迷惑な質問かもれしませんが…。 SPY++とかウィンドウエクスプローラ(WINMAP.EXE)のように 画面上のオブジェクトを細かく追っかけていくには どのようなAPIを用いればいいでしょうか? 何がしたいかと言うと、例えばヤフーメッセンジャーとかの Internet Explorer_serveクラスのrコンポーネントを弄りたいのです。 よろしくお願いします。
弄るな
弄ぶ
何この流れ。
現在、特定のプロセスを監視するプログラムを作ろうと考えています。 具体的には、ゲーム等のexeが起動したら、それを強制終了させるものです。 そこで、質問なのですが どうすればプロセスを特定できるでしょうか? よろしくお願いいたします。
PSAPI か パフォーマンスモニタ か
778 :
760 :2006/02/26(日) 21:51:23
>>764 なるほど、「libpngで」リソースから読めるわけじゃないのね。
#それなら余りに当たり前だ。
##てっきり、元質が>752だからリソースから直接読めるのかと思っちまったぜ。
>>775 っ[WMI使ってみる?]
WinAPIなのにWMIをすすめる俺の凄さ
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 がエラーを返してくれます。 何が原因か分からないでしょうか。 よろしくお願いします。
>>781 ウィンドウを動かさない、かつ他のウィンドウを被せない、って事ならそれでもいいだろうけど…
>>782 フォントを設定しないと駄目なんじゃない?
785 :
782 :2006/02/26(日) 23:06:53
>>784 しまった、デフォルトのフォントが選んであると思い込んでました。
やってみます。ありがとうございました。
こんばんは。 ウィンドウの削除をしてもプロセスが残ってしいます。 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; としています。 プロセスが残る原因がわからないのですが、永久ループを抜ける 処理を何か入れてあげなければならないのでしょうか? 原因がわかる方いらっしゃいましたらお願いいたします。
で、そのwhileループを抜ける処理はどこにあるんだ?
>>781 いえ、前の図形は消したいので、現状の動きが実現したい動きでいいんです。
ただ、クリックが検知された時、一回目のInvalidateRect()のredraw_rectの
値は前にクリックした場所で、実際に○や□があるところ。
ここでWM_PAINTが呼び出されても、消すような処理はしてないように思えて……。
ちなみに第3引数をFALSEにしても同じで、前までの位置の図形はきえます。
>>747 では非同期ということですが、だから「消える」という理由になっている
のでしょうか……。
混乱してきました。NULLで全画面描画にすれば悩むこともなかったのに……。
>>787 やはり抜ける処理がいりますよね?
PostQuitMessage(0); でそこらへんも勝手に抜けて
終わらせてくれるのかなぁと思ったのですが・・・。
永久ループのとこのPeekMessageでWM_CLOSEが着てたら
抜けるように良いのかな…。
790 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/02/26(日) 23:33:23 BE:163805928-
else { break; } てか、なんでそこで「いろいろな処理」やる必要あるんだ
>>788 第3引数って片方のInvalidateRectだけFALSEにしたとか?
>>789 WinMainでやる場合には、PeekMessageを使わずにGetMessageを使って
while (GetMessage(....
とするのが簡単。
PeekMessageを使う場合には、WM_QUITが来たらループを抜ける。
>>785 モノクロビットマップなのに、第3パラメータでグレースケールの指定をしているからかもしれん。
試してみんとわからんけど。
>>790 ゲームのメインループでここでタイマーの計算とかして
一定時間起きにInvalidateRectして画面更新、とかやって
いるのです。
>>793 PeekMessageのあとにmsg.messageの内容見てbreak;
させるようにしたらちゃんと終了できるようになりました。
どうもありがとうございました。
>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()にて
背景塗りつぶしが行われて……。
勉強になりました。感謝感謝です。
昨日始めたばかりの者です。 「未解決の外部シンボル_imp_MessageBoxA@16が関数_WinMain@16で参照されました。」 とエラーがでたのですが、解決方法がわかりません・・・ winmainの中は {MessageBox(NULL , TEXT("message") , TEXT("message") , MB_OK);} だけです。 何がいけないのでしょうか? ちなみに、使っているのはVisualStadio2005でc++です。
何を参考にしているのか知らんが、参考書が悪いか、ちゃんと読まないお前が悪いかのどちらかだ。
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); } } } }
>>798 うわ〜こりゃひどいわ。直すべきところはいろいろあるけど、
まずすぐ質問すればいいやという根性を直すのが最初だな。
・・・MSDNでMessageBoxを調べてみるんだね。十分に調べて、
それでわからなかったら、おまいさんにはまだ早すぎたってことだ。
>>800 スクロール停止処理後に
while( PeekMessage(&msgtemp,hwnd,WM_KEYFIRST,WM_KEYLAST,PM_REMOVE) );
でキーメッセージを握りつぶすとか。
803 :
800 :2006/02/27(月) 04:49:07
>>802 どうもありがとう。
そういう風にするのって普通にアリなんでしょうか(ひょっとして定石!?)
そもそもWM_KEYUPが続けて呼ばれる理由がよく分からないので
その辺はっきりさせる必要がある気もしつつ。
WM_TIMERを使わないと無理じゃないか? 滑らか処理を始めるかどうかを知るためのタイマーと、 滑らか処理そのもののタイマー。 タイマーコールバック内でGetAsyncKeyState()を使い キーアップされたかどうか調べてキーアップしているようならタイマー削除。
>>803 キーを押して離したらその回数だけメッセージが来る。
処理してなかったら後から当然のように呼ばれるだけで。
806 :
798 :2006/02/27(月) 09:08:13
>>799 >>801 けっこう調べたんだけどわかんないってことは、自分にはまだ早いってことですね。
出直してきます。ありがとう
>>803 メッセージがキューに溜まっているからじゃないかな?
>>806 , 798
見ているかわからんけど、MSDNにはどんなライブラリが必要か書いてあったよね?
過去にC++でコードを書いたことがあれば、SDKを使ったことなくても、あんな感じのエラーが
どういう状態ででるか経験するはず。VS使わずエディタとコマンドラインからコンパイルしながら
練習してごらん。
※厨房に武器は与えないようにしましょう
転職システム 厨房LV5以上 → 知ったか厨
Lv1 → Lv2 (環境整備) 必要Exp 4,294,967,295
>>771-773 ネタじゃないんですが…。
よろしくお願いします。
WSHとかじゃうまく掴んないんでAPI使って捕まえたいんですよ。
何が目的でそういうことをしたいのかを書くと もっと有益なレスが得られるかもしれない。
>>811 誰がネタって言ったよ
弄るなって言ってんだ
>>811 >>770 見ても意味がよくわからんかったんだけど、
・EnumChildWindows, GetWindowなんかで子ウィンドウをなめていく
・GetClassName, GetWindowLongなんかでそのウィンドウの情報を取得
ってことか????
自分のIPアドレスを設定(変更?)するにはどういう関数を使ったらよいのでしょうか? OSはwindowsXP、開発環境はwindows2000かXPで、 コンパイラはVC++6かボーランドCです。 ググって見たけど、うまい検索ワードがわからなくなて見つからず、 WSAStartup()した後に、gethostbyname()して、 strcut hostentのh_addr_listを直接書き換えるのも駄目だったので。 よろしくお願いいたします。
ローカルかグローバルかも書けないクズはもうくんなよ //ローカルかグr−バルか改めて書き込まなくてもいいからな、吊れよ
悔しそうだな
釣りかと思ったら、マジでこんな間抜けなこと書いてるのか。
>>815 ネットワークアプリの経験はあまりないんだけど、ググッて5分以内に
目的の関数が見つかったんだけど・・・
それ用のAPIがあったよ。Aから始まるAPIで。ググれば見つかるから、
もうちょっと頑張ってみたら?特別なキーワードじゃなくて見つかるよ。
AddIPAddress
IEコンポーネントのウィンドウをロード中に閉じようとすると たまにメモリリークを起こすのは仕様ですか?
>>810 知ったかは環境持ってなくても聞きかじりの知識で首を突っ込んでくるぞ
それはそれは どうしようもないでしね
我慢しよう
イヤです。
ちくしよう
自己解決しました
すげー
やっぱり駄目でした
やっぱり、事故解決していました
>>820 >>821 ありがとうございました。
検索の仕方が下手なのか、結構頑張ったつもりなのですが・・・
windowsとIPアドレスと設定で検索かけると、
普通にネットワークのプロパティから設定しているものが沢山かかったので、
それを見ているだけで時間を食ってました。
APIとかwin32とかwinsockとかを検索ワードに入れればよかったんですね
834 :
820 :2006/02/27(月) 22:18:08
>>833 そっかー自力で見つかった方がいいかなって思ったんだけど、
うまくいかなかったら仕方なし。検索は慣れなのかな?
使ったキーワードは、"windows api ipアドレス 変更"そのまんま。
2ページ目に「ソフトでPCのIPを変更〜」みたいなのが出てくるから、そっから辿ればよし。
ちょっと困ってます。
だからなに!
生活に困ってます
それじゃあ、仕方がないな。
API は大文字でなきゃイヤです ><
842 :
デフォルトの名無しさん :2006/02/28(火) 10:40:11
ファイルが他のプロセスが使用中の為コピー出来ない場合があって、それを次回リセット後コピーするようにしたいんですけど、 APIでサポートがありますか? よろしくお願いします。
リセットって何よ
>>842 MoveFileEx()
次回起動時、という意味でリセットを使っているのならな。
845 :
842 :2006/02/28(火) 11:21:12
>844 レスありがとうございます。 >次回起動時、という意味でリセットを使っているのならな。 そうでした、説明不足ですいません。 MoveFileEx() まさにこれでした、ありがとうございます。
>>845 本当に説明不足だと思っての? 脳が足りないだけだろ 氏ねよ
847 :
デフォルトの名無しさん :2006/02/28(火) 12:09:51
mutexについてなんですが、 CreateMutex(NULL,TRUE,"unique"); こんな感じでmutexを作成後、エラーなどでmutexを解放しないでプロセスが終了した場合、mutexはどなってしまうんでしょう?
>>847 一度プロセス無理矢理終了させた後もう一度作り直してみれば分かる。
>>847 解放されると思うけど、試してみるのが早い
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」が付く場合とあるので、 恐らく別々に取得できるのではないかと憶測しています。 憶測を含め、間違いがあったら、忌憚なく訂正してください。 お願いします。
DVD焼く機能はOSに付いていないはずだが。 オマケ機能なら、CD-Rに限定しておく方が吉。
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); で表示させてやると正常な値が出力されません。 何か根本的なところで詰まっているのでしょうか・・・。
すみません、正しくは ReadProcessMemory( hWnd , (LPCVOID)0x... , &A , 4 , &Read ); です。スレ汚し申し訳ない。
>>853 読み取ったメモリ内容を表示させたいのだったら、
どちらもうまく表示されないと思うけど。
>ReadProcessMemory( hWnd , (LPCVOID)0x... , A , 4 , &Read );
hWnd ってのも何だか変だし、A じゃなくて &A としないとダメだし。
レスありがとうございます。 〜の部分は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); にしてもダメでした。
なんか君は色々とダメだなあ
>>856 全く同じプログラムで、前者の
>printf( "%d" , A );
を
>char buf[256];
>wsprintf(buf , "%d" , A);
>MessageBox(NULL , buf , "" , MB_OK);
にすると表示が変ということですか?
他所のプロセスなので実際に値が違っている可能性も
あると思いますが、そこは確認しましたか?
wsprintf使うならTCHAR buf[256]にしとけ。
>>847 カーネルによって、自動的にミューテックスオブジェクトの参照カウンタがデクリメントされる。
ほかに、"unique"という名前のミューテックスオブジェクトを参照しているプロセスがない場合、
自動的に破棄される。
CloseHandle()せずにプロセスが終了すると、リークするんじゃないか、
などという心配は無用。
解決しました。そしてレス下さった方ありがとうございます。 下記のソースでハンドルの取得にミスがありました。 プロセスハンドルhWndと書いていることからお察し下さいorz お騒がせしました。
>857 ワラタ。
>859 >wsprintf使うならTCHAR buf[256]にしとけ。 wsprintf使うならwchar_t buf[256]にしとけ。 _stprintf使うならTCHAR buf[256]にしとけ。 なのでは?
>>863 wsprintfはWindowsAPIだ
>>863 みたいなのが絶えないのは、
MSが安直にwsprintfなんて*API*を作ってしまったせいだ。
>>863 int wsprintf(
LPTSTR lpOut, // 出力バッファ
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"); > > 方法ご存じでしたらよろしくお願いします。
CoCreateInstanceは動的ではなかったのか・・・
LoadLibraryして、DllGetClassObjectから始めるのかもしれない。
>>868 COMのディスパッチインターフェースとオートメーションを勉強してきてね。
>>868 #import でも多分
>>868 が必要としている程度には動的だから、
おとなしく #import を使うのが良いと思う。
>>868 もちろんそれ以上に動的になんでもやれる方法はある。(
>>871 )
しかしあまりにも面倒すぎてわけわからないから、
868が混乱をきたさないよう敢えて皆触れずにいるということに気付け。
お前らは868サンの凄さを知らない…
>>871 IDispatchは簡単でよいけど、C++ が VB に負けるのはシャクだから
ここはやはりITypeInfoからインタフェイス情報を得てアセンブラコード経由で
vtableインタフェイスで呼び出すべき。
ん?VBのvtable呼び出しはearly bindingだったか・・・
>>868 こ、こうかな・・・
ifstream vbs("com.vbs");
vbs << "Set fso = CreateObject(\"Scripting.FileSystemObject\")" << endl;
vbs.close();
system("com.vbs");
CoInitializeとかCoCreateInstanceとかのあたりかな・・・
メニューやツールバーのボタンの上にマウスを持って行くと、 ステータスバーに説明が表示されるアプリが良くありますが、 あれってどうやって実装してるんでしょうか?
>>875 IDispatch経由でしかメソッド・プロパティを公開しないdispinterfaceというものもある。
>>879 いえ、それはまた別のものです、はい
>>880 SB_SETTEXTでステータスバーに文字列を出す部分は分かるのですが、
問題は、そのタイミングをどうやって知るのかわからなくて
WM_MENUSELECTはポップアップメニューを開いた時しか来ませんでしたし・・・
NOTIFYメッセージも数有りすぎて良く分からないのが現状です・・・orz
>>881 >WM_MENUSELECTはポップアップメニューを開いた時しか来ませんでしたし・・・
普通のコマンドメニューでもセパレータでも来ますよ。
前に使ったことあるし、今Spy++でも確認しますた。
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でも使えるがソースよく読んだことないや
>>877 MenuHelpっていうAPIで全部勝手にやってくれる。
887 :
デフォルトの名無しさん :2006/03/01(水) 01:00:53
そのアプリがアクティブになっていなくても マウスやキーボードの入力を監視して 必要なら自分で処理してその入力を握りつぶすような処理は どうやってやればいいんでしょうか?
>>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; }
そのインスタンスハンドルが変わってたのはWin16まで。
>>890 Win32ではインスタンスハンドル変わらなくていいんですか?
売ってた本には
「インスタンスハンドルはOSがそれぞれのインスタンスを識別するために〜」
的なことが書いてあったんですが。
OSはXPsp2で処理系はBCC5.5.1です エントリーポイントがWinMainではなくmainの場合 どうしてもDOS窓が出現してしまいます。 もしmainの場合このDOS窓を出現させる事をさせなくする手法はありますか?
windowsでウィンドウをクラス化する時に、GetWindowLongPtrの、GWLP_USERDATAに 自分のポインタを突っ込む方法が使われてたと思うのですが、 64bit版では使えなくなってしまいました。 他の何か良いアイデアで解決された方居ませんか?
>>893 すまんが意味がまったく分からん
もうすこし説明を頼む
897 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/01(水) 02:45:26
>>893 コンソール上で動くからコンソールアプリケーションなの。
素直にWinMainで始まるアプリ使いましょう。
mainの前処理に、コンソールウィンドウを作成・割り付ける処理が入ってるから
それをどうにかするのは無理。
ただ、あとで隠す方法はあるにはある。
ただし、こんなことやったら大目玉食らうぜ
ShowWindow(GetForegroundWindow() , HW_HIDE);
まさに邪道
898 :
894 :2006/03/01(水) 02:47:04
899 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/01(水) 02:48:09
訂正 ShowWindow(GetForegroundWindow() , SW_HIDE); こんなことやったら、自分でコマンドプロンプト開いてコマンドラインから呼び出した時に コンソール画面が消えちゃうからね。 だから、絶対やらないの。
>>891 インスタンスハンドルってのは、実はモジュールのベースアドレスを指す
ポインタそのもの。
Win16では全てのプロセスが同じメモリ空間で動いていたから、各プロセスは
お互いに重なり合わないように別のアドレスにロードされていたので、
プロセスごとにインスタンスハンドルが異なっていた。
Win32ではプロセスは自分専用のメモリ空間を持っていて、プロセスごとに
リロケート(再配置)する必要がないので、通常は実行可能ファイルに記載された
ベースアドレス通りに読み込まれる。
インスタンスハンドルはプロセス内でのモジュールを識別するためのもので、
異なるプロセス間でのやり取りに使われる物ではないので、同じプロセス内で
一意であれば問題ない。
同じ実行ファイルの別インスタンスを識別するには、プロセスハンドルを使う。
(プロセスハンドルまで必要になるのは稀で通常はウィンドウハンドルで十分)
>>882 あれ、そうですか・・・?
やり方悪かったかなぁ・・・
もう一度やってみます
>>886 MenuHelpは、Inset表示にしてても勝手にプレーンな表示されちゃうんでちょっと・・・
904 :
デフォルトの名無しさん :2006/03/01(水) 12:39:01
>>877 うろ覚えだけど
WM_NCHITTEST
じゃねーの?
これのHITTESTCODEみる
自前処理ならって前提
>>894 の話は本当?
俺は使えなくなったなんて話、聞いたことがない。
>>897 せめてFreeConsole()を使おうぜ……。
>>894 みたいに勝手に勘違いしてデマを広める救いようのない人間が、
堀江メール事件のような事件を起こすんだろうな。
>>893 BCCでできるかは知らんけどsubsystemとエントリーポイントが
別々に指定できるのなら可能。
あるプロセスに DLL から SetWindowsHookEx(WH_GETMESSAGE, GetMessageProc, ...) で フックを欠けたのですが、この場合、まずプロセスの本来のメッセージ処理ルーチンを通ってから、 フックした GetMessageProc に来るので正しいでしょうか? だとしたら、この順番を逆に、まず自前の GetMessageProc を通るようにすることはできますか?
>>893 ILINK32を使い、C0X32.OBJを渡しておきながら/aaを指定すればよい。
BCC32からは無理だと思う。
こういうことは本当はBCCのスレへ行け。
main()ではじめてもコンパイラ(リン化)へのオプションで コンソールアプリじゃなくできないのか? てかランタイムやローダの問題と思うのだが…。 WinMainはやっぱ不自然。
>>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というフリーソフトではそのようなウインドウに対しても > キー入力を送信できているので、なにかしらいい方法があるはずです。 > どのような方法を使えばキー入力を行うことができると思いますか?
>>915 JoyToKeyの作者に聞くという方法はどうだろう。
>>912 嫌ならそうMSに要望でも出しとけば?
他人の作ったもの使っておいてその流儀が嫌だとか言われてもな
>>915 それね、
JoyToKeyは、keybd_eventを使っているが、
まあ、これからはそういうコードを書くべきではない。
SendInput()を使うべき。
で、DirectInputとかはどうすればいいのかって話だけど。
KEYBDINPUT構造体の説明をしっかり読んでいれば、簡単にわかるはず。
まあ、ここは自分も苦労したしね。
答えは、スキャンコードで指定すること。
Windowsで、普通使うのは、仮想キーコードだから、
スキャンコードに変換してやらなければならない。
直接やってもいいけど、MapVirtualKey()というAPIがある。
>>918 え? JoyToKey は keyboard mini driver 経由じゃないのか?
920 :
918 :2006/03/01(水) 15:26:00
>>919 昔、ごにょごにょして調べてみたら、keybd_event()使っていた。
で、引数に渡している値が変だったから、調べてみたら、スキャンコード使っていた。
keybd_event()でスキャンコード指定ができるというのは、
確かMSDNには書かれていないんだけどね。
ちゃんと明示されている、SendInput()を使うのか吉。
>>920 おお thx
>keybd_event()でスキャンコード指定ができるというのは、
>確かMSDNには書かれていないんだけどね。
平気でスキャンコードおくってたけど…
確かに載って無いなw (bScan が NOT USE になってるし)
明示されてる SendInput() を使うべきだろうね
>>918 そういえば、MapVirtualKey()ってカーソルキーが上手く
変換できなかった記憶があるけど、なんでだろう?
だいぶ前の記憶なんて曖昧だが、たしかVK_RIGHT等を渡すと
テンキーのコードが返ってきた気がする。
>>922 NumLock との兼ね合いで 多対1対応 になるからじゃね?
困ります
勝手に困ってろ
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ビットに拡張されたという情報は見つけられませんでした。
もし情報があるなら教えて頂けると助かります。
>>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 ;
それからもひとつ。
キーを押し下げてから、あげるまでに、ディレイが必要なこともある。
特に、ゲームなどだと、キーが押し下げられた時間などが、必要なことが多いし。
横からだが or は論理or だろ
> 文法をよく知らないから、間違っているのかもしれないが…… ああ、間違ってる
933 :
918 :2006/03/01(水) 18:20:57
間違っていたから無視してくれ。 キーの押し下げ押し上げの間に、適当にディレイをはさんでもダメだったら、わからない。
間違えたのならそれはすでに誤っている。
937 :
926 :2006/03/01(水) 20:59:43
>>934 SendInputの戻り値は 0 なので、「ほかのスレッドによって入力が
すでにブロックされている」らしいですが、具体的な意味が分かりません。
適当にDelayを入れてみたり、得意じゃないけどC++で
書き直してみたりしたんですが、やはり思ったようには動作していないです。
GetLastErrorを呼ぶと 127 が返って来ていたので
エラーメッセージを取得しようとFormatMessageの使い方を
調べていたというのが今の状況です。
>>911 あれ、逆でしたか。実際にDLLつくって試したところ、
本来来ているはずのWM_ACTIVATEやWM_KILLFOCUSなどが全然捕まらなかったので、
てっきり元のプログラムが吸い取っているのかと・・。
なにか勘違いしているようなので、調べ直してみます。
ありがとうございました。
>>937 127 : 指定されたプロシージャが見つかりません。
941 :
デフォルトの名無しさん :2006/03/01(水) 23:01:46
>>938 >本来来ているはずのWM_ACTIVATEやWM_KILLFOCUSなどが全然捕まらなかった
それはメッセージがsendされるか、postされるかの違いかと思われ。
確か、WH_GETMESSAGEはpostされるメッセージを補足する
ようだった気がする。
あるウィンドウが受け取る全てのメッセージに絡みたいなら、SetWindowsHookExで目的のウィンドウが属するプロセスにDLLを仕込んだ後、 適当なメッセージをPostMessageし、そのメッセージ処理で目的ウィンドウをサブクラス化。 じゃなかったか?
キーの組み合わせで登録したアプリケーションを起動するランチャーを作っています 今はPeekMessageでメッセージループを回して、メッセージがないときに GetAsyncKeyStateでキーボードの状態をチェックしていますが、 この方法ではCPUにかなり負荷がかかってしまいます。 適当にSleepさせればある程度押さえられるのですが、この場合 キーボードの状態をチェックし損なう確率が高くなってしまいます。 何かいい方法はありませんでしょうか?
アクセラレータじゃ駄目なんか?
フック、ストレート、アッパー!
MDIについて質問です。 子ウインドウを新規で作るときに最大化しようと重いmdicreate.styleにWS_MAXIMIZEを指定しました。 そうすると、メニュー書き換えのときに子ウインドウのアイコンが2個表示されたりします。 メニューの書き換えは子ウインドウプロシージャにWM_MDIACTIVATEがきたら WM_MDISETMENUで書き換えてます。 なにか解決策はないでしょうか?
基本はジャブ
>>943 ランチャがアクティブでないときにもキーを受け付けたいなら
RegisterHotKey()を使うといいかと。
>>948 ありがとうございます!
それならなんか出来そうな気がするのでやってみます
>>949 キーフック、聞いたこないですけどとりあえずググって試してみようと思います。。
951 :
デフォルトの名無しさん :2006/03/02(木) 19:48:17
自前アプリをタスクマネージャで監視すると、常に「Page Fault Delta」が発生していてパフォーマンスが著しく低下してしまうんですが 回避方法はありませんか? よろしくお願いします。
952 :
デフォルトの名無しさん :2006/03/02(木) 19:57:13
SetProcessWorkingSetSize
メモリをもっと積むんだ。 んでもって、ページファイルの設定をなしにするんだ。
疑問なんですが、上のほうにちらっと出てきたキーフックだけど、グローバルフックしてる最中にアプリがシボンヌしたらどうなるんでしょ。 その辺の回避策として、アプリが死んでもちゃんとデタッチできる様にDLLじゃないとできなくなってるんでしょうか?
そういうこと
956 :
デフォルトの名無しさん :2006/03/02(木) 22:09:59
LONGLONGの変数をLONG2つ(上位と下位)に分けるときってどうやってる?
manifestがあると、 ユーザの側でLUNAが有効無効にかかわらず、GetBkColor()が白を返すです。 どうして表示されてるダイアログは灰色なのに白が返ってくるですか?
HILONG LOLONG
POTELONG
どなたか
>>946 の解決策わかりませんでしょうか?
あと書き忘れてましたが、プログラミングWindows第\5版についてたMDIサンプルプログラムで同様のことをためしても同じ現象が発生しました。
タスクトレイのアイコンって16*16以上のものを表示するのは無理でしょうか? たとえば、32*16のように横長表示にして、6文字くらいの文字列(主に数字)をしたいのですが。
TOPMOSTなウィンドウ作った方が使いやすいだろ。 あるいはTClock2chのエリアを間借りさせてもらうとか。
わっかりました、親方。
>>963 やはりフックしないと無理ですか・・・。
なるべく目立たないプログラムを作ろうとしてたんですが、
TOPMOSTなウインドウで我慢します。
シンナーに気をつけてフックしな
GetIconInfo()について質問です。 GetIconInfo()で取得したICONINFO構造体のhbmMaskとhbmColorは DeleteObject()しないといけないんでしょうか?
質問させていただきます。 既製のゲームの補助ツールを作りたいと考えています。 ツールからでゲーム内の情報を参照したい (所持金、現在位置など) と 思っているのですが、検索エンジンで調べてみても、他プロセスの変数は 基本的に参照できないという情報しか得られませんでした。 しかし、実際にそのようなツールは存在するわけでして…… 自分で作ったプロセス間で通信する方法はわかるのですが…… どのようにして実装しているのか、わかる方がいらっしゃいましたら、 どうかご教授お願いします。
そういうツールは人に質問しなきゃ作れないやつが手を出す物ではないな。
>>971 変数は参照できないわな
逆アセンブルとかで
見たい変数がどこのアドレスにあるかを調べて、
ReadProcessMemoryかけてるだけ
974 :
971 :2006/03/03(金) 11:45:21
ありがとうございます。 方法すらわからなかったもので…… もっと精進します。ありがとうございました。
>>970 すみません、日本語の方しか見ていませんでした。
英語の方にちゃんと書いてあるとはorz
977 :
デフォルトの名無しさん :2006/03/03(金) 13:37:23
ウインドウの形状を変えたいのだけど、レイヤーウインドウでなくて、98やMEでも動くマスクウインドウみたいのがあったと思うんですけど、 情報ありましたら教えてください、サンプルなどあると助かります。 よろしくお願いします。
WMP9みたいなのか?うざす。 よけいなお世話だと思うが。
979 :
977 :2006/03/03(金) 13:46:13
>978 だいじょぶです、うざく無いの作りますから。 そして、僕もうざく無いです。
>>977 ,979
SetWindowRgn()でどうだ?
981 :
977 :2006/03/03(金) 13:52:32
>980 >SetWindowRgn()でどうだ? GIFとかの抜きカラーみたいにして抜けるやつがいんですが。 ご存じないでしょうか?
>>981 自前でシコシコどうぞ。
というか、いまさら9xなんて考えたくないな。
MSすら捨てているし。
983 :
977 :2006/03/03(金) 14:12:51
984 :
980 :2006/03/03(金) 14:13:17
985 :
977 :2006/03/03(金) 14:21:25
↑すげぇ、偶然にも同じとこ見てた。 980さん、ありがとうございます。
おれは
>>981 を見た時点で、SetWindowRgn()でいけるのに、うざいやつだな
と思った
987 :
デフォルトの名無しさん :2006/03/03(金) 17:45:08
ウインドウスタイルの「WS_EX_TOOLWINDOW」でタスクバーへの表示を、on/off出来るようにしたんだけど直ぐには反映されず、 ALT+TABでアプリ切り替えなどをすると初めて表示される、これをたちどころに反映させるようにしたいんですけど、 どのようにすればいんでしょうか? あと、これも同じ現象なんですが「WS_VISIBLE」でも同じような事が発生します。 よろしくお願いします。
よくわからんけど、 hide/showしてみるとか SHChangeNotify投げてみるとか 多分違うけどSHAppBarMessage
SetWindowLong() を使っているんなら、解説に書かれていることは問題ないかい? 「SetWindowPos 関数を呼び出すまでは〜」ってあたり。
スレ残り少ないですが・・・ 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);
>>991 ヒープをぶっ壊してる。
to = (LPTSTR)malloc(len * sizeof(WCHAR));
>>992 あ、すっごい初歩的なミスでした・・・
どうもすみません。
sizeof(from)も微妙に気になるな。
strlen(from)
CP_ACP, CP_OEMCPの使い分けが分からない。 コードページは何を指定するのが普通?
sizeof(from)がダメな理由がわからへんので教えてよん
sizeof(from) で合っている。 char *from = "変換対象"; だったら、sizeofじゃだめだけどな。
合ってないよ。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。