Win32API質問箱 Build126
■ このスレッドは過去ログ倉庫に格納されています
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/ おまいらGetLastErrorの戻りやHRESULTからstd::system_errorを投げるのに何使ってる? https://docs.microsoft.com/ja-jp/windows/win32/medfound/mfcaptured3d-sample
ここのサンプルを使ってwebカメラのキャプチャをしているのですが、
サンプルを実行すると勝手にオートフォーカスになります。
Media foundationを使ってマニュアルフォーカスにしたいのですが、
やり方が分かる方はいらっしゃいますでしょうか。 IMEで確定前の入力をキャンセルされるにはどうすればよいでしょうか? >>257
自己解決しました
>>258
'ESCキーを押します' 関数は無かったですね。 画面右下に IMEのON/OFF状態が表示されていますが、これをプログラムで
取得する方法はありますでしょうか? >>262
大事な点として、自分のアプリでの状態ではなく、システム全体での状態が取得
したいということがあります。 >>263
メモ帳開く(A)
→半角状態にする
→もう一つメモ帳を開く(B)
→全角状態にする
Aがアクティブになると半角に
Bがアクティブになると全角に
後はわかるな? >>264
それは、現在アクティブな(フォーカスを持っている)アプリに依存すると言うことですが、
タスクバーの右下には、ON/OFFが出ているので、システムは現在、どちらの状態
かを分かっているわけです。
その状態を知る方法が知りたいです。 自分のアプリがアクティブじゃない時でも状態をリアルタイムで知りたいって事?
もしそうならフック そもそもIMEの設定でアプリ毎に切り替えるかシステム全体で切り替えるかを選ぶから
そっちも観ておかないと判断出来ない いや、キーボードはひとつなんだから難しく考えるなよ >>268
IMEをON/OFFするキーバインドは、複数種あることと、カスタマイズすれば、
変更することも出来るので、単に全角/半角キーが押された回数をトラッキング
していけば済むわけではないと思います。
ALT+全角キーだけで反応する流儀と、ALTを押さずに、全角キーだけ押して
反応する流儀もありますし。 ImmGetOpenStatus
まあ>267の言うとおりの問題はあるので、Windows全般でどうなっているのかという
判断が必要ならば仕様の見直しが必要 IMM32を実装できる方はReactOSを助けて下さい。 >>266
やはり、フックですか。
実は、この件でのフックでの実験は既にやってみて、成功したことがあります。
ただし、フックは、32BITと64BITで DLL を分ける必要があるため、
実験したのは、32BITのみでした。
64BITにも対応しなくてはならないので、手間がかかるので中断してます。 >>262
GetDC(null)で画面全体のdevice contextを取得
bitblt()で画面イメージをメモリーDCに取得
>画面右下に IMEのON/OFF状態が表示
の部分を画像比較でON/OFF状態を判定 >>273
キーボードフックならdll作らんでもいいぞ >>276
そうでしたか?
フックを始めるための API 関数名やフラグ定数名やモードなどを教えていただければ幸いです。 32bit用に描いたフックを64bit用に描き治すのってそんなに大変? >>279
普段使っている処理系が古くて、64BITに対応の処理系は、今まで使っていませんでしたので。 普通にsetwindowshookexでできるぞ
wmwareアクティブだとマウスとキーボードフック全部効かなくなるけどなんとかならないのかな キーボードとマウスのフックでモジュールのハンドルとスレッドid0だとdllいらない
ほかは駄目なのあるけど
あと64bitで作っておけば32bitのフックもわざわざしなくていい >>282
>あと64bitで作っておけば32bitのフックもわざわざしなくていい
これはもしかすると、32BITアプリの場合、64BITのDLLのフック関数を OS
が呼び出してくれると言うことでしょうか? 32bitで実験やったんなら移植もすぐだからやってみればいい
dll使わずにする場合も専用APIとか無いし >>272
成功して欲しいOSだけど、日本語入力で行き詰まってるんなら先は長そうだね
>>274
表示位置で取得ってタスクバーの位置が変動するから無理があるのでは
デザインが少し変わっただけでも死ぬ
>>277
IMEのON/OFFのキーバインドなんて環境で様々なんだからキーボードフックなんかじゃ実現無理なの分かれよ
アプリ側でもプログラム的にON/OFFするのに
そもそもアプリ問わずIMEの状態を取得する意味あるのか?何したいんだよ 意味があるかどうかは外野がとやかく言うことではない 意味の有無を聞いてるとしか読み取れないのはどうかと思う 素直に質問に答えりゃ良いんだよ
質問自体を疑問に思う必要などない 質問が間違ってるから答える気にもならないことはある どうせ32bitでなら実験したってのが嘘で試しようがないんでしょ その実験は、凄く上手く行きました、と言っておきます。 IMEのON/OFFはマウスやアプリでも出来るからな
そっちの対応はどうするんだろ 皆キーボードフックしか言ってないけど
IMN_SETCONVERSIONMODE捕まえればいいやん
それもやったってんなら64bit対応するだけやん ONはともかくIME入力中だとOFFしても入力中のIMEのうにょうにょが消えないのだが ONだと普通の数字は全角なのに
テンキーだと半角
ちゃんと分岐してるならテンキーのうにょうにょも無しにしたらいいのに おまいらGetCommandLineが返した文字列からコマンド名だけ除いた部分て、どうやって得てる? やっぱり自前でコマンド名だけ取り除くしかないのかな
空白や引用符に特別な意味を持たせたくないんだけど MFCならCCommandLineInfoなんだがな。 CreateProcess見るといろいろな指定の仕方ができそうで不安になるよね >>296
そんなの使わずにWinMainの3rdパラメータ使う /a //b /c:"text"
この場合b無視すんの? >>303
CWinApp::ParseCommandLine()は__argcと__argvを見ているだけだけどな 質問なんですがWindowsのカレントディレクトリって
アプリ毎に持ってるものなんでしょうか?
それとも全アプリ共通なのでしょうか? >>309
スレッド毎に違うんですね!ありがとうございました。安心しました。 >>312
自分がそうだからといって他人もそうだと思うのはよくないな 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:
・・・ ということは、同一プロセス内の別スレッドでSetCurrentDirectoryが発行されると
自スレッドのカレントがいつの間にか変わっているということが起きるのか カレントディレクトリの取得なんて、グローバル変数から情報を取ってくるようなもんなので危険ってことだ
そんなもん使うな >>315
もちろんそういうこと。
というより、カレントディレクトリも、広い意味で「UI」に関係したものと
考えられなくもないので、必ず Mainスレッドから取得するようにすれば、
安全と言える。絶対そうしなくてはならないわけではないが。
Window作製、グラフィック描画、マウス、キーボードからの入力なども、
Mainスレッドで行うのが原則。
これも絶対そうでなくてはならないというわけではないかも知れないが、
敢えて Subスレッドでやる意味も余り無い事が多く、Mainスレッドに限定
すれば、さまざまな危険回避のための余計なことを考えなくて済むメリットがある。 >>317
補足すれば、カレントディレクトリは、MS-DOS時代では、command.com
が管理していたもので、アプリごとに異なるわけではなかったはず。
というのは、カレントディレクトリを便利に変更できるツールを作りたい
場合などに、アプリローカルであれば、不便だったからだと思う。
その設計哲学や文化や習慣が、Windowsにも受け継がれる必要は有ったと思う。
Unixの環境変数なども、アプリローカルになっていたりするが、意外と不便な
事も多い。 何を根拠に長文をw
INT21 AH=3B の説明を読み直し要 >>315
>自スレッドのカレントがいつの間にか変わっている
自分で管理できないスレッドなんてあるのか?
その別スレッドだって自分で作ったものだろ?
DLLとか自分で管理していないものもあるけどそれはスレッド関係ないわけだし DCE-RPCは電文受信すると勝手に
処理スレッドたててくれるよ >>320
別スレッドにするってことは自スレッドとの間にタイミングの束縛がない処理を任せるってことだよな
カレントディレクトリの変更がプロセス内の他のスレッドにも伝搬するということは
それはタイミングの束縛が生じうるってことだろ
つまり、それが困るなら別スレッドにしてはならない処理内容ってことで
そこの判断こそが「自分で管理」ということだ スレッドがお互いを信用できないとか、そんな羅生門みたいなプログラムは嫌だなぁ。 指定フォルダ以下のファイルをすべて処理するプログラムで
サブフォルダごとにスレッドを起動してみよう そんなバッチファイルみたいなアルゴリズムでカレントディレクトリ移動しながらマルチスレッドをやるとかがそもそも迂闊だよな。 >>329
マルチスレッドじゃなくてマルチプロセスなら作業ディレクトリは完全に分離できる。
せっかくマルチタスクOSを使っているのだから、別プロセスに丸投げするのが最適だよ。 タスクマネージャー開けばわかるけど、今時のWebブラウザ(具体的にはEdgeやFirefox等)はたくさんの子プロセスを動かしている。 sse2までが必須になったのはいつだったか覚えませんか
win-7の途中くらい? win32apiを使っている人は、普段の文字コードは
stringとwchar_tを使っているのでしょうか。 ありがとうございます。
調べてみます。
stringを使いたいのに、win32apiは変換が必要?なので躊躇しています。 CreateProcessのユニコード版(W)の第2引数がリテラルだとうまくいかない件
これはハマったわ。
CreateProcess(TCHAR)でメモ帳起動させるサンプルで
_T("C:\\Windows\\notepad.exe")を直接与えてもCとしてコンパイルするとうまくいってて
c++にしたら起動しなくなったが、エラーが出ないから全然気づかなかったわ
ネットのCreateProcessのサンプルも普通に与えてるしなあ
考えてみれば実運用でこの部分は文字リテラル決め打ちにめったにならないから
知らずに回避してることも多いのかも LPTSTR で受け取ってるから書き換え可能なメモリアドレスでないとあかんのじゃないのん?
リテラルは const で書き換え不可だし 一回変数経由しないと 自転車🚴のような絵文字をstd::stringで持つにはSJISではなくUTF-8として保持しておいて、
画面などの出力する直前にUTF-8からUTF-16に変換してUnicode版出力関数を呼び出す必要がある。 >>339
>lpCommandLine
>実行するコマンドライン。
>この文字列の最大長は、Unicodeで終了するnull文字を含めて32,767文字です。 lpApplicationNameがNULLの場合、lpCommandLineのモジュール名の部分はMAX_PATH文字に制限されます。
>この関数のUnicodeバージョンであるCreateProcessWは、この文字列の内容を変更できます。
>したがって、このパラメーターを読み取り専用メモリー(const変数やリテラル文字列など)へのポインターにすることはできません。
>このパラメーターが定数文字列の場合、関数はアクセス違反を引き起こす可能性があります。 >>339
argvに渡すから非constだぞって話か 非 const の引数に const リテラル与えたら
コンパイルエラーにならないか? それがエラーになるなら固定文字列を渡せなくなるやん >>346
C++11以後、そうなった筈だけどcl.exeはversion 19.27.29111でも通す(もち/W4で) Win32API全部作り直してほしい
くだらない部分で人間の時間を消費しすぎだろw >>349
自分でラッパーでも作ればいいんじゃね?
作れない低能なら諦めるしかないだろうけど ■ このスレッドは過去ログ倉庫に格納されています