{"id":459,"date":"2025-03-20T13:36:54","date_gmt":"2025-03-20T05:36:54","guid":{"rendered":"https:\/\/zechs.taipei\/?p=459"},"modified":"2025-03-20T13:36:56","modified_gmt":"2025-03-20T05:36:56","slug":"pythonwindows-%e9%9f%b3%e9%87%8f%e7%b5%b1%e4%b8%80%e8%aa%bf%e6%95%b4%e5%b7%a5%e5%85%b7%ef%bc%9a%e8%ae%93%e7%b3%bb%e7%b5%b1%e5%96%87%e5%8f%ad%e8%88%87%e6%87%89%e7%94%a8%e7%a8%8b%e5%bc%8f%e9%9f%b3","status":"publish","type":"post","link":"https:\/\/zechs.taipei\/?p=459","title":{"rendered":"[Python]Windows \u97f3\u91cf\u7d71\u4e00\u8abf\u6574\u5de5\u5177\uff1a\u8b93\u7cfb\u7d71\u5587\u53ed\u8207\u61c9\u7528\u7a0b\u5f0f\u97f3\u91cf\u5b8c\u7f8e\u5354\u8abf"},"content":{"rendered":"<p>\u9019\u500b\u7c21\u5316\u7248\u5de5\u5177\u53ef\u4ee5\u4e00\u9375\u5c07\u7cfb\u7d71\u5587\u53ed\u97f3\u91cf\u8a2d\u5b9a\u70ba 30%\uff0c\u540c\u6642\u5c07\u6240\u6709\u61c9\u7528\u7a0b\u5f0f\u97f3\u91cf\u8abf\u6574\u5230 100%\uff0c\u8b93\u60a8\u7684\u97f3\u8a0a\u9ad4\u9a57\u66f4\u4e00\u81f4\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b89\u88dd\u6240\u9700\u5957\u4ef6<\/h2>\n\n\n\n<p>\u958b\u59cb\u4f7f\u7528\u524d\uff0c\u8acb\u5728\u547d\u4ee4\u63d0\u793a\u5b57\u5143\uff08CMD\uff09\u6216 PowerShell \u57f7\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install comtypes\npip install pycaw\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b8c\u6574\u7a0b\u5f0f\u78bc<\/h2>\n\n\n\n<p>\u5c07\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u8907\u88fd\u5230\u4e00\u500b\u65b0\u7684 <code>.py<\/code> \u6a94\u6848\u4e2d\uff08\u4f8b\u5982 <code>quick_volume.py<\/code>\uff09\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import ctypes\nfrom comtypes import CLSCTX_ALL\nfrom pycaw.pycaw import AudioUtilities, IAudioEndpointVolume\n\n# \u8a2d\u5b9a\u97f3\u91cf\u5e38\u6578\nSPEAKER_VOLUME = 0.30  # \u7cfb\u7d71\u5587\u53ed\u97f3\u91cf\u8a2d\u70ba30%\nAPP_VOLUME = 1.0  # \u61c9\u7528\u7a0b\u5f0f\u97f3\u91cf\u8a2d\u70ba100%\n\ndef set_master_volume():\n    \"\"\"\u5c07\u7cfb\u7d71\u4e3b\u5587\u53ed\u97f3\u91cf\u8a2d\u5b9a\u70ba30%\"\"\"\n    try:\n        # \u7372\u53d6\u5587\u53ed\u8a2d\u5099\n        devices = AudioUtilities.GetSpeakers()\n        interface = devices.Activate(\n            IAudioEndpointVolume._iid_, CLSCTX_ALL, None)\n        volume = ctypes.cast(interface, ctypes.POINTER(IAudioEndpointVolume))\n        \n        # \u7372\u53d6\u7576\u524d\u97f3\u91cf\n        current_volume = volume.GetMasterVolumeLevelScalar()\n        \n        # \u8a2d\u7f6e\u5587\u53ed\u97f3\u91cf\u70ba30%\n        volume.SetMasterVolumeLevelScalar(SPEAKER_VOLUME, None)\n        \n        print(f\"\u5df2\u5c07\u7cfb\u7d71\u5587\u53ed\u97f3\u91cf\u5f9e {current_volume*100:.1f}% \u8abf\u6574\u70ba {SPEAKER_VOLUME*100:.1f}%\")\n        return True\n    except Exception as e:\n        print(f\"\u8a2d\u7f6e\u7cfb\u7d71\u5587\u53ed\u97f3\u91cf\u6642\u767c\u751f\u932f\u8aa4: {e}\")\n        return False\n\ndef set_all_app_volumes():\n    \"\"\"\u5c07\u6240\u6709\u61c9\u7528\u7a0b\u5f0f\u97f3\u91cf\u8a2d\u5b9a\u70ba100%\"\"\"\n    print(f\"\u6b63\u5728\u5c07\u6240\u6709\u61c9\u7528\u7a0b\u5f0f\u97f3\u91cf\u8abf\u6574\u70ba 100%...\")\n    \n    # \u7372\u53d6\u6240\u6709\u97f3\u8a0a\u6703\u8a71\n    sessions = AudioUtilities.GetAllSessions()\n    adjusted_count = 0\n    \n    for session in sessions:\n        try:\n            # \u7372\u53d6\u97f3\u91cf\u63a5\u53e3\n            app_volume = session.SimpleAudioVolume\n            \n            # \u7372\u53d6\u61c9\u7528\u540d\u7a31\n            if session.Process:\n                app_name = session.Process.name()\n            else:\n                app_name = \"\u7cfb\u7d71\u97f3\u6548\"\n            \n            # \u5c07\u61c9\u7528\u7a0b\u5f0f\u97f3\u91cf\u8a2d\u7f6e\u70ba100%\n            app_volume.SetMasterVolume(APP_VOLUME, None)\n            adjusted_count += 1\n            \n        except:\n            pass\n    \n    print(f\"\u5df2\u8abf\u6574 {adjusted_count} \u500b\u61c9\u7528\u7a0b\u5f0f\u7684\u97f3\u91cf\u70ba 100%\")\n\ndef show_current_volumes():\n    \"\"\"\u986f\u793a\u6240\u6709\u97f3\u8a0a\u6e90\u7684\u7576\u524d\u97f3\u91cf\"\"\"\n    print(\"\\n\u7576\u524d\u97f3\u91cf\u8a2d\u7f6e:\")\n    print(\"-\" * 30)\n    \n    # \u986f\u793a\u7cfb\u7d71\u5587\u53ed\u97f3\u91cf\n    devices = AudioUtilities.GetSpeakers()\n    interface = devices.Activate(IAudioEndpointVolume._iid_, CLSCTX_ALL, None)\n    volume = ctypes.cast(interface, ctypes.POINTER(IAudioEndpointVolume))\n    master_volume = volume.GetMasterVolumeLevelScalar()\n    \n    print(f\"\u7cfb\u7d71\u5587\u53ed: {master_volume*100:.1f}%\")\n    \n    # \u986f\u793a\u61c9\u7528\u7a0b\u5f0f\u97f3\u91cf\n    sessions = AudioUtilities.GetAllSessions()\n    for session in sessions:\n        try:\n            if session.SimpleAudioVolume and session.Process:\n                current_volume = session.SimpleAudioVolume.GetMasterVolume()\n                print(f\"{session.Process.name()}: {current_volume*100:.1f}%\")\n        except:\n            pass\n    \n    print(\"-\" * 30)\n\nif __name__ == \"__main__\":\n    try:\n        print(\"Windows \u97f3\u91cf\u7d71\u4e00\u8abf\u6574\u5de5\u5177\")\n        print(\"\u6b63\u5728\u8abf\u6574\u97f3\u91cf...\")\n        \n        # \u8abf\u6574\u7cfb\u7d71\u5587\u53ed\u97f3\u91cf\n        set_master_volume()\n        \n        # \u8abf\u6574\u6240\u6709\u61c9\u7528\u7a0b\u5f0f\u97f3\u91cf\n        set_all_app_volumes()\n        \n        # \u986f\u793a\u6700\u7d42\u8a2d\u7f6e\n        show_current_volumes()\n        \n        print(\"\\n\u97f3\u91cf\u8abf\u6574\u5df2\u5b8c\u6210\uff01\u6309\u4efb\u610f\u9375\u9000\u51fa...\")\n        input()\n    except Exception as e:\n        print(f\"\\n\u767c\u751f\u932f\u8aa4: {e}\")\n        input(\"\u6309\u4efb\u610f\u9375\u9000\u51fa...\")\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f7f\u7528\u65b9\u6cd5<\/h2>\n\n\n\n<p>\u53ea\u9700\u96d9\u64ca\u57f7\u884c <code>.py<\/code> \u6a94\u6848\uff0c\u7a0b\u5f0f\u6703\u81ea\u52d5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5c07\u7cfb\u7d71\u5587\u53ed\u97f3\u91cf\u8a2d\u5b9a\u70ba 30%<\/li>\n\n\n\n<li>\u5c07\u6240\u6709\u61c9\u7528\u7a0b\u5f0f\u97f3\u91cf\u8abf\u6574\u70ba 100%<\/li>\n\n\n\n<li>\u986f\u793a\u8abf\u6574\u5f8c\u7684\u97f3\u91cf\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u7b49\u5f85\u60a8\u6309\u4efb\u610f\u9375\u9000\u51fa<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u81ea\u8a02\u8a2d\u5b9a<\/h2>\n\n\n\n<p>\u5982\u679c\u60a8\u60f3\u8abf\u6574\u9810\u8a2d\u97f3\u91cf\uff0c\u53ea\u9700\u4fee\u6539\u7a0b\u5f0f\u78bc\u958b\u982d\u7684\u5e38\u6578\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u8a2d\u5b9a\u97f3\u91cf\u5e38\u6578\nSPEAKER_VOLUME = 0.30  # \u7cfb\u7d71\u5587\u53ed\u97f3\u91cf\u8a2d\u70ba30%\nAPP_VOLUME = 1.0  # \u61c9\u7528\u7a0b\u5f0f\u97f3\u91cf\u8a2d\u70ba100%\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u958b\u6a5f\u81ea\u52d5\u57f7\u884c<\/h2>\n\n\n\n<p>\u5982\u679c\u5e0c\u671b\u6bcf\u6b21\u958b\u6a5f\u90fd\u81ea\u52d5\u57f7\u884c\u6b64\u7a0b\u5f0f\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5c07 <code>.py<\/code> \u6a94\u6848\u8f49\u63db\u70ba <code>.exe<\/code> \u6a94\u6848\uff08\u53ef\u4f7f\u7528 PyInstaller\uff09\uff1a <code>pip install pyinstaller pyinstaller --onefile quick_volume.py<\/code><\/li>\n\n\n\n<li>\u5c07\u751f\u6210\u7684 <code>.exe<\/code> \u6a94\u6848\u653e\u5165\u555f\u52d5\u8cc7\u6599\u593e\uff1a\n<ul class=\"wp-block-list\">\n<li>\u6309 Win+R<\/li>\n\n\n\n<li>\u8f38\u5165 <code>shell:startup<\/code><\/li>\n\n\n\n<li>\u5c07 <code>.exe<\/code> \u6a94\u6848\u7684\u6377\u5f91\u653e\u5165\u958b\u555f\u7684\u8cc7\u6599\u593e\u4e2d<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u6ce8\u610f\u4e8b\u9805<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6b64\u5de5\u5177\u50c5\u9069\u7528\u65bc Windows \u7cfb\u7d71<\/li>\n\n\n\n<li>\u67d0\u4e9b\u7cfb\u7d71\u7a0b\u5e8f\u6216\u53d7\u4fdd\u8b77\u7684\u61c9\u7528\u7a0b\u5f0f\u53ef\u80fd\u7121\u6cd5\u8abf\u6574\u97f3\u91cf<\/li>\n\n\n\n<li>\u5982\u679c\u5728\u57f7\u884c\u6642\u9047\u5230\u554f\u984c\uff0c\u8acb\u78ba\u4fdd\u5df2\u5b89\u88dd\u6240\u6709\u5fc5\u8981\u7684\u5957\u4ef6<\/li>\n<\/ul>\n\n\n\n<p>\u9019\u500b\u7c21\u5316\u7248\u672c\u79fb\u9664\u4e86\u9078\u55ae\u754c\u9762\u8207\u591a\u9918\u7684\u529f\u80fd\uff0c\u57f7\u884c\u5f8c\u6703\u7acb\u5373\u9032\u884c\u97f3\u91cf\u8abf\u6574\uff0c\u5b8c\u6210\u5f8c\u986f\u793a\u7d50\u679c\u4e26\u7b49\u5f85\u60a8\u6309\u9375\u9000\u51fa\uff0c\u64cd\u4f5c\u66f4\u52a0\u76f4\u63a5\u4fbf\u6377\u3002<\/p>","protected":false},"excerpt":{"rendered":"<p>\u9019\u500b\u7c21\u5316\u7248\u5de5\u5177\u53ef\u4ee5\u4e00\u9375\u5c07\u7cfb\u7d71\u5587\u53ed\u97f3\u91cf\u8a2d\u5b9a\u70ba 30%\uff0c\u540c\u6642\u5c07\u6240\u6709\u61c9\u7528\u7a0b\u5f0f\u97f3\u91cf\u8abf\u6574\u5230 100%\uff0c\u8b93\u60a8\u7684\u97f3\u8a0a\u9ad4\u9a57\u66f4\u4e00 &#8230; <a title=\"[Python]Windows \u97f3\u91cf\u7d71\u4e00\u8abf\u6574\u5de5\u5177\uff1a\u8b93\u7cfb\u7d71\u5587\u53ed\u8207\u61c9\u7528\u7a0b\u5f0f\u97f3\u91cf\u5b8c\u7f8e\u5354\u8abf\" class=\"read-more\" href=\"https:\/\/zechs.taipei\/?p=459\" aria-label=\"\u95b1\u8b80\u3008[Python]Windows \u97f3\u91cf\u7d71\u4e00\u8abf\u6574\u5de5\u5177\uff1a\u8b93\u7cfb\u7d71\u5587\u53ed\u8207\u61c9\u7528\u7a0b\u5f0f\u97f3\u91cf\u5b8c\u7f8e\u5354\u8abf\u3009\u5168\u6587\">\u95b1\u8b80\u5168\u6587<\/a><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-459","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/zechs.taipei\/index.php?rest_route=\/wp\/v2\/posts\/459","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zechs.taipei\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zechs.taipei\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zechs.taipei\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zechs.taipei\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=459"}],"version-history":[{"count":1,"href":"https:\/\/zechs.taipei\/index.php?rest_route=\/wp\/v2\/posts\/459\/revisions"}],"predecessor-version":[{"id":460,"href":"https:\/\/zechs.taipei\/index.php?rest_route=\/wp\/v2\/posts\/459\/revisions\/460"}],"wp:attachment":[{"href":"https:\/\/zechs.taipei\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=459"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zechs.taipei\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=459"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zechs.taipei\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=459"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}