X



Win32API質問箱 Build126

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
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/
0254デフォルトの名無しさん
垢版 |
2020/08/03(月) 13:41:03.78ID:3aFKjSal
関数を使います
0255デフォルトの名無しさん
垢版 |
2020/08/03(月) 22:17:32.43ID:uGqrBkR1
糞翻訳はポイーで
0257デフォルトの名無しさん
垢版 |
2020/08/20(木) 16:41:05.34ID:TZFigD9E
IMEで確定前の入力をキャンセルされるにはどうすればよいでしょうか?
0259257
垢版 |
2020/08/20(木) 17:04:27.56ID:TZFigD9E
>>257
自己解決しました

>>258
'ESCキーを押します' 関数は無かったですね。
0262デフォルトの名無しさん
垢版 |
2020/08/21(金) 01:55:16.52ID:SPVvFNrm
画面右下に IMEのON/OFF状態が表示されていますが、これをプログラムで
取得する方法はありますでしょうか?
0263デフォルトの名無しさん
垢版 |
2020/08/21(金) 01:58:58.71ID:SPVvFNrm
>>262
大事な点として、自分のアプリでの状態ではなく、システム全体での状態が取得
したいということがあります。
0264デフォルトの名無しさん
垢版 |
2020/08/21(金) 10:04:56.98ID:XusJMwC4
>>263
メモ帳開く(A)
→半角状態にする
→もう一つメモ帳を開く(B)
→全角状態にする

Aがアクティブになると半角に
Bがアクティブになると全角に
後はわかるな?
0265デフォルトの名無しさん
垢版 |
2020/08/21(金) 10:10:54.09ID:SPVvFNrm
>>264
それは、現在アクティブな(フォーカスを持っている)アプリに依存すると言うことですが、
タスクバーの右下には、ON/OFFが出ているので、システムは現在、どちらの状態
かを分かっているわけです。
その状態を知る方法が知りたいです。
0266デフォルトの名無しさん
垢版 |
2020/08/21(金) 10:27:29.32ID:XusJMwC4
自分のアプリがアクティブじゃない時でも状態をリアルタイムで知りたいって事?
もしそうならフック
0267デフォルトの名無しさん
垢版 |
2020/08/21(金) 11:14:24.59ID:6zccVHNz
そもそもIMEの設定でアプリ毎に切り替えるかシステム全体で切り替えるかを選ぶから
そっちも観ておかないと判断出来ない
0268デフォルトの名無しさん
垢版 |
2020/08/21(金) 14:02:23.66ID:oq5BC8ZW
いや、キーボードはひとつなんだから難しく考えるなよ
0269デフォルトの名無しさん
垢版 |
2020/08/21(金) 16:28:33.73ID:hY6Ml5La
>>268
IMEをON/OFFするキーバインドは、複数種あることと、カスタマイズすれば、
変更することも出来るので、単に全角/半角キーが押された回数をトラッキング
していけば済むわけではないと思います。
ALT+全角キーだけで反応する流儀と、ALTを押さずに、全角キーだけ押して
反応する流儀もありますし。
0271デフォルトの名無しさん
垢版 |
2020/08/21(金) 17:34:52.11ID:Ci3Fu54P
ImmGetOpenStatus

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

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

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

>>277
IMEのON/OFFのキーバインドなんて環境で様々なんだからキーボードフックなんかじゃ実現無理なの分かれよ
アプリ側でもプログラム的にON/OFFするのに
そもそもアプリ問わずIMEの状態を取得する意味あるのか?何したいんだよ
0289デフォルトの名無しさん
垢版 |
2020/08/30(日) 15:09:45.20ID:GgAZZaQa
質問が間違ってるから答える気にもならないことはある
0292デフォルトの名無しさん
垢版 |
2020/08/30(日) 17:36:51.12ID:IbTRMPI+
IMEのON/OFFはマウスやアプリでも出来るからな
そっちの対応はどうするんだろ
0293デフォルトの名無しさん
垢版 |
2020/08/30(日) 19:00:20.18ID:ClA8nGT1
皆キーボードフックしか言ってないけど
IMN_SETCONVERSIONMODE捕まえればいいやん
それもやったってんなら64bit対応するだけやん
0294デフォルトの名無しさん
垢版 |
2020/08/31(月) 20:27:32.61ID:YgYq5nQZ
ONはともかくIME入力中だとOFFしても入力中のIMEのうにょうにょが消えないのだが
0295デフォルトの名無しさん
垢版 |
2020/08/31(月) 21:02:36.79ID:fGHCeYBV
ONだと普通の数字は全角なのに
テンキーだと半角
ちゃんと分岐してるならテンキーのうにょうにょも無しにしたらいいのに
0296デフォルトの名無しさん
垢版 |
2020/09/07(月) 07:46:03.38ID:h3kjQIhT
おまいらGetCommandLineが返した文字列からコマンド名だけ除いた部分て、どうやって得てる?
0299デフォルトの名無しさん
垢版 |
2020/09/07(月) 08:39:11.94ID:h3kjQIhT
やっぱり自前でコマンド名だけ取り除くしかないのかな
空白や引用符に特別な意味を持たせたくないんだけど
0301デフォルトの名無しさん
垢版 |
2020/09/07(月) 10:21:46.55ID:Egt+Qwmp
結果にコミットする気が無い回答者たち
0304デフォルトの名無しさん
垢版 |
2020/09/07(月) 14:10:25.67ID:MtDNWdkb
CreateProcess見るといろいろな指定の仕方ができそうで不安になるよね
0308デフォルトの名無しさん
垢版 |
2020/09/08(火) 01:38:27.47ID:BXhGoa38
質問なんですがWindowsのカレントディレクトリって
アプリ毎に持ってるものなんでしょうか?
それとも全アプリ共通なのでしょうか?
0311デフォルトの名無しさん
垢版 |
2020/09/08(火) 11:55:58.97ID:POT3YWIT
プロセスごとだろ
嘘つくなよ
0314デフォルトの名無しさん
垢版 |
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:

・・・
0315デフォルトの名無しさん
垢版 |
2020/09/08(火) 13:29:57.92ID:oUJlYCUI
ということは、同一プロセス内の別スレッドでSetCurrentDirectoryが発行されると
自スレッドのカレントがいつの間にか変わっているということが起きるのか
0316デフォルトの名無しさん
垢版 |
2020/09/08(火) 13:50:32.04ID:JNlu12o+
カレントディレクトリの取得なんて、グローバル変数から情報を取ってくるようなもんなので危険ってことだ
そんなもん使うな
0317デフォルトの名無しさん
垢版 |
2020/09/08(火) 14:09:32.72ID:5CeoL0rA
>>315
もちろんそういうこと。
というより、カレントディレクトリも、広い意味で「UI」に関係したものと
考えられなくもないので、必ず Mainスレッドから取得するようにすれば、
安全と言える。絶対そうしなくてはならないわけではないが。
Window作製、グラフィック描画、マウス、キーボードからの入力なども、
Mainスレッドで行うのが原則。
これも絶対そうでなくてはならないというわけではないかも知れないが、
敢えて Subスレッドでやる意味も余り無い事が多く、Mainスレッドに限定
すれば、さまざまな危険回避のための余計なことを考えなくて済むメリットがある。
0318デフォルトの名無しさん
垢版 |
2020/09/08(火) 14:13:07.26ID:5CeoL0rA
>>317
補足すれば、カレントディレクトリは、MS-DOS時代では、command.com
が管理していたもので、アプリごとに異なるわけではなかったはず。
というのは、カレントディレクトリを便利に変更できるツールを作りたい
場合などに、アプリローカルであれば、不便だったからだと思う。
その設計哲学や文化や習慣が、Windowsにも受け継がれる必要は有ったと思う。
Unixの環境変数なども、アプリローカルになっていたりするが、意外と不便な
事も多い。
0320デフォルトの名無しさん
垢版 |
2020/09/08(火) 18:38:57.08ID:HYNPtfS+
>>315
>自スレッドのカレントがいつの間にか変わっている
自分で管理できないスレッドなんてあるのか?
その別スレッドだって自分で作ったものだろ?
DLLとか自分で管理していないものもあるけどそれはスレッド関係ないわけだし
0322デフォルトの名無しさん
垢版 |
2020/09/08(火) 19:34:11.85ID:oUJlYCUI
>>320
別スレッドにするってことは自スレッドとの間にタイミングの束縛がない処理を任せるってことだよな
カレントディレクトリの変更がプロセス内の他のスレッドにも伝搬するということは
それはタイミングの束縛が生じうるってことだろ
つまり、それが困るなら別スレッドにしてはならない処理内容ってことで
そこの判断こそが「自分で管理」ということだ
0325デフォルトの名無しさん
垢版 |
2020/09/08(火) 22:47:13.26ID:txiCBqFi
スレッドがお互いを信用できないとか、そんな羅生門みたいなプログラムは嫌だなぁ。
0327デフォルトの名無しさん
垢版 |
2020/09/09(水) 00:11:58.92ID:VoppH/up
指定フォルダ以下のファイルをすべて処理するプログラムで
サブフォルダごとにスレッドを起動してみよう
0328デフォルトの名無しさん
垢版 |
2020/09/09(水) 09:51:28.66ID:9MEEjZyT
フォルダ間移動ですね判ります
0329デフォルトの名無しさん
垢版 |
2020/09/09(水) 11:03:42.50ID:w9YsWEn5
そんなバッチファイルみたいなアルゴリズムでカレントディレクトリ移動しながらマルチスレッドをやるとかがそもそも迂闊だよな。
0330デフォルトの名無しさん
垢版 |
2020/09/10(木) 08:55:55.87ID:YCiClA3r
>>329
マルチスレッドじゃなくてマルチプロセスなら作業ディレクトリは完全に分離できる。
せっかくマルチタスクOSを使っているのだから、別プロセスに丸投げするのが最適だよ。
0331デフォルトの名無しさん
垢版 |
2020/09/10(木) 08:57:16.11ID:YCiClA3r
タスクマネージャー開けばわかるけど、今時のWebブラウザ(具体的にはEdgeやFirefox等)はたくさんの子プロセスを動かしている。
0336デフォルトの名無しさん
垢版 |
2020/09/22(火) 08:18:54.27ID:EoOf3jnh
win32apiを使っている人は、普段の文字コードは
stringとwchar_tを使っているのでしょうか。
0338デフォルトの名無しさん
垢版 |
2020/09/22(火) 12:46:05.64ID:EoOf3jnh
ありがとうございます。
調べてみます。

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

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

