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

Win32API質問箱 Build47

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/13(月) 08:56:12
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。

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

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn.microsoft.com/library/)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
0409デフォルトの名無しさん2006/11/26(日) 12:58:44
>>405
Vistaでは使えない。
0410デフォルトの名無しさん2006/11/26(日) 13:17:03
>>409
NetDDE が使用不能になるってのは見つけたが、DDE そのものが使用不能になるって記事が見つからんのだが。
0411デフォルトの名無しさん2006/11/26(日) 13:32:20
DDE使えなくなったら動かなくなるアプリが大量にでないか?
0412デフォルトの名無しさん2006/11/26(日) 13:40:24
もともと動かなくなるアプリ大量にあるから問題なくね?
0413デフォルトの名無しさん2006/11/26(日) 13:45:38
今ちょっと試してみたら、
VistaのエクスプローラのフォルダウインドウじゃDDE使ってないみたいね
レジストリ(HKEY_CLASSES_ROOT\Folder)もなくなってる

>>389
も無駄な技術になったか
0414デフォルトの名無しさん2006/11/26(日) 13:46:23
>>410-411
実際、Vistaで動かしてみそ。ほとんど動かないから。(DDEサーバーがほぼ使えない)
ただ、中途半端にスダブが残っているので、その機能だけなら動くけど
0415デフォルトの名無しさん2006/11/26(日) 14:22:44
もしかすっとIE7にDDEでURL渡せないとか?
0416デフォルトの名無しさん2006/11/26(日) 15:14:15
>>408
DLL Injecttionで相手先のIDirect*インターフェースの
vtable乗っ取りしてるっぽいね。やっぱりこれしかないか
0417デフォルトの名無しさん2006/11/26(日) 15:31:53
めんどくさいなぁ。
いくつか書き直さないといけなくなるな。
0418デフォルトの名無しさん2006/11/26(日) 15:51:32
DDEって良く分からんが、何のためにあるの?
0419デフォルトの名無しさん2006/11/26(日) 15:54:22
お気楽プロセス間通信と理解している
0420デフォルトの名無しさん2006/11/26(日) 15:59:04
IPCは
・DDE
・window message
・named pipe(NT系)
・DCOM
が用意されてるんだが
DCOMはレジストリがウザい
named pipeは98系で使えない
ってことでwindow messageかddeになるのよね
他にあったら教えてたもれ
0421デフォルトの名無しさん2006/11/26(日) 16:03:04
socket
mailslot
RPC

後者2つは使ったこともないが
0422デフォルトの名無しさん2006/11/26(日) 16:06:57
名前なしのパイプ
メールスロット
RPC
(メッセージの一種だけど)WM_COPYDATA
0423デフォルトの名無しさん2006/11/26(日) 16:14:58
これこれ、共有メモリを忘れていますよ
0424デフォルトの名無しさん2006/11/26(日) 16:21:21
>>423
イベント通知ができません...
0425デフォルトの名無しさん2006/11/26(日) 16:56:40
>>424
名前付きイベントと組み合わせれば・・・
0426デフォルトの名無しさん2006/11/26(日) 17:06:45
>>406
成程、CoCreateInstanceはレジストリのCLSID見てモジュールをロードするんですか、勉強になります。
しかしDirect3Dに関してはCOMで作ってるクセにDirectX8からCOMを逸脱しているらしく
CLSIDが登録されていない(=CoCreateInstanceでインスタンスを作れない)みたいです。
なんでこんな仕様になったのか理解不能なんですが、ともあれCLSIDからの乗っ取りアプローチは
Direct3D8に関しては無理みたいです(´・ω・`)

>>408
おお…これは、すごい。動画処理をVfWでやってるのが多少残念ですが(僕のプログラムでも
最初の実装ではVfWでしたが、処理が遅い+マルチスレッドを想定していないらしく、
プログラミングしづらい上に、2GB制限等のユーザー側の利便性を損なう欠点が多々見つかった事から、
DirctShowへの乗り換えを検討しています。)参考になりそうな部分はとても多いです。
実は僕C++は始めたばかりで、テンプレートクラス等個人的に見慣れない部分はありますが
がんばって解読してみようと思います。情報有難うございました。

そろそろ長引いちゃってアレなのでこの辺りで消えます。
付き合ってくださった皆さん本当に有難うございましたm(_ _)m
0427デフォルトの名無しさん2006/11/26(日) 17:07:34
つまりwin9xしねばいいのにってことだな
0428デフォルトの名無しさん2006/11/26(日) 17:14:50
>>413
Firefoxでフォルダ開くとどんどん新しい窓ができるのはそのせいカー
0429デフォルトの名無しさん2006/11/26(日) 17:15:33
>>426
多分知ってると思うが
ttp://saw.minidns.net/software/
DirectXのHookはこれも参考になる
0430デフォルトの名無しさん2006/11/26(日) 17:18:25
今SetWindowPosを使ってWindowを常に最前面に出しているのですが
フルスクリーンのゲームなどより前に出てきません。
フルスクリーンより前に持ってくることはできるのでしょうか?
0431デフォルトの名無しさん2006/11/26(日) 17:24:15
>>430
ゲームがフルスクリーンになったあとに最前面にもってくる
0432デフォルトの名無しさん2006/11/26(日) 17:29:58
>>431
ゲームを起動した後に起動するということですよね?
それをしても負けてしまうのです;
0433デフォルトの名無しさん2006/11/26(日) 18:04:40
>>432
タイマーで定期的に最前面にもってきてもだめか?
0434デフォルトの名無しさん2006/11/26(日) 18:07:09
誰一人、ゲームが再描画の度に最前面に持ってきているのでは
という事に、ツッコミを入れない件について
0435デフォルトの名無しさん2006/11/26(日) 18:23:17
>>433
タイマーで呼んだらきました。WM_CREATEでつくってそれっきりでした。
ありでした
0436デフォルトの名無しさん2006/11/26(日) 18:29:51
>>434
そんなコード誰も書かないだろ
常識的に考えて
0437デフォルトの名無しさん2006/11/26(日) 18:33:16
プログラマの常識的に考えて〜〜しない
そんな風に考えて(ry

まあ、解決したようでなによりだけどな
0438デフォルトの名無しさん2006/11/26(日) 18:33:51
すまんな
SetWindowPosで最前面にできないなら、ゲーム側で
何かしているとしか、考えられない。

それに、ベクターにいけば、そんなウンコアプリなんて
いくらでも存在してるから、恐ろしいのだよ。
0439デフォルトの名無しさん2006/11/26(日) 19:28:40
Createじゃタイミングが悪いんじゃないの?
まだウインドウないんだし
0440デフォルトの名無しさん2006/11/26(日) 19:38:35
いやフルスクリーンのゲームもまた最前面ウィンドウなんだから
最後にアクティブになるゲーム画面が前面に出ちゃうでしょ
だからフルスクリーンになった後に最前面化させないと出てこない
0441デフォルトの名無しさん2006/11/26(日) 20:31:06
ゲームのウィンドウをオーナーに指定すれば必ず手前に出る
0442デフォルトの名無しさん2006/11/26(日) 20:40:21
DirectXのフルスクリーンだと、どうしようもないんじゃね?
0443デフォルトの名無しさん2006/11/26(日) 20:41:32
フルスクリーンだとGDIのクリッピングを無視するから
ゲームの描画で上書きされる可能性はあるけど
ウィンドウマネージャ的には手前に出せる
0444デフォルトの名無しさん2006/11/26(日) 21:08:40
Vistaはまた挙動が違うんだろうなあ・・・
0445デフォルトの名無しさん2006/11/26(日) 21:12:10
ウィンドウズプログラムで質問したい事があります。
開発環境はVS2003です。SDKで作っています。

リストビュー(レポート)の中でドラッグの開始位置と終了位置のアイテムとサブアイテムを取得するために、
リストビューをサブクラス化してWM_LBUTTONDOWNとWM_LBUTTONUPを受け取ろうとしたのですが、
WM_LBUTTONDOWNは通知されるのに、WM_LBUTTONUPはプロシージャに通知されず困っています。
WM_LBUTTONUPを取得する方法を教えていただけないでしょうか?
0446デフォルトの名無しさん2006/11/26(日) 21:22:00
VistaのAeroモードでウィンドウの内容をBitBltすると
画面外の情報もちゃんと取れたのにちょっと感動
04474452006/11/26(日) 21:24:58
補足します。
ダブルクリックの後にはWM_LBUTTONUPが通知されました。

プログラムはこのHPのサンプルを書き換えました。
ttp://wisdom.sakura.ne.jp/system/winapi/common/common15.html

WNDPROC DefListProc;

LRESULT CALLBACK ListProc(
HWND WH_Window,
UINT msg,
WPARAM wp,
LPARAM lp)
{
switch(msg)
{
case WM_LBUTTONUP:
MessageBox(WH_Window,"","",MB_OK);
break;
}
return CallWindowProc(DefListProc,WH_Window,msg,wp,lp);
}

hList = CreateWindowEx(0 , WC_LISTVIEW , 0 ,
WS_CHILD | WS_VISIBLE | LVS_REPORT ,
0 , 0 , 10 , 10 , hWnd , (HMENU)1 ,
((LPCREATESTRUCT)lp)->hInstance , NULL);

DefListProc = (WNDPROC)GetWindowLong(hList,GWL_WNDPROC);
SetWindowLong(hList,GWL_WNDPROC,(LONG)ListProc);

よろしくお願いいたします。
0448デフォルトの名無しさん2006/11/26(日) 21:38:59
試しにSpy++でマイコンピュータのリストビューのメッセージを見てみたが
ちゃんと、LBUTTONDOWN→MOUSEMOVE→LBUTTONUP来てたがね
まぁ、何かやってることがおかしいんだろうけど・・・
0449デフォルトの名無しさん2006/11/26(日) 21:57:43
フルスクリーンうぜぇ。
画面全体を有効に使っているならまだしも、
黒いスペースが埋められているだけだし。
せめてタクスバーを残してくれ。
04504452006/11/26(日) 22:18:17
>>448
問題のプログラムをSpy++で覗いた所WM_LBUTTONUPは発行されていました。

ためしに
return CallWindowProc(DefListProc,WH_Window,msg,wp,lp);
↓
return DefWindowProc(WH_Window,msg,wp,lp);
に変えてみたところ、WM_LBUTTONUPメッセージを取得できました。

リストビューのプロシージャが悪さをしているようなので、調べてみます。
ありがとうございました。
0451デフォルトの名無しさん2006/11/26(日) 23:35:16
教えてください。

CreateWindowExで拡張ウィンドウスタイルを使わないようにするには
CreateWindowを使えばいいんですがExのみを使うっていう前提の場合、
CreateWindowEx(NULL,・・・);でいいんでしょうか?
0452デフォルトの名無しさん2006/11/26(日) 23:55:05
>>451
イエス。拡張ウィンドウスタイルは(普通のスタイルもそうですが)スタイルを示すビットフラグの
論理和で示されるので、全てのビットが0=NULLを指定すれば拡張ウィンドウスタイルは無効になります。

正確には、なると思います。実際やって見た事がないので。
04534512006/11/27(月) 00:08:22
>>452
ありがとうございます。

WS_EX_LEFT
WS_EX_LTRREADING
WS_EX_RIGHTSCROLLBAR

の定義も0x00000000なんですがこれはデフォルトでそうなってると解釈しました。
0454デフォルトの名無しさん2006/11/27(月) 00:15:24
>>453
その通り。それらは拡張スタイルを指定しなくても自動でそうなっているスタイル、
要するに拡張スタイルの指定と対比させるために敢えて定義された定数です。
0455デフォルトの名無しさん2006/11/27(月) 00:26:34
>>451
細かいことと思うかもしれないが、NULLはポインタ専用だ。そこには0使え。
0456デフォルトの名無しさん2006/11/27(月) 00:27:13
>>455
haxa?
04574512006/11/27(月) 00:28:33
>>455
その辺はワーニング対策で#define DF_NULL 0x00000000を定義してそれ使ってます。
0458デフォルトの名無しさん2006/11/27(月) 00:44:57
CreateWindowは0Lを渡してるな。
0459デフォルトの名無しさん2006/11/27(月) 04:39:11
ものすごく見当違い名事をいってたらすいません
この先、microsoftが提供する開発環境って
platform sdk が無くなって、.net flameworkだけになるってことはありますか?

ちょっと疑問に思っただけなんですが
0460デフォルトの名無しさん2006/11/27(月) 04:51:25
Platform SDKと.NET Framework SDKはすでに統合されてWindows SDKになったけど
従来のPlatform SDKの内容(+Vistaの新API)は今のところそのまま入ってる。
将来的には(かつてのWin16 APIみたいに)Win32 APIはWDKに追いやられて
ユーザーモードアプリはWinFX API一本になるということもあるかもね
0461デフォルトの名無しさん2006/11/27(月) 06:56:20
CreateWindowも実は、CreateWindowExのマクロだからな・・・
ウィンドウ関係のAPIラッパクラスを作ってる時にはじめて知ったわ
0462デフォルトの名無しさん2006/11/27(月) 12:08:07
>>445
LVN_BEGINDRAGでメッセージループを廻しているかDoDragDropしているのか
0463デフォルトの名無しさん2006/11/27(月) 12:38:15
354と似た話になりますが、スクリーンセーバーのパスワード保護の
チェックが付いているかどうかって、レジストリから確認できるの
でしょうか。
0464デフォルトの名無しさん2006/11/27(月) 13:04:26
PC初心者
http://pc7.2ch.net/pcqa/
Windows
http://pc8.2ch.net/win/
0465デフォルトの名無しさん2006/11/27(月) 14:13:54
>>463
HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaveActive
04664652006/11/27(月) 14:16:37
>>463
間違えた・・・・
HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaverIsSecure
だ。
0467デフォルトの名無しさん2006/11/27(月) 18:31:49
質問いたします.
クリップボード内のデータの履歴を取り,再利用するものを想定しています.
テキストだけでなく,画像やリンクなどを含めたデータをクリップボードから取り出し,
保存するにはどのようにしたらよいでしょうか?
0468デフォルトの名無しさん2006/11/27(月) 18:42:38
調べたらわかりそうな気がするんだけど
0469デフォルトの名無しさん2006/11/27(月) 18:47:21
>>467
取り出すのはOpenClipboard, EnumClipboardFormats, GetClipboardDataなど。
保存は御自由に。
わからない事をもっと具体的に端的に質問することをお勧めします。
0470デフォルトの名無しさん2006/11/27(月) 18:49:52
http://pc8.2ch.net/test/read.cgi/tech/1162215248/817
0471デフォルトの名無しさん2006/11/27(月) 22:01:30
>>455
今の規格上はNULLはゼロと同じ。
0472デフォルトの名無しさん2006/11/27(月) 22:04:37
そういう問題じゃ無いと思うが
0473デフォルトの名無しさん2006/11/27(月) 22:11:36
じゃあどういう問題なんだ?
0474デフォルトの名無しさん2006/11/27(月) 22:30:47
FtpGetFile()でのダウンロード処理って途中で中断できないんでしょうか。
他にFtpでのダウンロードを中断する方法があったら教えてください。
お願いします、ほんとに。

環境はWinXP+VS2005のMFC+SDKです。
Win2000以降のみ対応できればよいです。
0475デフォルトの名無しさん2006/11/27(月) 22:36:06
NULLはOSによっては0じゃない場合もあると昔聞いた事がある。-1も有りうると。記憶が頼りだけど。
0476デフォルトの名無しさん2006/11/27(月) 22:37:49
NULLが実行環境に依存するのか?
コンパイラによって、ならまだ解るが。
0477デフォルトの名無しさん2006/11/27(月) 22:39:24
折角Win32APIスレなのに
0478デフォルトの名無しさん2006/11/27(月) 22:40:31
実行環境には依存しないがな
コンパイル環境によっては0じゃない場合もあるのは確か
0479デフォルトの名無しさん2006/11/27(月) 22:51:25
>>474
WinINet使えば?
0480デフォルトの名無しさん2006/11/27(月) 22:59:04
が、うまくゼロであるとみなせるようにすることが規格として求められてる。 <NULL
0481デフォルトの名無しさん2006/11/27(月) 23:03:28
C と C++ でも違うんじゃなかったっけか
0482デフォルトの名無しさん2006/11/27(月) 23:21:24
ぬるぽの話題ここまで
0483デフォルトの名無しさん2006/11/27(月) 23:26:00
■━⊂( ‘ー‘)☆彡 ガッ☆`Д´)ノ
0484デフォルトの名無しさん2006/11/27(月) 23:58:51
>>467>>769
OleGetClipboardのほうが形式を考えなくてすむから楽だと思うぞ。
0485デフォルトの名無しさん2006/11/28(火) 01:24:15
>>460
大変遅くなって申し訳ありませんがレスをいただきありがとうございました。
恥ずかしながらWindows SDKやWinFX APIというのは意味をよく知りませんでしたので
勉強になりました。ありがとうございます。
0486デフォルトの名無しさん2006/11/28(火) 02:47:44
>>475
内部表現の話とごっちゃにしてる。ここはWin32 APIスレだし。
それともWin32sではヌルポインタをアクセス違反にするためWin32アプリから見える
アドレスとVxDから見えるアドレスが64KBずれてるなんてトリビアを話したいのか。
0487デフォルトの名無しさん2006/11/28(火) 06:49:16
>>479
具体的にはどの関数を使えば…
0488デフォルトの名無しさん2006/11/28(火) 08:40:42
Win32環境だと0番地でいいけど、セグメンテーションだかの関係で0じゃない環境もあると聞いたな。
0489デフォルトの名無しさん2006/11/28(火) 08:52:56
NULLは、あくまでも無効(?)番地であって。数値の0をマクロで使えるようにしたものじゃない。
目的と手段を逆に取り違えている奴が世の中多すぎ。
0490デフォルトの名無しさん2006/11/28(火) 08:59:10
NULLが0なのではなく、0がNULLなのです。
0491デフォルトの名無しさん2006/11/28(火) 09:04:36
どうでもいい
0492デフォルトの名無しさん2006/11/28(火) 09:38:17
某流出ソースの中見てみたら数値の0として使ってますよ。
0493デフォルトの名無しさん2006/11/28(火) 09:42:13
「Half Life 2」のソース?
0494デフォルトの名無しさん2006/11/28(火) 09:45:11
>>487
それぐらい自分で調べろよ。
0495デフォルトの名無しさん2006/11/28(火) 09:52:26
HOGE* p = 0;
は、ヌルポインタの値が0でなくても、コンパイラによってその型のヌルポインタの値に変換される
と聞いたことがある。
だからC++ではNULLと0は等価らしい。
0496デフォルトの名無しさん2006/11/28(火) 10:23:31
MSDNのsdkのサンプルでこんなのが見つかるけど
FONTEDIT\FONTEDIT.C(566): (HWND)NULL, /* no parent */
FONTEDIT\FONTEDIT.C(567): (HMENU)NULL, /* use class menu */
0497デフォルトの名無しさん2006/11/28(火) 10:26:15
おまえらぬるぽ好きだな
0498デフォルトの名無しさん2006/11/28(火) 10:28:52
>>474
Wininetよく知らないからなんともいえないけど、
FtpOpenFileとInternetReadFileでやるんじゃない?

もしGUIアプリ作ってるんなら、これをスレッドでやる方法と
内部でメッセージループでやる方法があると思う。

結構大変だよ。
0499デフォルトの名無しさん2006/11/28(火) 11:19:22
>>496
SDKは空ハンドルにもNULL使うよな
0500デフォルトの名無しさん2006/11/28(火) 11:40:40
>>499
それとは別に INVALID_HANDLE_VALUE も使うし ややこしい
0501デフォルトの名無しさん2006/11/28(火) 11:48:35
単なる仕様概念の違いやん
0502デフォルトの名無しさん2006/11/28(火) 12:16:52
ES_NUMBERを付けた単一行エディットコントロールに文字列をクリップボードからペーストするとしっかり文字列が入っちゃうんですが、
CM_TEXTCHANGEでチェックするしかないんでしょうか‥‥
0503デフォルトの名無しさん2006/11/28(火) 12:52:52
ダイアログでエディットを数個配置して
エンターキーで次のエディットにフォーカスを移動
させようと思っています。

サブクラス化されたウィンドウプロシージャでイベントを
捕まえてSetFocusで移動はできるのですが、
TABキーを送ってまとめて処理したいです。

TABキーの送り方を教えてください。
0504デフォルトの名無しさん2006/11/28(火) 12:55:27
>>496
ハンドルはOSが内部で確保する構造体へのポインタだからなんだよ。
0505デフォルトの名無しさん2006/11/28(火) 13:36:38
>>496
DWORDの引数にNULLを渡すのはおかしいという話題なのに、
なぜいきなりポインタであるハンドルの話を出してきたのか。
0506デフォルトの名無しさん2006/11/28(火) 14:44:11
質問させてください、
COM風のDLLを作ってるときに、
void IHOGE::Release()
{
  // あらかじめ保存しておいた、exe側のWinAPIのFreeLibrary()のアドレスと
  BOOL (WINAPI *fpFreeLibrary)(HMODULE) = m_fpFreeLibrary;
  // DLLのハンドルをローカル変数にコピーしてから、
  HMODULE hLibrary = m_hLibrary;
  // 自殺して
  delete this;
  // DLL解放
  fpFreeLibrary(hLibrary);
}

なんてやろうとしたんですが、DLL解放のところでバグってしまいました。

以前VC6でやっててうまくいってたんですが
(実行時にDLLの方がDLL解放の処理を書いてないバージョンのままだった可能性はあります・・・)
VC2005Expressでやるとダメでした。

こんなことせずに自前で解放すれば大丈夫なのですが、
DLLから得た関数の中でDLLを解放することはそもそも原理的にダメなのでしょうか?
そのあたりの理屈が知りたいので、よろしければ教えてください。
0507デフォルトの名無しさん2006/11/28(火) 15:14:56
>>506
そのDLLを解放するコードIHOGE::Releaseは、解放しようとしているDLLにあるわけで。
列車が走ってるレールを破棄するようなもんだ。
0508デフォルトの名無しさん2006/11/28(火) 16:29:21
>>503 WM_NEXTDLGCTL使えば楽できる。たぶん。
■ このスレッドは過去ログ倉庫に格納されています