Win32API質問箱 Build126

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2020/05/01(金) 22:16:51.96ID:ZJ42fMZB
Win32APIについての質問はこちらへどうぞ。

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

■過去スレ
Win32API質問箱 Build125
https://mevius.5ch.net/test/read.cgi/tech/1551247748/
Win32API質問箱 Build124
https://mevius.5ch.net/test/read.cgi/tech/1510395780/

■関連スレ
Visual Studio 2019 Part4 https://mevius.5ch.net/test/read.cgi/tech/1585715794/
Visual Studio 2017 Part7 https://mevius.5ch.net/test/read.cgi/tech/1558179898/
【C++】 DirectX初心者質問スレ Part41 【C】 https://mevius.5ch.net/test/read.cgi/tech/1521786252/
2020/08/21(金) 17:34:52.11ID:Ci3Fu54P
ImmGetOpenStatus

まあ>267の言うとおりの問題はあるので、Windows全般でどうなっているのかという
判断が必要ならば仕様の見直しが必要
2020/08/21(金) 22:17:44.89ID:0m1+vyON
IMM32を実装できる方はReactOSを助けて下さい。
2020/08/22(土) 12:46:26.84ID:oUSNiZjo
>>266
やはり、フックですか。
実は、この件でのフックでの実験は既にやってみて、成功したことがあります。
ただし、フックは、32BITと64BITで DLL を分ける必要があるため、
実験したのは、32BITのみでした。
64BITにも対応しなくてはならないので、手間がかかるので中断してます。
2020/08/22(土) 15:55:52.64ID:hVxrtALE
>>262
GetDC(null)で画面全体のdevice contextを取得
bitblt()で画面イメージをメモリーDCに取得
>画面右下に IMEのON/OFF状態が表示
の部分を画像比較でON/OFF状態を判定
2020/08/22(土) 16:16:49.59ID:uVP5D41B
それはwindows2000までじゃね?
2020/08/23(日) 11:19:55.27ID:a/7Z84eB
>>273
キーボードフックならdll作らんでもいいぞ
2020/08/23(日) 12:54:28.26ID:SVuEjc7r
>>276
そうでしたか?
フックを始めるための API 関数名やフラグ定数名やモードなどを教えていただければ幸いです。
2020/08/23(日) 13:49:04.77ID:t0NmBsz5
そんなものはない
279デフォルトの名無しさん
垢版 |
2020/08/23(日) 14:07:51.37ID:Exm+Pt+Z
32bit用に描いたフックを64bit用に描き治すのってそんなに大変?
2020/08/23(日) 14:24:31.89ID:SVuEjc7r
>>279
普段使っている処理系が古くて、64BITに対応の処理系は、今まで使っていませんでしたので。
2020/08/23(日) 15:50:19.81ID:a/7Z84eB
普通にsetwindowshookexでできるぞ

wmwareアクティブだとマウスとキーボードフック全部効かなくなるけどなんとかならないのかな
2020/08/23(日) 15:53:59.01ID:a/7Z84eB
キーボードとマウスのフックでモジュールのハンドルとスレッドid0だとdllいらない
ほかは駄目なのあるけど
あと64bitで作っておけば32bitのフックもわざわざしなくていい
2020/08/23(日) 16:00:25.99ID:SVuEjc7r
>>282
>あと64bitで作っておけば32bitのフックもわざわざしなくていい
これはもしかすると、32BITアプリの場合、64BITのDLLのフック関数を OS
が呼び出してくれると言うことでしょうか?
2020/08/23(日) 18:50:47.56ID:t0NmBsz5
32bitで実験やったんなら移植もすぐだからやってみればいい
dll使わずにする場合も専用APIとか無いし
2020/08/24(月) 10:55:52.42ID:IztyfRL4
>>272
成功して欲しいOSだけど、日本語入力で行き詰まってるんなら先は長そうだね

>>274
表示位置で取得ってタスクバーの位置が変動するから無理があるのでは
デザインが少し変わっただけでも死ぬ

