X



Win32API質問箱 Build124
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 垢版2017/11/11(土) 19:23:00.69ID:TpLoCFAx
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/
0402デフォルトの名無しさん垢版2018/05/29(火) 22:34:39.42ID:7/wI9AnP
Windows10で仮想デスクトップを使った場合
そのどちらのデスクトップに自作アプリがあろうとも
GetDC(0)って現在表示しているデスクトップを取得するんだな

子ウィンドウだけを仮想デスクトップに移動しておいて
その子ウィンドウにスクリーン・ショットを取らせようと考えていたんだが
所詮、仮想なんだ?
もしかしてGetDC(1)で仮想の方を取得できないかもやったが真っ白だた
0403デフォルトの名無しさん垢版2018/05/30(水) 07:12:33.93ID:tkaPgK/f
そらgetdcの引数は仮想デスクトップ番号じゃないかならなw
ivirtualdesktopmanagerじゃそういうのできないしどうしたらいんだろうな
0404デフォルトの名無しさん垢版2018/05/30(水) 07:34:07.95ID:VLAeNwdW
アクティブじゃない仮想デスクトップにあるUWPアプリとか
サスペンドするようにもなってるしDWM的に無理じゃないかしら
0405デフォルトの名無しさん垢版2018/06/01(金) 04:15:17.48ID:LQ78zvmu
このスレがまだあってよかった。
いま時 Win32APIを使ってゴリゴリ書いてるんだけど、
RegisterClassEx 構造体の lpszClassName に指定する文字列って、
ローカルな変数で指定しても大丈夫? つまり、ウィンドウクラスの登録後に
文字列のメモリが解放されてしまうことになっても問題ない?
それとも文字列リテラル(静的文字列)じゃないとダメなの?
0406405垢版2018/06/01(金) 04:17:20.03ID:LQ78zvmu
すまそ、変な書き方をした。
>RegisterClassEx 構造体の

WNDCLASSEX 構造体の、lpszClassNameフィールド。
0408405垢版2018/06/01(金) 08:42:09.72ID:LQ78zvmu
>>407
ご回答ありがとうございます、了解です(>∀<;)
0411デフォルトの名無しさん垢版2018/06/13(水) 21:31:58.11ID:lSIEjw1a
x86だと先頭にアンダーバーが 後ろに@引数バイト数がついてたけど
それが無くなって関数名だけを勝手にエクスポートしてくれるみたいだ
0415デフォルトの名無しさん垢版2018/06/16(土) 12:34:33.29ID:eoVHJNOw
Windows7でRemoveMenu関数を使ってコマンドプロンプトのクローズボックスを無効化したあと
タイトルバーからプロパティが開けなくなるようですが、コマンドプロンプトを再起動する以外で
回避する方法はありますか?
0416デフォルトの名無しさん垢版2018/06/16(土) 12:41:21.25ID:fQgtrTpq
cmdが内部で特殊な処理してない限りそんなこと起きないと思うんだけど・・
単にプロパティの位置が一番下だから間違えて消してるんじゃない?
0418デフォルトの名無しさん垢版2018/06/16(土) 16:12:48.28ID:IDYLbmOn
コマンドプロンプトやPSのコンソールの実装はかなり特殊だよ
1ウィンドウと同じに考えてはいけないと思ってる
0419デフォルトの名無しさん垢版2018/06/16(土) 16:48:55.99ID:fQgtrTpq
本当かよっと思って試しにやってみたら何のトラブルもなく閉じるだけ消えてプロパティ開けるぞ
0420デフォルトの名無しさん垢版2018/06/20(水) 14:47:03.73ID:XFilFgQX
LOGFONTのlfUnderlineを設定したフォントで文字を描画した際、下線が引かれますが、
この下線の位置や太さを決定するルーチンはありませんか?
点線なども引けるようにするため、lfUnderlineを使わずに自分で描きたいのですが、
単純に下端に描くと、メイリオだと全然違う位置になってしまいます。
0421デフォルトの名無しさん垢版2018/06/20(水) 14:57:53.57ID:OnxnZInx
つまりアンダーラインが相対的にどこに来るかを指定してる属性を取りたいっていう質問でしょうか?
0422デフォルトの名無しさん垢版2018/06/20(水) 15:05:42.83ID:XFilFgQX
>>421
そういう感じです。
CreateFontIndirectで作成したフォントを使って文字を描画したあと、
その文字の位置に自分で下線を引きたいと思っています。
0423デフォルトの名無しさん垢版2018/06/20(水) 15:06:59.64ID:XFilFgQX
追記ですが、理想としてはlfUnderlineのときと
全く同じ位置や太さで描きたいと思っています。
0425デフォルトの名無しさん垢版2018/06/20(水) 15:34:01.33ID:mFWpedZK
質問者じゃないけど、フォント周りのコードを弄ってるときに
ベースラインやレディングについて実際に値が欲しいときがちょくちょくあったなあ。
結局分からなかった思い出。

