Win11のウィジェット、作ってる人いなくない? #JavaScript - Qiita

経緯はタイトルの通りです。
しばらく前にwindows11のウィジェット機能を一般人が開発できるようになったのに、誰も作ってなくないですか!?
ということで、参考資料の少ない中でなんとか最低限ウィジェット部分に表示させることができたので、ここに具体的なファイルを備忘録します。

注意点

  • あくまでもウィジェットとして認識させることができたというだけで、具体的な開発はまだ行っておりません
  • また、私はPWAに関する知識もほとんどないため、間違いが多分に含まれることが想定されます。その点にはご留意ください
  • 本文やファイル内に「PWAmp」や「mini-player」といった文字列が登場するかもしれませんが、これは公式のデモアプリを学習したChatGPTが出した文字列なので、別の文字にしても問題ないと思います。私が改変したせいでファイル間の整合性がなくなってしまうほうが問題だと考えたため、一部そのまま記載しています

windows11で「win + W」を押したときに左からニョキっと出てくるやつです。
image.png
実はここに自作のウィジェットを配置することができてしまいます!

・PWA(Webアプリをデスクトップアプリのように使うあれ)
・Win32アプリ

今回はPWAによる駆動方法を使いました。
win32アプリの知識が身についたらそちらでもやってみます。

動作環境

  • WinAppSDK 1.2 (ここからダウンロード)
  • windows11 開発者モード (windowsの設定から有効化する)
  • Microsoft Edge 最近のバージョン(PWA機能に対応してればOK?)

必要なファイル群

/project-root
├── index.html
├── manifest.json
├── service-worker.js
├── /widgets
│   ├── [任意のファイル名-レイアウト].json
│   └── [任意のファイル名-データ].json
├── /img
│   └── icon-128.png
├── favicon-16.png
└── screenshot-widget.png

各ファイルの役割

index.html

PWAをダウンロードする際にアクセスするページ。最低限で構わない。

manifest.json

PWAをダウンロードする際に参照されるファイル。これがないとPWAとして認識されない??

service-worker.js

PWAの中で動作するJavaScript。ここでキャッシュの作成などを行うらしい。後述するが、ウィジェットの動作にも関わる。

favicon-16.png

アイコンになるもの。必要かはわからない。

screenshot-widget.png

ウィジェット選択画面でプレビューされるもの??

./widgets/[任意のファイル名-レイアウト].json

実際のウィジェットの画面をこのjsonで設計する。意外と自由度は高く、htmlみたいな感じで設計できる。

./widgets/[任意のファイル名-データ].json

ウィジェットに表示する情報はこちらに書き込み、それをレイアウト担当側で読み込む。

具体的なファイルの中身

index.html


 lang="en">


     charset="UTF-8" />
     name="viewport" content="width=device-width, initial-scale=1.0" />
    </span>PWAmp<span class="nt"/>

    <span class="c"><!-- リンク: マニフェスト --></span>
    <span class="nt"><link/> <span class="na">rel=</span><span class="s">"manifest"</span> <span class="na">href=</span><span class="s">"manifest.json"</span> <span class="nt">/></span>

    <span class="c"><!-- アイコン --></span>
    <span class="nt"><link/> <span class="na">rel=</span><span class="s">"icon"</span> <span class="na">href=</span><span class="s">"favicon-16.png"</span> <span class="na">sizes=</span><span class="s">"16x16"</span> <span class="nt">/></span>

    <span class="c"><!-- PWA 用のテーマカラー --></span>
    <span class="nt"><meta/> <span class="na">name=</span><span class="s">"theme-color"</span> <span class="na">content=</span><span class="s">"#000000"</span> <span class="nt">/></span>

<span class="nt"/>

<span class="nt"/>
    <span class="nt"/>Welcome to PWA<span class="nt"/>
    <span class="nt"><script/></span>
        <span class="k">if </span><span class="p">(</span><span class="dl">'</span><span class="s1">serviceWorker</span><span class="dl">'</span> <span class="k">in</span> <span class="nb">navigator</span><span class="p">)</span> <span class="p">{</span>
            <span class="nb">navigator</span><span class="p">.</span><span class="nx">serviceWorker</span><span class="p">.</span><span class="nf">register</span><span class="p">(</span><span class="dl">'</span><span class="s1">service-worker.js</span><span class="dl">'</span><span class="p">)</span>
                <span class="p">.</span><span class="nf">then</span><span class="p">(()</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Service Worker registered</span><span class="dl">'</span><span class="p">))</span>
                <span class="p">.</span><span class="k">catch</span><span class="p">(</span><span class="nx">err</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="dl">'</span><span class="s1">Service Worker registration failed:</span><span class="dl">'</span><span class="p">,</span> <span class="nx">err</span><span class="p">));</span>
        <span class="p">}</span>
    <span class="nt"/>
