トップページ⇒tech
1001コメント269KB

Win32API質問箱 Build81

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/08/02(日) 00:20:49
スレ立てるまでもない、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質問箱 Build80
http://pc12.2ch.net/test/read.cgi/tech/1244057140/l50
0175デフォルトの名無しさん2009/08/08(土) 00:52:59
>>172
MSDNにはXP以降と書かれてるけど実際には2000でも使える。
0176デフォルトの名無しさん2009/08/08(土) 08:04:08
Windows7 SDK のISOイメージは、まだx86版しか上がってないのか。
今までと違って、x64環境にはx64用のイメージが必要なのに気付かなかったぜ。
0177デフォルトの名無しさん2009/08/08(土) 09:41:58
>>176
試してないけど、ファイルはあるみたい。
http://download.microsoft.com/download/2/E/9/2E911956-F90F-4BFB-8231-E292A7B6F287/GRMSDKX_EN_DVD.iso
01781352009/08/08(土) 16:14:41
>>135のものですが、>>137さんありがとうございます。
その方法で試みていますが、うまくいきません。
具体的には、
LPNETRESOURCE netResource = new NETRESOURCE();
netResource->dwScope = 0;
netResource->dwType = RESOURCETYPE_DISK;
netResource->dwDisplayType = 0;
netResource->dwUsage = 0;
netResource->lpLocalName = ""; // ネットワークドライブにする場合は"z:"などドライブレター設定
netResource->lpRemoteName = "\\\\hostname.com";
netResource->lpProvider = "";
DWORD err = WNetAddConnection2(netResource, "password", "account", CONNECT_UPDATE_PROFILE);
で、戻り値のerrは0になったのですが、マウントがされません。
netResource->lpLocalName = "Z:";
のようにしても、Zドライブに割り当てられません。
何が原因でマウントされないのでしょうか?
マウントされたボリュームが表示されるようにしたいのですが、
どうすればよいか教えてください。
よろしくお願いします。
0179デフォルトの名無しさん2009/08/08(土) 17:59:47
>>177
サンクス。ハッシュも一致していたし、それでOKみたいだ。
0180デフォルトの名無しさん2009/08/08(土) 18:00:32
lpRemoteNameにホスト名だけを指定しているのがまずいような
多分\\\\hostname.com\\folderのようにするはず
で、folderは共有されていなければならなかったはず
0181デフォルトの名無しさん2009/08/08(土) 22:49:32
7で目覚まし動かん
0182デフォルトの名無しさん2009/08/08(土) 23:01:41
相変わらずSDKでけぇなー
.NETとかイラネーし別ファイルにしてくれよ・・・
0183デフォルトの名無しさん2009/08/08(土) 23:04:10
別ファイルにしたら誰も使ってくれなくなるだろ…

VC++ しか使わないのに VB も VC# もついてくるのは抱合せ販売では?
とか思ったけど、いまの Visual Studio って、過去のVisual C++単体と同じくらいの金額なんだよな。
0184デフォルトの名無しさん2009/08/08(土) 23:09:40
それを言ったら昔はSDKやDDKだって有償だったでしょうに
0185デフォルトの名無しさん2009/08/08(土) 23:11:47
無料で何でも揃う割にクリエイティブなティーンが少ない件
0186デフォルトの名無しさん2009/08/08(土) 23:33:24
>>182
ウェブセットアップ版ではだめですか?
0187デフォルトの名無しさん2009/08/08(土) 23:40:10
>>186
> Error: Setup determined that the Microsoft .NET Framework 2.0 is not present or could not be detected.
> Navigate to the Microsoft Download Center, search for .NET Framework 2.0 redistributable, and download the version appropriate for your platform

うぜーーーーーーーーー
0188デフォルトの名無しさん2009/08/09(日) 00:43:32
いいかげんMINMAXマクロ定義するのやめてほしい
0189デフォルトの名無しさん2009/08/09(日) 01:06:45
今更やめられないのは少し考えれば判るだろ
0190デフォルトの名無しさん2009/08/09(日) 01:22:41
NOMINMAXで我慢してください。
0191デフォルトの名無しさん2009/08/09(日) 01:33:08
事情はわかってるがそういう上塗りでのごまかしにはウンザリなんだよ。
ちょっとグチらせてくれや。
0192デフォルトの名無しさん2009/08/09(日) 01:34:28
#include <cstdlib>
#include <limits>
#define NOMINMAX
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <shlobj.h>
#include <shlwapi.h>
#define STRSAFE_NO_DEPRECATE
#include <strsafe.h>
#pragma comment(lib, "comctl32.lib")
#pragma comment(lib, "shlwapi.lib")