考えてみれば実運用でこの部分は文字リテラル決め打ちにめったにならないから
知らずに回避してることも多いのかも
0340デフォルトの名無しさん
垢版 |
2020/09/22(火) 14:14:47.55ID:iCejn/78
>>336
>>338
wstring
0342デフォルトの名無しさん
垢版 |
2020/09/22(火) 14:16:37.87ID:5Q3AK6nV
LPTSTR で受け取ってるから書き換え可能なメモリアドレスでないとあかんのじゃないのん?
リテラルは const で書き換え不可だし 一回変数経由しないと
0343デフォルトの名無しさん
垢版 |
2020/09/22(火) 14:22:15.75ID:uF0JvJPV
自転車🚴のような絵文字をstd::stringで持つにはSJISではなくUTF-8として保持しておいて、
画面などの出力する直前にUTF-8からUTF-16に変換してUnicode版出力関数を呼び出す必要がある。
0344デフォルトの名無しさん
垢版 |
2020/09/22(火) 15:28:51.96ID:J6Z/5nZW
>>339
>lpCommandLine
>実行するコマンドライン。
>この文字列の最大長は、Unicodeで終了するnull文字を含めて32,767文字です。 lpApplicationNameがNULLの場合、lpCommandLineのモジュール名の部分はMAX_PATH文字に制限されます。
>この関数のUnicodeバージョンであるCreateProcessWは、この文字列の内容を変更できます。
>したがって、このパラメーターを読み取り専用メモリー(const変数やリテラル文字列など)へのポインターにすることはできません。
>このパラメーターが定数文字列の場合、関数はアクセス違反を引き起こす可能性があります。
0346デフォルトの名無しさん
垢版 |
2020/09/25(金) 10:57:09.24ID:4ovx1Tzj
非 const の引数に const リテラル与えたら
コンパイルエラーにならないか?
0349デフォルトの名無しさん
垢版 |
2020/09/25(金) 18:33:43.19ID:M9uVftQk
Win32API全部作り直してほしい
くだらない部分で人間の時間を消費しすぎだろw
0352◆QZaw55cn4c
垢版 |
2020/09/25(金) 21:02:31.80ID:DCkHs+Bt
>>349
どんなところがダメなんでしょうか?
■ このスレッドは過去ログ倉庫に格納されています

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