<span class="nt"/>

<span class="nt"/>
</span></span></span></span></span></span></span></code></pre>
</div>
</div>
<h3 data-sourcepos="92:1-92:17">
<span id="manifestjson-1" class="fragment"/><a href="#manifestjson-1"><i class="fa fa-link"/></a>manifest.json</h3>
<div class="code-frame" data-lang="json" data-sourcepos="93:1-142:3">
<div class="highlight">
<pre><code><span class="p">{</span><span class="w">
    </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"PWA"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"hogehoge"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"icons"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="p">{</span><span class="w">
            </span><span class="nl">"src"</span><span class="p">:</span><span class="w"> </span><span class="s2">"img/icon-96.png"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"sizes"</span><span class="p">:</span><span class="w"> </span><span class="s2">"96x96"</span><span class="w">
        </span><span class="p">},</span><span class="w">
        </span><span class="p">{</span><span class="w">
            </span><span class="nl">"src"</span><span class="p">:</span><span class="w"> </span><span class="s2">"img/icon-128.png"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"sizes"</span><span class="p">:</span><span class="w"> </span><span class="s2">"128x128"</span><span class="w">
        </span><span class="p">},</span><span class="w">
        </span><span class="p">{</span><span class="w">
            </span><span class="nl">"src"</span><span class="p">:</span><span class="w"> </span><span class="s2">"img/icon-256.png"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"sizes"</span><span class="p">:</span><span class="w"> </span><span class="s2">"256x256"</span><span class="w">
        </span><span class="p">},</span><span class="w">
        </span><span class="p">{</span><span class="w">
            </span><span class="nl">"src"</span><span class="p">:</span><span class="w"> </span><span class="s2">"img/icon-512.png"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"sizes"</span><span class="p">:</span><span class="w"> </span><span class="s2">"512x512"</span><span class="w">
        </span><span class="p">}</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </span><span class="nl">"widgets"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="p">{</span><span class="w">
            </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"name"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"hogehoge"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"tag"</span><span class="p">:</span><span class="w"> </span><span class="s2">"pwamp"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"template"</span><span class="p">:</span><span class="w"> </span><span class="s2">"pwamp-template"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"ms_ac_template"</span><span class="p">:</span><span class="w"> </span><span class="s2">"widgets/[任意のファイル名-レイアウト].json"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"data"</span><span class="p">:</span><span class="w"> </span><span class="s2">"widgets/[任意のファイル名-データ].json"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"application/json"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"screenshots"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
                </span><span class="p">{</span><span class="w">
                    </span><span class="nl">"src"</span><span class="p">:</span><span class="w"> </span><span class="s2">"./screenshot-widget.png"</span><span class="p">,</span><span class="w">
                    </span><span class="nl">"sizes"</span><span class="p">:</span><span class="w"> </span><span class="s2">"600x400"</span><span class="p">,</span><span class="w">
                    </span><span class="nl">"label"</span><span class="p">:</span><span class="w"> </span><span class="s2">"hogehoge"</span><span class="w">
                </span><span class="p">}</span><span class="w">
            </span><span class="p">],</span><span class="w">
            </span><span class="nl">"icons"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
                </span><span class="p">{</span><span class="w">
                    </span><span class="nl">"src"</span><span class="p">:</span><span class="w"> </span><span class="s2">"./favicon-16.png"</span><span class="p">,</span><span class="w">
                    </span><span class="nl">"sizes"</span><span class="p">:</span><span class="w"> </span><span class="s2">"16x16"</span><span class="w">
                </span><span class="p">}</span><span class="w">
            </span><span class="p">],</span><span class="w">
            </span><span class="nl">"auth"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w">
            </span><span class="nl">"update"</span><span class="p">:</span><span class="w"> </span><span class="mi">86400</span><span class="w">
        </span><span class="p">}</span><span class="w">
    </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre>
</div>
</div>
<h3 data-sourcepos="143:1-143:21">
<span id="service-workerjs-1" class="fragment"/><a href="#service-workerjs-1"><i class="fa fa-link"/></a>service-worker.js</h3>
<div class="code-frame" data-lang="js" data-sourcepos="144:1-151:3">
<div class="highlight">
<pre><code><span class="nb">self</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">notificationclick</span><span class="dl">'</span><span class="p">,</span> <span class="nf">function </span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">event</span><span class="p">.</span><span class="nx">notification</span><span class="p">.</span><span class="nf">close</span><span class="p">();</span>
    <span class="nx">event</span><span class="p">.</span><span class="nf">waitUntil</span><span class="p">(</span>
        <span class="nx">clients</span><span class="p">.</span><span class="nf">openWindow</span><span class="p">(</span><span class="dl">'</span><span class="s1">https://example.com</span><span class="dl">'</span><span class="p">)</span>
    <span class="p">);</span>
<span class="p">});</span>
</code></pre>
</div>
</div>
<h3 data-sourcepos="152:1-152:18">
<span id="favicon-16png-1" class="fragment"/><a href="#favicon-16png-1"><i class="fa fa-link"/></a>favicon-16.png</h3>
<p data-sourcepos="153:1-153:122"><a href="https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3778018%2Fd82b64cc-07a2-4482-9dbb-cec5d5c7edc8.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=53c4dfef07af59a434cd0451a5ecd8ec" target="_blank" rel="nofollow noopener"><img decoding="async" src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3778018%2Fd82b64cc-07a2-4482-9dbb-cec5d5c7edc8.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=53c4dfef07af59a434cd0451a5ecd8ec" alt="image.png" srcset="https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3778018%2Fd82b64cc-07a2-4482-9dbb-cec5d5c7edc8.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=9b2409c1e6a177e67ece2861583b1a99 1x" data-canonical-src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778018/d82b64cc-07a2-4482-9dbb-cec5d5c7edc8.png" loading="lazy"/></a>
<h3 data-sourcepos="154:1-154:25">
<span id="screenshot-widgetpng-1" class="fragment"/><a href="#screenshot-widgetpng-1"><i class="fa fa-link"/></a>screenshot-widget.png</h3>
<p data-sourcepos="155:1-155:122"><a href="https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3778018%2F500ca2e4-aced-4ddd-af34-a8193b5246ad.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=c82eee16fef42d92514bba8c2ed7b810" target="_blank" rel="nofollow noopener"><img decoding="async" src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3778018%2F500ca2e4-aced-4ddd-af34-a8193b5246ad.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=c82eee16fef42d92514bba8c2ed7b810" alt="image.png" srcset="https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3778018%2F500ca2e4-aced-4ddd-af34-a8193b5246ad.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=4697ef73b6a9329b50d2a96c9993cb25 1x" data-canonical-src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778018/500ca2e4-aced-4ddd-af34-a8193b5246ad.png" loading="lazy"/></a>
<h3 data-sourcepos="157:1-157:61">
<span id="widgets任意のファイル名-レイアウトjson-1" class="fragment"/><a href="#widgets%E4%BB%BB%E6%84%8F%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D-%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88json-1"><i class="fa fa-link"/></a>./widgets/[任意のファイル名-レイアウト].json</h3>
<p data-sourcepos="158:1-158:61">body部分は以下のサイトで作成できるらしい。
<p data-sourcepos="160:1-160:34"><iframe id="qiita-embed-content__c5e1f473214a1cc4ff026ccf11a48ae9" src="https://qiita.com/embed-contents/link-card#qiita-embed-content__c5e1f473214a1cc4ff026ccf11a48ae9" data-content="https%3A%2F%2Fadaptivecards.io%2Fdesigner%2F" frameborder="0" scrolling="no" loading="lazy" style="width:100%;" height="29">
</iframe>

<p data-sourcepos="162:1-162:126">データファイルの値を呼び出したいときは、<code>${変数名}</code>とすると、更新時にその値となる。
<div class="code-frame" data-lang="json" data-sourcepos="163:1-178:3">
<div class="highlight">
<pre><code><span class="p">{</span><span class="w">
    </span><span class="nl">"$schema"</span><span class="p">:</span><span class="w"> </span><span class="s2">"http://adaptivecards.io/schemas/adaptive-card.json"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"AdaptiveCard"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1.2"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </span><span class="nl">"actions"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="p">{</span><span class="w">
            </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Action.OpenUrl"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"title"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Open"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://example.com"</span><span class="w">
        </span><span class="p">}</span><span class="w">
    </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre>