こういうのをcommon.hみたいな名前で%include%に放り込んでおけば

#include <common.h>
だけで万事解決
0193デフォルトの名無しさん2009/08/10(月) 13:12:16
LEAN AND MEANもdefineしようぜ
0194デフォルトの名無しさん2009/08/10(月) 13:42:19
windef.hだけインクルードしようとするとコンパイルエラーになるんだがなんでだろう
0195デフォルトの名無しさん2009/08/10(月) 14:25:22
>>193
ソレつけるとかえって#includeの行数が増える事になるし面倒じゃね?
今時の計算機ならコンパイル時間の短縮にほとんど貢献しなさそう
0196デフォルトの名無しさん2009/08/11(火) 10:43:43
メニューを作る際、リソースファイルなどで、「INACTIVE」を指定すると、
選択できない項目にすることができますが、
これを、アプリケーションからInsertMenuItem関数などで動的に追加するときに
適用することはできないでしょうか?
InsertMenuItem関数で使用するMENUITEMUINFO構造体を見ても、
該当するような項目は見当たりませんでした。

よろしくお願いします。 m(_ _)m
0197デフォルトの名無しさん2009/08/11(火) 10:56:45
fState = MFS_DISABLED
0198デフォルトの名無しさん2009/08/11(火) 11:11:44
MFS_DISABLED だとグレーアウトした選択不可
グレーアウトなしの選択不可は MF_DISABLED っぽいが…

