トップページ⇒tech
986コメント329KB

Win32API【2】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
ただし、質問する前にまずMSDN読め。

MSDN Online
http://www.asia.microsoft.com/japan/developer/

前スレ
http://pc.2ch.net/test/read.cgi/tech/991576947/
0175デフォルトの名無しさんNGNG
>>174
意味不明。書き込んだあとに消せばいいではないか。
0176172NGNG
できちゃいました。でわ…
0177デフォルトの名無しさんNGNG
朝焼けに
  夕日を思う
 スダチかな
0178デフォルトの名無しさんNGNG
>>173
http: とか .url とかその辺もいろいろ変えれ。
0179デフォルトの名無しさんNGNG
>>174
また書き直せば良いよ。
必要なときに WM_PAINT が送られてくるから、そんときに。
・・・って、フォームってなんぞ。
0180デフォルトの名無しさんNGNG
MSDNで、Win95ではFreeResourceを呼ばなくてはならないって説明が
いつのまにか説明ごと葬り去られてなかったことになってるんだけど
どうなってるの?
0181デフォルトの名無しさんNGNG
>>125
SPI_GETSCREENSAVERRUNNING
ただしWin98/2000以降
0182ナナシNGNG
XP環境下でレイヤーでウインドウの形を変えて半透明にすると、
なぜかウインドウの形に亀裂が入ってしまうんだけど、これって
XPのバグなんですか?2000じゃならないし。
0183デフォルトの名無しさんNGNG
ListViewでカラムの数を調べたいんですが、ListView_GetItemCountのColumn版というかが見つかりません。
なんか凄いアホな質問だとおもうんですが、だれかズバッと教えてください。
0184デフォルトの名無しさんNGNG
カラムを追加したのは誰なの?
0185デフォルトの名無しさんNGNG
>>183
ListView_GetColumnあるじゃん?
0186デフォルトの名無しさんNGNG
>>183
int nCount = Header_GetItemCount(ListView_GetHeader(hwndLV));
つう感じでどうか。
0187183NGNG
>>186
おお、でけました。恥ずかしながら、そういう風にやるなんてまったくしらなかったっす。
185さんのを見て、何番目までGetColumn出来るか、で数えてみる方法でもちゃんと分かりましたが、
そっちの方がスマートでありがたいです。とにかく助かりました。
0188180NGNG
誰か真相を教えてください。
昔はLoadResourceの説明にこんなことが書かれてたんだけど
> Windows 95: The system does not automatically free resources
> loaded using the LoadResource function. Applications must use
> the FreeResource function function to explicitly discard a resource
> that is no longer needed.
0189ヒッキー@プログラミングNGNG
>>188
FreeResource

