Win32API 質問箱 Build5
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGやさしいお兄さんたちが答えてくれるかも。
でも、最低限Web検索ぐらいはしてね。
前スレ
Win32API 質問箱
http://pc.2ch.net/tech/kako/991/991576947.html
Win32API【2】
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Win32API 質問箱 Build3
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Win32API 質問箱 Build4
http://pc3.2ch.net/test/read.cgi/tech/1023361418/
参考
MSDN Online
http://www.microsoft.com/japan/msdn/default.asp
猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang/index.html
0554デフォルトの名無しさん
NGNGんなことより、あんたの
名前欄はなんなんだ??
0555デフォルトの名無しさん
NGNGフックをかけると潜り込める
0556YahooBB237224170.bbtec.net
NGNGこっちが聞きたいよ.fusianasan としたらこれが出た.(今回も)
もちろんプロバイダはYBBですが,板の仕様?
それより実行中の別プログラムの何をフックするんですか?APIがある?
0557デフォルトの名無しさん
NGNG皆を代表して聞くが
なんで
「fusianasan」と入れる?
0558デフォルトの名無しさん
NGNGウインドウをフックする
0559fusianasa
NGNGなんか特別な意味がある?
どっかでみて適当に書いただけだが.
こんかいは fusianasa と書いてみました.
window handle を入手するんですね.どうも.
たぶんまた聞きますのでよろしく.
0560デフォルトの名無しさん
NGNGデータの一部をリストビューで表示させてるときって
データをどうやってもつんですか?
自分のデータを保持してると
リストビューにも同じ内容のデータが出来て
メモリがもったいない気がする
0561デフォルトの名無しさん
NGNGこっちのスレの最初のほうでちょっと議論があった
Windows Programing for C/C++(Not MFC)
http://pc3.2ch.net/test/read.cgi/tech/1018239290/l50
漏れは重複して持たない主義。ただMVCの分離が…
0562デフォルトの名無しさん
NGNG仮想リストビュー(オーナーデータ)でがんがれ。
0563
NGNGthx
ちょっと読んできます
0564デフォルトの名無しさん
NGNGAddAccessAllowedAceEx関数を使用し継承を設定したのですが、設定したフォルダの中に新しいフォルダを作成すると「継承元なし」のフォルダが出来てしまいます。
継承元を親フォルダに設定するにはどうしたらよいでしょうか?
OSはWindowsXPで、VC++のバージョンは6.0です。
0565デフォルトの名無しさん
NGNGこちらの方が適当だと思いますので、質問し直させてください。
VB6.0、Windows2000で、OpenPrinter関数でプリンタのハンドルが取れません。
ローカルプリンタだと大丈夫なのですが、\\SERVER\PRINTERといった
ネットワークプリンタだと失敗してしまいます。
ネットワークプリンタの場合、方法を変える必要があるのでしょうか?
0566デフォルトの名無しさん
NGNGウィンドウプロシージャをフレンド関数としてそのクラスにもたせています。
(メンバ関数のアドレスを取るのは望ましくないですよね?)
インスタンスはたくさんあるけれどもWndProcはひとつなので、
WndProcから見るとどのインスタンスに属するメッセージなのかが区別できません。
これを解決するために、CreateWindowでインスタンスポインタ(this)をWM_CREATEに
渡してSTLのmapにhWndとthisポインタを格納し、メッセージに応答するときは
hWndからthisをサーチしてインスタンスを決定する、という方法をとっています。
なんだか泥臭いので、もっといい方法はないでしょうか。
こういったことはよくありそうだと思うんですけど。
0567デフォルトの名無しさん
NGNG他に定番の方法としては、
・SetWindowLong でhWndにthisポインタを関連付けて置いて、
WndProcでGetWindowLongで取り出し。
・サンクを使う。つまり、thisポインタを埋め込んだマシンコードを
実行中にメモリに作ってしまって、それをWndProc替わりにする。ATLとか参照。
0568デフォルトの名無しさん
NGNGVirtualAllocの割り当て単位がページ毎だし、
サンク作る毎にメモリ確保してたら4kずつ取られてくよね
0569デフォルトの名無しさん
NGNG0570デフォルトの名無しさん
NGNGPAGE_EXECUTE属性をつけにゃならんだろうが
0571デフォルトの名無しさん
NGNG#include <stdio.h>
int main ()
{
unsigned char *p;
unsigned char x[] = {
0xB8,0x7B,0,0,0, // mov eax,123
0xC3 // ret
};
p = malloc( sizeof( x ) );
memcpy( p, x, sizeof(x) );
printf("%d\n",(*((int (*)(void))&x))());
printf("%d\n",(*((int (*)(void))&p))());
}
BCC32 on WinXPで実行したけど、violation出えへんかったで。
0572566
NGNGサンクですが、要するにメモリにマシン語書いておいてそこに突入させる
わけですよね? そいつをWndProc代わりにするってのがよくわかりませんが・・・。
何にしても最後にはWndProc呼んでやらないといけないですよね?
アセンブラはPC-98時代にぶいぶい言わしたくらいで最近はとんといじってません。
0573デフォルトの名無しさん
NGNG> そいつをWndProc代わりにするってのがよくわかりませんが・・・。
引数の hWnd を、アセンブラコードの部分でこっそり this とすり替えるんだよ。
0574デフォルトの名無しさん
NGNG通るかも知れないけど、EXECUTE属性のないメモリ上でコードを実行させるのは行儀悪いだろ
0575デフォルトの名無しさん
NGNG文句があるなら、Microsoftにいってくれ。
0576デフォルトの名無しさん
NGNGデフォルトで実行属性がつくから、問題ない。
そんなの処理系・環境依存だろって意見はあるかも知れんが、そもそも
VirtualAlloc とか言ってる時点で Win32 環境限定の話だしさ。
0577デフォルトの名無しさん
NGNGおおよそのところ
memcpy( buf,
//---------------------------------
mov dword ptr [esp+4] this
jmp WndProc - (buf + α)
を意味するコード
//---------------------------------
, size
);
SetWindowLong( GWL_WNDPROC, buf );
こんな感じにすると、第一引数としてhWndが入ってたはずの部分に
thisポインタの値が入った状態でWndProc関数に飛ぶので、
あとはテケトーに。
0578デフォルトの名無しさん
NGNGこんなことどこに書いてある?
0579566
NGNG行儀悪いのは大好きなのですが、hWndとthisをすり替えるってのが
ちょっとキモチワルイです。
ひとつ思ったんですが、これって誰かにサブクラス化されたらえらいことになりますね・・・。
0580デフォルトの名無しさん
NGNGecxにthisを入れてjmpすれば、
少なくともvcでは正常にthisが使えるよ。
0581デフォルトの名無しさん
NGNG公式にドキュメント化されてるかは分からないなぁ。
ただ、俺は少なくともプロセスヒープは「read/write/execute可能」という前提で
プログラミングして(いちいち GetProcessHeap && VirtualProtect なんて
やってない)。MS が出してるコードも、そうなってるしさ。
0582デフォルトの名無しさん
NGNG> ひとつ思ったんですが、これって誰かにサブクラス化されたらえらいことになりますね・・・。
なんで?
0583デフォルトの名無しさん
NGNG特殊キーの状態はGetKeyStateで取得できるのですが、
それ以外のキーの状態を取得するAPIはありませんか?
0584583
NGNG0585デフォルトの名無しさん
NGNGGetKeyboardState
0586デフォルトの名無しさん
NGNGできますた! ありがとうございます。
0587デフォルトの名無しさん
NGNG0588デフォルトの名無しさん
NGNGGetKeyboardState()で特殊キーも取得できちゃったんで、
全部コレにしてしまいました。
その、GetKeyState()で、例えばzキーやxキーを取得できるとして、
速度的にはどっちが早いんですか?
0589デフォルトの名無しさん
NGNG0590デフォルトの名無しさん
NGNGほぼ同時に実行したいのですが、どうしたらいいですか?
いつもはPeekMessageを使ってるプログラムで暇な時にSleepしてると
フリーズしたみたいになるので、その間だけGetMessageを使いたいんですが。
GetMessageを呼んだ時に送られるメッセージとかってありますか?
0591デフォルトの名無しさん
NGNG>>589
えと、ゲームを作ってて、俺マシンはK6-2の500MHzなんですよ。
んで、1フレームにイロイロ処理をしてると秒間10フレーム逝くか逝かないかで。
なんで、なるべく時間をかけたくないワケです。
0592デフォルトの名無しさん
NGNG電波ですか?
>GetMessageを呼んだ時に送られるメッセージとかってありますか?
これがあったら無限ループ
0593デフォルトの名無しさん
NGNG入力くらいスレッド分けろよ。
WM_KEYDOWNが来た時点でイベント起こしたりSwitchToFiberしたり汁。
そもそも、ループ毎に検出しなきゃならないのはジョイスティックくらいで、
キーボードなんかはイベントで十分。
0594デフォルトの名無しさん
NGNGアクションゲーなんですが、スレッド使うんですか? それはちょっと。
0595デフォルトの名無しさん
NGNG500mm秒ほど寝かせてPeakMessage使え。
スレッドの切り替え時間が十数mm秒だからほかへの影響もほとんどないし、
反応が悪くなることもない。
0596デフォルトの名無しさん
NGNGMsgWaitForMultipleObjects
0597デフォルトの名無しさん
NGNG500mm秒って50cm秒でしょうか?
ってどのくらいの長さですか?
0598デフォルトの名無しさん
NGNG多分>>595は500�_秒と表現したかったんだろうけど、
ホントは500マイクロ秒と言いたかったのではないと予測。
0599デフォルトの名無しさん
NGNG親ウインドウにメッセージを返すのに、どの変数を
どういう風に設定すれば良いのかがわからないのです。
0600デフォルトの名無しさん
NGNG何のメッセージを返すの?
自前で処理したいメッセージなら処理してリターン、
それ以外はDefWindowProcにそのまま渡せばいいんだけど。
0601デフォルトの名無しさん
NGNGWM_QUERYENDSESSION
で検出したのはいいのですが、
lParamがシャットダウンも再起動も
共に0になってしまいます。
見分ける方法はないでしょうか?
WinXP、VC.NETです。
0602デフォルトの名無しさん
NGNG0603デフォルトの名無しさん
NGNG自作のエディットコントロールで、NotifyメッセージをEDIT互換にしたいとかじゃないの?
見分けても意味ないだろ。
0605601
NGNG見分ける方法はあるのですか?
それともないのですか?
0606デフォルトの名無しさん
NGNG何をやりたいのか、もう少し具体的に書いてみれば? 代案が出てくるかも
知れんぞ。
0608601
NGNG別スレですこし話したのですが、
ファイルを定期的にバックアップするツールを作っています。
その機能の一部に
終了時、バックアップをとる
というのがあるんですが、
これを実装するためです。
別スレでは、シャットダウン時は
重い作業厳禁、といわれたのですが、
ファイルのコピーなので仕方ないかな、と思って開発進めてます。
シャットダウン時にコピーすると応答が無い、という
ダイアログが出てしまいます。
ですから
WM QUERYENDSESSIONでFALSEを返し
システムからのシャットダウン要求を中断、
WM ENDSESSION中側でファイルの処理、
その後ExitWindowsExでシャットダウン
とするように動かしたいのですが、
一度止めて、ExitWindowsExする時に、
シャットダウンならシャットダウン、
リブートならリブート、と引数を変化させる必要が
あり、どうしても必要な情報と思ってます。
0609デフォルトの名無しさん
NGNGそんな感じって...自分でまともに説明もできんのなら
標準のEditコントロールでも使っとけ。
通知したい時点で
SendMessage(GetParent(hwnd),
WM_COMMAND,
MAKEWPARAM(GetDlgCtrlID(hwnd), EN_CHANGE),
(LPARAM)hwnd);
のような感じで呼び出せばいい。
0610デフォルトの名無しさん
NGNGMFCスレで、そのソリューションを提示した者だ。
if ( lParam & ENDSESSION_LOGOFF )
でちゃんと区別つけられたよ(Win2000)。
0611601
NGNGすみません、毎度毎度ご迷惑おかけします。
あたりです。
そんな定数あるとは知りませんでした。
winusuer.h内のしかも
ExitWindowsExの近くに
#define EWX_LOGOFF 0
#define EWX_SHUTDOWN 0x00000001
#define EWX_REBOOT 0x00000002
#define EWX_FORCE 0x00000004
#define EWX_POWEROFF 0x00000008
#if(_WIN32_WINNT >= 0x0500)
#define EWX_FORCEIFHUNG 0x00000010
とあり、他のも区別できそうです。
.hへ定数を調べにいくという考えは持ってませんでした。
次から気をつけたいと思います。
ありがとうございました。
0612601
NGNG勘違いしてました。
これはExitWindowsExの引数に使う定数ですね。
>610さんのおっしゃられてる方法だと、
確かにログオフは検出されますが、
シャットダウンか再起動かは判別できないようです。
簡易的にはWM_QUERYENDSESSIONの
lParamが1か0かで同じ判断ができるようです。
喜びのあまり、てっきり
EWX_SHUTDOWNをENDSESSION_SHUTDOWNと
勘違いしていたようです、すみません。
ENDSESSION_LOGOFFもあるならと
ENDSESSION_SHUTDOWN
なども探してみましたがどうやらログオフしかないようです。
シャットダウンと再起動を見分けることはできないのでしょうか?
0613デフォルトの名無しさん
NGNGWM_CLOSE -> WM_DESTROY -> WM_QUIT
の順番でいいんでしょうか?
WM_DESTROYでオブジェクトの解法とかしてるんですけど
なんかの解法忘れがあるっぽくて、終了後CPU占有率が70%くらいになってしまう...
0615613
NGNGはずかちー・・・
0616デフォルトの名無しさん
NGNG0617613
NGNGイカレたOSでコンパイルしたexeって
やっぱイカレてるのかな
0618デフォルトの名無しさん
NGNGGetForegroundWindow を使えば、取得できないことはないですが
ちょっと違うんです。
あとは、GetDesktopWindow から下がっていくぐらいしかわからなかったっす。
関数の引数に与えてやれる情報は、何もないっす。
具体的には、DLL からその呼び出されているウインドウのハンドル
を取得したいのです。
DLLに直接ウィンドウハンドルを渡してやるとかは、ナシっす。
それをやりたくないのでありまして・・・。
0619デフォルトの名無しさん
NGNGWndProcの第一引数にハンドルが入ってくるが
0620デフォルトの名無しさん
NGNGこれは、田舎のひなびた小さな学校のHPを100万ヒットの
人気HPにしてあげようという運動です。現在のターゲット校は上記です。
多くの皆さんクリックしてあげて下さい。
HPに飛んだら、2,3回更新していただくと、もっとありがたいです。
どんどんコピペして他の板にまいてください。
0621bloom
NGNGhttp://www.leverage.jp/bloom/start/
0622デフォルトの名無しさん
NGNGどのウインドウのWindowProc中か知りたいということ?
スタックをさかのぼるしか方法ないと思うが
0623618
NGNG実行しているプログラム=プロセスのことで、あってるのかな。
具体的にいいますと、a.exe ってのが、x.dll を使ってるとします。
このとき、a.exeが、自分自身ってことです。
そして、やりたいことというのは、x.dll からa.exe のウィンドウハンドルを
取得したいのです。
もしかして、DllMainの第一引数でOK???
もうちょっと調べてみます〜。
0624デフォルトの名無しさん
NGNG一つのプロセスは複数のウインドウを所有できることを忘れてないか?
0625デフォルトの名無しさん
NGNGまずこれを理解しよう。
コマンドラインで使うようなプログラムはウインドウを持たないし、
Exploror等は1プロセスでいくつものウインドウを持ってる。
0626デフォルトの名無しさん
NGNGまぁ、プロセスが持つウィンドウを全部調べたいと仮定して、EnumWindows & GetWindowThreadProcessId が妥当なところだろう。
0627618
NGNGなんとかできあたみたいです。
アドバイス役にたちました。どもッス。
0628デフォルトの名無しさん
NGNG0629デフォルトの名無しさん
NGNGこれってシステムの背景色で透過させることはできないのでしょうか?
システム背景色は設定で変えられるので、ビットマップの周辺に灰色を塗っただけじゃ
浮いてしまう可能性がありますし、ダサいので・・・。
それと、メディアプレーヤ6.4のツールバーのようにツールバーを下の方に移動したいのですが、
SetWindowPosを受け付けてくれません。完全に下にへばりつかせるか、上にへばりつかせるかしか
できないようです。これもなんとかならないでしょうか。
0630デフォルトの名無しさん
NGNG0631デフォルトの名無しさん
NGNG「bitblt 透過」でgoogleしる。
0632デフォルトの名無しさん
NGNGマスクを生成して自前で透過処理を行え、ということでしょうか?
0633デフォルトの名無しさん
NGNG0634デフォルトの名無しさん
NGNGネタ?かなり笑ったんだけど…
0635デフォルトの名無しさん
NGNG0636デフォルトの名無しさん
NGNGこれは漏れのプリンタ(MJ-900C)がボロいからでしょうか?
0637
NGNG0638デフォルトの名無しさん
NGNG3回も出やがった
0639あ
NGNG何を聞きたいのかよくわかりません。
検索エンジンにでも聞いてください。
0640638
NGNGCライクにベタ打ちしてる間は動いてたけど
DirectXの初期化とかをまとめてクラス化してったら出るようになった
んだけど、なぜか初期化の前で出る
わけわかめ
0641デフォルトの名無しさん
NGNG0642デフォルトの名無しさん
NGNG>For example, to move in the range from 2 gigabytes to 4 gigabytes set
>the contents of lpDistanceToMoveHigh to zero, or ・・・
^^^^^^
なんで 0 なんですか?1なら納得なんですが...
nSize = (nSizeHigh * (MAXDWORD+1)) + nSizeLow
ですよね???
0643デフォルトの名無しさん
NGNGSetFilePointerのリファレンスは読んでないけど、それを見る限り間違ってないように思うけど?
2G〜4Gなら、32ビットに収まる範囲だろ?上位DWORDはゼロでいいんじゃないの?
4G〜8Gが、上位DWORD=1になるんじゃない?
0644デフォルトの名無しさん
NGNGサンプル通りLARGE_INTEGER使えって事だ
0645642
NGNGDWORD SetFilePointer(
HANDLE hFile, // ファイルのハンドル
LONG lDistanceToMove, // ポインタを移動するべきバイト数(下位32ビット)
PLONG lpDistanceToMoveHigh, // ポインタを移動するべきバイト数(上位32ビット)
DWORD dwMoveMethod // 開始点
);
確かにそうなんですが、下位32ビット lDistanceToMove は符号付って
書いてあるんです...もしかして、lpDistanceToMoveHigh が
Non-NULLのときは、lDistanceToMoveは符号無しとして扱われるのかな?
//実験すればすぐ分かりそうなもんですが...
今カキコしてる環境では実験できないもんで(;´Д`)
0647デフォルトの名無しさん
NGNG> Non-NULLのときは、lDistanceToMoveは符号無しとして扱われるのかな?
そりゃそうでしょ。両方が符号ビット持ってどうするのよ。
0648デフォルトの名無しさん
NGNG644じゃないけど
32ビットで符号つきならMSBと31ビットだけど
64ビットなら符号を上位32ビットに移せば下位32ビットの
MSBは符号を示す必要がなくなるじゃん。
下位32ビットで4GBまで表現できるわけでしょ。
0649デフォルトの名無しさん
NGNG0650デフォルトの名無しさん
NGNGウィンドウプロシージャに WM_CREATE が送られるとき、その lParam に渡すために使われます。
0651デフォルトの名無しさん
NGNGMSDN参照。
ウィンドウを生成したときに WM_CREAT メッセージが
WinProcに飛んでくるがそのときに lParam 値に設定される。
使い方はお好きなようにどうぞ。
0652651
NGNG0653642
NGNGこんな夜更けにどうも。勉強になりますた。
>For example, to move in the range from [0] to 4 gigabytes set
>the contents of lpDistanceToMoveHigh to zero, or ・・・
こう書いてくれれば...
■ このスレッドは過去ログ倉庫に格納されています