>>424
結局概念しか分からないw

win32apiじゃなくて、これしかないのかな?
https://msdn.microsoft.com/en-us/library/windows/desktop/ms533824(v=vs.85).aspx
0426菩薩@太子垢版2018/06/21(木) 20:10:03.98ID:6ce+aANS
汝らよ、汝らはWin32APIに関してわからないことがあったら、このスレで質問しなさい。
そして我が見守るこのスレで、誉れと思って、おにーさんおねーさんたちから、適切なアドバイスを受けなさい。
0428デフォルトの名無しさん垢版2018/06/22(金) 06:16:52.85ID:kyYAMp48
芽っていう意味だよ
0429デフォルトの名無しさん垢版2018/06/22(金) 08:59:29.47ID:4s+1pzSQ
>>423
アセント、ディセントの値を取ってベースラインを割り出すとか出来たような…
とにかく、アセント、ディセントをググってみるのがいいと思う

昔、似たようなことやって、えらい苦労した覚えがあるわ
詳しいことはもうほとんど忘れた
0430デフォルトの名無しさん垢版2018/06/22(金) 20:00:29.48ID:HpQmxb21
DirectWriteだとカスタム描画用にIDWriteTextRenderer::DrawUnderlineというコールバックがあるで
0431デフォルトの名無しさん垢版2018/06/22(金) 20:21:26.56ID:vo7No3CM
もしかして GetTextMetrics で取得した TEXTMETRIC の tmAscent, tmDescent
で分かるんじゃないの?
0432415垢版2018/06/23(土) 09:44:08.76ID:UVw2sBCh
>>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);
/* 以下省略 */
0436デフォルトの名無しさん垢版2018/06/24(日) 10:53:22.32ID:7l22t7T7
そういう考えで今まで何度も宣伝してたのかw
ここはwin32api質問用のスレ。言い換えるとAPIの使い方に関するスレであって、
API使ってるアプリ紹介スレじゃないんだよ
0437デフォルトの名無しさん垢版2018/06/24(日) 10:54:03.26ID:QdNeiEeM
あ? なんだよ「C++11に準拠してarray::operator[]で範囲チェックしろ」とかラリってる糞コテは片山かよ
0440デフォルトの名無しさん垢版2018/06/24(日) 11:21:10.11ID:7l22t7T7
関係ないよ
質問内容によってはリソース編集が関係してくることはあるが、そんなソフトが関係することはまずない
044441垢版2018/06/24(日) 11:48:47.83ID:iIAhljkC
Win32Apiで何ができるかをを知り尽くしているが
Win32Apiが何をしているのかは何も知らない
0445デフォルトの名無しさん垢版2018/06/25(月) 01:12:02.96ID:R9m7k+sg
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+データキー」といったふうに送信したいのですが、
データキーしか送信されません。
何がいけないのでしょうか?
0447デフォルトの名無しさん垢版2018/06/25(月) 18:46:39.01ID:oo6U7F08
??非アクティブウィンドウのままがいいならこれでどうでしょう
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); // 実行前の状態に復帰
}
0448デフォルトの名無しさん垢版2018/06/25(月) 20:01:44.94ID:R9m7k+sg
レスありがとうございます。

このようにしてみたのですが、送りたいウィンドウがもともとアクティブな時は送信されるのですが、
アクティブ出ない場合、アクティブに出来ずに居ます。

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);
}

