トップページ⇒tech
995コメント264KB

Win32API質問箱 Build87

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/03/28(日) 10:23:58
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。
「知らないならレスしないで下さい。ウザイだけです。 」なんて言わないでねっ!

過去スレ、関連リンクは>>2-10くらい。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで

- Win32API質問箱 wiki
http://wiki.livedoor.jp/program1/d/FrontPage

Win32API質問箱 Build86
http://pc12.2ch.net/test/read.cgi/tech/1265350980/
04491182010/04/26(月) 20:34:37
>>448
文字サイズ=ポイント
1 pt = 0.352 778 mm
0450デフォルトの名無しさん2010/04/26(月) 20:34:37
まじかるにゃんにゃんは良いよね〜

>>448
解像度には思いっきり影響されるだろ。
高解像度だとその分全体に占める割合が小さくなるし。
別にダイアログが勝手に大きくなったりはしないぞ。
それよりも、文字サイズ基準の関係でDPIの設定が反映されるのが特徴だな。
96から120にしてやれば、大きさもそれなりに広がる。
レンダリングの関係で120にしたら文字が切れてしまうのもよくある話w
04514482010/04/26(月) 20:53:08
ダイアログの大きさは、どの解像度でも一定な文字サイズを基準に取ってる。
だから解像度の違いにより、ダイアログの大きさが崩れることなく表示できる。
ダイアログの大きさは一定なので低解像度だと画面をはみ出して表示されないことがある。
-----
x には X座標、y には Y座標をそれぞれ
ウィンドウのクライアント座標でダイアログの左上の位置を指定します とありますが
こちらは解像度単位で、設定した値によっては始めからウインドウの端も表示されないことはあるんですか?

どの解像度でも真中に表示するには使用しているPCの解像度を取得して2で割って
SetWindowPos をすれば良いのでしょうか?
0452デフォルトの名無しさん2010/04/26(月) 21:04:43
ど真ん中に出されたら邪魔くさくてしょうがない
0453デフォルトの名無しさん2010/04/26(月) 21:37:45
>>451
WindowsSDKのリソースコンパイラの所に
リソーススクリプトの記述方法が全部書いてあるから。
0454デフォルトの名無しさん2010/04/26(月) 23:13:49
>>452
エロビデオ見てて良いシーンで一時停止すると
再生の→ボタンが画面の真ん中に出て来て
邪魔をする漏れのプレイヤー
04551182010/04/27(火) 02:26:21
   ○
     O
      o                       と
       。 ,. -ー冖'⌒'ー-、             思
       ,ノ         \            う
       / ,r‐へへく⌒'¬、  ヽ          キ
       {ノ へ.._、 ,,/~`  〉  }    ,r=-、  モ
      /プ?`y'¨Y´?ヽ?}j=く    /,ミ=/  ヲ
    ノ /レ'>-〈_ュ`ー‐'  リ,イ}    〃 /   タ
   / _勺 イ;;∵r;==、、∴'∵; シ    〃 /    で
  ,/ └' ノ \   こ¨`    ノ{ー--、〃__/    あ
  人__/ー┬ 个-、__,,.. ‐'´ 〃`ァーァー\   っ
. /   |/ |::::::|、       〃 /:::::/    ヽ  た
/   |   |::::::|\、_________/'   /:::::/〃
0456デフォルトの名無しさん2010/04/27(火) 06:59:37
tesst
0457デフォルトの名無しさん2010/04/27(火) 13:32:18
Windowsのログイン時のパスワードを変更する
プログラムて作成することはできますか?
ハックとかではなく、自分のTOOL上からパスワード変更をしたいと考えています。
0458デフォルトの名無しさん2010/04/27(火) 13:52:33
#include <lm.h>

NetUserChangePassword()
04591182010/04/27(火) 23:49:22
#pragma pack(push,1)
04601182010/04/28(水) 10:34:52
ppp
0461デフォルトの名無しさん2010/04/28(水) 23:36:21
SJISで表現できない文字を含むフォルダ、ファイル名をA系のAPIでアクセスしようと思ったら
8.3形式にしてアクセスするしかないんでしょうか?例えば
   ,