>>277
IMEのON/OFFのキーバインドなんて環境で様々なんだからキーボードフックなんかじゃ実現無理なの分かれよ
アプリ側でもプログラム的にON/OFFするのに
そもそもアプリ問わずIMEの状態を取得する意味あるのか?何したいんだよ
2020/08/30(日) 07:55:13.94ID:yNtthsj4
意味があるかどうかは外野がとやかく言うことではない
2020/08/30(日) 10:06:50.95ID:/cTt0XEP
意味の有無を聞いてるとしか読み取れないのはどうかと思う
2020/08/30(日) 14:59:21.03ID:XN33z1n0
素直に質問に答えりゃ良いんだよ
質問自体を疑問に思う必要などない
289デフォルトの名無しさん
垢版 |
2020/08/30(日) 15:09:45.20ID:GgAZZaQa
質問が間違ってるから答える気にもならないことはある
2020/08/30(日) 16:53:37.52ID:ClA8nGT1
どうせ32bitでなら実験したってのが嘘で試しようがないんでしょ
2020/08/30(日) 17:33:56.68ID:BjChy3oe
その実験は、凄く上手く行きました、と言っておきます。
2020/08/30(日) 17:36:51.12ID:IbTRMPI+
IMEのON/OFFはマウスやアプリでも出来るからな
そっちの対応はどうするんだろ
2020/08/30(日) 19:00:20.18ID:ClA8nGT1
皆キーボードフックしか言ってないけど
IMN_SETCONVERSIONMODE捕まえればいいやん
それもやったってんなら64bit対応するだけやん
2020/08/31(月) 20:27:32.61ID:YgYq5nQZ
ONはともかくIME入力中だとOFFしても入力中のIMEのうにょうにょが消えないのだが
2020/08/31(月) 21:02:36.79ID:fGHCeYBV
ONだと普通の数字は全角なのに
テンキーだと半角
ちゃんと分岐してるならテンキーのうにょうにょも無しにしたらいいのに
2020/09/07(月) 07:46:03.38ID:h3kjQIhT
おまいらGetCommandLineが返した文字列からコマンド名だけ除いた部分て、どうやって得てる?
2020/09/07(月) 08:31:55.79ID:Ml9CONKv
CommandLineToArgv
2020/09/07(月) 08:32:44.96ID:Y2TEo/a2
CommandLineToArgvW
2020/09/07(月) 08:39:11.94ID:h3kjQIhT
やっぱり自前でコマンド名だけ取り除くしかないのかな
空白や引用符に特別な意味を持たせたくないんだけど
2020/09/07(月) 09:33:01.54ID:DSNLMJBI
before afterはどんなの?
301デフォルトの名無しさん
垢版 |
2020/09/07(月) 10:21:46.55ID:Egt+Qwmp
結果にコミットする気が無い回答者たち
2020/09/07(月) 10:56:37.10ID:9HEBPbyG
おセックスしたいです
2020/09/07(月) 13:52:28.70ID:X4wk0IcB
MFCならCCommandLineInfoなんだがな。
304デフォルトの名無しさん
垢版 |
2020/09/07(月) 14:10:25.67ID:MtDNWdkb
CreateProcess見るといろいろな指定の仕方ができそうで不安になるよね
2020/09/07(月) 14:32:13.03ID:ibXVM4v9
>>296
そんなの使わずにWinMainの3rdパラメータ使う
2020/09/07(月) 15:26:51.28ID:DSNLMJBI
/a //b /c:"text"
この場合b無視すんの?
2020/09/07(月) 18:53:34.42ID:XlcRu9mb
>>303
CWinApp::ParseCommandLine()は__argcと__argvを見ているだけだけどな
308デフォルトの名無しさん
垢版 |
2020/09/08(火) 01:38:27.47ID:BXhGoa38
質問なんですがWindowsのカレントディレクトリって
アプリ毎に持ってるものなんでしょうか?
それとも全アプリ共通なのでしょうか?
2020/09/08(火) 01:41:38.73ID:NIyJzstU
>>308
スレッドごとに違うよ。
2020/09/08(火) 01:54:21.79ID:BXhGoa38
>>309
スレッド毎に違うんですね!ありがとうございました。安心しました。
311デフォルトの名無しさん
垢版 |
2020/09/08(火) 11:55:58.97ID:POT3YWIT
プロセスごとだろ
嘘つくなよ
2020/09/08(火) 12:00:43.95ID:VotMLAWA
この板には嘘つき朝鮮人しかいない
2020/09/08(火) 13:00:32.46ID:HYZN+BkE
>>312
自分がそうだからといって他人もそうだと思うのはよくないな
2020/09/08(火) 13:23:24.69ID:5CeoL0rA
MSDN によれば、正しいのはプロセス毎。スレッド毎ではない。

*SetCurrentDirectory

The SetCurrentDirectory function changes the current directory for the current process.

BOOL SetCurrentDirectory(
LPCTSTR lpPathName // new directory name
);

*Remarks

Each process has a single current directory made up of two parts:

・・・
2020/09/08(火) 13:29:57.92ID:oUJlYCUI
ということは、同一プロセス内の別スレッドでSetCurrentDirectoryが発行されると
自スレッドのカレントがいつの間にか変わっているということが起きるのか
2020/09/08(火) 13:50:32.04ID:JNlu12o+
カレントディレクトリの取得なんて、グローバル変数から情報を取ってくるようなもんなので危険ってことだ
そんなもん使うな
2020/09/08(火) 14:09:32.72ID:5CeoL0rA
>>315
もちろんそういうこと。
というより、カレントディレクトリも、広い意味で「UI」に関係したものと
考えられなくもないので、必ず Mainスレッドから取得するようにすれば、
安全と言える。絶対そうしなくてはならないわけではないが。
Window作製、グラフィック描画、マウス、キーボードからの入力なども、
Mainスレッドで行うのが原則。
これも絶対そうでなくてはならないというわけではないかも知れないが、
敢えて Subスレッドでやる意味も余り無い事が多く、Mainスレッドに限定
すれば、さまざまな危険回避のための余計なことを考えなくて済むメリットがある。
2020/09/08(火) 14:13:07.26ID:5CeoL0rA
>>317
補足すれば、カレントディレクトリは、MS-DOS時代では、command.com
が管理していたもので、アプリごとに異なるわけではなかったはず。
というのは、カレントディレクトリを便利に変更できるツールを作りたい
場合などに、アプリローカルであれば、不便だったからだと思う。
その設計哲学や文化や習慣が、Windowsにも受け継がれる必要は有ったと思う。
Unixの環境変数なども、アプリローカルになっていたりするが、意外と不便な
事も多い。
2020/09/08(火) 14:55:05.93ID:2rsMzWV+
何を根拠に長文をw
INT21 AH=3B の説明を読み直し要
2020/09/08(火) 18:38:57.08ID:HYNPtfS+
>>315
>自スレッドのカレントがいつの間にか変わっている
自分で管理できないスレッドなんてあるのか?
その別スレッドだって自分で作ったものだろ?
DLLとか自分で管理していないものもあるけどそれはスレッド関係ないわけだし
2020/09/08(火) 18:48:41.38ID:FLHP/hAu
DCE-RPCは電文受信すると勝手に
処理スレッドたててくれるよ
2020/09/08(火) 19:34:11.85ID:oUJlYCUI
>>320
別スレッドにするってことは自スレッドとの間にタイミングの束縛がない処理を任せるってことだよな
カレントディレクトリの変更がプロセス内の他のスレッドにも伝搬するということは
それはタイミングの束縛が生じうるってことだろ
つまり、それが困るなら別スレッドにしてはならない処理内容ってことで
そこの判断こそが「自分で管理」ということだ
2020/09/08(火) 19:36:02.20ID:HYNPtfS+
ちょっと何言っているのかわからない
2020/09/08(火) 19:41:07.94ID:oUJlYCUI
そうかい、それは残念だね
2020/09/08(火) 22:47:13.26ID:txiCBqFi
スレッドがお互いを信用できないとか、そんな羅生門みたいなプログラムは嫌だなぁ。
2020/09/08(火) 23:06:57.38ID:bOnMHAua
マジで地獄の召還かもな
2020/09/09(水) 00:11:58.92ID:VoppH/up
指定フォルダ以下のファイルをすべて処理するプログラムで
サブフォルダごとにスレッドを起動してみよう
328デフォルトの名無しさん
垢版 |
2020/09/09(水) 09:51:28.66ID:9MEEjZyT
フォルダ間移動ですね判ります
2020/09/09(水) 11:03:42.50ID:w9YsWEn5
そんなバッチファイルみたいなアルゴリズムでカレントディレクトリ移動しながらマルチスレッドをやるとかがそもそも迂闊だよな。
2020/09/10(木) 08:55:55.87ID:YCiClA3r
>>329
マルチスレッドじゃなくてマルチプロセスなら作業ディレクトリは完全に分離できる。
せっかくマルチタスクOSを使っているのだから、別プロセスに丸投げするのが最適だよ。
2020/09/10(木) 08:57:16.11ID:YCiClA3r
タスクマネージャー開けばわかるけど、今時のWebブラウザ(具体的にはEdgeやFirefox等)はたくさんの子プロセスを動かしている。
2020/09/10(木) 13:46:51.31ID:+JaTYUbA
話の流れを読めない奴は黙ってりゃいいのに…
2020/09/20(日) 07:50:00.62ID:sAMwu2sI
sse2までが必須になったのはいつだったか覚えませんか
win-7の途中くらい?
2020/09/20(日) 08:05:49.82ID:WRa/xy2u
>>333
Windows sse でググれ
https://www.atmarkit.co.jp/ait/spv/1807/02/news014.html
2020/09/20(日) 08:21:02.12ID:sAMwu2sI
>>334
ありがとうございます
336デフォルトの名無しさん
垢版 |
2020/09/22(火) 08:18:54.27ID:EoOf3jnh
win32apiを使っている人は、普段の文字コードは
stringとwchar_tを使っているのでしょうか。
2020/09/22(火) 08:26:19.44ID:bhDrmv5D
LPWSTR
338デフォルトの名無しさん
垢版 |
2020/09/22(火) 12:46:05.64ID:EoOf3jnh
ありがとうございます。
調べてみます。