デバッグ情報を見る限り、ウィンドウハンドルは取得できてます。何がまずいのでしょうか?
0454デフォルトの名無しさん垢版2018/06/30(土) 18:06:34.48ID:RTJdtcUh
言いたかないがCOMでマジで糞だなと思うのは
アパートメントか何だか知らないが
勝手に内部でメッセージループ回すな!!!
たまにそうなって通常ではあり得ない順番で関数が呼ばれてデッドロックするんだよ糞野郎
そういう糞メソッド見つけるたびにメインスレッドとは別のスレッドで実行するように書き直すんだが
実に馬鹿らしい
どのオブジェクトのどのメソッドでそうなる可能性が有るかMSDNのどこにも書かれてないしな
どうしろと
0456デフォルトの名無しさん垢版2018/06/30(土) 19:40:38.36ID:RTJdtcUh
いやまじでさ
しかも今まで大丈夫だったのに最近のWindows10のアップデートを当てたら
なぜかメッセージループ回すようになったやつとかあるし
いつ何のタイミングでメッセージループが回るか分からねぇ
アパートメントモデルはマジで糞過ぎ
全部マルチスレッド対応でいいだろ意味不明
0457デフォルトの名無しさん垢版2018/06/30(土) 19:45:02.11ID:RTJdtcUh
ただスレッドモデルのせいでメッセージループが回ってるのかどうかは良くわからないんだがな
原因は分からんが勝手にメッセージループ回すのはマジで迷惑だからやめてほしい
何がどの順で実行されるか分からなくなるから
0458デフォルトの名無しさん垢版2018/07/04(水) 22:09:52.47ID:gFgZc5FG
548
0459デフォルトの名無しさん垢版2018/07/05(木) 06:45:33.22ID:uNMy++3S
Direct2D いいね。
4K画像もヌルヌルに縮小拡大表示できる。回転や鏡像反転も大丈夫だった。
0460デフォルトの名無しさん垢版2018/07/06(金) 20:02:27.82ID:xJt/yCDq
1台のPCにマウスAとBを接続し、
マウスAは普通のマウスとしてWindowsで、マウスBを特定のプログラムのみで使いたいのですが
どのようにすればよいでしょうか?
0461デフォルトの名無しさん垢版2018/07/06(金) 20:26:18.50ID:uwYbJKCZ
特定のプログラムのみで使うってのをどういう意味にするかだな
フィルタードライバ作ってBを潰すと同時に操作をアプリに送って、アプリから特定のプログラムへマウスメッセージでも送るとか
0462デフォルトの名無しさん垢版2018/07/08(日) 20:51:40.89ID:O/180cHX
Low-Level Mouse HookでデバイスIDは取れなかったと思うし
ソフトでやる場合ドライバまで降りるしかないね
0463デフォルトの名無しさん垢版2018/07/08(日) 23:36:33.06ID:aNDdpi7h
GetGlyphOutlineでサロゲートペアの文字のビットマップを取得するには
どうすればいいでしょうか
普通の2バイトの文字はできます

調べると、グリフインデックスを取得して〜みないな内容は
ぽつぽつ見つかったのですがよくわかりません
コピペして適当に真似てみたのですが、GGO_GLYPH_INDEXを指定すると
謎の小さいデータ(abc間隔とかいうやつでしょうか)が返ってくるだけです
これまた試しにGGO_GRAY8_BITMAP | GGO_GLYPH_INDEX とやってもサイズは0でした
0464デフォルトの名無しさん垢版2018/07/09(月) 17:38:45.00ID:1p1eFn95
INDEXをもらったら本体を取りに行く
0465デフォルトの名無しさん垢版2018/07/09(月) 21:03:04.88ID:xF/N3z+3
>>464
それはINDEXから直接アウトラインデータを持ってきて自前で処理するという意味でしょうか
本体を取りに行くというのがわからないです
0466デフォルトの名無しさん垢版2018/07/10(火) 19:32:28.56ID:Q7aC7GqH
カーネルモードからユーザーモードアプリにデータを渡すいい方法ないかな?
イメージとしてはマウスのボタンを押したらその情報をアプリが受け取るとか、ネットワークメッセージを受信したらそれをアプリに渡すというもの
CreateEventの通知と共有メモリ使えばできるけど、もっといい方法ないかな
0467デフォルトの名無しさん垢版2018/07/15(日) 04:33:45.21ID:Fuh1W0mR
>>463
これですがインデックス取得後、GGO_GRAY8_BITMAP | GGO_GLYPH_INDEXで
普通にサロゲートペアのビットマップを取得することが出来ました
原因は単にテストに使用していたフォントがサロゲートペアに対応してなかっただけでした…

もしそういうフォントの場合は
自分で取得前に代替フォントに切り替えるという認識であってますか
それともどこかで指定する方法はあるんでしょうか
0468デフォルトの名無しさん垢版2018/07/15(日) 07:18:20.84ID:F1eG7opL
>>466
> もっといい方法ないかな


「いい」はあなたの脳内でのみ定義された概念なので他人には答えようがない。
0472デフォルトの名無しさん垢版2018/07/15(日) 08:54:59.84ID:JD67P8Kl
プログラマなんてアスペキチばっかだから質問を読み取ってくれないのはよくあることよ
それにDDKスレ見りゃ分かるが質問は海外ですべき。国内じゃ回答つかん