Andre (eの上に ' がつく文字)というファイルを
FindFirstFile(便利な変換関数("Andre"), ...)としてアクセスする手段はないですよね。
0462デフォルトの名無しさん2010/04/29(木) 05:39:44
>>461
8.3形式のファイル名はどうやって得るつもりなの?
GetShortPathName()を使うならUnicode版を使わなきゃならないし、
それが出来る環境ならそもそもA系APIを使う意味がないんじゃ?
0463デフォルトの名無しさん2010/04/29(木) 11:07:57
仲介DLLからローカルフックでアプリの WM_KEYDOWN, WM_KEYUP を横取りして処理し、アプリには渡さないようにしたいのですが
キーボードプロシージャからDLL側のスレッドに PostThreadMessage() すると
なぜかアプリ側に WM_KEY* メッセージが素通りしてしまいます。
PostThreadMessage() で投げているのはユーザ定義メッセージなので、WM_KEY* とは全く無関係なはずだと思うのですが
何故こういうことが起こるのでしょうか?PostThreadMessage() はそういう仕様のものなんでしょうか?

キーボードプロシージャのソースを示します。
DLL側で生成したスレッドはウィンドウを持ちませんが、事前に PeekThreadMessage(&msg, 0, 0, 0, PM_NOREMOVE) を呼んでいるので
メッセージキューは生成されているはずだと思います。
--------------------
HHOOK hHook;
UINT thread_id; // DLL側で生成したスレッドのID

LRESULT CALLBACK KeyBoardProc(int code, WPARAM wp, LPARAM lp)
{
  if(code < 0 || code == HC_NOREMOVE) return CallNextHookEx(hHook, code, wp, lp);

  // これを行うとなぜか WM_KEY* が素通りしてしまう
  // コメントアウトすると WM_KEY* は望み通り遮断される
  PostThreadMessage(thread_id, WM_APP+1, wp, lp);

  return TRUE; // アプリに WM_KEY* を渡さない
}
--------------------

仕様上やむを得ないのであればメッセージキューに相当するものを自作しようかと考えているのですが
標準のメッセージキューで可能ならそれに越したことはないので、詳しい方の知恵をお借りしたいです。
0464デフォルトの名無しさん2010/04/29(木) 11:14:38
PeekThreadMessage(&msg, 0, 0, 0, PM_NOREMOVE) は

PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE) の誤りです。すみません。
0465デフォルトの名無しさん2010/04/29(木) 12:11:37
>>462
いちいち取得しなくても、ソースを書く段階で「最初から知っていた」というケースもある
汎用性はなくなるけど特定の業務に使うアプリなら決め打ちで問題ないこともある
0466118 ◆ayPjxbmM2c 2010/04/29(木) 12:22:36
>>465
じゃ、直接指定しろよ。
0467デフォルトの名無しさん2010/04/29(木) 18:32:54
SJISで表現できないから困ってるんじゃないのかと
04681182010/04/29(木) 19:16:56
int i = 10;
int * p = &i;//int型ポインタpにiのアドレスを代入する
簡単。
char str1[] = "abcde";
char * str2 = "abcde";
上と下は同じでどっちを使ってもいい。
0469デフォルトの名無しさん2010/04/29(木) 19:34:33
やばい、>>468 見てちょっと可愛いと思ってしまった
0470デフォルトの名無しさん2010/04/29(木) 20:09:32
468にツッコミたくて仕方がないが、それ以前になんでそんな書き込みをしたのか
気になってしょうがない。どこかの誤爆?
0471デフォルトの名無しさん2010/04/29(木) 21:30:31
ただのキチガだから触れるな
0472デフォルトの名無しさん2010/04/30(金) 00:28:31
118 はいろんなところで見かける
04731182010/04/30(金) 02:24:22
真の118 >>118
偽の118 トリップ全部、sage
>>468>>459>>378>>370
>>300>>240>>186
>>176>>149>>190


04741182010/04/30(金) 03:01:53
なんだこいつうぜえ
04751182010/04/30(金) 09:58:59
ppp
04761182010/04/30(金) 10:05:06
おはよう、おまいら。今起きたところなんで過去10時間の書き込みは全部偽物だぜ。
04771182010/04/30(金) 10:57:54
漏れも偽者でつ
0478デフォルトの名無しさん2010/04/30(金) 12:16:25
現在のIMEの状態を取得するAPIを教えてください。