</div>
</div>
<h3 data-sourcepos="179:1-179:55">
<span id="widgets任意のファイル名-データjson-1" class="fragment"/><a href="#widgets%E4%BB%BB%E6%84%8F%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D-%E3%83%87%E3%83%BC%E3%82%BFjson-1"><i class="fa fa-link"/></a>./widgets/[任意のファイル名-データ].json</h3>
<div class="code-frame" data-lang="json" data-sourcepos="180:1-185:3">
<div class="highlight">
<pre><code><span class="p">{</span><span class="w">
    </span><span class="nl">"変数名"</span><span class="p">:</span><span class="s2">"value"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"変数名2"</span><span class="p">:</span><span class="s2">"value2"</span><span class="p">,</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre>
</div>
</div>
<ul data-sourcepos="187:1-190:116">
<li data-sourcepos="187:1-187:108">普段はchromeを使っているが、そもそもEdgeでPWAをインストールしないと動かない</li>
<li data-sourcepos="188:1-188:123">PWAを配布するサーバーがhttps通信を行っていないといけない(私はGitHub Pagesを使いました。)</li>
<li data-sourcepos="189:1-190:116">PWAをインストールしたのにウィジェット一覧にない!⇒ウィジェット画面の歯車マークから「新しいウィジェットの検出」を実行してみる</li>
</ul>
<ul data-sourcepos="192:1-196:0">
<li data-sourcepos="192:1-192:67">service-worker.jsは常時実装されるわけではなさそう</li>
<li data-sourcepos="193:1-193:78">権限的な問題でwindowsの情報にはあまりアクセスできない</li>
<li data-sourcepos="194:1-194:38">音声の再生などはできない</li>
<li data-sourcepos="195:1-196:0">PWAのアプリ起動時のみ動作する?(バックグラウンドも可能のようだが一筋縄ではいかなそう)</li>
</ul>
<p data-sourcepos="198:1-200:240">今回はPWA駆動型のウィジェットの作成をしました。ほんとうに参考資料が少なく、PWA化しても認識されずに挫折することが3度ほどありました。できることは少なそうですが、予定の表示、SNSの通知、時間割の確認など、「見せるだけ」の用途に使う分には有用なのかなと思います。ショートカットキーで呼び出せますし。
</div>
<script>!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '305156090176370');
fbq('trackSingle', '305156090176370', 'PageView');</script><br />
<br /><a href="https://h.accesstrade.net/sp/cc?rk=0100oyf000odbd" rel="nofollow" referrerpolicy="no-referrer-when-downgrade"><img decoding="async" src="https://h.accesstrade.net/sp/rr?rk=0100oyf000odbd" alt="フラッグシティパートナーズ海外不動産投資セミナー" border="0" /></a>
<a href="https://h.accesstrade.net/sp/cc?rk=01004iw600odbd" rel="nofollow" referrerpolicy="no-referrer-when-downgrade"><img decoding="async" src="https://h.accesstrade.net/sp/rr?rk=01004iw600odbd" alt="【DMM FX】入金" border="0" /></a><br />
<br /><a href="https://qiita.com/ak-2302/items/e8c37374372736c1b5a3?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items">Source link </a></p>
<div class='amazon-auto-links'><div class="amazon-products-container-list amazon-unit-29349 unit-type-category" style="">
        <div class="amazon-product-container">
        <div class="amazon-auto-links-product">
    <div class="amazon-auto-links-product-image">
        <div class='amazon-product-thumbnail-container' data-href='https://www.amazon.co.jp/%E3%83%96%E3%83%AB%E3%83%BC%E3%83%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E5%A4%96%E4%BB%98%E3%81%91-blu-ray%E3%83%97%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E5%86%8D%E7%94%9F%E8%AA%AD%E3%81%BF%E6%9B%B8usb-a%E3%81%A8-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%AC%E3%82%A4%E3%83%97%E3%83%AC%E3%83%BC%E3%83%A4%E3%83%BC%E3%83%96%E3%83%AB%E3%83%BC%E3%83%AC%E3%82%A4%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E5%AF%BE%E5%BF%9CWIN7-11-%E3%83%8E%E3%83%BC%E3%83%88%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E5%AF%BE%E5%BF%9C-%E3%81%91%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96bd%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%EF%BC%88black%EF%BC%89/dp/B0DSB942D4/ref=zg_bsnr_g_computers_d_sccl_29/356-3178928-8054451?psc=1&tag=inmobi06-22' data-large-src='https://images-fe.ssl-images-amazon.com/images/I/71keNCBCOuL._AC_UL500_SR500,500_.jpg'><div class="amazon-product-thumbnail" style="max-width:160px;max-height:160px;width:160px">
    <a href="https://www.amazon.co.jp/%E3%83%96%E3%83%AB%E3%83%BC%E3%83%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E5%A4%96%E4%BB%98%E3%81%91-blu-ray%E3%83%97%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E5%86%8D%E7%94%9F%E8%AA%AD%E3%81%BF%E6%9B%B8usb-a%E3%81%A8-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%AC%E3%82%A4%E3%83%97%E3%83%AC%E3%83%BC%E3%83%A4%E3%83%BC%E3%83%96%E3%83%AB%E3%83%BC%E3%83%AC%E3%82%A4%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E5%AF%BE%E5%BF%9CWIN7-11-%E3%83%8E%E3%83%BC%E3%83%88%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E5%AF%BE%E5%BF%9C-%E3%81%91%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96bd%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%EF%BC%88black%EF%BC%89/dp/B0DSB942D4/ref=zg_bsnr_g_computers_d_sccl_29/356-3178928-8054451?psc=1&tag=inmobi06-22" title="ブルーレイドライブ外付け blu-rayプレイヤー再生読み書usb-aと (type-c) ブルーレイプレーヤーブルーレイディスク対応WIN7-11/MAC対応 ノートパソコン対応 blu-ray けドライブbdドライブ(black): " rel="nofollow noopener" target="_blank">
        <img decoding="async" src="https://images-fe.ssl-images-amazon.com/images/I/71keNCBCOuL._AC_UL160_SR160,160_.jpg" alt="" style="max-height:160px" />
    </a>
