Win32API質問箱 Build124
■ このスレッドは過去ログ倉庫に格納されています
Win32APIについての質問はこちらへどうぞ。 ■注意 ・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。 ・日本語版MSDN Online Libraryは不完全です。 英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。 ・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。 ・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで ■過去スレ Win32API質問箱 Build123 http://mevius.2ch.net/test/read.cgi/tech/1475897582/ Win32API質問箱 Build122 http://echo.2ch.net/test/read.cgi/tech/1451988219/ Win32API質問箱 Build121 http://echo.2ch.net/test/read.cgi/tech/1438695290/ Win32API質問箱 Build120 http://echo.2ch.net/test/read.cgi/tech/1428570962/ ■関連スレ Visual Studio 2017 Part4 http://mevius.2ch.net/test/read.cgi/tech/1509244956/ 【C++】 DirectX初心者質問スレ Part40 【C】 http://mevius.2ch.net/test/read.cgi/tech/1474782237/ 鳴らす毎に固まるん? ロード画面とかでオープンだけ先にやっておいて 後は鳴らし終わったら最初にシークしてまた鳴らしたらいいんでない? 的外れてたらごめんな すみません。自己解決しました。 キーが連続して入力されたと判定されないように 前回から0.1秒以下の間隔で入力されたキーを無視する部分で レンダリングまで無視してしまっていました。 度々すみません。 音の再生で画面が固まらないようには出来たのですが、 オープン、シークを事前に行っておいても再生までに少し時間がかかってしまいます。 例えばクリックでクリック音を鳴らせるようにすると、クリックを連打した時に鳴らなくなってしまいます。 クリック音は1フレーム目から音が鳴るように調整済みで、高速化のためwavファイルにしてあります。 core i5 8250u, m.2 ssdの環境で最適化ビルドでも再生まで0.2秒以上かかります。 mcisendcommandを高速に動作させる方法はないでしょうか? 20年近く前に設置されたお手軽APIにリアルタイム性を求めるのもな… ゲーム用の効果音ならDirectXTKのAudio(XAudio2のラッパー)がお手頃かしら キーボードの入力だけを無効化するAPIを教えてください BlockInputだとキーボードとマウスの両方が無力化されてしまうので。 ないじゃねーんだよアホ だったらどうすりゃ実現できるのか教えろよ >>381 教えろよじゃねーんだよアホ だったらどうなりゃ理想なのか教えろよ 指定したプロセスのみ無効化? 全てのプロセスで無効化? BlockInputを試したという事は全てのプロセスで無効化でいい? BlockInputはそのスレッドだけじゃないかな おまえらこんな糞な奴のをよく答える気になるなw キーボードを取り外す 展示とかに使うならこれだなw easyhookを使えるようにするにはどうすればいいのですか? たすけて ごめんなさい プログラムするんじゃなくて、インストールの仕方、使えるようにする方法がわからない ducumentationにインストール方法書いてあるじゃん どれ?。。 プロジェクトに追加されてたらOKなの? EasyHookをつかってるプログラムが動かないんだけど RemoteHooking.Injectがエラーになる ducumentationからコピペ Adding EasyHook to your project 1.Open your project in Visual Studio, or create a new one. 2.Right-click your project within the Solution Explorer and select “Manage NuGet Packages…”. 3.Search for “EasyHook” 4.Select the EasyHook package and click install. After accepting the license agreement your project is ready to use EasyHook. あるならEasyHookをつかってるプログラムのスレ 無いなら入手元良く見る 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方 役に立つかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 IAVAJ Windows10で仮想デスクトップを使った場合 そのどちらのデスクトップに自作アプリがあろうとも GetDC(0)って現在表示しているデスクトップを取得するんだな 子ウィンドウだけを仮想デスクトップに移動しておいて その子ウィンドウにスクリーン・ショットを取らせようと考えていたんだが 所詮、仮想なんだ? もしかしてGetDC(1)で仮想の方を取得できないかもやったが真っ白だた そらgetdcの引数は仮想デスクトップ番号じゃないかならなw ivirtualdesktopmanagerじゃそういうのできないしどうしたらいんだろうな アクティブじゃない仮想デスクトップにあるUWPアプリとか サスペンドするようにもなってるしDWM的に無理じゃないかしら このスレがまだあってよかった。 いま時 Win32APIを使ってゴリゴリ書いてるんだけど、 RegisterClassEx 構造体の lpszClassName に指定する文字列って、 ローカルな変数で指定しても大丈夫? つまり、ウィンドウクラスの登録後に 文字列のメモリが解放されてしまうことになっても問題ない? それとも文字列リテラル(静的文字列)じゃないとダメなの? すまそ、変な書き方をした。 >RegisterClassEx 構造体の WNDCLASSEX 構造体の、lpszClassNameフィールド。 登録されたら、文字列の内容が記録されるから、ローカル変数で結構毛だらけ。 >>407 ご回答ありがとうございます、了解です(>∀<;) declspec dllexport使ってなかったから気づかなかったけど x64で仕様変わったんだな x86だと先頭にアンダーバーが 後ろに@引数バイト数がついてたけど それが無くなって関数名だけを勝手にエクスポートしてくれるみたいだ Windows7でRemoveMenu関数を使ってコマンドプロンプトのクローズボックスを無効化したあと タイトルバーからプロパティが開けなくなるようですが、コマンドプロンプトを再起動する以外で 回避する方法はありますか? cmdが内部で特殊な処理してない限りそんなこと起きないと思うんだけど・・ 単にプロパティの位置が一番下だから間違えて消してるんじゃない? RemoveMenu呼び出しの周辺のコードさらせ。 コマンドプロンプトやPSのコンソールの実装はかなり特殊だよ 1ウィンドウと同じに考えてはいけないと思ってる 本当かよっと思って試しにやってみたら何のトラブルもなく閉じるだけ消えてプロパティ開けるぞ LOGFONTのlfUnderlineを設定したフォントで文字を描画した際、下線が引かれますが、 この下線の位置や太さを決定するルーチンはありませんか? 点線なども引けるようにするため、lfUnderlineを使わずに自分で描きたいのですが、 単純に下端に描くと、メイリオだと全然違う位置になってしまいます。 つまりアンダーラインが相対的にどこに来るかを指定してる属性を取りたいっていう質問でしょうか? >>421 そういう感じです。 CreateFontIndirectで作成したフォントを使って文字を描画したあと、 その文字の位置に自分で下線を引きたいと思っています。 追記ですが、理想としてはlfUnderlineのときと 全く同じ位置や太さで描きたいと思っています。 質問者じゃないけど、フォント周りのコードを弄ってるときに ベースラインやレディングについて実際に値が欲しいときがちょくちょくあったなあ。 結局分からなかった思い出。 >>424 結局概念しか分からないw win32apiじゃなくて、これしかないのかな? https://msdn.microsoft.com/en-us/library/windows/desktop/ms533824 (v=vs.85).aspx 汝らよ、汝らはWin32APIに関してわからないことがあったら、このスレで質問しなさい。 そして我が見守るこのスレで、誉れと思って、おにーさんおねーさんたちから、適切なアドバイスを受けなさい。 さすれば、弥勒菩薩が降臨するまでに回答が得られるであろう >>423 アセント、ディセントの値を取ってベースラインを割り出すとか出来たような… とにかく、アセント、ディセントをググってみるのがいいと思う 昔、似たようなことやって、えらい苦労した覚えがあるわ 詳しいことはもうほとんど忘れた DirectWriteだとカスタム描画用にIDWriteTextRenderer::DrawUnderlineというコールバックがあるで もしかして GetTextMetrics で取得した TEXTMETRIC の tmAscent, tmDescent で分かるんじゃないの? >>416-419 原因が分かりました ↓のGetSystemMenuをTRUEで呼ぶ箇所をなくしたら、実行後でもプロパティが表示されました MSDNに「TRUE を指定すると、この関数は、ウィンドウメニューをリセットして Windows の既定の状態へ戻します。」と 書いてあったので、cmdなら起動直後の状態に戻るものだとばかり・・・orz HMENU hmenu; /* ボタンの状態を変更する前に、コンソールのカスタマイズを取り消す */ GetSystemMenu(GetConsoleWindow(), TRUE); /* コンソールメニューハンドルのコピーを取得する */ hmenu = GetSystemMenu(GetConsoleWindow(), FALSE); /* 引数に応じて "閉じる"、"最小化"、"最大化" 各ボタンを無効化する */ if (!(button_stat & 0x01)) RemoveMenu(hwnd, SC_CLOSE, MF_BYCOMMAND); /* 以下省略 */ そういう考えで今まで何度も宣伝してたのかw ここはwin32api質問用のスレ。言い換えるとAPIの使い方に関するスレであって、 API使ってるアプリ紹介スレじゃないんだよ あ? なんだよ「C++11に準拠してarray::operator[]で範囲チェックしろ」とかラリってる糞コテは片山かよ >>436 リソースエディタがWin32APIに関係ないって? >>437 誤解です。関係ない話を勝手に結び付けないで下さい。 5ちゃんねるは、広告料と浪人の収益によって成り立っています。 関係ないよ 質問内容によってはリソース編集が関係してくることはあるが、そんなソフトが関係することはまずない コマーシャルの仕組みについて皆さまのご理解をお願い致します。 お前ら、Win32を知り尽くしているんだろ? だれかReactOSで日本語入力できるようにしてくれよ。 Win32Apiで何ができるかをを知り尽くしているが Win32Apiが何をしているのかは何も知らない if(sa::sendkey[cnt]!=NULL){ if(sa::sendcontrol[cnt]) SendNotifyMessage(sa::hWndSa, WM_KEYDOWN, VK_CONTROL, 0 ); if(sa::sendalt[cnt]) SendNotifyMessage(sa::hWndSa, WM_KEYDOWN, VK_MENU, 0 ); if(sa::sendshift[cnt]) SendNotifyMessage(sa::hWndSa, WM_KEYDOWN, VK_SHIFT, 0 ); SendNotifyMessage(sa::hWndSa, WM_KEYDOWN, sa::sendkey[cnt], 0 ); SendNotifyMessage(sa::hWndSa, WM_KEYUP, sa::sendkey[cnt], 1); if(sa::sendshift[cnt]) SendNotifyMessage(sa::hWndSa, WM_KEYUP, VK_SHIFT, 1); if(sa::sendalt[cnt]) SendNotifyMessage(sa::hWndSa, WM_KEYUP, VK_MENU, 1); if(sa::sendcontrol[cnt]) SendNotifyMessage(sa::hWndSa, WM_KEYUP, VK_CONTROL, 1); } sa::sendkeyにデータキーが有る時、sa::sendcontrol、sa::sendalt、sa::sendshiftがtrueならば、 「Ctrl+Alt+Shift+データキー」といったふうに送信したいのですが、 データキーしか送信されません。 何がいけないのでしょうか? keybd_eventもしくはsendinput使う ??非アクティブウィンドウのままがいいならこれでどうでしょう ShiftとEndの同時押しが出来ることを確認しました void send_shift_and_end() { HWND hWnd = FindWindow(L"Notepad", NULL); if (hWnd == NULL) { return; } HWND hEdit = FindWindowEx(hWnd, NULL, L"Edit", L"" ); if (hEdit == NULL) { return; } BYTE kstats[256], shiftstat; DWORD srctid, dsttid; srctid = GetCurrentThreadId(); dsttid = GetWindowThreadProcessId(hEdit, NULL); AttachThreadInput(srctid, dsttid, TRUE); GetKeyboardState(kstats); // 実行前の状態を保存 shiftstat = kstats[VK_SHIFT]; kstats[VK_SHIFT] |= 0x80; // shift を押下状態に SetKeyboardState(kstats); // 状態を更新 SendMessage(hEdit, WM_KEYDOWN, VK_END, 0); // SendMessage は OK, PostMessageは NG kstats[VK_SHIFT] = shiftstat; SetKeyboardState(kstats); // 実行前の状態に復帰 } レスありがとうございます。 このようにしてみたのですが、送りたいウィンドウがもともとアクティブな時は送信されるのですが、 アクティブ出ない場合、アクティブに出来ずに居ます。 if(sa::sendkey[cnt]!=NULL){ //ターゲットををアクティブに HWND hWndTemp = SetActiveWindow(sa::hWndSa); char t0[256 + MAX_PATH]; sprintf(t0, "sa::hWndSa:%d(%x), hWndTemp:%d(%x)", sa::hWndSa, sa::hWndSa, hWndTemp, hWndTemp); strscr_set(t0); //Key Event送信 if(sa::sendcontrol[cnt]) keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY | 0, 0); if(sa::sendalt[cnt]) keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY | 0, 0); if(sa::sendshift[cnt]) keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY | 0, 0); keybd_event(sa::sendkey[cnt], 0, KEYEVENTF_EXTENDEDKEY | 0, 0); keybd_event(sa::sendkey[cnt], 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); if(sa::sendshift[cnt]) keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP | 0, 0); if(sa::sendalt[cnt]) keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); if(sa::sendcontrol[cnt]) keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); //元のウィンドウをアクティブに SetActiveWindow(hWndTemp); } デバッグ情報を見る限り、ウィンドウハンドルは取得できてます。何がまずいのでしょうか? ちょっと>>447 さんの方法も試してみます。 有り難うございます。 Ctrl+Alt+Delは、セキュリティで保護されているんじゃ中田家? >>447 さんの方法で無事うごきました。 ありがとうございましたm(_ _)m SetActiveWindow の代わりに SetForegroundWindow を試してみたら? 言いたかないがCOMでマジで糞だなと思うのは アパートメントか何だか知らないが 勝手に内部でメッセージループ回すな!!! たまにそうなって通常ではあり得ない順番で関数が呼ばれてデッドロックするんだよ糞野郎 そういう糞メソッド見つけるたびにメインスレッドとは別のスレッドで実行するように書き直すんだが 実に馬鹿らしい どのオブジェクトのどのメソッドでそうなる可能性が有るかMSDNのどこにも書かれてないしな どうしろと いやまじでさ しかも今まで大丈夫だったのに最近のWindows10のアップデートを当てたら なぜかメッセージループ回すようになったやつとかあるし いつ何のタイミングでメッセージループが回るか分からねぇ アパートメントモデルはマジで糞過ぎ 全部マルチスレッド対応でいいだろ意味不明 ただスレッドモデルのせいでメッセージループが回ってるのかどうかは良くわからないんだがな 原因は分からんが勝手にメッセージループ回すのはマジで迷惑だからやめてほしい 何がどの順で実行されるか分からなくなるから Direct2D いいね。 4K画像もヌルヌルに縮小拡大表示できる。回転や鏡像反転も大丈夫だった。 1台のPCにマウスAとBを接続し、 マウスAは普通のマウスとしてWindowsで、マウスBを特定のプログラムのみで使いたいのですが どのようにすればよいでしょうか? 特定のプログラムのみで使うってのをどういう意味にするかだな フィルタードライバ作ってBを潰すと同時に操作をアプリに送って、アプリから特定のプログラムへマウスメッセージでも送るとか Low-Level Mouse HookでデバイスIDは取れなかったと思うし ソフトでやる場合ドライバまで降りるしかないね GetGlyphOutlineでサロゲートペアの文字のビットマップを取得するには どうすればいいでしょうか 普通の2バイトの文字はできます 調べると、グリフインデックスを取得して〜みないな内容は ぽつぽつ見つかったのですがよくわかりません コピペして適当に真似てみたのですが、GGO_GLYPH_INDEXを指定すると 謎の小さいデータ(abc間隔とかいうやつでしょうか)が返ってくるだけです これまた試しにGGO_GRAY8_BITMAP | GGO_GLYPH_INDEX とやってもサイズは0でした >>464 それはINDEXから直接アウトラインデータを持ってきて自前で処理するという意味でしょうか 本体を取りに行くというのがわからないです カーネルモードからユーザーモードアプリにデータを渡すいい方法ないかな? イメージとしてはマウスのボタンを押したらその情報をアプリが受け取るとか、ネットワークメッセージを受信したらそれをアプリに渡すというもの CreateEventの通知と共有メモリ使えばできるけど、もっといい方法ないかな >>463 これですがインデックス取得後、GGO_GRAY8_BITMAP | GGO_GLYPH_INDEXで 普通にサロゲートペアのビットマップを取得することが出来ました 原因は単にテストに使用していたフォントがサロゲートペアに対応してなかっただけでした… もしそういうフォントの場合は 自分で取得前に代替フォントに切り替えるという認識であってますか それともどこかで指定する方法はあるんでしょうか ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる