X



Win32API質問箱 Build125

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2019/02/27(水) 15:09:08.64ID:6ExXwgQU
Win32APIについての質問はこちらへどうぞ。

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

■過去スレ
Win32API質問箱 Build124
http://mevius.5ch.net/test/read.cgi/tech/1510395780/
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 2019
http://mevius.5ch.net/test/read.cgi/tech/1548765663/
Visual Studio 2017 Part6
http://mevius.5ch.net/test/read.cgi/tech/1528645068/
【C++】 DirectX初心者質問スレ Part41 【C】
http://mevius.5ch.net/test/read.cgi/tech/1521786252/
0176デフォルトの名無しさん
垢版 |
2019/06/11(火) 14:20:31.55ID:lbh69FdF
初心者質問です。
VBAからIEで印刷するときにプリンター選択を自由に行いたいです。

プリンタを選択する部分は、syslistview32というクラス名で、hwndまでわかっています。
sendmessageの、LVM_GETITEMCOUNTで、プリンターの数まで取得できることを確認しました。
今は、LVM_SETITEMSTATEで、構造体とテキトーなindexをsetして、sendmessageをしたら、IEが落ちてしまうような状態です。

メモリー書き込みも考慮しなければいけないなど情報も見かけましたが、VBA半年程度しかやっていないので、OSに近い処理は何から調べたらいいのかわかりません

プリンター名が指定の文字列に該当するもののindexをsyslistview32から取得し、syslistview32の選択をそのindexにするような、VBAのコードをお教えいただくことはできないでしょう。(Cなどでも大丈夫です。)

以上、よろしくお願いします。
0180デフォルトの名無しさん
垢版 |
2019/06/11(火) 16:18:02.74ID:DThKFJnr
>>176
デフォルトのプリンタを取得して保存しとく
デフォルトのプリンタ変更する
IEで印刷開始
デフォルトのプリンタもとに戻す

こんなんじゃだめなのか?
0182デフォルトの名無しさん
垢版 |
2019/06/11(火) 17:55:31.55ID:b3tPk+od
>>180
ありがとうございます
今はそれで運用しているのですが、デフォルトプリンターを変更しても、IEで現在立ち上げているページのプリンターの選択は変わりませんでした。(新しいタブやページなどは変わる)

ですので、デフォルトプリンターを変更した後タブを複製して、そのタブをアクティブにして、複製されていないhtmlの箇所をコピーして、印刷して、タブを閉じて、デフォルトプリンターを元に戻すような処理にしています。

プリンターを変更しないといけない処理が過去にあったりしたそうなので、その場でプリンター選択を操作できるのであれば、知りたいという感じです
0184デフォルトの名無しさん
垢版 |
2019/06/11(火) 19:34:28.79ID:iv+iCaIJ
別プロセスからメッセージ投げるから、IEが構造体にアクセスできないってことでしょ?
VirtualAllocExでメモリ確保してそこに構造体用意しては

LVM_GETITEMCOUNT
0185デフォルトの名無しさん
垢版 |
2019/06/11(火) 20:56:45.31ID:HsLA7EXf
>>175
じゃあ何のために158みたいな戯れ言をぬかしたんだ?
アホだからか? それともバカだからか?
0186デフォルトの名無しさん
垢版 |
2019/06/11(火) 21:07:50.93ID:oRHFwQ78
>>185
なんで>>158から社員が出てくるんだよ
理解できていないのは>>143って事だぞ

全く同じって事が(>>143には)理解できていないから>>143みたいな発言になるんだろ
って事だぞ
0187デフォルトの名無しさん
垢版 |
2019/06/11(火) 22:59:27.04ID:xU3mv9gp
意味が分からん。
ドキュメントが間違ってるだけで、マクロ関数はintで実装されてるから気にせず使えって話で合ってる?
0189デフォルトの名無しさん
垢版 |
2019/06/14(金) 00:21:25.69ID:TGTlo7vf
WiteProcessMemoryの返り値が0になる(´・ω・`)
GetSharedMemの返り値 のアドレスが、「-1597046784」 とか返ってくる(´・ω・`)
Long型(-200万〜200万くらい)なのに(´・ω・`)

助けてください(´・ω・`)

tid = GetWindowThreadProcessId(lngSysListView32, pid)

hProc = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, _
False, pid)

lpShared1 = GetSharedMem(hProc, LenB(li))
lpShared2 = GetSharedMem(hProc, LenB(lt))

For i = 0 To maxitem - 1

li.mask = LVIF_TEXT
li.iItem = i
li.iSubItem = 0
li.lpszText = lpShared2
li.cchTextMax = LenB(lt)

lngRC = WriteProcessMemory(hProc, ByVal lpShared1, li, LenB(li), lWritten)
lngRC = WriteProcessMemory(hProc, ByVal lpShared2, lt, LenB(lt), lWritten)


Public Function GetSharedMem(ByRef hProc As Long, ByVal memSize As Long) As Long
GetSharedMem = VirtualAllocEx(ByVal hProc, ByVal 0&, ByVal memSize, MEM_RESERVE Or MEM_COMMIT, PAGE_READWRITE)
End Function
0190デフォルトの名無しさん
垢版 |
2019/06/14(金) 01:18:48.45ID:udVNzUQx
176だよな・・・
GetSharedMemなんてAPIあったっけ?と思ったら、MSDNのサンプルまんま使ってるのかな?
lpShared2とかltとか変数の意味が分からん

この辺参考にして作り直したら
ttp://hongliang.seesaa.net/article/7851680.html
0191デフォルトの名無しさん
垢版 |
2019/06/14(金) 02:03:09.01ID:WbpzR08B
-1597046784==0xa0cf0000、別におかしくはなさそうな

>Long型(-200万〜200万くらい)なのに(´・ω・`)
VBA(VBS?)のLongって22bitなの?
10bit勘違いしてるだけでは?
0192デフォルトの名無しさん
垢版 |
2019/06/14(金) 07:51:56.01ID:AF2NDvCn
>>190
ありがとうございます
読んで理解して再度実装してみます

今回のコードはこれを丸コピして、プリンター選択画面に対して試してみているという感じです。(プリンター名一覧を取得できるかどうか)
https://teratail.com/questions/120773

>>192
うわ、本当だ。知れて良かったです。ありがとうございます
bit反転が起きていると思って、反転させてみたら(+2 ^32?)オーバーフローが起きて、勘違いしていました

LVM_SETITEMSTATEはここを参考にして書いていました
https://stackoverflow.com/questions/12342433/i-need-to-select-an-item-of-a-syslistview32-using-sendmessage-in-c-sharp?rq=1
https://oshiete.goo.ne.jp/qa/4705094.html

今調べたらこっちのはSolvedなので参考にしてみます
https://social.msdn.microsoft.com/Forums/vstudio/en-US/f7788669-c3a9-4d80-b61b-8e26870c7cf4/select-listviewitem-using-lvmsetitemstatesolved?forum=vbgeneral

いろいろと助かります
0193デフォルトの名無しさん
垢版 |
2019/06/14(金) 12:34:20.64ID:rNE5XrYC
馬鹿には無理
0194デフォルトの名無しさん
垢版 |
2019/06/14(金) 12:52:57.90ID:bpAwmG5b
ソフト業界でマイクロソフトは邪魔でしかない。
まともなものをよくするならいいが、悪するのがマイクロソフトで
しかも、おかしなものを直さず放置して悪化させる。
マイクロソフトは邪魔な存在でしかない。
マイクロソフトの弱点は仕様通りに作れないのは欠点は
同時に自社のソフトをWindows以外のデバイスへ移植できないことも意味する。
そこ弱点だし、将来性がないのもそのあたり。
Windowsの次のOSの仕組みを作ってもソフトの移植ができない。
来年か再来年あたりに出すわけだが引き継ぎできないだろうね。

昔にアーケードゲームの中途半端な移植のファミコンソフトレベルでしかない。
作っても何か違うって状態になる。
0195デフォルトの名無しさん
垢版 |
2019/06/14(金) 13:22:29.13ID:FKc1iwhz
>>194
突然どうした?
この朝鮮臭い駄文は窓板きっての汚物キチガイマカーのコピペと見受けるが
0197デフォルトの名無しさん
垢版 |
2019/06/14(金) 15:50:36.86ID:sZCV0u2+
>>194
>マイクロソフトの弱点は仕様通りに作れないのは欠点は
同時に自社のソフトをWindows以外のデバイスへ移植できないことも意味する。

この文章は日本語としておかしい。


>昔にアーケードゲームの中途半端な移植のファミコンソフトレベルでしかない。

この文章も日本語としておかしい
0198 ◆QZaw55cn4c
垢版 |
2019/06/14(金) 18:48:04.20ID:FySvhFYo
>>194
>悪するのが
>マイクロソフトの弱点は仕様通りに作れないのは欠点は同時に自社のソフトをWindows以外のデバイスへ移植できないことも意味する。
>そこ弱点だし
>そのあたり
>昔に

以上、日本語としておかしい部分を抽出したので訂正するように
0203デフォルトの名無しさん
垢版 |
2019/06/16(日) 15:19:28.33ID:RxcvAD6u
ダメだぁ...
WriteProcessMemory がどうしても失敗する(´・ω・`)

デスクトップのsyslistview32やexplorerのDirectUIHWNDでは成功(返り値1)するんだけど、
メモ帳やIEのプリンター選択のsyslistview32や、メモ帳のEditに対しては失敗(返り値0)する

なんでー?
0204デフォルトの名無しさん
垢版 |
2019/06/16(日) 15:34:33.84ID:RxcvAD6u
Err.LastDllError の番号は998で、
メモリ ロケーションへのアクセスが無効です。
0205デフォルトの名無しさん
垢版 |
2019/06/16(日) 17:12:52.81ID:Z9zSyDOE
WOW64
0206デフォルトの名無しさん
垢版 |
2019/06/16(日) 20:39:35.26ID:RxcvAD6u
>>205
64bit版でコンパイルしたら、32bit版のプロセスに介入することできないから難しいという感じでしょうか(´;Д;`)
64bit版のIEでも返り値は0でした...
Long型を、LongPtrにしてもダメでした...
0208デフォルトの名無しさん
垢版 |
2019/06/17(月) 11:24:55.79ID:lxO8a0KV
いよいよwindowsを捨てる時が来たようだ
0210デフォルトの名無しさん
垢版 |
2019/06/18(火) 06:23:28.70ID:3nOE2mBA
プログラム板にキチガイ降臨中!botに一晩も反応する異常さ
一般人(学校恩師)に殺害予告をしているのでスレ建て通報してください。
https://mevius.5ch.net/test/read.cgi/tech/1559872586/

142 名前:a4 ◆700L1Efzuv 投稿日:2019/06/18(火) 05:29:55 ID://qVkzO
>>141
名古屋の人な 俺ね、君の問題を大橋先生と混ぜないことにする。つまりね、
片桐孝洋のことをボコろうと思う。普通に顎の骨を折る。これくらいで警察来るか?
一般市民とかさ、普通にさ、俺らの秘密なんだけどさ、日本人なんて復活ねーから。
0212デフォルトの名無しさん
垢版 |
2019/06/22(土) 14:06:32.16ID:DZJ/hc7X
>>206
自分は一旦それで絶望して
32bitアプリ用のラッパー作って呼んでる
32bit資産使ってる人はみんなこうじゃないかな
0213デフォルトの名無しさん
垢版 |
2019/06/22(土) 14:29:13.02ID:8YBlX71B
seamless ωωω
0214デフォルトの名無しさん
垢版 |
2019/06/25(火) 16:44:22.77ID:hU5ITaEA
既存の Console に代わる Windows Terminal のプレビュー版が公開されたけど
今後コンソールアプリはどういう作りになるんだろう
既存の ConsoleAPI またはその拡張API になるのか
それともConsoleAPI は廃止されて Unix なんかと同様のエスケープシーケンスを制御する
curses ライブラリみたいのが提供されるのか

まぁオープンソースみたいだからソース見ればいいんだろうけど
0215デフォルトの名無しさん
垢版 |
2019/06/25(火) 16:58:20.59ID:vGWUuZ9A
初歩的な質問ですが、64bitのプロセスにもWin32APIって使えますか?
0216デフォルトの名無しさん
垢版 |
2019/06/25(火) 17:11:37.24ID:JYAeHTmF
使える
ただし、例えばGetWindowLongのようにポインタのビット数を決め打ちしている箇所に注意が必要
0217蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/06/25(火) 17:11:56.15ID:CrMrKXln
>>215
Win64APIではWoW64というシステムがWin32からWin64への互換性レイヤーになる。
0218デフォルトの名無しさん
垢版 |
2019/06/25(火) 17:35:47.56ID:XhZtJiMw
32bit OS の場合
System32 = 32bit 用 DLL (Win32API)

64bit OS の場合
System32 = 64bit 用 DLL (64bitWin32API)
SysWOW64 = 32bit 用 DLL (32bitWin32API)
0219デフォルトの名無しさん
垢版 |
2019/06/25(火) 17:37:53.13ID:vGWUuZ9A
ありがとうございます
これで気にせず昔の情報あされます
0220デフォルトの名無しさん
垢版 |
2019/07/10(水) 12:39:20.34ID:LrFGCWwq
SysListView32のリストビューで、縦スクロールバーが表示されている状態で、
アイテムをクリックして選択し、すぐにホイールを回してそのアイテムを画面外に出すと、
一定時間後にそのアイテムが表示される位置まで飛んでしまいます。

選択されていないアイテムよりも、すでに選択されているアイテムをクリックした方が、
ホイールを回すまでの時間が多少長くてもその現象が起きます。

これWindows自体のバグでしょうか。
内部のタイマー処理でも絡んでいるのでしょうか。
0221デフォルトの名無しさん
垢版 |
2019/07/10(水) 12:47:11.51ID:+uFplCdI
君が発見出来るような程度のバグなら
既に誰かが発見して治してるよ
0222デフォルトの名無しさん
垢版 |
2019/07/10(水) 12:50:54.60ID:z7915HRG
ホイールは3rdパーティーのマウスドライバや常駐もので
余計にメッセージ飛ばしたりすることあるから厄介
0223デフォルトの名無しさん
垢版 |
2019/07/10(水) 13:04:08.77ID:GamN/JFp
Win10の一年位前のビルドでSysListView32がスクロールバーを出してる状態でドラッグすると
画面右端にカーソルがすっ飛ぶバグがあったな
SysListView32使ってるアプリは多いからこれは一般ユーザーもすぐに気付い
0224デフォルトの名無しさん
垢版 |
2019/07/10(水) 13:14:56.30ID:LrFGCWwq
>>222
ホイールでなくスクロールバーのドラッグでも起きました。
操作が難しくなりますが、アイテムをクリックして選択し、
すぐにスクロールバーをドラッグしてそのアイテムを画面外に出すと、やはり同じ現象が起きます。
0225デフォルトの名無しさん
垢版 |
2019/07/11(木) 10:11:43.64ID:Bpzge626
全然関係なくて申し訳ないが
シングルクリックとダブルクリックの判定って結構難しいよな
クリックのメッセージが飛んできても
シングルクリックのつもりなのか
ダブルクリックの一回目のクリックのつもりなのか
その時点では判断が付かない
なのでダブルクリックの二回目のクリックが飛んで来るかどうか
少し時間をおいてみるしかない
この間にユーザーが何か操作すると
0227デフォルトの名無しさん
垢版 |
2019/07/11(木) 10:24:15.51ID:dt9f58xR
アホ発見
0229デフォルトの名無しさん
垢版 |
2019/07/11(木) 10:32:56.46ID:Bpzge626
>>226
WM_LBUTTONDBLCLKが飛んで来たらダブルクリック
でも飛んでこないかもしれない(つまりシングルクリック)という事だよ
飛んでくるかどうかは少し待ってみないとわからない
エクスプローラでファイルの名前の変更するとき
少し待たされるあの動作
タイマー使ってWM_LBUTTONDBLCLKが来るか少し待ってみるっていう
でもこの魔の時間にユーザーが操作することがあって
例えばホイール回したりスクロールバー触ったり
0231デフォルトの名無しさん
垢版 |
2019/07/11(木) 10:56:55.16ID:dt9f58xR
ダブルクリックはシングルボタンのAppleから持ち込まれた悪臭
0234デフォルトの名無しさん
垢版 |
2019/07/12(金) 00:14:57.72ID:B1Jsh2gD
あれ?シングルクリックってダブルクリックになったら、マージされてダブルクリックで処理されると思っていた。
0236デフォルトの名無しさん
垢版 |
2019/07/12(金) 10:36:37.27ID:ueORW37F
>>234
マージされるのは二回目のクリック
今言ってるのは一回目のクリックをどう扱うかという話
この一回目のクリックは
シングルクリックのつもりなのか
ダブルクリックの一回目なのか
コンピュータには知る由もない
0237デフォルトの名無しさん
垢版 |
2019/07/12(金) 12:00:48.30ID:Y/iKed6k
なんでここまで説明しないと分からんのだろ
特にハイコンテクストって訳でもないのに
0238デフォルトの名無しさん
垢版 |
2019/07/12(金) 12:24:57.20ID:gSsTJBIy
誰が誰に対して?
1回目の誰が2回目の誰に対してマージされて処理されるのか?
おやすみ
0239デフォルトの名無しさん
垢版 |
2019/07/12(金) 12:53:40.57ID:nIUn02wm
GetCursorPosでポインターの場所、GetKeyStateでマウスボタンが押されてるか離されてるか
取得できるから、あとは時間測って適当にクリックとダブルクリック、ドラッグを判別する
SwapMouseButtonで右利き左利きとか、GetDoubleClickTimeでダブルクリック判定する時間とか
そんなのを設定できるようにしとけば完璧

これがおまえらが一番納得する方法だろwww
0240デフォルトの名無しさん
垢版 |
2019/07/12(金) 17:04:32.98ID:Uu5c0ODM
自信満々で嘘書くな迷惑
0241デフォルトの名無しさん
垢版 |
2019/07/13(土) 05:00:55.61ID:5W75r4eA
クリック動作はダブルクリックの直前に発生しても致命的にならないものであればいんでない?
クリック 選択
ダブルクリック 実行
これを逆にするようなら難しくなるだけかと
0242デフォルトの名無しさん
垢版 |
2019/08/04(日) 16:34:02.68ID:78/vdzUN
QueryPerformanceFrequencyが10000000を返してくるようになってた
将来はQPCは常に100ナノ秒単位で表しますよってなっていくんだろうか
今回たまたま自分の環境がそうなってしまっただけなんだろうか
0244デフォルトの名無しさん
垢版 |
2019/08/05(月) 13:40:42.17ID:NOA3rn3w
グロ中尉
0245デフォルトの名無しさん
垢版 |
2019/08/07(水) 11:59:12.69ID:6nD1xIcw
現在、AddFontResourceとRemoveFontResourceを使って
プログラムからフォントを登録して使っています。
でもこの方法だと、RemoveFontResourceを呼んでも
システムを再起動しないと登録されたままになってしまいます。
その間はフォントファイルも削除できないです。
どうにかプログラム使用時だけフォントを有効にする方法はないでしょうか?
プログラム終了すれば登録されたフォントも登録解除されるような方法がいいです。
0246デフォルトの名無しさん
垢版 |
2019/08/07(水) 12:59:48.16ID:u0NlqDQ2
>>245
ドキュメントを読むとWM_FONTCHANGEをブロードキャストする必要があるらしいけどやってる?
もしくはAddFontResourceExでFR_PRIVATEを指定すると
> When the process terminates, the system will remove all fonts installed by the process with the AddFontResourceEx function
とあるからそれに頼るのもありかも
0247デフォルトの名無しさん
垢版 |
2019/08/07(水) 13:05:20.88ID:6nD1xIcw
>>246
AddFontResourceExでFR_PRIVATE指定でもしかするといけるかもしれませんね!
試してみます。ありがとうございます。
0248デフォルトの名無しさん
垢版 |
2019/09/05(木) 10:39:03.32ID:qYKhXOia
質問させてください。

日本語の Windows10 で、Windows Explorer のアドレスバーに
日本語で「デスクトップ」とだけ入力してエンターキーを押すとデスクトップに移動できます。
他にも、「ドキュメント」「ピクチャ」「ダウンロード」「3D オブジェクト」「OneDrive」など
いくつかの単語が特定のフォルダーと関連付けられていますが、
この対応をプログラムで調べる方法はありますでしょうか。

例えば SHGetFileInfo を使えばデスクトップのフルパスから
「デスクトップ」という日本語の display name を得ることはできますが、
SHGetFileInfo では上記のような関連付けの有無は判定できませんし、
そもそもフルパスから日本語名を得るのではなくその逆をしたいので、
SHGetFileInfo はあまり役に立たなそうです。

何かお分かりのことがありましたら教えていただけないでしょうか。
どうぞよろしくお願いします。
0250蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/05(木) 11:22:27.86ID:sYiofqED
SHGetLocalizedNameという関数が日本語パス名を返すみたいだが、逆はない。

SHGetSpecialFolderLocation/SHGetSpecialFolderPathで特殊フォルダのパス名を取得し、
SHGetLocalizedNameで日本語パス名を取得する。
それで対応表を作るといいだろう。
0251デフォルトの名無しさん
垢版 |
2019/09/05(木) 11:23:33.11ID:A2EHupI7
それは対応表作るにしても結構苦労するよ
例えば俺のWin10のユーザフォルダの中を見ると
同じフォルダ内にドキュメント、と、ピクチャ、が二つずつあったりする
ディスプレイネームが同じでITEMIDLISTが違うアイテムが
同一フォルダに複数存在してたりする環境もあるって事
俺の場合は片方はOneDriveでもう一つはローカル用
同じ名前で同じフォルダ
だから単にドキュメントといってもどっちの事か分からんwwwという事態に
苦労するよ、それ
0252デフォルトの名無しさん
垢版 |
2019/09/05(木) 11:28:46.02ID:A2EHupI7
てか、同じ名前のアイテムを同一フォルダに突っ込むWindowsが糞仕様なんだけど
普通に使う分にもどっちがどっちか分からんでムカつく
OneDriveの方は「ドキュメント(OneDrive)」とか区別付く名前にしとけよ
それかOneDriveっていうフォルダ掘ってその下に配置しろよ
同じ名前のアイテムが同じフォルダにあると混乱することぐらい分かるだろ糞
0254デフォルトの名無しさん
垢版 |
2019/09/05(木) 12:29:13.60ID:Cn2xW5Dx
アクセス履歴見ながら対応表を順次変更すりゃいい
そういうのはアイデア次第でどうとでもなる
0255デフォルトの名無しさん
垢版 |
2019/09/05(木) 12:30:06.05ID:qYKhXOia
>>249
レスどうもありがとうございます。
他の方のレスを拝見してみても、やっぱりなかなか難しそうですね。

>>250
大変有用な情報どうもありがとうございます。この方針が一番現実的そうですね。
SHGetSpecialFolderLocation/SHGetSpecialFolderPath は
CSIDL しか受け付けなくて、「3D オブジェクト」のように CSIDL がないフォルダもあるので、
CSIDL の代わりに GUID が使える SHGetKnownFolderIDList を使おうと思います。
ただいずれにしても、どのフォルダの CSIDL/GUID を指定するかは
プログラムの段階で決めないという認識で正しいでしょうか?
その部分を自動で決められれば最高なのですが難しそうですね。
あと、日本語名を取得するのに SHGetLocalizedName を紹介していただきましたが、
SHGetFileInfo を使うのとどちらがいいでしょうか?
SHGetFileInfo なら直接日本語名が得られるのに対して、SHGetLocalizedName だと
'the ID of the localized file name in the resource file' が返ってきますが、
こちらのほうがパフォーマンス的に有利だったりするのでしょうか?

>>251
貴重なご意見どうもありがとうございます。確かになかなか問題の根は深そうです。
エクスプローラーのアドレスバーはそのあたりをいい感じに解決しているようなので
その仕組みをそのまま拝借できたら楽なのですが、そう簡単には行かなさそうですね。
0256デフォルトの名無しさん
垢版 |
2019/09/05(木) 12:39:12.77ID:qYKhXOia
>>252 >>254
レスどうもありがとうございます。
確かに Windows のフォルダ階層の仕組みは少し分かりにくいところがありますが、
今回の件についてはその問題はあまり関係なくて、
ちょっと誤解を与えてしまっている気がするので改めてやりたいことを説明させていただきます。

エクスプローラでは、今どのフォルダを開いているかにかかわらず、
アドレスバーに単に「デスクトップ」とだけ入力してエンターキーを押せばデスクトップに移動できます。
つまり、エクスプローラーの中では「デスクトップ」という単一の単語とデスクトップのフルパスとが
対応付けられているということになります。そして私は、この対応表を取得したいと考えております。
0257デフォルトの名無しさん
垢版 |
2019/09/05(木) 13:04:18.60ID:REbzCKHr
質問です。

ファイルに関連付けされている実行ファイルパスを取得するのに
FindExecutable()やAssocQueryString()を使っているのですが、
一部関連付けが取得できません。

どうやら関連付け先の実行ファイルの種類がWindowsパッケージ(デスクトップ)版と
ストアアプリ版とでは動作が異なるらしく、パッケージ版は上記APIで取得できる
ようですがストアアプリ版は取得できないようです。

仕方がないのでレジストリを直接たどる方法を模索しているのですが、
パッケージ版は分かるのですがストアアプリ版がよく分りません。

自分で調べた限りでは、HKCR\{拡張子}\OpenWithProgidsのREG_NONE型の{名前}
を元に、HKCR\{名前}\ApplicationのApplicationNameまでたどればいいと
いう情報を見つけて実践してみました。が、
0258デフォルトの名無しさん
垢版 |
2019/09/05(木) 13:05:00.53ID:REbzCKHr
(つづき)
実際に.pdfがedgeに関連付けられていて上記APIでは取得できない環境
においてレジストリをたどると
 \HKCR\.pdf\OpenWithProgids
のREG_NONE型の名前「AppXd4nrz8ff68srnhf9t5a8sbjyar1cr723」を元に
 \HKCR\AppXd4nrz8ff68srnhf9t5a8sbjyar1cr723\Application
のApplicationNameまではたどり着きました。

しかしこれに設定されている文字列が
 @{Microsoft.MicrosoftEdge_44.18362.329.0_neutral__8wekyb3d8bbwe?ms-resource://Microsoft.MicrosoftEdge/Resources/AppName}
となっています。
どう見ても実行パスではないというか、これをさらにどうにかするのか
たどる方法が間違っているのか分からなくなりました。

正しい方法をよろしくお願いします。
0259デフォルトの名無しさん
垢版 |
2019/09/05(木) 13:11:24.93ID:d3q2zCXJ
>>256
試しにmspaintと入力してエンター押したらペイントが起動しない?
と言う事は入力が日本語ならC:\Users\<ユーザー名>\この中の対応するフォルダを開く
とか内部でやってるんじゃないかな

英語の場合はLoadLibraryと同じように
Explorer.exeと同じディレクトリ
Explorer.exeのカレントディレクトリ
システムディレクトリ
Windowsディレクトリ
環境変数のPATHに指定されてるディレクトリ
の順で検索されてmspaintが起動とか
0261デフォルトの名無しさん
垢版 |
2019/09/05(木) 22:24:50.64ID:qYKhXOia
>>259
レスありがとうございます。お返事が遅くなってしまい申し訳ないです。

> 試しにmspaintと入力してエンター押したらペイントが起動しない?
本当ですね!
しかし一方で、C:\Users\<ユーザ名>\AppData というフォルダはあるのに
アドレスバーに AppData と入力してエンターを押しても期待通りの動作はせず、
なかなかルールは複雑みたいです。

また、日本語環境ではアドレスバーに「Desktop」と入力してエンターを押しても
期待される動作にはならず、「デスクトップ」でなければならないようなので、
やはりシステムの言語設定は関係あるように思われます。

SHGetFileInfo で取得できる displayName を調べれば
日本語環境ならデスクトップフォルダから「デスクトップ」という文字列が得られるので
その逆ができればいいかと思ったのですが、実際はそれほど簡単な問題ではないようです。

例えば私の環境では C:\Users\<ユーザ名> の displayName は
ウィンドウズの GUI から設定できる「ユーザ名(アカウント名)」になっていますが、
エクスプローラーのアドレスバーで期待通りの動作になる文字列は
「ユーザ名(アカウント名)」ではなく「フルネーム」でした。

エクスプローラーのアドレスバーの動作を完全に模倣するのは難しそうですが、
ここでいただいたアドバイスを元に、現実的な方法を考えていきたいと思います。
0263デフォルトの名無しさん
垢版 |
2019/09/06(金) 19:55:29.68ID:H/ygVIaK
>>261
いくつか気付いた事を報告 その1/2

・ユーザーフォルダ内のフォルダで移動できたもの
 アドレス帳
 お気に入り
 デスクトップ
 ドキュメント
 ピクチャ
 ビデオ
 ミュージック
仮説1 〜\<ユーザー名>\(日本語名で表示される一部のフォルダ)って条件なのかもしれない
仮説2 仮説1の一部のフォルダで法則があるとしたらレジストリで保存場所を変更できるフォルダではないか?
     試しに「プログラム」「スタートアップ」と入力しても移動できた
     レジストリの「HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders」
     ここに列挙されてるやつがヒントになるかもしれない
・レジストリをヒントに入力して移動できたもの
 プログラム
 recent
 sendto
 スタート メニュー
 スタートアップ
・その他で移動できたもの (ツリービューで日本語表記をヒントにした)
 パブリック
 コンピュータ
 ネットワーク
 コントロール パネル
 ごみ箱
0264デフォルトの名無しさん
垢版 |
2019/09/06(金) 20:02:10.05ID:H/ygVIaK
いくつか気付いた事を報告 その2/2

・ここまでの間に気付いた事
アドレスバーに「コ」と入力すると
 コントロール パネル
 コンピュータ
 コンピュータの簡単操作センター
この3つの入力候補が現れたけど
入力候補が表示されるのとされないのもあった

あと日本語・英語混在(sendto recent)でさらに混乱させる事になってしまったかもしれないw
0265デフォルトの名無しさん
垢版 |
2019/09/06(金) 20:40:37.12ID:H/ygVIaK
ドキュメントがDocumentsの表示になった時の直し方で
LocalizedResourceNameが出てくるからそれをヒントにするのもいいかもしれない
0266デフォルトの名無しさん
垢版 |
2019/09/06(金) 23:22:21.54ID:ZBxclhCf
>>262
コメントどうもありがとうございます。
色々とレジストリにもヒントが隠れてそうなので調べてみたいと思います。

>>263-265
大変有用な情報どうもありがとうございます。
書いていただいた内容を見ながら実験してみて分かったこととして、
問題のアドレスバーの挙動は環境によって相当にブレがあるようです。

私の環境(Windows 10 Pro)では、
>>263 に書いていただいた文字列のうち
「recent」「コンピュータ(ちなみにコンピュータ『ー』もダメ)」は
期待通りの動作にならず、代わりにブラウザ(私の環境では Firefox)で
入力した文字列が検索されてしまいました。

私の環境ではアドレスバーに「Creative Cloud Files」と入力すると
対応する Adobe のソフトが作ったフォルダが開かれるので
ある程度外部ソフト等の影響があるだろうとは思っていたのですが、
「コンピュータ」ですら環境によって結果が異なるとは予想外でした。

ちなみに外部ソフトの影響に関しては、レジストリの
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace
に登録されているものが該当しているような気がするのですが、
確かなことは分かっていません。

ともあれ、非常に興味深い実験結果と考察を読ませていただき
大変勉強になりました。どうもありがとうございます。
また何かお気づきのことがあれば教えていただけると嬉しく思います。
0268デフォルトの名無しさん
垢版 |
2019/09/07(土) 09:58:32.00ID:dh6f1+zl
これはひどい
0270デフォルトの名無しさん
垢版 |
2019/09/12(木) 18:25:54.76ID:h3dV0Q14
Win32アプリのバージョンリソースについての質問です。
自作アプリの1.0.0をリリースした後、1.1.0を作成中にベータ版を出す場合、
リソースのFILEVERSIONやPRODUCTVERSIONはどのように記述するのがよいのでしょうか。

1,1,0,0は、1.1.0の正式版に使いたいのですが、これより大きい値を付けるのも変だし、
数字以外の文字は入力できないようなので。
0272デフォルトの名無しさん
垢版 |
2019/09/12(木) 19:48:34.37ID:5JZ2mwNb
好きにしろよww
自作アプリなんて俺は1.0も1.1も2.0もみんなβだから1.00から0.01刻みで増やしてる
昔はカスタムビルドステップでビルド番号もつけてたけど今はやってない
0273デフォルトの名無しさん
垢版 |
2019/09/12(木) 20:46:30.04ID:igJ/H+nC
ちょろめとかふぃれふぉxはメジャーの数字上げ過ぎてひどいことになってるな
ばかなんですかね
■ このスレッドは過去ログ倉庫に格納されています

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