指定したハンドルのではなくて、IME自体の状態を取得したいのですが
0479デフォルトの名無しさん2010/04/30(金) 12:46:28
それ俺も知りたいが
IMEってやっかいだよな
下手に関わるとwineでまともに動かなくなるし
0480デフォルトの名無しさん2010/04/30(金) 12:48:47
今調べてたんだけど
WM_IME_〜メッセージとかでどうですかね?
0481デフォルトの名無しさん2010/04/30(金) 12:49:52
あ、ハンドルがわからないか・・・
0482デフォルトの名無しさん2010/04/30(金) 12:50:39
レジストリかどっかにIMEの現在の状態って書いてないですか?
0483デフォルトの名無しさん2010/04/30(金) 15:04:41
毎回レジストリなんかに書かれるとでも?
・・・本当に書かれてたら笑うが
0484デフォルトの名無しさん2010/04/30(金) 17:20:46
IMEの状態を表示するツールなら知ってる
0485デフォルトの名無しさん2010/04/30(金) 18:42:03
IME自体の状態って言うけど
IMEの状態ってウィンドウごとに保持されてるんじゃないの?
0486デフォルトの名無しさん2010/04/30(金) 21:42:26
IMEの状態を取得する方法がわからないから、IMEがONのままスリープすると、
復帰したときにATOKはおかしくなることがある。
MS-IMEも昔はおかしくなったんだけど、最近になってようやくきちんと復帰するようになった。
0487デフォルトの名無しさん2010/05/01(土) 02:16:39
IMEの有効・無効なら、グローバルフックしてWM_IME_STATUSを捕まえるでおk
0488デフォルトの名無しさん2010/05/01(土) 11:40:28
複数のウィンドウを用意してるなかで、片方が普段非表示なんだが
もう片方がクリックされたら、クリックされたマウス上に表示するようにしてる
それで、ウィンドウは両方ともダブルクリックに対応してるんだけど
片方がダブルクリックされると、最初のクリックでもう片方が表示、その結果WM_LDBLCLKが来ないんだが
綺麗な解決方法無いかな?
0489デフォルトの名無しさん2010/05/01(土) 11:52:20
表示を遅延させてみるとか
0490デフォルトの名無しさん2010/05/01(土) 14:38:20
>>489
�d。遅延なら何とかなりそう
0491デフォルトの名無しさん2010/05/01(土) 15:53:08
>>488
試してみたけど、普通にWM_LBUTTONDBLCLKきたよ?
非表示のウインドウを表示させるコードに問題があるんじゃないの?
表示させるときにSWP_NOACTIVATEとか、SW_SHOWNA使ってる?
0492デフォルトの名無しさん2010/05/01(土) 19:59:55
>>491
うぉぉぉ。有難う!
普通にSW_SHOW使ってました
0493デフォルトの名無しさん2010/05/01(土) 23:44:22
GetWindowPlacement
GetClientRect
GetWindowRect

の違いがわかりません。
どれも、領域の左上、右下の座標を取得することができるようですが・・・

どう違うんでしょうか?
0494デフォルトの名無しさん2010/05/01(土) 23:46:03
調べろよw
0495デフォルトの名無しさん2010/05/02(日) 00:11:33
回答できるほどの知識はないようですねw
0496デフォルトの名無しさん2010/05/02(日) 00:17:32
センスなさすぎw
0497118 ◆ayPjxbmM2c 2010/05/02(日) 00:17:53
あるわけないだろ。
0498デフォルトの名無しさん2010/05/02(日) 00:25:43
知識ないから質問するだけ無駄
0499デフォルトの名無しさん2010/05/02(日) 00:27:50
ただのキチガだから触れるな
0500デフォルトの名無しさん2010/05/02(日) 00:30:03
GetWindowPlacement - 通常、最小化、最大化の位置情報
GetClientRect - クライアント領域の位置情報
GetWindowRect - ウィンドウ領域の位置情報
0501デフォルトの名無しさん2010/05/02(日) 01:52:03
GetWindowPlacement - 各ウィンドウ情報取得
GetClientRect - クライアント上に描画している矩形を取得
GetWindowRect - ウィンドウ上に描画している矩形を取得
05021182010/05/02(日) 03:17:58
あなたは知らないのですか?
05031182010/05/02(日) 08:58:19
<おみやげ>が<のらドワーフのさと>にあることを。
0504デフォルトの名無しさん2010/05/02(日) 10:14:26
複数のウィンドウ(AとBと略)を最前面表示にしてるんだが
Aは常に最前面、しかしBは更にAより最前面って出来ない?
0505デフォルトの名無しさん2010/05/02(日) 10:16:20
可。
0506118 ◆ayPjxbmM2c 2010/05/02(日) 10:44:32
質問文にすでに矛盾があるんだが。
0507デフォルトの名無しさん2010/05/02(日) 11:30:06
悔しいが >>506 の突っ込みでワロタ
0508デフォルトの名無しさん2010/05/02(日) 12:46:07
おれは読解力の無さに呆れた
0509118 ◆88ZPSwqsm6 2010/05/02(日) 12:58:18
AをBのオーナーにしとけばいいな。
0510デフォルトの名無しさん2010/05/02(日) 13:09:46
それだとオーナー関係にしないと駄目じゃない?
0511デフォルトの名無しさん2010/05/02(日) 13:11:19
途中で送信してしまったorz