</div></div>
    </div>
    <div class="amazon-auto-links-product-body">
        <h5 class="amazon-product-title">
<a href="https://www.amazon.co.jp/%E3%83%96%E3%83%AB%E3%83%BC%E3%83%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E5%A4%96%E4%BB%98%E3%81%91-blu-ray%E3%83%97%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E5%86%8D%E7%94%9F%E8%AA%AD%E3%81%BF%E6%9B%B8usb-a%E3%81%A8-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%AC%E3%82%A4%E3%83%97%E3%83%AC%E3%83%BC%E3%83%A4%E3%83%BC%E3%83%96%E3%83%AB%E3%83%BC%E3%83%AC%E3%82%A4%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E5%AF%BE%E5%BF%9CWIN7-11-%E3%83%8E%E3%83%BC%E3%83%88%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E5%AF%BE%E5%BF%9C-%E3%81%91%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96bd%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%EF%BC%88black%EF%BC%89/dp/B0DSB942D4/ref=zg_bsnr_g_computers_d_sccl_29/356-3178928-8054451?psc=1&tag=inmobi06-22" title="ブルーレイドライブ外付け blu-rayプレイヤー再生読み書usb-aと (type-c) ブルーレイプレーヤーブルーレイディスク対応WIN7-11/MAC対応 ノートパソコン対応 blu-ray けドライブbdドライブ(black): " rel="nofollow noopener" target="_blank">ブルーレイドライブ外付け blu-rayプレイヤー再生読み書usb-aと (type-c) ブルーレイプレーヤーブルーレイディスク対応WIN7-11/MAC対応 ノートパソコン対応 blu-ray けドライブbdドライブ(black)</a>
</h5>
        <div class='amazon-customer-rating-stars'><div class='crIFrameNumCustReviews' data-rating='37' data-review-count='166' data-review-url='https://www.amazon.co.jp/product-reviews/B0DSB942D4?tag=inmobi06-22'><span class='crAvgStars'><span class='review-stars'><a href='https://www.amazon.co.jp/product-reviews/B0DSB942D4?tag=inmobi06-22' target='_blank' rel='nofollow noopener'><svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 160 32' enable-background='new 0 0 160 32'><title>5星中3.7(166)
¥5,888 (2025年4月25日 13:05 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)