共有メモリだとデータ欠落がありえるから(受け渡し済みデータをメモリ内から消す仕組みを作るのが大変だから)
FIFOにためて通知後にdeviceiocontrolで読み出させる
0473デフォルトの名無しさん垢版2018/07/15(日) 09:02:55.50ID:TNInTYOo
いい方法はわからないが正しい方法はあるだろう
システムはある方法が正解になる前提で全体ができている
それに逆らうと別の局面で何か問題が発生する
0474デフォルトの名無しさん垢版2018/07/15(日) 14:57:39.97ID:F1eG7opL
煽りぬきで、まず「いい」の定義から。
信頼性を優先するのか、速度を優先するのか、ソースコードの使いやすさを優先するのか、メモリ消費を抑えることを優先するのか、等。
0475デフォルトの名無しさん垢版2018/07/15(日) 15:00:46.43ID:JD67P8Kl
用途が挙げられてるからそこから読み取れってことよ
その用途で実装するならこういう処理の方が「いい」となる
0476デフォルトの名無しさん垢版2018/07/15(日) 15:19:18.62ID:F1eG7opL
質問者や発注者は、何を優先し、何を犠牲にする覚悟があるかを明確にすることが必要。
それは金であったり時間であったりする。お前らの工数と人件費を犠牲にしたい場合が多い。
0477デフォルトの名無しさん垢版2018/07/15(日) 15:24:35.14ID:blM5pGUx
まあ、「いい」は人それぞれな部分はあるかもしれないけど、そこやこだわりが書かれて無いならテキトーで良いんじゃね?
「お手軽な」という程度の解釈で。
0478デフォルトの名無しさん垢版2018/07/15(日) 15:38:50.77ID:F1eG7opL
発注側が受注側にわざと曖昧な要件を出して、受注側が提案したアイデアを無償で手に入れるのも重要な技術。
いかにしてコストを相手に押し付けるかが重要になる。
0479デフォルトの名無しさん垢版2018/07/15(日) 16:39:00.88ID:F1eG7opL
相手の自尊心を刺激しつつ、情報をタダで引き出す技術は極めて重要。省資源の基本。
0480デフォルトの名無しさん垢版2018/07/15(日) 18:54:11.43ID:z9dis41F
>>471
だよな
0481デフォルトの名無しさん垢版2018/07/15(日) 19:02:18.64ID:/PIdnGOp
逆に言えば「CreateEventの通知と共有メモリ」ではダメな理由は何なのか?
当人(>>466)が思うダメな理由が判れば、それを改善するものが「いい方法」なんじゃね?
0482デフォルトの名無しさん垢版2018/07/15(日) 19:29:32.13ID:JD67P8Kl
ネットワークモニターを共有メモリで実装すること考えたらダメと感じる理由分かるだろうよ
0484デフォルトの名無しさん垢版2018/07/16(月) 09:41:18.75ID:Tl1DHPio
memory mapped file
0485デフォルトの名無しさん垢版2018/07/16(月) 11:29:16.36ID:fjsGqhw7
共有メモリは誰が最後に開放するか問題があった気がする
代表プロセス(サービスとか)が全部やることにすればいいんだろうけど
0486デフォルトの名無しさん垢版2018/07/17(火) 09:35:44.28ID:3FwnZhxD
Win32APIでHDCに描画していくルーチンでPDFを作成できて、
プリンタドライバではなくDLLなどで提供されているものはありませんか?

ユーザーが印刷でAcrobatなどを選択するのではなく、専用のコマンドを用意して、
DLLのAPIからHDCを作成してそこに描画していく、という方法を探しています。
0489デフォルトの名無しさん垢版2018/07/17(火) 14:53:09.38ID:+kxKOOfA
HDC って描いてるからダメなんだろうけど
win32api じゃなくて良ければ
matplotlib の dll
0492さまよえる蟻人間 ◆T6xkBnTXz7B0 垢版2018/07/17(火) 21:32:24.00ID:o/CsZXJt
PDFは、Win32APIの範疇じゃないから、HDCにこだわる必要はないと思う。
どうしてもHDCで描くなら、ビットマップを使うことになる。
0495486垢版2018/07/18(水) 09:13:26.55ID:b6TTATjh
やっぱりこういうライブラリは無いものなんですかね。

プリンタのHDCに対する印刷処理は実装済みで、
普通にAcrobatなどを選んで印刷すればPDFは作成できるので、
PDF作成用のHDCさえ作れれば、Acrobatなどに依存せずに、
今の処理でPDFを作成できるんじゃないかと思った次第です。

もちろん、プリンタのHDCに描画する処理とは別に、
PDFを作成する処理を新たに作れば可能なんでしょうけど、
今の印刷結果と一致させるもの大変そうだと思いました。
0496デフォルトの名無しさん垢版2018/07/18(水) 09:30:56.80ID:XytxFrpz
HDC→bmp→手書きPDFの調子で画像埋め込みpdf生成
これで終わり。1日あればできるでしょw
0500デフォルトの名無しさん垢版2018/07/18(水) 10:49:35.82ID:XytxFrpz
HDCをDLLから作れないと思う。プリンタドライバ入れないと無理じゃないかな
それでもプリンタドライバを入れたくない&HDC使いたいってなら、手書きPDFしかないと思う
HDC使う処理を全てフックして手書きPDF処理に渡して生成
フォントは埋め込めるし、当然座標指定もできるから見た目を合わせるのは難しいことじゃない
■ このスレッドは過去ログ倉庫に格納されています

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