オーナーにせずに解決策ってある?
0512デフォルトの名無しさん2010/05/02(日) 13:22:24
それしかないとも言う。
アプリのメッセージボックスの自己主張が激しかった
Win95/NT4.0時代の悪夢を繰り返さないための仕様。
0513デフォルトの名無しさん2010/05/02(日) 13:26:59
>>504
適当なイベント(Activateなど)をトリガに
毎回EnumでZオーダーをチェックし
BがAの背面に回っていたら
A、Bの順にTopmostする
0514デフォルトの名無しさん2010/05/03(月) 03:38:49
winapiで立方体の表示はできないの?
0515デフォルトの名無しさん2010/05/03(月) 03:42:03
やろうと思えばできる。自分で計算して描画すれば。
DrawCube みたいな関数をイメージしてるなら、そんな物は無い
05161182010/05/03(月) 04:19:42
>>514
3D->2D変換

typedef struct type3d {
float x,y,z;
} POINT3D;

typedef struct type2d {
float x,y;
}

void convert3dto2d(p3 *POINT3D, p2 *POINT2D)
{
float vp = 0.7;

p2->x = p3->x * (vp / p3->z);
p2->y = p3->y * (vp / p3->z );
}
0517デフォルトの名無しさん2010/05/03(月) 04:56:57
↑
何言語?
糞いい加減なレスすんなや、ボケ
0518デフォルトの名無しさん2010/05/03(月) 05:10:26
>>516
滅茶苦茶過ぎてワロタ
0519デフォルトの名無しさん2010/05/03(月) 10:31:17
あるゲームを解析したいと考えています
どうやるかというとHPが100以下になったら回復アイテムを
自動で使うというものを作りたいです