stringを使いたいのに、win32apiは変換が必要?なので躊躇しています。
2020/09/22(火) 13:48:40.94ID:YDb2rcNJ
CreateProcessのユニコード版(W)の第2引数がリテラルだとうまくいかない件
これはハマったわ。

CreateProcess(TCHAR)でメモ帳起動させるサンプルで
_T("C:\\Windows\\notepad.exe")を直接与えてもCとしてコンパイルするとうまくいってて
c++にしたら起動しなくなったが、エラーが出ないから全然気づかなかったわ
ネットのCreateProcessのサンプルも普通に与えてるしなあ

考えてみれば実運用でこの部分は文字リテラル決め打ちにめったにならないから
知らずに回避してることも多いのかも
340デフォルトの名無しさん
垢版 |
2020/09/22(火) 14:14:47.55ID:iCejn/78
>>336
>>338
wstring
2020/09/22(火) 14:16:32.73ID:yrkD80aj
そもそもMSDNに書いてるし
2020/09/22(火) 14:16:37.87ID:5Q3AK6nV
LPTSTR で受け取ってるから書き換え可能なメモリアドレスでないとあかんのじゃないのん?
リテラルは const で書き換え不可だし 一回変数経由しないと
2020/09/22(火) 14:22:15.75ID:uF0JvJPV
自転車🚴のような絵文字をstd::stringで持つにはSJISではなくUTF-8として保持しておいて、
画面などの出力する直前にUTF-8からUTF-16に変換してUnicode版出力関数を呼び出す必要がある。
2020/09/22(火) 15:28:51.96ID:J6Z/5nZW
>>339
>lpCommandLine
>実行するコマンドライン。
>この文字列の最大長は、Unicodeで終了するnull文字を含めて32,767文字です。 lpApplicationNameがNULLの場合、lpCommandLineのモジュール名の部分はMAX_PATH文字に制限されます。
>この関数のUnicodeバージョンであるCreateProcessWは、この文字列の内容を変更できます。
>したがって、このパラメーターを読み取り専用メモリー(const変数やリテラル文字列など)へのポインターにすることはできません。
>このパラメーターが定数文字列の場合、関数はアクセス違反を引き起こす可能性があります。
2020/09/25(金) 09:12:14.46ID:3+LaQyVV
>>339
argvに渡すから非constだぞって話か
346デフォルトの名無しさん
垢版 |
2020/09/25(金) 10:57:09.24ID:4ovx1Tzj
非 const の引数に const リテラル与えたら
コンパイルエラーにならないか?
2020/09/25(金) 11:44:47.33ID:cdg8K9Zm
それがエラーになるなら固定文字列を渡せなくなるやん
2020/09/25(金) 12:18:15.76ID:3+LaQyVV
>>346
C++11以後、そうなった筈だけどcl.exeはversion 19.27.29111でも通す(もち/W4で)
349デフォルトの名無しさん
垢版 |
2020/09/25(金) 18:33:43.19ID:M9uVftQk
Win32API全部作り直してほしい
くだらない部分で人間の時間を消費しすぎだろw
2020/09/25(金) 18:41:06.52ID:14hC/BSs
>>349
自分でラッパーでも作ればいいんじゃね?
作れない低能なら諦めるしかないだろうけど
2020/09/25(金) 18:57:00.47ID:3+LaQyVV
>>350
御意
2020/09/25(金) 21:02:31.80ID:DCkHs+Bt
>>349
どんなところがダメなんでしょうか?
2020/09/25(金) 21:58:40.78ID:62tG58VZ
WINDK使ってサブシステム毎作り直せば良いのに
2020/09/25(金) 22:05:15.01ID:ogXn8IQh
コンパイルできるXPのソースが漏れてるらしい。
2020/09/27(日) 00:13:50.58ID:Tq9/SM8I
>>354
まじで?
XPはじまったな
2020/09/28(月) 13:45:59.88ID:A9tQ9Jdm
7もお漏らしして欲しいね
2020/09/28(月) 13:53:48.40ID:n9LyrBhU
未だに使ってる奴が死ぬだけ
2020/09/28(月) 14:33:51.78ID:PAQov7G9
海賊版天国の中国死ぬの?
2020/09/28(月) 15:10:38.57ID:q9HWvXQA
穴がさらにいっぱい見つかって攻撃方法が増えるんだから自明だろ
誰が対応するんや
360デフォルトの名無しさん
垢版 |
2020/09/28(月) 16:14:01.27ID:n0MW1Etw
久しぶりに Windows Update したら
Edge レイプされてポカーン
2020/09/28(月) 16:42:43.52ID:8K79+FWG
スカ ポン タン
2020/09/28(月) 16:51:28.28ID:QxfbhGyV
> Edge レイプ

うまい!
2020/09/29(火) 21:54:15.29ID:6fvRDqpi
_beginthreadexだけは許さんよ
もっとも醜悪な名前だわ
2020/09/29(火) 21:58:00.70ID:LdxVDSVq
MJD?
2020/10/01(木) 23:20:42.73ID:rwmZapHm
>>363 すれち
2020/10/18(日) 23:53:11.43ID:cRjbazHq
http://eternalwindows.jp にはWin32の核心部分が載ってる。参考になる記事だ。
2020/10/27(火) 20:43:03.29ID:rXCQsaV4
GetOpenFileName で初期ディレクトリとして OPENFILENAME の lpstrInitialDir に
任意のディレクトリを指定してファイルを開くダイアログを開いていて、おおよそ
意図した通りに動いているのですが、"C:\Users\Public\Documents"を指定したときだけ
初期ディレクトリが現在使用中ユーザーのドキュメントディレクトリになってしまいます

アクセス権のない他のユーザーのドキュメントディレクトリを指定したのなら
このような動作は理解できるのですが、パブリックディレクトリでこのように
なってしまうのは仕様でしょうか?
368デフォルトの名無しさん
垢版 |
2020/10/28(水) 11:43:37.22ID:Mf8tEr2f
SHGetSpecialFolderPath
2020/10/28(水) 17:45:50.04ID:DoZwgPmf
パブリックディレクトリの取得方法を聞いているわけではないのですが
"C:\Users\Public\Documents" は存在する有効なパスです
370デフォルトの名無しさん
垢版 |
2020/10/28(水) 18:30:52.56ID:Mf8tEr2f
再現した
C:\Users\Public
ならちゃんと public が開くが
C:\Users\Public\Documents
にすると自分のアカウントに行ってしまう
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況