16 ビット Windows ベースのアプリケーションの移植を容易にするために提供されているもので、
今後廃止されます。Win32 アプリケーションでは、LoadResource 関数でロードしたリソースを
解放する必要がありません。LoadResource 関数で取得したリソースは、それをロードした
モジュールがアンロードされると自動的に解放されます。
0190デフォルトの名無しさんNGNG
折れはLoadResouceしたらFreeResourceを必ず呼んでる。
理由は、ペアになっていないと気持ち悪いから(w
0191180NGNG
>>189
で、結局どっちが正しいんでしょうか。
0192デフォルトの名無しさんNGNG
>>191
MSDN Library の文章は信用できないが、2ちゃんねらーの言明は信用できるのか?
0193デフォルトの名無しさんNGNG
whiel(1){
h=loadlibrary('test.dll')
rsr=findresource(h,test,...)
LoadResource(h,rsr);
freelibrary( hl );
}
みたいに回して試せば〜?
0194180NGNG
>>192
188もVC++ 4.0のBooks Onlineからの引用なんですけど。
いつのまにか記述がコロコロ変わるようなものとどっちが
信用できるんでしょうねえ。マジで。
ちなみに
http://msdn.microsoft.com/library/en-us/win32/chilimit_70vn.asp
に相当するドキュメントにも、昔は
> In Windows 95, a call to the FreeResource function must be
> included for every call to the LoadResource function. The call
> to FreeResource allows the system to discard a resource that
> an application no longer needs. Windows NT automatically frees
> resources, so a call to FreeResource is not required.
とか書かれてたんですけどこれも葬られてますね。
0195デフォルトの名無しさんNGNG
>>194
VC4 のドキュメントは、古すぎだって。とりあえず最新の MSDN Library 参照して、それを信用しておく
のが賢明と思われ。

本当に困りそうなら、

1. 実験して試す (Win95 も OSR のバージョンによって挙動が違ったりしそうだが)
2. インシデント消費して MS に問い合わせる

しかないんじゃないかなぁ。
0196180NGNG
>>195
それを言うなら95だって古すぎだと思うんですけど。
ドキュメントが新しくなったからって95についての記述が変わるなんて
95には自己進化能力でもあるんでしょうか、とか思ったり。

消されたもっともらしい理由があれば納得するんですけど
Microsoftに聞くしかないか。
0197デフォルトの名無しさんNGNG
95のkernel32.dllのFreeResourceの逆汗
FreeResource:
bff915fc 33c0 xor eax,eax
bff915fe c20400 ret 0004
結論: 当時のドキュメントのバグ
0198デフォルトの名無しさんNGNG
MemTurboみたいなメモリデフラグって、どうやってるのでしょうか?
特別にドライバ入れたりしてるわけではないので、
APIだけで実現してるのだとは思うのですが・・・。
0199デフォルトの名無しさんNGNG
かっこいいAPIを教えてください
0200デフォルトの名無しさんNGNG
>>196
http://www.microsoft.com/japan/windows/lifecycleconsumer.asp

そろそろ非サポート対象フェーズに移行するらしいので、古いOSに関する
記述をサクッと削除しようという方針ではないかと推測。
なぜ当時のドキュメントに"In Windows 95,〜"と書いてあったかはわからない
けど。
0201デフォルトの名無しさんNGNG
LoadResourceって、確かファイルマッピングぢゃない?
LoadLibraryで作成されたファイルマップに対するビューだから、
FreeLibrary時に自動的に無効になるはず。
だからFreeResourceが要らないというのは正しいが、
たぶんFreeResourceするとアンマップされるので
した方がメモリ消費が減るかと思われる。

巨大リソースを埋め込んだexeで試してみるといいよ。
ロード時にはexeのファイルサイズ分はメモリ使ってないけど、
LoadResourceの時点でメモリが喰われる。
FreeResourceでメモリが解放されるかどうかはOSのバージョンに依る。
0202デフォルトの名無しさんNGNG
>201
とりあえず、>>197のは見えるか?
0203デフォルトの名無しさんNGNG
スワップアウト(ページアウト?)されるときに、スワップファイル(ページングファイル?)に待避する代わりに単に破棄するはずだから、解放されるというかなんというか。
0204デフォルトの名無しさんNGNG
>>200
他の部分は95の記述もいっぱい残ってるしVC++6付属のMSDNで
すでに削除されてたので深読みしすぎだと思われ
0205悩んでますNGNG
質問させていただきます。初心者ではありますが、かなり真剣です。

とある事情からWin32APIの「SystemParametersInfo」という
関数を使う必要が出てきました。具体的にはその関数の1番目の
引数を「SPI_GETSHOWIMEUI」に設定するのですが、いざビルドした所
エラーになりました。(エラーはSPI_GETSHOWIMEUIは定義されていない)

しかしMSDN Online Japanのサイトでもしっかりと記述してあるし
定義されていないわけがないのですが、なぜかそう出ます。

includeしているのはWindows.hのみです。
Visual C++6.0とDirectX7.0を使用してます。

他に何かファイルをincludeする必要でもあるのでしょうか?
一応他の関連スレでも聞く予定ですが、もし分かる方がいらっしゃれば
どなたかご教授よろしくお願いします。
0206デフォルトの名無しさんNGNG
>>205
>しかしMSDN Online Japanのサイトでもしっかりと記述してあるし
制限付きなモノは、デフォルトでは使えませんよ…バージョン指定しないと。

>他に何かファイルをincludeする必要でもあるのでしょうか?
MSDN見たなら最後の方に、どのヘッダで定義されてるか書いてるでしょ。
0207悩んでますNGNG
>206
レスどうもです。

バージョン指定・・・とはどこをどう変える必要があるのでしょうか?
他スレで指摘されたのですがWINVERの値のことですか?
0208悩んでますNGNG
>206
解決しました。なるほど、おっしゃる意味が解決したことで
分かりました。どうもです。
0209200NGNG
>>204
それもそうだった。鬱
0210デフォルトの名無しさんNGNG
マルチスクリーン環境で、特定の座標が何番目のスクリーンの上か、
またそのスクリーンの左上・右下の座標を得るにはどう調べたら
宜しいのでしょうか…
0211デフォルトの名無しさんNGNG
>>210
マルチスクリーンってマルチモニタのこと?
だったらMonitorFromPointでハンドルを取得しておいてGetMonitorInfoとか。
0212210NGNG
>>211
一度このAPIに目止まったのですが、いまいち意味が解らず、
そのまま素通りしてました;
二つ通して眺めたら納得。 有り難うございましたー
0213デフォルトの名無しさんNGNG
ここらでフォントのことはっきりさせておきたいので
教えてください
0214デフォルトの名無しさんNGNG
>>213
なにか?
0215デフォルトの名無しさんNGNG
SetWindowFont(hWnd1,GetWindowFont(hWnd2),TRUE);

ここにhWnd1とhWnd2は別アプリ。

こーいうのってやらないほうがいいのかな?
hWnd2をDestroyしてもちゃんとフォント残ってるよ
フォントってどうなってるの?
0216デフォルトの名無しさんNGNG
SetWindowFont って API あったっけ。
0217デフォルトの名無しさんNGNG
ごめんなさい失礼しました。。
0218デフォルトの名無しさんNGNG
>>216
マクロー
WINDOWSX.Hにあるー
0219デフォルトの名無しさんNGNG
で、
SetWindowFont(hWnd1,GetWindowFont(hWnd2),TRUE);
オブジェクト的にどーなってるの?
0220デフォルトの名無しさんNGNG
継承してる感じですか?
0221デフォルトの名無しさんNGNG
ユーザー定義の仮想フォルダってつくれないんでしょうか?

プリンタ、コントロールパネル、ダイアルアップネットワーク、お気に入り、
など各仮想フォルダごとにカラムの内容が違いますよね。

自作の仮想フォルダが要求された時にエクスプローラーのカラムの内容を変更
し、ファイルに相当するものの一覧を表示したいのですが。
0222デフォルトの名無しさんNGNG
>>221
IShellFolder を実装しなきゃならんと思います。
んで、クラスファクトリ作ったり、ちゃんとしたCOMのインプロセスサーバーに仕立てて、クラスIDをレジストリに登録します。

んで、ファイルシステム内に置くなら desktop.ini をスーパー隠しファイルにしてクラスIDを書けば良かったかな?
マイコンピュータ内に置きたいなら HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace
デスクトップ上なら HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace が怪しそうです。

いずれも実際に自分がやったことはないので、信頼度の低い情報です。参考程度にして頂ければ。
0223デフォルトの名無しさんNGNG
タスクマネージャがやってるようにスレッド PID から優先度を変更したいのですが、
SetThreadPriority() に渡すスレッドハンドルは、どうやって求めるのでしょう?
0224デフォルトの名無しさんNGNG
>223
他のプロセスのスレッドの優先度を変更したい
ということですか?
0225223NGNG
そです。
無理ですか?
0226デフォルトの名無しさんNGNG
>>225
OpenThread() かな。
0227デフォルトの名無しさんNGNG
共有化してあるフォルダにあるファイルを自分や
他のユーザーが開いていないかをラベルにはどうしたらいいですか?
0228デフォルトの名無しさんNGNG
実際に書き込み属性つけて開いてみれば〜?
0229デフォルトの名無しさんNGNG
>>226
Win95/98/NT 4.0では無理?
0230223NGNG
OpenThread() は廃止されてるという話ですが…
少なくとも taskman.exe では呼ばれてないですね
0231デフォルトの名無しさんNGNG
>>230
どこで聞いた話か知りませんがデマを振りまかないでください。
廃止などされていません。
Win9xのtaskman.exeにはそもそも優先度変更の機能なんて
ありませんから呼んでるわけがありませんね。あなた本当に223?
0232デフォルトの名無しさんNGNG
>>229
NT のタスクマネージャには機能がある以上、方法はあると思う。とりあえず Dependency Walker でタスク
マネージャが使っている API をリストアップしてみたら? (ただ NTDLL.DLL にある非公開 API を使われ
てるとお手上げだけど)。
0233デフォルトの名無しさんNGNG
タスクマネージャで変更できるのは優先度クラスで、
優先度クラス変更のAPI(SetPriorityClass)に渡すのは
スレッドハンドルではなくてプロセスハンドルだから、
そもそもスレッドハンドルを求める必要はない。
0234デフォルトの名無しさんNGNG
どうしてもスレッドを開く必要があるなら
Windows NT/2000ネイティブAPIリファレンスみたいな本も出てるから
お手上げってほどでもない。
NT 4.0でOpenThreadをシミュレートするとこんな感じ。

HANDLE OpenThread(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwThreadId)
{
OBJECT_ATTRIBUTES ObjectAttributes;
CLIENT_ID ClientId;
NTSTATUS status;
HANDLE ThreadHandle;

InitializeObjectAttributes(&ObjectAttributes, NULL, bInheritHandle ? OBJ_INHERIT : 0, NULL, NULL);
ClientId.UniqueProcess = 0;
ClientId.UniqueThread = dwThreadId;
status = NtOpenThread(&ThreadHandle, dwDesiredAccess, &ObjectAttributes, &ClientId);
if (!NT_SUCCESS(status)) {
SetLastError(RtlNtStatusToDosError(status));
return NULL;
}

return ThreadHandle;
}
0235デフォルトの名無しさんNGNG
Win95/98だと
typedef HANDLE (WINAPI *OPENTHREADPROC)(DWORD, BOOL, DWORD);
pOpenThread = (OPENTHREADPROC)((LPBYTE)GetProcAddress(GetModuleHandle("KERNEL32"), "OpenProcess") + 0x24);

__asm mov eax,dwThreadId
__asm xor eax,Obsfucator
return pOpenThread(dwDesiredAccess, bInheritHandle, dwThreadId);
0236デフォルトの名無しさんNGNG
Win32sだとOpenThreadは存在するけど引数がスレッドIDのみで他と異なる。
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q121093
0237デフォルトの名無しさんNGNG
お正月バージョン

(゚д゚)午-
0238デフォルトの名無しさんNGNG
>>237 「ゴー」って読んじまった。逝。
0239デフォルトの名無しさんNGNG
結局>>223は優先度の変更に成功したのだろうか
0240デフォルトの名無しさんNGNG
ウィンドウのクライアント領域に描かれてる内容をBMPにして
セーブしたいんですが、どうやればいいのでしょうか?
BITMAP作ってDCにSelectObjectしたりしたんですが駄目でした。
あと本当はBMPじゃなくてピクセル情報が取りたいのですが。
0241デフォルトの名無しさんNGNG
>>240
ピクセル拾うなら GetPixel()
ビットマップにコピーしたければ BitBlt()
0242240NGNG
GetPixelを使った時は、他のウィンドウがそのウィンドウの上にある場合に失敗しました。
(上のウィンドウもピクセルとして拾ってしまう)

BitBltを使ってどうやってピクセル情報を得るんでしょうか?
ヘルプを見るとDCからDCへのコピーみたいな感じなんですが。
0243デフォルトの名無しさんNGNG
>>242
SetForegroundWindow で明示的に前に出せば?
直後に sleep を入れて少し待てば確実にいけると思うが。
0244240NGNG
こんな感じ↓でBitBltを使ってみたんですが、bitmapには何も描かれていませんでした・・。

hdc = GetDC(hwnd);
hdc2 = CreateCompatibleDC(hdc);
bitmap = CreateDIBSection(hdc2...
SelectObject(hdc2, bitmap);
BitBlt(hdc2, 0, 0, w, h, hdc, 0, 0);

単純にSetDIBitsToDevice関数の逆をやりたいだけなんですけど、Winって難しいっすね。
0245デフォルトの名無しさんNGNG
>>242
表示されてないクライアント領域まで拾いたいのか? それは無理だろう。自分で書いてるアプリなら

- WM_PAINT に対して直接書かずに、いったんバックバッファに書くようにする
- クライアント領域のデータがほしければ、バックバッファから拾ってくる

とするところだが、他のアプリだと汎用的な方法はないと思うなぁ。

>>243
Win98/2000 以降だと、自分がアクティブでない場合には SetForegroundWindow() しても対象のウィンドウが
前面に出てこないから、ちと厳しいと思う。
0246240NGNG
結局バックバッファから拾ってくる方法で上手くいきました。
みなさま、ありがとうございました。

・・実はDCってバックバッファみたいな機能を持ってると思い込んでました。
0247 NGNG
バッファ取ってないからWM_PAINTがあるんだろう。。。
0248デフォルトの名無しさんNGNG
マスターボリューム(音量)を age,sage,ミュート等できるAPIってありますか?
0249デフォルトの名無しさんNGNG
http://n76cd-01p02.ppp11.odn.ad.jp/old/a5850.html#A5844
上のURLに書かれている「Windows2000でのWM_MOVING」について
分かる方いますか?自分もまったく同じ現象で悩んでいます。
0250デフォルトの名無しさんNGNG
>>249
http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_callwndproc.htm

解説
 CallWndProc フックプロシージャはメッセージを調べることはできますが、変更することはできません。フックプロシージャがシステムに制御を返した後、このメッセージはウィンドウプロシージャへ渡されます。

誤動作でもなければ、バグでもなければ、使い方が悪いわけでもないです。仕様です。
0251デフォルトの名無しさんNGNG
というわけで変更したかったらサブクラス化すれ。
0252デフォルトの名無しさんNGNG
>>248
Win3.1+MMEの頃からミキサはmmsystem
0253デフォルトの名無しさんNGNG
>>249
WH_CBTでもできるかもしれない。
0254249NGNG
>>250 >>251 >>253
サブクラス化することによって望みの動作になりました。
ありがとうございました。
0255デフォルトの名無しさんNGNG
環境変数の設定方法を教えてほしいんですが。
0256デフォルトの名無しさんNGNG
それだけじゃ教えようがありません。
もっと解るように質問してよ。
0257255NGNG
すみません。
Windows95ですが、環境変数をプログラムから設定する
APIを教えてください。
0258デフォルトの名無しさんNGNG
>>248 SDKのAPIじゃないけれどmmsystemも含めてDirectSoundは良いよ
0259デフォルトの名無しさんNGNG
環境変数って、どの?

自分のプロセスのなら SetEnvironmentVariable だけど、
すべてのプロセスのなら RegSetValueEx だな。 (藁

ただしすべてのプロセスの環境変数は、次回再起動時から有効。(当然)
0260255NGNG
>>259
自分のプロセスのほうです。
ありがとうございました。
0261デフォルトの名無しさんNGNG
>>259
環境がWin95ならautoexec.batに書くんじゃないの?
0262 デフォルトの名無しさん NGNG
DOSプロンプト画面からプログラムを起動した場合、
そのプロンプトに文字を出力する方法ってどうするのでしょうか?

AllocConsoleだと別のコンソールウィンドウ作成するし、
何かいい方法はないモノでしょうか
0263デフォルトの名無しさんNGNG
WriteConsoleとGetStdHandleではいけないのか?
0264262NGNG
>>263
それだけだと、どこにも文字が表示されなかったんですよ。
で、AllocConsoleを使ったら、別のコンソールウィンドウが
作成されてそちらに文字表示されてしまいますし。

起動元のDos画面のstdoutを取得する方法がわかれば
いいんですが・・・
0265デフォルトの名無しさんNGNG
subsystem:consoleで解決する?

subsystem:windowsで、コマンドプロンプトから起動した場合のみ、
そのコマンドプロンプトを利用してWriteConsoleする、ショートカット等
から、起動した場合、コマンドプロンプトは表示も利用もしない、という
事なら、やり方はわからないなー。
0266デフォルトの名無しさんNGNG
isatty(fileno(stdout))は効かんのか?
0267266NGNG
あ、勘違い。忘れてくれ。
0268262NGNG
やりたかったのは、コマンドプロンプトから起動した場合、
コマンドプロンプトに文字を出力し、ショートカットなど
から起動した場合はウィンドウを作成して処理をする
方法です。

素直に処理する方法ってなさそうですね。
あきらめてウィンドウで処理するようにするか・・・
0269デフォルトの名無しさん NGNG
メニューに影をつけるにはどうすればいいんでしょうか。
0270デフォルトの名無しさん NGNG
ちょっと部屋の電気を暗くする
0271デフォルトの名無しさんNGNG
MAX_PATH超えるファイル名を扱う時ってどうすりゃいんだろ。
何か長さの目安ってある?
0272デフォルトの名無しさんNGNG
単純にMAX_PATHでぶったぎったらあかんの?
それ以上の長さのファイル名が扱えても意味ないでしょ?
0273271NGNG
まあ、MAX_PATH超えるといろんなアプリで不都合出るからねえ……。
0274デフォルトの名無しさんNGNG
つーか、越えてるやつはシステムも扱えないんじゃないか?
■ このスレッドは過去ログ倉庫に格納されています