そこで、起動しているexeのメモリの内容を参照するAPIって
何があるのでしょうか?
0520デフォルトの名無しさん2010/05/03(月) 10:39:31
坊やはお帰り
0521118 ◆1oKmZSIAF. 2010/05/03(月) 10:43:46
ReadProcessMemory()
0522デフォルトの名無しさん2010/05/03(月) 11:35:11
いつから釣りだらけのスレになったのか
元からかw
0523デフォルトの名無しさん2010/05/03(月) 12:59:13
         \   ∩─ー、    ====
           \/ ● 、_ `ヽ   ======
           / \( ●  ● |つ
           |   X_入__ノ   ミ   そんな餌で俺様が釣られクマ――
            、 (_/   ノ /⌒l
            /\___ノ゙_/  /  =====
            〈         __ノ  ====
            \ \_    \
             \___)     \   ======   (´⌒
                \   ___ \__  (´⌒;;(´⌒;;
                  \___)___)(´;;⌒  (´⌒;;  ズザザザ
0524デフォルトの名無しさん2010/05/03(月) 18:01:45
特定のプロセスのみ、ShellExecute() のプログラムの検索パスを変更することは可能でしょうか?
SetEnvironment() で path を新たに設定しなおして、その後 ShellExecute() を実行してみたんですが
古いパスしか見てくれないようで困っています
0525デフォルトの名無しさん2010/05/03(月) 18:06:17
>>524
環境変数を継承するオプション無かった?なかったら、CreateProcessでごにょごにょする。
0526118 ◆4BcWhWACFc 2010/05/03(月) 18:06:47
なんか勘違いしてるような気がする。

もう少し具体的にやりたいことと、やってみたことを説明してみ。
0527デフォルトの名無しさん2010/05/03(月) 19:29:35
524です
notepad.exe とか memo.txt とかのファイル名が書かれたテキストファイルを読み
適当なタイミングでそのプログラムをShellExecuteで起動する32ビットアプリを作っています
64ビット環境下で動く時に、%SystemRoot%\Sysnative を優先して実行ファイルの探索パスとして使えると、
64ビット版のアプリが起動できるのではないかと思い実装を試みていました
多分、ShellExecute のパスを変えるには、親玉の explorer.exe の環境変数を変更しないとだめで、
そこを書き換えている期間は他のアプリにも影響が出てしまうのでこの方針はまずそうです
素直に64ビット版のShellExecuteのプロセスを用意しようと思います
0528118 ◆4BcWhWACFc 2010/05/03(月) 19:35:37
それ、環境変数関係ないだろ。フォルダリダイレクションだし。
素直に、フルパスで起動すればいいんじゃね?
0529デフォルトの名無しさん2010/05/03(月) 19:51:42
実行ファイルだけならCreateProcessなどでフルパス指定で呼べばいいんですが
memo.txt や a.bat のようなファイル名指定による ShellExecute でSystem32配下のアプリが呼ばれるときの挙動を変えたかったんです
0530118 ◆4BcWhWACFc 2010/05/03(月) 19:56:27
exe以外なら、FindExecutableで関連づけられたアプリを取得して、
必要に応じてSysnativeにパスを変えて、CreateProcessすればいいだろ?
0531デフォルトの名無しさん2010/05/03(月) 19:58:29
おれの周りにも最近64がちらついてきた
面倒な世の中になってきたなあ
05321182010/05/03(月) 20:12:45
>>531
ニンテンドウ64
0533デフォルトの名無しさん2010/05/03(月) 20:53:44
>>530
これでいけそうです。ありがとうございます!
0534デフォルトの名無しさん2010/05/04(火) 13:31:49
x86向けとx64向けの両方のバイナリをはき出すにあたって
ソースコードを同一にする方法って言うか注意事項って言うか
そういうのがまとまったサイトってないのかな。
0535デフォルトの名無しさん2010/05/04(火) 13:36:35
これやらなけりゃ問題ない。
void* p;
int a=(int)p;
0536118 ◆tfxvx8WXZ2 2010/05/04(火) 13:42:38
ポインタサイズだけだからな・・・。
0537デフォルトの名無しさん2010/05/04(火) 13:45:08
if (sizof(int) != sizof(int*)) {
#error 無理です。
}
0538デフォルトの名無しさん2010/05/04(火) 14:13:04
>>537
それじゃ常にエラー出るだろw
0539デフォルトの名無しさん2010/05/04(火) 14:21:17
確かに常にエラー出るなw
0540デフォルトの名無しさん2010/05/04(火) 15:44:10
x64でビルドしようかと思ってたけどノートパソで走らなくなるからx86にしたことがある。
0541デフォルトの名無しさん2010/05/04(火) 21:26:09
ソースはともかくバイナリを同一にしたい
副次ストリームとか使ってなんとか一緒にできないものか
foo.exe(32ビット版) が起動た時OSが64ビットだったら foo64.exe を呼び出す、みたいな間抜けなやり方しか思いつかん
0542デフォルトの名無しさん2010/05/04(火) 21:43:04
>>541
PEフォーマットが複数バイナリを格納できない以上、それは無理ってもんでしょ。
0543118 ◆tfxvx8WXZ2 2010/05/04(火) 22:08:22
>>541
SysInternalのツールとかは、そういう風にやってるね。
0544デフォルトの名無しさん2010/05/04(火) 22:11:35
Visual Studio には spy ツールがありますよね
あれって、たとえば、特定のEXEにあたっちすることまでは
わかったのですが、
そのEXEが発行するAPIとか取得できるのかな?

やりたいことは、
EXEがあり、このEXEは、Widnowsのハードウエアにかかわる
DLL(API)を使っています。
このdevice.dll に対して、どのようなAPIが発行を要求したかしらべたいのです。
0545デフォルトの名無しさん2010/05/04(火) 22:13:03
何故かコクヨのノートに書かれた夏休みの絵日記が浮かんだ
0546118 ◆uKObk31oqA 2010/05/04(火) 22:16:02
SPY++は、メッセージのやりとりを確認するツール。
API呼び出しを確認したければ、API Monitorかデバッガでアタッチ、
あるいは、ラッパ生成ツールでも使うことになる。

詳細はググレ。
0547デフォルトの名無しさん2010/05/04(火) 22:16:52
>>544
昔、dependency walkerってのがあったけど、
今もあんの?
0548デフォルトの名無しさん2010/05/04(火) 22:20:10
横から >>544 を書き直すと、

今手元に、とある dll とそれを利用している exe があります。
この dll について、公開されている関数の中で、この exe が
今どの関数を使用しているかを知る方法はありませんか?
ご教示の程よろしくお願い致します。

こんな感じか
0549118 ◆uKObk31oqA 2010/05/04(火) 22:24:30
>>547
VSには含まれなくなったけど、フリーのやつが落とせる。
■ このスレッドは過去ログ倉庫に格納されています