# リソースで作ったメニューを GetMenuItemInfo で fState 取得したら 2 だった
# 2 相当のマクロを winuser.h で探すと… MFS_xxx は存在しないっぽい
01991962009/08/11(火) 11:15:57
>>197
>>198
ありがとうございましたぁ!! 。゜( ゜´∀`゜)゜。
0200デフォルトの名無しさん2009/08/11(火) 15:33:56
MF_DISABLEDはdeprecatedなんだろ
そもそもグレーアウトしないのに選択できないなんてUIとしておかしいし
キーボード操作だと選択できないのが分からない
0201デフォルトの名無しさん2009/08/11(火) 21:24:00
教えてください。レバーコントロールの勉強中です。
レバーコントロールの背景についてです。
エクスプローラみたいにグラデーションのかかった背景にするには
どうしたらできるんですか?
背景としてビットマップを指定できるのは分かったんですけど、
エクスプローラの場合、ウィンドウのサイズを変えると、
背景のグラデーションも動的に変わるようにしたいんです。
0202デフォルトの名無しさん2009/08/11(火) 21:32:55
また肝臓コントロールかよ
0203デフォルトの名無しさん2009/08/11(火) 21:38:11
XPスタイルのコモンコントロールとかなんとかでぐぐれ
0204デフォルトの名無しさん2009/08/11(火) 21:47:38
最近のVCだと自動でXPスタイルのmanifest付けてくれるんじゃないの?
0205デフォルトの名無しさん2009/08/11(火) 22:04:11
デフォ設定だとマニフェストは埋め込まれる
0206デフォルトの名無しさん2009/08/11(火) 22:40:13
マニフェストは埋め込まれるけど、comctl32のバージョン6を使う指定は自分で追加しないといけない。
その最近のVCだとこんな風にpragmaでも書ける。もちろん、リソースでもリンカオプションでも可能。

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' "\
"version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
0207デフォルトの名無しさん2009/08/11(火) 23:47:01
面倒だなあ

#pragma comment(linker,"/manifest:comctlv6")
みたいなオプション用意してくれればいいのに
0208デフォルトの名無しさん2009/08/12(水) 00:19:40
>>192に書いとけばいいよ
0209デフォルトの名無しさん2009/08/12(水) 02:29:38
よく使う割に長いオプションは短縮系的なものが用意されてそうな気はするんだが。
(/nodefaultlib → /nod みたいな)
今度link.exeを逆汗して調べてみるか。

<チラシの裏>
cl.exeに/Bzか/Bdをつけてコンパイるとc1.dllやc2.dllに渡してるコマンドラインが見れる。
</チラシの裏>
0210デフォルトの名無しさん2009/08/12(水) 12:27:53
>>209
マニュアル見ろよ。
02112012009/08/12(水) 12:34:05
XPスタイルというものだったんですね。
マニフェストのおかげで実現できました。
ありがとうございました。
0212デフォルトの名無しさん2009/08/12(水) 14:02:13
WM_NCPAINTで(HRGN)wParamからGetDCEx取得したHDCを使って描画すると、
思った位置に描画できないのですが、どうしてなんでしょうか。

ttp://msdn.microsoft.com/en-us/library/dd145212%28VS.85%29.aspx

ここの0x10000を足すやり方でhdcを求めてFillRgnで塗りつぶすと、
クライアント領域にずれ込んでウィンドウフレームの形に塗りつぶされてしまいます・・・
0213デフォルトの名無しさん2009/08/12(水) 17:46:56
>>210
マニュアルに載ってないオプションが大量にあるのを知らないのか
平和な奴だな
0214デフォルトの名無しさん2009/08/12(水) 18:06:50
煽るな
0215デフォルトの名無しさん2009/08/12(水) 18:54:54
ごめんなさい
0216デフォルトの名無しさん2009/08/12(水) 19:32:00
>>213
あるだろうな。 それがどうした。
公開してないのをむやみに使うんじゃないよ。
0217デフォルトの名無しさん2009/08/12(水) 21:27:51
ウィンドウメッセージでマウスカーソルが入ってくるのはわかるんですが
出て行くのを知る手段はありますか?
0218デフォルトの名無しさん2009/08/12(水) 21:44:39
>>217
入ってきたときMOUSEMOVEをキャプチャするとか。
または入ってきたときタイマで確認し始めるとか。
で、出たらどちらも初期化するとか。

いずれにしても自前で処理する必要がある。
0219デフォルトの名無しさん2009/08/12(水) 21:59:29
WM_MOUSELEAVEはだめ?
0220デフォルトの名無しさん2009/08/12(水) 22:07:32
それが、MOUSEMOVEのキャプチャじゃない?
入ってきたとき、TrackMouseEvent()実行しないとだめだよね。
0221デフォルトの名無しさん2009/08/12(水) 22:11:05
>>218-220
キャプチャってボタン押さなくてもいけるんですね
それとWM_MOUSELEAVEも知らなかったのでその二つを色々試してやってみようと思います
ありがとう
0222デフォルトの名無しさん2009/08/13(木) 20:40:36
上のWM_MOUSELEAVEなのですが
ALT+キーにも反応してしまうのを抑制することは出来ますか
0223デフォルトの名無しさん2009/08/13(木) 21:55:58
出来ます
0224デフォルトの名無しさん2009/08/13(木) 22:12:02
確かに良く考えれば出来ました
LEAVEの中で座標調べて必要ならEvent設定しなおしてやりましたが
何故キーに反応するのかわからない…
0225デフォルトの名無しさん2009/08/14(金) 10:53:15
SPY++が無いため質問させて頂けます
ポップアップメニューを選択した時、メッセージの流れは

WM_EXITMENULOOP
WM_COMMAND

の順になるんですが
WM_EXITMENULOOPがくるまえに確実に選択したメッセージは来ないんでしょうか?
0226デフォルトの名無しさん2009/08/14(金) 20:58:55
Spy++で見れば分かるだろ
0227デフォルトの名無しさん2009/08/14(金) 23:00:09
だからないって言ってんだよ、このスカポンタン。
ボヤッキー、やっちまいな。
0228デフォルトの名無しさん2009/08/14(金) 23:01:44
入れればいいだろうが。
0229デフォルトの名無しさん2009/08/14(金) 23:17:19
Spy++ってネットから落とせたっけ?
俺はVC6買ったら入ってたから、今もそれ使ってるけど
0230デフォルトの名無しさん2009/08/15(土) 00:52:42
VC++をネットから落としてきたら入ってるよ。
0231デフォルトの名無しさん2009/08/15(土) 01:27:20
なんか人聞きが悪いな
0232デフォルトの名無しさん2009/08/15(土) 01:32:20
???
0233デフォルトの名無しさん2009/08/15(土) 01:33:16
プログラマなんだから作れよ
0234デフォルトの名無しさん2009/08/15(土) 01:46:37
自作するとフックやプロセス間通信の勉強になるよね。
02352312009/08/15(土) 01:49:10
>>232
ネットで落とすってなんか割る感じに聞こえたから
0236デフォルトの名無しさん2009/08/15(土) 01:52:36
今のVisual StudioはExpressのつく製品なら無料でDLできるからなあ
02372312009/08/15(土) 01:57:13
いや、dreamsparkでってことでしょ
expressionじゃspy++付いてこないし
0238デフォルトの名無しさん2009/08/15(土) 02:05:26
あ…dreamsparkってもう終わってたのね
0239デフォルトの名無しさん2009/08/15(土) 02:59:21
           \
            \
          ∧ニユ/ ̄ヽ
\        ( ´∀/)    i
\.\    _(」つ/とl) .  | \
;::;::\i\  匚レ| .〈/ )    |  \
 。::;;:'\.\   (_,)ー'    |_,, -'''"!
^人;:'::;゚:;.\l\     _,,, -''"|_,, -''"|
 ^^从::;;:。':\.\_,, -''"|_,, -''"|   . :|
 へ ^へ;;::';;:'\l_,, -''" .   | 从^    〜
 ^ ^ヘ^人从::;;;:|    ,ィ人^. |  ^ ^へ^^
  〜 ^.へ' ^':レ^从 へ'  | 〜   ^
 へ ^^ へ 〜人^ ^  へ〜  〜
0240デフォルトの名無しさん2009/08/15(土) 04:00:00
http://pc12.2ch.net/test/read.cgi/tech/1250129684/
0241デフォルトの名無しさん2009/08/15(土) 06:15:12
>>231
この馬鹿はmsdnサブスクリプション知らないの?
0242デフォルトの名無しさん2009/08/15(土) 07:21:18
今少し調べてみたんだが、Spy++に代わりとなるアプリって無いな
あっても正直ショボいから、自分で作ったほうがいいかもな
0243デフォルトの名無しさん2009/08/15(土) 08:43:19
ハァ?Spy++より高機能なアプリなんて山ほどあるだろ
0244デフォルトの名無しさん2009/08/15(土) 09:13:09
そんなことは知ってる
探すぐらいなら自分で作ったほうがいいということだ
0245デフォルトの名無しさん2009/08/15(土) 09:15:41
キャタピラでも再発明しますか
0246デフォルトの名無しさん2009/08/15(土) 09:21:02
>>243
あるなら教えてくれよ。軽く調べたけど俺は見つけられなかった

後、質問なんだが
マウスフックしてる時に、クリックされたウィンドウがポップアップなら処理しない用にしたいんだが
FindWindow( TEXT("#32768"), NULL )で取得したハンドルと
フックで渡されたハンドルが一致しないんだが、何か良い解決策ないかな?
0247デフォルトの名無しさん2009/08/15(土) 12:43:14
>>246
Spy++互換ならWinspectorとか?
高機能かどうかは保証しないけど。
0248デフォルトの名無しさん2009/08/15(土) 21:07:38
>>246
お前の調べ方が悪いだけ
0249デフォルトの名無しさん2009/08/15(土) 21:23:10
2chはツンデレが多いな
0250デフォルトの名無しさん2009/08/15(土) 23:36:19
>>246
>FindWindow( TEXT("#32768"), NULL )
文字列を渡すのが間違いじゃないかな。
MAKEINTATOM(32768)とか。
0251デフォルトの名無しさん2009/08/16(日) 01:52:59
「山田って名前のやつが来たら門前払いしたいんだけど
"山田"で検索したのと顔が一致しないんだが、何か良い解決策ないかな?」
「そいつに名前聞けよ」
0252デフォルトの名無しさん2009/08/16(日) 02:53:09
クラス名が "#32768" ってポップアップメニューなんだけど(ちなみに"#32770"はダイアログ)
>>246 で書いてある「クリックされたウィンドウがポップアップなら」って条件に当てはまるはずがない
0253デフォルトの名無しさん2009/08/16(日) 06:50:20
マウスフックで、クリックされたハンドルがポップアップメニューの場合
#32768でおk?
0254デフォルトの名無しさん2009/08/16(日) 07:22:47
クラスアトムでチェックすればいいだろ
if(GetClassWord(hwnd,GCW_ATOM)==32768){
 //メニュー
}
0255デフォルトの名無しさん2009/08/16(日) 08:46:22
表示してる全てのポップアップメニューの領域を取得する方法ないかな?
単体なら取れるんだけど
MF_POPUPして複数になると、新しく表示されたポップアップメニューしか領域が取れない
0256デフォルトの名無しさん2009/08/16(日) 10:02:07
#32768の全ウィンドウに対してUnionRectすれば求まるだろ
頭使おうな
0257デフォルトの名無しさん2009/08/16(日) 10:34:25
>>256
有難う
#32768の全列挙ってFindWindowEx使う?
一々全ウィンドウを列挙してクラス名を使わないと駄目かな?
0258デフォルトの名無しさん2009/08/16(日) 11:48:11
EnumWindowsを使う方がいいよ
ウィンドウの判別は>>254でもおk
0259デフォルトの名無しさん2009/08/16(日) 14:33:51
>>258
有難うっ
Findで複数32768を取れないか試したけど駄目だった
全列挙してやります
0260デフォルトの名無しさん2009/08/16(日) 16:10:38
ボタンの見た目をサブクラス化してWM_PAINT乗っ取りで変更したいんだけど、ボタンを押したときにデフォルトの描画をされてしまいます。
BM_SETSTATE時にウィンドウプロシジャを介さずに描画してるからっぽいんですが、これを止める方法ありますか?
BM_SETSTATE時に再描画させると一瞬ちらつくし、オーナードローだとプッシュボタン以外使えないし。。。
0261デフォルトの名無しさん2009/08/16(日) 16:55:38
>>260
XP以降かつ、comctl6.0以降を使っていれば、
NM_CUSTOMDRAWが送られてくるから、そこで描画したらどう?
0262デフォルトの名無しさん2009/08/16(日) 23:02:14
>>455
いや、ホントうまいって、騙されたと思って食ってみ
最近嫁に内緒で夜にこれ入れて1合だけ炊いて食べてたんだけど、それがバレて早朝ランニングさせられるようになった…
けど今日も頃合いを見計らって炊くつもり^^あー想像しただけで武者震いがw

断っておくけど、俺の嫁は鬼嫁とかそういうのじゃないからな
0263デフォルトの名無しさん2009/08/16(日) 23:02:55
誤爆
0264デフォルトの名無しさん2009/08/16(日) 23:09:51
脳内嫁ですね分かります
0265デフォルトの名無しさん2009/08/17(月) 00:37:16
バージョン情報って1.01とかあらわすけど
メジャー、マイナー以降のバージョンの名称って何かな?
0266デフォルトの名無しさん2009/08/17(月) 00:50:47
ビルド、リビジョン
0267デフォルトの名無しさん2009/08/17(月) 05:04:37
ビルド番号ってどうやって決まってんの?
単純にビルドした回数にしては1998とか6000とか狙ったような番号だし
0268デフォルトの名無しさん2009/08/17(月) 06:59:42
お好きにどうぞ
0269デフォルトの名無しさん2009/08/17(月) 08:31:54
知らないならレスしないで下さい。ウザイだけです。
0270デフォルトの名無しさん2009/08/17(月) 13:15:28
親ウィンドウ(スレッドA) -子ウィンドウ1(スレッドAの派生スレッドB)
               -子ウィンドウ2(スレッドAの派生スレッドC)
みたいな感じでウィンドウを生成してメッセージ処理させてるんだけど、
子ウィンドウ/スレッドに投げられたメッセージキューを、親ウィンドウ/スレッドに送らないor認識させない方法ってないかな?
親ウィンドウのGet/PeekMessageで、親ウィンドウのハンドルを指定すればいいとか聞いたんだけど
そうするとWM_DESTROYメッセージが送られてきた時点でウィンドウが消滅しててメッセージが取得不能→終了不能になるみたいで。
0271デフォルトの名無しさん2009/08/17(月) 13:49:56
別スレッド上でCreateWindowすればメッセージキュー自体別々になるから
GetMessageでハンドル指定だの気にしなくても親から認識できないのでは
0272デフォルトの名無しさん2009/08/17(月) 16:03:12
自作ファイルを自作プログラムへ関連付けの
設定及び削除ということをやりたいのですが、
(もちろんオプションです)
Winのバージョン違いを吸収するようなAPIはありませんか?
0273デフォルトの名無しさん2009/08/17(月) 16:06:00
関連付けのレジストリなんてWin95以降変わってないだろ
02742722009/08/17(月) 16:13:31
>>273
.* の位置が
(2k)HKEY_CLASSES_ROOT\
(xp)HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\
と、違うようなのですが・・・
調べが足りないのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています