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

Win32API質問箱 Build80

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

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

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

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

Win32API質問箱 Build79
http://pc12.2ch.net/test/read.cgi/tech/1240411224/
0693デフォルトの名無しさん2009/07/15(水) 14:24:22
ああ説明が足りなかった
エディットボックスの中の文字を書いた後にエンター押させたいんだけどポンッって鳴る
0694デフォルトの名無しさん2009/07/15(水) 14:27:46
単に複数行入力にすればいいと思うよ
0695デフォルトの名無しさん2009/07/15(水) 14:31:07
改行とか受け付けちゃったりしない?
0696デフォルトの名無しさん2009/07/15(水) 14:31:40
改行したいんじゃないの?
0697デフォルトの名無しさん2009/07/15(水) 14:37:48
enterが改行じゃないケースは少なからず存在する
0698デフォルトの名無しさん2009/07/15(水) 14:42:50
ES_WANTRETURN
かな
0699デフォルトの名無しさん2009/07/15(水) 14:48:42
>>693
KeyPressの中でKeyがVK_RETURNならKey = NULL;しとけ
0700デフォルトの名無しさん2009/07/15(水) 17:03:32
ボリュームをミュートにしてもいいと思うんだ
0701デフォルトの名無しさん2009/07/15(水) 18:49:16
釣れますか
0702デフォルトの名無しさん2009/07/16(木) 15:02:50
リソースエディタで作ったダイアログ(Langurgeが英語)を日本語環境で表示させる方法を教えてください。
0703デフォルトの名無しさん2009/07/16(木) 15:05:42
What is your problem?
0704デフォルトの名無しさん2009/07/16(木) 15:15:39
FindResourceEx
LoadResource
LockResource
CreateDialogIndirect(Param)
07057022009/07/16(木) 15:22:27
>>704
ありがとうございます。
アプリのロケールを変えたら、英語のリソース読んでくれるとか、そんな簡単にできないんですね。
0706デフォルトの名無しさん2009/07/16(木) 15:36:02
その目的でSetThreadLocaleは使うなと書いてある
0707デフォルトの名無しさん2009/07/16(木) 17:08:57
WSAWaitForMultipleEvents(1, &hEvent, FALSE, WSA_INFINITE, FALSE);
WSAEnumNetworkEvents(Socket, hEvent, &EventFlags);
てやったときに、どちらの関数も 0 を返していて、成功はしているだけど
EventFlags.lNetworkEvents が 0 のときがある。これはなんなの??
何もイベントが発生していないのにWSAEnumNetworkEventsから制御が戻ってきたって事?
0708デフォルトの名無しさん2009/07/16(木) 20:34:31
キー入力に関して。前回の呼び出しから、今回の呼び出しの間に特定のキーが1度でも押されたかどうかを調べるAPIってありますか?
0709デフォルトの名無しさん2009/07/16(木) 20:57:31
あります
ttp://msdn.microsoft.com/ja-jp/library/cc430056.aspx
0710デフォルトの名無しさん2009/07/16(木) 21:12:07
GetAsyncKeyStateというやつですね。thx
GetAsyncKeyboardStateが無いのは不便ですね
0711デフォルトの名無しさん2009/07/17(金) 02:43:56
one night
0712デフォルトの名無しさん2009/07/17(金) 12:30:09
ExitWindowsでWindowsを終了する場合
一応メモリ解放とかした方がいいのかな?
ログオフの時はするけど、終了や再起動ならリークもしても関係無いと思うんだが
0713デフォルトの名無しさん2009/07/17(金) 12:33:34
関係なくてもするのが礼儀というものです
礼儀など気にしないなら、別にどうでも
0714デフォルトの名無しさん2009/07/17(金) 12:49:03
Windowsを終了する場合は解放しない、なんてコードをわざわざ書くのだろうか。誰得
0715デフォルトの名無しさん2009/07/17(金) 13:02:57
カーネルオブジェクトの呼称について質問なんですが、
Memory Mapped FileのことをSectionと呼ぶ場合には、どういった意図が込められているのでしょうか
あるいは殊更に分けて考える必要はないのでしょうか
0716デフォルトの名無しさん2009/07/17(金) 13:17:07
>>712
CのmallocとちがってWindowsのresourceは終了時に解放されないものがある
あとはわかるね
07177122009/07/17(金) 13:55:09
有難うございます
後から追加した機能なので、解放処理をWM_CLOSEや他に混ぜている事もあり
面倒なので、いいかなっと思っていました

アプリが終了してからExitWindowsを呼ぶ為には良い方法は無いでしょうか?
0718デフォルトの名無しさん2009/07/17(金) 14:24:07
>>717
そんだけの用途なら、なんかのフラグ立てといて、メッセージループ抜けたらExitWindows呼べば?
0719デフォルトの名無しさん2009/07/17(金) 14:34:49
>>718
有難うございます
atexitで設定するか、仰る通りにフラグ経ててループ抜けたら呼ぶようにしてみます
0720デフォルトの名無しさん2009/07/17(金) 17:18:25
通   素材の味を楽しむ          自然本来の味     う     塩でその店のレベルがわかる
は            塩最高     塩以外は邪道       な   素材のうまみを生かす          素材
塩   「塩で」                              ぎ                          の香
           甘ったるいタレで焼き鳥が食えるか      の   タレ厨は味覚障害者            
      塩もこだわった塩がいい                  白.. 異              高い店で食ったことないんだろ?
                    臭い肉をごまかすためのタレ 焼 . .論    ポテチはうす塩が至高
タレは子供用      AVの見過ぎ                 き   は                   素
                       素      / ̄ ̄ ̄\       認  タレはタレの味しかしない  材
     最終的にたどり着くのは塩  材    .../.\    /. \      め                    の 
                        の   /  <●>  <●>  \ 本   な  焼き鳥=塩           魅
. 「タレ」から「塩」に           味  |    (__人__)    | 当    い                    力
             普通は塩         \    `ー'´    / の   高い店なら塩、安い店ならタレ     が
     シンプルに塩      ..       /             \ 味                           際
             甘味にも通ずるものがある            覚  たれ(笑)  食の原点に戻る        立
 自分用の塩を携帯してない奴は馬鹿                          子供の頃はタレだったが今は塩  つ
                            塩こそ最高の調味料!!
0721デフォルトの名無しさん2009/07/17(金) 22:09:37
strcmpi使うとワーニングが出るんだけど_strcmpiつかえってことでしょうか?

少し調べたんですけど両者の違いがよくわからなくて・・
わかる方いたら教えて頂けませんか?
0722デフォルトの名無しさん2009/07/17(金) 22:22:03
yahooの知恵袋っていつから珍回答で質問者をからかう場所になってんだ
0723デフォルトの名無しさん2009/07/17(金) 22:50:58
>>721
ISO/ANSI標準規格では、下線部で始まる名前を処理系の独自拡張用に使って良いとしている。

VC++にとっては、strcmpiはなんの標準でもない名前なので、
下線を付けて独自拡張用の名前に適合するようにするのがふさわしいとVC++の制作陣は考えたということ。

ここまで書いたけど、スレ違いだから次はよそで聞け。
0724デフォルトの名無しさん2009/07/17(金) 23:07:24
WindowsFormsのControl.Tagのような機能をSDKで実現するにはどうしたら良いのでしょうか。
具体的に言うと、各コントロールにそれぞれ整数を記憶させておきたいです。

現在は、STLのmapを使って、ハンドルとデータを関連付けています。
0725デフォルトの名無しさん2009/07/17(金) 23:31:15
>>724
SetProp
0726デフォルトの名無しさん2009/07/17(金) 23:35:35
たぶんこの3つある。

Set/GetWindowLongPtrでDWLP_USER
Set/GetWindowLongPtrで任意の正整数によるインデックス指定(使用量をWNDCLASS(EX)で指定)
SetProp/GetPropで文字列またはアトムによるキー指定
07277242009/07/18(土) 00:40:32
おぉ、可能なのですね。回答ありがとうございました。
自分に最適な方法を吟味して使ってみようと思います。
0728デフォルトの名無しさん2009/07/18(土) 01:48:56
単色塗りつぶしはどの方法がオヌヌメ?
FillRect?PatBlt?それともExtTextOut?
0729デフォルトの名無しさん2009/07/18(土) 02:14:14
>>726
自己レス。GWLP_USERだった、すまん。

>>728
自分はExtTextOutが多いなあ。
MFCやWTLだとFillSolidRectという名前でラップされているから、躊躇無く使える。
MFCもWTLも使っていないなら、自前で定義するといいと思う。
0730デフォルトの名無しさん2009/07/18(土) 10:27:39
どなたか>>715について知っている方はいませんでしょうか
0731デフォルトの名無しさん2009/07/18(土) 10:28:13
Win9xで動くソースをベースに改良を加えたら
9x系で実行すると現在のWindowsのバージョンでは起動出来ない
とエラーが発生するんだが、こうなる原因って何かな?

API周りはきちんと動的リンクにしてる
文字列は全てリソースに纏めてしまったが、もしかしてリソースに纏めると9x系って駄目?
0732デフォルトの名無しさん2009/07/18(土) 10:32:54
>>731
VisualStudio2008でビルドすると駄目
0733デフォルトの名無しさん2009/07/18(土) 10:49:23
>>730
本人に聞けば良いんじゃね?
0734デフォルトの名無しさん2009/07/18(土) 11:10:18
MSDNのライブラリにもあるし、一般的な慣習ならここの方が早いかなと思って質問しました
とりあえず質問に対するお答えを待つことにします
0735デフォルトの名無しさん2009/07/18(土) 11:30:48
>>734
そう呼んでいる例をあげてくれまいか。
0736デフォルトの名無しさん2009/07/18(土) 11:34:47
>>732
有難うございます
borlandでビルドした所きちんと起動しました
VC++2008ではWin9x系に対応出来ないんでしょうか?
0737デフォルトの名無しさん2009/07/18(土) 11:37:20
>>736
2008はNT4以前、9x系はランタイムでバージョンチェックしてる。
2005にするしか無いかなあ。
0738デフォルトの名無しさん2009/07/18(土) 12:52:21
>>737
有難うございます
2008では無理ですか…
別のIDEでビルドするようにしてみます。有難うございました。
0739デフォルトの名無しさん2009/07/18(土) 14:36:34
まぁ、動くようには出来るがお薦めはしない。
因みにVC2005でも95だけアウトだった気がする。
0740デフォルトの名無しさん2009/07/18(土) 15:02:55
>>739
VS2005でWin95はググれば対処法が出てくる。
0741デフォルトの名無しさん2009/07/18(土) 15:05:46
>>736
公式にだめにしたと言っている。
http://msdn.microsoft.com/ja-jp/library/dd695830(VS.100).aspx
0742デフォルトの名無しさん2009/07/18(土) 16:36:58
ファイルパスを扱うコードを書いてたのですが
NTFSで最大のパス長って32768文字ってことになってますが
Vista64bit環境でエクスプローラでフォルダを作ってみると
どうもMAX_PATH制限がかかっているようで250文字付近から
新しいフォルダを作れなくなります

Win32APIでもパス先頭に \\?\付けてUnicode版なら32768文字までと
MSDNに出ていますが
OS標準のエクスプローラで未だMAX_PATH制限があるのは互換性のため?
自分で作るときもMAX_PATH制限のあるAPIで気にせず使えばいいのでしょうか?
0743デフォルトの名無しさん2009/07/18(土) 17:42:05
>>742
.NETだと「\\?\」を付ける形式は殆ど通らないしなあ。
(大抵ArgumentExceptionで蹴られる。)
MS的にはMAX_PATHの範囲内でやりくりしろ、って方針に見える。
つまりは、MAX_PATH制限は半ば公式って事でOKなんじゃないかな。
0744デフォルトの名無しさん2009/07/18(土) 18:29:38
windowsにkill()ってないの?
0745デフォルトの名無しさん2009/07/18(土) 18:43:39
>>744
windowsにってことならtaskkillのことになるのか?
0746デフォルトの名無しさん2009/07/18(土) 18:44:07
恒例のMAX_PATH論争スタートぉぉぉぉぉ!!!
0747デフォルトの名無しさん2009/07/18(土) 18:49:18
>>744
何をやりたいかによる。例えば、文字通り殺したいならTerminateProcessだけど。
0748デフォルトの名無しさん2009/07/18(土) 18:59:41
>>745
それはコマンドっぽい
>>747
signalハンドラで捕まるもの全て
受け取ったものをそのまま子プロセスに流したい
0749デフォルトの名無しさん2009/07/18(土) 19:13:56
それは難しいな。Windowsにはシグナルなんて概念ないから。

ANSI/ISO Cになぜかsignal/raiseが収録されているせいで、C/C++ではsingal関数が使えるけれど、
Windowsではlibc層でエミュレーション的に実装されている。
そのため、大抵は外から直接シグナルを送る手段なんて存在しない。

CygwinやSFU/SUAなどといったUnix互換環境ならそっちのkill使えよと言うところ。
0750デフォルトの名無しさん2009/07/18(土) 19:18:05
そんならコンソールプログラムの終了とかは一体どうやって実現されてるの・・・
もしかしてTerminalProcess呼ばれたことも知らないまま死亡?
0751デフォルトの名無しさん2009/07/18(土) 19:57:44
>>750
コンソールでのCtrl+C入力をWindows APIで取得するにはSetConsoleCtrlHandler。
初期状態のハンドラはExitProcessを呼び出す。
(しかし、C/C++ならSIGINT用にlibcがハンドラを登録しているはず)

こんな調子で、ほかのものもだいたいは別の手段となる。
0752デフォルトの名無しさん2009/07/18(土) 19:58:14
コンソールならSetConsoleCtrlHandlerとかかな
ウィンドウアプリならWaitForSingleObjectでオブジェクトがシグナル状態か非シグナル状態かを確認できる
スレッドが終了すればスレッドのハンドルがシグナル状態になるし、CreateEventとかで自分で好きにイベントを作って
SetEventやResetEventでシグナル状態を変えれるよ…たぶん
0753デフォルトの名無しさん2009/07/18(土) 20:10:08
>>752
いや、GUIアプリで、SetConsoleCtrlHandlerに対比させる何かといえばWM_CLOSEだと思う。
0754デフォルトの名無しさん2009/07/18(土) 22:30:25
>>743
やっぱエクスプローラでもサポートしてないとこからも
そうなんでしょうね
有り難うございました
0755デフォルトの名無しさん2009/07/18(土) 23:41:43
a1からh8なら縦横の位置を出して
qが入ると終了する。どうするの?
0756デフォルトの名無しさん2009/07/18(土) 23:42:36
は?
0757デフォルトの名無しさん2009/07/18(土) 23:47:26
別のスレでも見たな
0758デフォルトの名無しさん2009/07/19(日) 00:08:10
b3を引いてxでOKじゃね?
0759デフォルトの名無しさん2009/07/19(日) 00:18:07
いや、s13を左シフトして∀でおk
0760デフォルトの名無しさん2009/07/19(日) 00:57:19
何言ってんだ、気合だ、気合だろ。
0761デフォルトの名無しさん2009/07/19(日) 07:44:23
ウィンドウにフォーカスがない状態でもキー入力が取得できるように
ウィンドウプロシージャ内でGetAsyncKeyStateを使ってみましたがうまくいきません。
コンソールだとフォーカス外でも取得できるのですがどのようにしたらいいでしょうか?
環境はXPとBCCです
0762デフォルトの名無しさん2009/07/19(日) 11:11:04
>>761
SetWindowsHookEx
07637212009/07/19(日) 11:27:16
>>723
ありがとうございます!!
確かにスレ違いでしたので次は気をつけます
0764デフォルトの名無しさん2009/07/19(日) 15:47:56
>>762
やはりグローバルフックを使うしかありませんか。サンクス
0765デフォルトの名無しさん2009/07/19(日) 16:59:54
API関数が失敗した際にC++例外を投げたとして、内部的にRaiseException等のAPI関数が呼ばれて
GetLastError()の値が更新されることはあり得るんでしょうか

例外をキャッチする箇所でGetLastErrorを呼ぶという設計に問題があるのかもしれませんが...
0766デフォルトの名無しさん2009/07/19(日) 17:28:53
GetLastErrorはAPI呼び出し直後に呼ぶものだろ。
自分の都合で勝手にAPIの動作が、自分流になることを期待するなんて、どんだけゆとりなんだよ!
07677652009/07/19(日) 17:47:38
そんなに変ですか?
失敗したときにSetLastErrorでエラーコード設定しておいて、例外で抜けるようにしておけば、
呼び出し元のコードで失敗を処理するか、放置するか選択できて、
特に、失敗頻度が低いであろうコードで見通しのよいコードになると思ったのですが...
0768デフォルトの名無しさん2009/07/19(日) 17:48:20
内部的にRaiseException等のAPI関数が呼ばれて
GetLastError()の値が更新される
0769デフォルトの名無しさん2009/07/19(日) 17:51:57
SetWindowRgn 関数でリージョン設定すると
XPのビジュアルスタイルがクラシックみないになってしまうのって
回避できないんでしょうか?
0770デフォルトの名無しさん2009/07/19(日) 17:58:59
SetWindowAttributesLayeredEx
07717652009/07/19(日) 18:12:46
ありがとうございます
やはりそういうことがあるというなら、回避策を検討します
0772デフォルトの名無しさん2009/07/19(日) 18:16:06
もっと使いやすくて同じぐらい低レベルなAPIはないんですか?
0773デフォルトの名無しさん2009/07/19(日) 18:42:57
>>767
自分は例外クラスにGetLastErrorのコードを渡すようにしている。
__declspec(noreturn)
void ThrowWin32Exception()
{
throw Win32Exception(GetLastError());
}
07747692009/07/19(日) 18:59:49
>770
ありがとうございます。
調べてきました。
SetLayeredWindowAttributes
UpdateLayeredWindow
ですね。

これ使わないと実現不可ですかね?
可能であればSetWindowRgnが良いのですが。

0775デフォルトの名無しさん2009/07/19(日) 19:36:33
SetWindowRgn is obsoleted.
07767692009/07/19(日) 19:54:51
>775
了解。
0777デフォルトの名無しさん2009/07/20(月) 01:53:07
タスクトレイのツールチップで変数を表示したいのですが
wsprintf(str, "%d", hensu);
CopyMemory(ic.szTip, str, 5);
上のようにして変数が変わっても初期値(0)のまま表示されます
ホバーするたびに値が更新されるにはどうすればいいですか?
0778デフォルトの名無しさん2009/07/20(月) 02:07:59
>>777
NIM_MODIFYでShell_NotifyIconを呼び出さないと駄目。
というか、その二行で本当に反映されると思っていたのなら、
APIの一般的な設計を理解していない気がする。
0779デフォルトの名無しさん2009/07/20(月) 02:24:51
>>778
できました。本当にトンクス。精進します
0780デフォルトの名無しさん2009/07/20(月) 03:00:38
ウィンドウハンドルって中身はウィンドウオブジェクトの識別子でしたっけ?
LATにウィンドウオブジェクトの識別子があって、LATのインデックス、とかでしたっけ?
0781デフォルトの名無しさん2009/07/20(月) 10:28:03
unlockerのようにファイルを使用しているプログラムを列挙するにはどうしたらいいんでしょうか?
0782デフォルトの名無しさん2009/07/20(月) 14:49:47
ハンドルはただの実体へのポインタ メモリアドレスなんでプロセス内でしか意味を成さない

0783デフォルトの名無しさん2009/07/20(月) 14:52:07
>>782
突っ込みどころ満載だが、平気で嘘つくの良くない!
0784デフォルトの名無しさん2009/07/20(月) 14:52:13
カーネルオブジェクトは別だろ?
0785デフォルトの名無しさん2009/07/20(月) 14:58:29
ウィンドウハンドルって他プロセスと共有できんの?
別に同期オブジェクトだの共有メモリマップハンドルだのは別腹ですだよ
0786デフォルトの名無しさん2009/07/20(月) 15:02:28
共有できなかったら、どうやって WM_COPYDATA を送るんだよ。
0787デフォルトの名無しさん2009/07/20(月) 15:17:38
>>786
プロセスBのウィンドウを操作するためのハンドルをプロセスAで取得する
このときプロセスAで取得したハンドルとプロセスBで元々使っていたハンドルは
同じウィンドウを指していても共有されてるわけではない
0788デフォルトの名無しさん2009/07/20(月) 15:22:58
あー、はいはい。共有はされてません。同じのが使えるけど。
0789デフォルトの名無しさん2009/07/20(月) 15:29:45
sorehatamatama
0790デフォルトの名無しさん2009/07/20(月) 15:38:01
>>786みてFindWindowが返すHWNDの中身が激しく気になってきた
07917802009/07/20(月) 15:52:51
俺のあやふやな知識によれば>>787が正しかったと思う
HWNDを別プロセスへ何らかの手段で持っていっても、使えない。
WM_COPYDATAの場合だけは、そのメッセージの場合に限りシステムがHWNDを輸送するための特別な処理をしていたと思う。

HWNDの中身はメモリポインタではなく単純な整数(1とか2)になってて
プロセスごとに1つあるシステム的なオブジェクトを管理するテーブルのインデックスだったと思う。
そのインデックスで参照した先にあるのがメモリポインタだったかウィンドウオブジェクトの識別子だったかは覚えてない。
0792デフォルトの名無しさん2009/07/20(月) 15:57:12
前段と後段で矛盾してるわけだが。
■ このスレッドは過去ログ倉庫に格納されています