[{"data":1,"prerenderedAt":2345},["ShallowReactive",2],{"content-/uiautomation-shotokuzei-tatsujin":3,"all-pages-for-dir":2323,"related-/uiautomation-shotokuzei-tatsujin":2324,"og-image-/uiautomation-shotokuzei-tatsujin":2344},{"id":4,"title":5,"body":6,"category":2306,"concepts":2307,"description":2308,"extension":2309,"meta":2310,"navigation":330,"ogImage":2307,"path":2311,"project_name":2307,"published":2312,"publishedAt":2313,"seo":2314,"source":2307,"stem":2315,"tags":2316,"todo":2321,"unpublished":2312,"updatedAt":2307,"__hash__":2322},"pages/2026-01/2026-01-08/uiautomation-shotokuzei-tatsujin.md","所得税の達人をUI Automation APIで自動化する",{"type":7,"value":8,"toc":2278},"minimark",[9,13,59,63,66,91,94,97,100,105,185,188,196,199,203,206,213,216,234,240,540,544,547,661,665,672,677,779,783,786,789,793,796,1052,1057,1063,1067,1074,1079,1102,1107,1122,1125,1653,1656,1659,1665,1668,1671,1678,1681,1935,1938,2013,2016,2036,2040,2043,2048,2052,2134,2137,2140,2180,2183,2203,2206,2239,2242,2259,2262,2274],[10,11,5],"h1",{"id":12},"所得税の達人をui-automation-apiで自動化する",[14,15,16,23,26,29,41,44,47,50,53,56],"blockquote",{},[17,18,19],"p",{},[20,21,22],"strong",{},"正直な感想",[17,24,25],{},"達人シリーズの自動化は確かに魅力的だ。毎年の確定申告作業で同じ操作を繰り返すのは苦痛だし、自動化できれば素晴らしい。",[17,27,28],{},"でも実際やってみると……時間かかりすぎ。",[17,30,31,32,36,37,40],{},"Claude Codeで対話しながらコードを書いたり、生成AIでアイデアを形にしたり、そういう「未来」を体験している今この瞬間に、Win32 APIの",[33,34,35],"code",{},"WM_KEYDOWN","がどうとか、MFCのカスタム描画でUIAutomationが効かないとか、",[33,38,39],{},"time.sleep(1.5)","じゃないと安定しないとか……こういう泥臭い作業をしている自分がいる。",[17,42,43],{},"なんだろう、この気持ち。",[17,45,46],{},"2026年にもなって、ウィンドウハンドルを取得してPostMessageしてる。AIがコードを書いてくれる時代に、座標クリックを回避するためにショートカットファイルのパスをハードコードしてる。",[17,48,49],{},"税理士として、この作業の費用対効果も考えてしまう。自分でやる分にはまだいいが、スタッフにやらせるとなると時給が発生する。そもそも「自動化できないUIを人間が操作する」という発想自体がイケてない。",[17,51,52],{},"もっと言えば、税務ソフトのUIをRPAで自動操作するというアプローチ自体が間違っているのでは。コードが書けるなら、e-Taxに直接XMLを作成してデプロイしたほうが早いのではないか。財務諸表データや別表を最初からXMLで生成する。税務ソフトのボタンをクリックする代わりに、データそのものを作る。",[17,54,55],{},"たぶん、アプローチがこっちじゃない。",[17,57,58],{},"継続的に取り組みたい気持ちはある。でも、費用対効果を考えると……トホホ。",[60,61,62],"h2",{"id":62},"結論",[17,64,65],{},"PythonのuiautomationライブラリでWindows UI Automation APIを使い、「所得税の達人」の事業者選択操作を自動化できた。ポイントは以下の3つ。",[67,68,69,76,85],"ol",{},[70,71,72,75],"li",{},[20,73,74],{},"所得税の達人はショートカットから直接起動"," - 達人CubeのUIはカスタム描画でUIAutomationで検出できないため、座標クリックに依存せず直接起動する",[70,77,78,81,82,84],{},[20,79,80],{},"ダイアログ検出のタイミング調整"," - ",[33,83,39],{},"程度の待機が必要",[70,86,87,90],{},[20,88,89],{},"ダブルクリック＋確認ダイアログ対応"," - OKボタンが検出できない場合はダブルクリックで代替",[60,92,93],{"id":93},"背景",[17,95,96],{},"達人Cubeは税務申告ソフトで、毎年の確定申告作業で繰り返し操作が必要になる。Claude Codeと連携してRPAスクリプトを開発し、作業効率を上げたい。",[60,98,99],{"id":99},"セットアップ",[101,102,104],"h3",{"id":103},"uv環境の構築","UV環境の構築",[106,107,112],"pre",{"className":108,"code":109,"language":110,"meta":111,"style":111},"language-bash shiki shiki-themes vitesse-light vitesse-light","cd C:\\Users\\numbe\\Git_repo\\RPA_TATSUJIN\nuv init --name rpa-tatsujin\nuv add uiautomation mss pillow\n","bash","",[33,113,114,152,168],{"__ignoreMap":111},[115,116,119,123,127,131,134,137,140,143,146,149],"span",{"class":117,"line":118},"line",1,[115,120,122],{"class":121},"sz8Xr","cd",[115,124,126],{"class":125},"sdGka"," C:",[115,128,130],{"class":129},"snbK4","\\U",[115,132,133],{"class":125},"sers",[115,135,136],{"class":129},"\\n",[115,138,139],{"class":125},"umbe",[115,141,142],{"class":129},"\\G",[115,144,145],{"class":125},"it_repo",[115,147,148],{"class":129},"\\R",[115,150,151],{"class":125},"PA_TATSUJIN\n",[115,153,155,159,162,165],{"class":117,"line":154},2,[115,156,158],{"class":157},"senZ8","uv",[115,160,161],{"class":125}," init",[115,163,164],{"class":129}," --name",[115,166,167],{"class":125}," rpa-tatsujin\n",[115,169,171,173,176,179,182],{"class":117,"line":170},3,[115,172,158],{"class":157},[115,174,175],{"class":125}," add",[115,177,178],{"class":125}," uiautomation",[115,180,181],{"class":125}," mss",[115,183,184],{"class":125}," pillow\n",[101,186,187],{"id":187},"プロジェクト構造",[106,189,194],{"className":190,"code":192,"language":193},[191],"language-text","RPA_TATSUJIN/\n├── pyproject.toml\n├── open_jigyosha.py    # 事業者を開くスクリプト\n├── utils/\n│   └── logger.py       # ログ・スクリーンショット機能\n└── memo/\n    └── 2026-01-08/     # 実行ログ・スクリーンショット\n","text",[33,195,192],{"__ignoreMap":111},[60,197,198],{"id":198},"試行錯誤の経緯",[101,200,202],{"id":201},"_1-達人cubeのui要素が検出できない問題","1. 達人CubeのUI要素が検出できない問題",[17,204,205],{},"最初は達人Cubeから「所得税」ボタンをクリックして所得税の達人を起動しようとした。",[17,207,208],{},[209,210],"img",{"alt":211,"src":212},"達人Cubeのメニュー","/2026-01/2026-01-08/images/tatsujin-cube-menu.png",[17,214,215],{},"しかし、pywinautoとuiautomationの両方で調査した結果、達人CubeはMFCのカスタム描画UIを使っており、要素に名前が設定されていなかった。",[106,217,221],{"className":218,"code":219,"language":220,"meta":111,"style":111},"language-python shiki shiki-themes vitesse-light vitesse-light","# pywinautoで調査した結果\n# 全ての要素が Afx:00400000:8 クラスで、Name属性が空\n","python",[33,222,223,229],{"__ignoreMap":111},[115,224,225],{"class":117,"line":118},[115,226,228],{"class":227},"sxvE3","# pywinautoで調査した結果\n",[115,230,231],{"class":117,"line":154},[115,232,233],{"class":227},"# 全ての要素が Afx:00400000:8 クラスで、Name属性が空\n",[17,235,236,239],{},[20,237,238],{},"解決策",": 座標クリックに依存せず、所得税の達人をスタートメニューのショートカットから直接起動する。",[106,241,243],{"className":218,"code":242,"language":220,"meta":111,"style":111},"SHOTOKUZEI_LNK = r\"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\達人シリーズ\\所得税の達人(令和06年分版).lnk\"\n\ndef launch_shotokuzei():\n    subprocess.Popen([\"cmd\", \"/c\", \"start\", \"\", SHOTOKUZEI_LNK], shell=True)\n    # 起動を待つ\n    for i in range(30):\n        time.sleep(1)\n        shotokuzei = auto.WindowControl(searchDepth=1, SubName=\"所得税の達人\")\n        if shotokuzei.Exists(0):\n            return shotokuzei\n    return None\n",[33,244,245,326,332,343,412,418,442,460,501,522,531],{"__ignoreMap":111},[115,246,247,250,254,258,262,266,270,273,276,279,282,285,288,291,293,296,299,302,305,308,311,314,317,320,323],{"class":117,"line":118},[115,248,249],{"class":129},"SHOTOKUZEI_LNK",[115,251,253],{"class":252},"shFtX"," =",[115,255,257],{"class":256},"stQ0i"," r",[115,259,261],{"class":260},"sMJiu","\"",[115,263,265],{"class":264},"sLkVR","C:",[115,267,269],{"class":268},"svWSF","\\P",[115,271,272],{"class":264},"rogramData",[115,274,275],{"class":268},"\\M",[115,277,278],{"class":264},"icrosoft",[115,280,281],{"class":121},"\\W",[115,283,284],{"class":264},"indows",[115,286,287],{"class":121},"\\S",[115,289,290],{"class":264},"tart Menu",[115,292,269],{"class":268},[115,294,295],{"class":264},"rograms",[115,297,298],{"class":268},"\\達",[115,300,301],{"class":264},"人シリーズ",[115,303,304],{"class":268},"\\所",[115,306,307],{"class":264},"得税の達人",[115,309,310],{"class":252},"(",[115,312,313],{"class":264},"令和06年分版",[115,315,316],{"class":252},")",[115,318,319],{"class":121},".",[115,321,322],{"class":264},"lnk",[115,324,325],{"class":260},"\"\n",[115,327,328],{"class":117,"line":154},[115,329,331],{"emptyLinePlaceholder":330},true,"\n",[115,333,334,337,340],{"class":117,"line":170},[115,335,336],{"class":256},"def",[115,338,339],{"class":157}," launch_shotokuzei",[115,341,342],{"class":252},"():\n",[115,344,346,350,352,355,358,360,363,365,368,371,374,376,378,380,383,385,387,390,392,395,398,402,405,409],{"class":117,"line":345},4,[115,347,349],{"class":348},"sG7-3","    subprocess",[115,351,319],{"class":252},[115,353,354],{"class":348},"Popen",[115,356,357],{"class":252},"([",[115,359,261],{"class":260},[115,361,362],{"class":125},"cmd",[115,364,261],{"class":260},[115,366,367],{"class":252},",",[115,369,370],{"class":260}," \"",[115,372,373],{"class":125},"/c",[115,375,261],{"class":260},[115,377,367],{"class":252},[115,379,370],{"class":260},[115,381,382],{"class":125},"start",[115,384,261],{"class":260},[115,386,367],{"class":252},[115,388,389],{"class":260}," \"\"",[115,391,367],{"class":252},[115,393,394],{"class":129}," SHOTOKUZEI_LNK",[115,396,397],{"class":252},"],",[115,399,401],{"class":400},"s4oTP"," shell",[115,403,404],{"class":252},"=",[115,406,408],{"class":407},"sHkkW","True",[115,410,411],{"class":252},")\n",[115,413,415],{"class":117,"line":414},5,[115,416,417],{"class":227},"    # 起動を待つ\n",[115,419,421,424,427,430,433,435,439],{"class":117,"line":420},6,[115,422,423],{"class":407},"    for",[115,425,426],{"class":348}," i ",[115,428,429],{"class":407},"in",[115,431,432],{"class":121}," range",[115,434,310],{"class":252},[115,436,438],{"class":437},"sM54T","30",[115,440,441],{"class":252},"):\n",[115,443,445,448,450,453,455,458],{"class":117,"line":444},7,[115,446,447],{"class":348},"        time",[115,449,319],{"class":252},[115,451,452],{"class":348},"sleep",[115,454,310],{"class":252},[115,456,457],{"class":437},"1",[115,459,411],{"class":252},[115,461,463,466,468,471,473,476,478,481,483,485,487,490,492,494,497,499],{"class":117,"line":462},8,[115,464,465],{"class":348},"        shotokuzei ",[115,467,404],{"class":252},[115,469,470],{"class":348}," auto",[115,472,319],{"class":252},[115,474,475],{"class":348},"WindowControl",[115,477,310],{"class":252},[115,479,480],{"class":400},"searchDepth",[115,482,404],{"class":252},[115,484,457],{"class":437},[115,486,367],{"class":252},[115,488,489],{"class":400}," SubName",[115,491,404],{"class":252},[115,493,261],{"class":260},[115,495,496],{"class":125},"所得税の達人",[115,498,261],{"class":260},[115,500,411],{"class":252},[115,502,504,507,510,512,515,517,520],{"class":117,"line":503},9,[115,505,506],{"class":407},"        if",[115,508,509],{"class":348}," shotokuzei",[115,511,319],{"class":252},[115,513,514],{"class":348},"Exists",[115,516,310],{"class":252},[115,518,519],{"class":437},"0",[115,521,441],{"class":252},[115,523,525,528],{"class":117,"line":524},10,[115,526,527],{"class":407},"            return",[115,529,530],{"class":348}," shotokuzei\n",[115,532,534,537],{"class":117,"line":533},11,[115,535,536],{"class":407},"    return",[115,538,539],{"class":407}," None\n",[101,541,543],{"id":542},"_2-ダイアログ検出のタイミング問題","2. ダイアログ検出のタイミング問題",[17,545,546],{},"「開く」ボタンをクリックした後、ダイアログの検出に失敗することがあった。",[106,548,550],{"className":218,"code":549,"language":220,"meta":111,"style":111},"# 1秒では不足\ntime.sleep(1)\ndialog = shotokuzei.WindowControl(Name=\"開く\")\n# → Exists=False\n\n# 1.5秒なら安定\ntime.sleep(1.5)\ndialog = shotokuzei.WindowControl(Name=\"開く\")\n# → Exists=True\n",[33,551,552,557,572,601,606,610,615,630,656],{"__ignoreMap":111},[115,553,554],{"class":117,"line":118},[115,555,556],{"class":227},"# 1秒では不足\n",[115,558,559,562,564,566,568,570],{"class":117,"line":154},[115,560,561],{"class":348},"time",[115,563,319],{"class":252},[115,565,452],{"class":348},[115,567,310],{"class":252},[115,569,457],{"class":437},[115,571,411],{"class":252},[115,573,574,577,579,581,583,585,587,590,592,594,597,599],{"class":117,"line":170},[115,575,576],{"class":348},"dialog ",[115,578,404],{"class":252},[115,580,509],{"class":348},[115,582,319],{"class":252},[115,584,475],{"class":348},[115,586,310],{"class":252},[115,588,589],{"class":400},"Name",[115,591,404],{"class":252},[115,593,261],{"class":260},[115,595,596],{"class":125},"開く",[115,598,261],{"class":260},[115,600,411],{"class":252},[115,602,603],{"class":117,"line":345},[115,604,605],{"class":227},"# → Exists=False\n",[115,607,608],{"class":117,"line":414},[115,609,331],{"emptyLinePlaceholder":330},[115,611,612],{"class":117,"line":420},[115,613,614],{"class":227},"# 1.5秒なら安定\n",[115,616,617,619,621,623,625,628],{"class":117,"line":444},[115,618,561],{"class":348},[115,620,319],{"class":252},[115,622,452],{"class":348},[115,624,310],{"class":252},[115,626,627],{"class":437},"1.5",[115,629,411],{"class":252},[115,631,632,634,636,638,640,642,644,646,648,650,652,654],{"class":117,"line":462},[115,633,576],{"class":348},[115,635,404],{"class":252},[115,637,509],{"class":348},[115,639,319],{"class":252},[115,641,475],{"class":348},[115,643,310],{"class":252},[115,645,589],{"class":400},[115,647,404],{"class":252},[115,649,261],{"class":260},[115,651,596],{"class":125},[115,653,261],{"class":260},[115,655,411],{"class":252},[115,657,658],{"class":117,"line":503},[115,659,660],{"class":227},"# → Exists=True\n",[101,662,664],{"id":663},"_3-okボタンが見つからない問題","3. OKボタンが見つからない問題",[17,666,667,668,671],{},"ダイアログのOKボタンが",[33,669,670],{},"ButtonControl(Name=\"OK\")","で検出できない場合があった。",[17,673,674,676],{},[20,675,238],{},": ダブルクリックで開く方法を代替として実装。",[106,678,680],{"className":218,"code":679,"language":220,"meta":111,"style":111},"ok_btn = dialog.ButtonControl(searchDepth=5, Name=\"OK\")\nif ok_btn.Exists(2):\n    ok_btn.Click()\nelse:\n    # ダブルクリックで開く\n    target_item.DoubleClick()\n",[33,681,682,722,741,754,762,767],{"__ignoreMap":111},[115,683,684,687,689,692,694,697,699,701,703,706,708,711,713,715,718,720],{"class":117,"line":118},[115,685,686],{"class":348},"ok_btn ",[115,688,404],{"class":252},[115,690,691],{"class":348}," dialog",[115,693,319],{"class":252},[115,695,696],{"class":348},"ButtonControl",[115,698,310],{"class":252},[115,700,480],{"class":400},[115,702,404],{"class":252},[115,704,705],{"class":437},"5",[115,707,367],{"class":252},[115,709,710],{"class":400}," Name",[115,712,404],{"class":252},[115,714,261],{"class":260},[115,716,717],{"class":125},"OK",[115,719,261],{"class":260},[115,721,411],{"class":252},[115,723,724,727,730,732,734,736,739],{"class":117,"line":154},[115,725,726],{"class":407},"if",[115,728,729],{"class":348}," ok_btn",[115,731,319],{"class":252},[115,733,514],{"class":348},[115,735,310],{"class":252},[115,737,738],{"class":437},"2",[115,740,441],{"class":252},[115,742,743,746,748,751],{"class":117,"line":170},[115,744,745],{"class":348},"    ok_btn",[115,747,319],{"class":252},[115,749,750],{"class":348},"Click",[115,752,753],{"class":252},"()\n",[115,755,756,759],{"class":117,"line":345},[115,757,758],{"class":407},"else",[115,760,761],{"class":252},":\n",[115,763,764],{"class":117,"line":414},[115,765,766],{"class":227},"    # ダブルクリックで開く\n",[115,768,769,772,774,777],{"class":117,"line":420},[115,770,771],{"class":348},"    target_item",[115,773,319],{"class":252},[115,775,776],{"class":348},"DoubleClick",[115,778,753],{"class":252},[101,780,782],{"id":781},"_4-確認ダイアログへの対応","4. 確認ダイアログへの対応",[17,784,785],{},"ダブルクリック後に確認ダイアログが表示される。",[17,787,788],{},"「選択されたデータおよび下の明細について、データを開きます。よろしいですか？」というダイアログのOKをクリックする処理を追加。",[101,790,792],{"id":791},"_5-スクリーンショット機能claude-codeとの連携","5. スクリーンショット機能（Claude Codeとの連携）",[17,794,795],{},"各ステップでスクリーンショットを撮る機能を実装した。",[106,797,799],{"className":218,"code":798,"language":220,"meta":111,"style":111},"def screenshot(name: str = \"\") -> Path:\n    \"\"\"スクリーンショットを撮ってimages_時刻ディレクトリに保存\"\"\"\n    with mss.mss() as sct:\n        # 座標が最も左のモニターを選択（4Kモニター3台環境）\n        leftmost = min(range(1, len(sct.monitors)),\n                       key=lambda i: sct.monitors[i]['left'])\n        monitor = sct.monitors[leftmost]\n        sct_img = sct.grab(monitor)\n        mss.tools.to_png(sct_img.rgb, sct_img.size, output=str(filepath))\n    return filepath\n",[33,800,801,833,844,867,872,909,950,971,992,1045],{"__ignoreMap":111},[115,802,803,805,808,810,813,816,819,821,823,825,828,831],{"class":117,"line":118},[115,804,336],{"class":256},[115,806,807],{"class":157}," screenshot",[115,809,310],{"class":252},[115,811,812],{"class":348},"name",[115,814,815],{"class":252},":",[115,817,818],{"class":121}," str",[115,820,253],{"class":252},[115,822,389],{"class":260},[115,824,316],{"class":252},[115,826,827],{"class":252}," ->",[115,829,830],{"class":348}," Path",[115,832,761],{"class":252},[115,834,835,838,841],{"class":117,"line":154},[115,836,837],{"class":260},"    \"\"\"",[115,839,840],{"class":125},"スクリーンショットを撮ってimages_時刻ディレクトリに保存",[115,842,843],{"class":260},"\"\"\"\n",[115,845,846,849,851,853,856,859,862,865],{"class":117,"line":170},[115,847,848],{"class":407},"    with",[115,850,181],{"class":348},[115,852,319],{"class":252},[115,854,855],{"class":348},"mss",[115,857,858],{"class":252},"()",[115,860,861],{"class":407}," as",[115,863,864],{"class":348}," sct",[115,866,761],{"class":252},[115,868,869],{"class":117,"line":345},[115,870,871],{"class":227},"        # 座標が最も左のモニターを選択（4Kモニター3台環境）\n",[115,873,874,877,879,882,884,887,889,891,893,896,898,901,903,906],{"class":117,"line":414},[115,875,876],{"class":348},"        leftmost ",[115,878,404],{"class":252},[115,880,881],{"class":121}," min",[115,883,310],{"class":252},[115,885,886],{"class":121},"range",[115,888,310],{"class":252},[115,890,457],{"class":437},[115,892,367],{"class":252},[115,894,895],{"class":121}," len",[115,897,310],{"class":252},[115,899,900],{"class":348},"sct",[115,902,319],{"class":252},[115,904,905],{"class":348},"monitors",[115,907,908],{"class":252},")),\n",[115,910,911,914,916,919,922,924,926,928,930,933,936,939,942,945,947],{"class":117,"line":420},[115,912,913],{"class":400},"                       key",[115,915,404],{"class":252},[115,917,918],{"class":256},"lambda",[115,920,921],{"class":348}," i",[115,923,815],{"class":252},[115,925,864],{"class":348},[115,927,319],{"class":252},[115,929,905],{"class":348},[115,931,932],{"class":252},"[",[115,934,935],{"class":348},"i",[115,937,938],{"class":252},"][",[115,940,941],{"class":260},"'",[115,943,944],{"class":125},"left",[115,946,941],{"class":260},[115,948,949],{"class":252},"])\n",[115,951,952,955,957,959,961,963,965,968],{"class":117,"line":444},[115,953,954],{"class":348},"        monitor ",[115,956,404],{"class":252},[115,958,864],{"class":348},[115,960,319],{"class":252},[115,962,905],{"class":348},[115,964,932],{"class":252},[115,966,967],{"class":348},"leftmost",[115,969,970],{"class":252},"]\n",[115,972,973,976,978,980,982,985,987,990],{"class":117,"line":462},[115,974,975],{"class":348},"        sct_img ",[115,977,404],{"class":252},[115,979,864],{"class":348},[115,981,319],{"class":252},[115,983,984],{"class":348},"grab",[115,986,310],{"class":252},[115,988,989],{"class":348},"monitor",[115,991,411],{"class":252},[115,993,994,997,999,1002,1004,1007,1009,1012,1014,1017,1019,1022,1024,1027,1029,1032,1034,1037,1039,1042],{"class":117,"line":503},[115,995,996],{"class":348},"        mss",[115,998,319],{"class":252},[115,1000,1001],{"class":348},"tools",[115,1003,319],{"class":252},[115,1005,1006],{"class":348},"to_png",[115,1008,310],{"class":252},[115,1010,1011],{"class":348},"sct_img",[115,1013,319],{"class":252},[115,1015,1016],{"class":348},"rgb",[115,1018,367],{"class":252},[115,1020,1021],{"class":348}," sct_img",[115,1023,319],{"class":252},[115,1025,1026],{"class":348},"size",[115,1028,367],{"class":252},[115,1030,1031],{"class":400}," output",[115,1033,404],{"class":252},[115,1035,1036],{"class":121},"str",[115,1038,310],{"class":252},[115,1040,1041],{"class":348},"filepath",[115,1043,1044],{"class":252},"))\n",[115,1046,1047,1049],{"class":117,"line":524},[115,1048,536],{"class":407},[115,1050,1051],{"class":348}," filepath\n",[17,1053,1054],{},[20,1055,1056],{},"ディレクトリ構造:",[106,1058,1061],{"className":1059,"code":1060,"language":193},[191],"memo/\n└── 2026-01-08/\n    ├── 11_18_43.txt           # ログファイル\n    ├── images_11_18_43/       # スクリーンショット（セッション1）\n    │   ├── 01_start.png\n    │   ├── 02_after_open_click.png\n    │   └── 03_error_no_dialog.png\n    └── images_11_25_00/       # スクリーンショット（セッション2）\n        ├── 01_start.png\n        └── 02_complete.png\n",[33,1062,1060],{"__ignoreMap":111},[1064,1065,1066],"h4",{"id":1066},"なぜスクリーンショットを撮るのか",[17,1068,1069,1070,1073],{},"Claude Codeと連携して",[20,1071,1072],{},"再帰的にRPAスクリプトを開発","するため。",[17,1075,1076],{},[20,1077,1078],{},"開発フロー:",[67,1080,1081,1084,1087,1090,1093,1096,1099],{},[70,1082,1083],{},"Claude Codeがスクリプトを作成・実行",[70,1085,1086],{},"各ステップでスクリーンショットを撮影し、memoディレクトリに保存",[70,1088,1089],{},"エラーや想定外の挙動が発生したら停止",[70,1091,1092],{},"Claude Codeがスクリーンショットを読み込み、「なぜ止まったか」を確認",[70,1094,1095],{},"次に押すべきボタンや修正すべきコードを特定",[70,1097,1098],{},"スクリプトを修正して再実行",[70,1100,1101],{},"成功するまで2〜6を繰り返す",[17,1103,1104],{},[20,1105,1106],{},"メリット:",[1108,1109,1110,1113,1116,1119],"ul",{},[70,1111,1112],{},"人間がログを読んでClaude Codeに伝える手間が省ける",[70,1114,1115],{},"スクリーンショットから視覚的にUI状態を把握できる",[70,1117,1118],{},"「ダイアログが見つからない」→「実際には表示されている」といった乖離をすぐ発見できる",[70,1120,1121],{},"試行錯誤のログが自動的に残る",[60,1123,1124],{"id":1124},"最終的なコード",[106,1126,1128],{"className":218,"code":1127,"language":220,"meta":111,"style":111},"def open_jigyosha(target_code: str = \"9999\"):\n    \"\"\"指定した個人コードの事業者を開く\"\"\"\n\n    # 所得税の達人ウィンドウを取得（なければ起動）\n    shotokuzei = auto.WindowControl(searchDepth=1, SubName=\"所得税の達人\")\n    if not shotokuzei.Exists(3):\n        shotokuzei = launch_shotokuzei()\n        if not shotokuzei:\n            return False\n\n    # ツールバーの「開く」ボタンをクリック\n    open_btn = shotokuzei.ButtonControl(Name=\"事業者データの選択を行います。\")\n    open_btn.Click()\n    time.sleep(1.5)\n\n    # ダイアログ取得\n    dialog = shotokuzei.WindowControl(Name=\"開く\")\n    list_ctrl = dialog.ListControl()\n\n    # 個人コードで検索してクリック\n    target_item = list_ctrl.ListItemControl(Name=target_code)\n    target_item.Click()\n\n    # OKボタンまたはダブルクリック\n    ok_btn = dialog.ButtonControl(searchDepth=5, Name=\"OK\")\n    if ok_btn.Exists(2):\n        ok_btn.Click()\n    else:\n        target_item.DoubleClick()\n\n    # 確認ダイアログのOKをクリック\n    confirm_dialog = shotokuzei.WindowControl(SubName=\"所得税の達人\")\n    if confirm_dialog.Exists(2):\n        confirm_ok = confirm_dialog.ButtonControl(Name=\"OK\")\n        if confirm_ok.Exists(1):\n            confirm_ok.Click()\n\n    return True\n",[33,1129,1130,1157,1166,1170,1175,1210,1231,1241,1251,1258,1262,1267,1296,1308,1324,1329,1335,1363,1380,1385,1391,1417,1428,1433,1439,1475,1492,1504,1512,1524,1529,1535,1564,1582,1610,1628,1640,1645],{"__ignoreMap":111},[115,1131,1132,1134,1137,1139,1142,1144,1146,1148,1150,1153,1155],{"class":117,"line":118},[115,1133,336],{"class":256},[115,1135,1136],{"class":157}," open_jigyosha",[115,1138,310],{"class":252},[115,1140,1141],{"class":348},"target_code",[115,1143,815],{"class":252},[115,1145,818],{"class":121},[115,1147,253],{"class":252},[115,1149,370],{"class":260},[115,1151,1152],{"class":125},"9999",[115,1154,261],{"class":260},[115,1156,441],{"class":252},[115,1158,1159,1161,1164],{"class":117,"line":154},[115,1160,837],{"class":260},[115,1162,1163],{"class":125},"指定した個人コードの事業者を開く",[115,1165,843],{"class":260},[115,1167,1168],{"class":117,"line":170},[115,1169,331],{"emptyLinePlaceholder":330},[115,1171,1172],{"class":117,"line":345},[115,1173,1174],{"class":227},"    # 所得税の達人ウィンドウを取得（なければ起動）\n",[115,1176,1177,1180,1182,1184,1186,1188,1190,1192,1194,1196,1198,1200,1202,1204,1206,1208],{"class":117,"line":414},[115,1178,1179],{"class":348},"    shotokuzei ",[115,1181,404],{"class":252},[115,1183,470],{"class":348},[115,1185,319],{"class":252},[115,1187,475],{"class":348},[115,1189,310],{"class":252},[115,1191,480],{"class":400},[115,1193,404],{"class":252},[115,1195,457],{"class":437},[115,1197,367],{"class":252},[115,1199,489],{"class":400},[115,1201,404],{"class":252},[115,1203,261],{"class":260},[115,1205,496],{"class":125},[115,1207,261],{"class":260},[115,1209,411],{"class":252},[115,1211,1212,1215,1218,1220,1222,1224,1226,1229],{"class":117,"line":420},[115,1213,1214],{"class":407},"    if",[115,1216,1217],{"class":256}," not",[115,1219,509],{"class":348},[115,1221,319],{"class":252},[115,1223,514],{"class":348},[115,1225,310],{"class":252},[115,1227,1228],{"class":437},"3",[115,1230,441],{"class":252},[115,1232,1233,1235,1237,1239],{"class":117,"line":444},[115,1234,465],{"class":348},[115,1236,404],{"class":252},[115,1238,339],{"class":348},[115,1240,753],{"class":252},[115,1242,1243,1245,1247,1249],{"class":117,"line":462},[115,1244,506],{"class":407},[115,1246,1217],{"class":256},[115,1248,509],{"class":348},[115,1250,761],{"class":252},[115,1252,1253,1255],{"class":117,"line":503},[115,1254,527],{"class":407},[115,1256,1257],{"class":407}," False\n",[115,1259,1260],{"class":117,"line":524},[115,1261,331],{"emptyLinePlaceholder":330},[115,1263,1264],{"class":117,"line":533},[115,1265,1266],{"class":227},"    # ツールバーの「開く」ボタンをクリック\n",[115,1268,1270,1273,1275,1277,1279,1281,1283,1285,1287,1289,1292,1294],{"class":117,"line":1269},12,[115,1271,1272],{"class":348},"    open_btn ",[115,1274,404],{"class":252},[115,1276,509],{"class":348},[115,1278,319],{"class":252},[115,1280,696],{"class":348},[115,1282,310],{"class":252},[115,1284,589],{"class":400},[115,1286,404],{"class":252},[115,1288,261],{"class":260},[115,1290,1291],{"class":125},"事業者データの選択を行います。",[115,1293,261],{"class":260},[115,1295,411],{"class":252},[115,1297,1299,1302,1304,1306],{"class":117,"line":1298},13,[115,1300,1301],{"class":348},"    open_btn",[115,1303,319],{"class":252},[115,1305,750],{"class":348},[115,1307,753],{"class":252},[115,1309,1311,1314,1316,1318,1320,1322],{"class":117,"line":1310},14,[115,1312,1313],{"class":348},"    time",[115,1315,319],{"class":252},[115,1317,452],{"class":348},[115,1319,310],{"class":252},[115,1321,627],{"class":437},[115,1323,411],{"class":252},[115,1325,1327],{"class":117,"line":1326},15,[115,1328,331],{"emptyLinePlaceholder":330},[115,1330,1332],{"class":117,"line":1331},16,[115,1333,1334],{"class":227},"    # ダイアログ取得\n",[115,1336,1338,1341,1343,1345,1347,1349,1351,1353,1355,1357,1359,1361],{"class":117,"line":1337},17,[115,1339,1340],{"class":348},"    dialog ",[115,1342,404],{"class":252},[115,1344,509],{"class":348},[115,1346,319],{"class":252},[115,1348,475],{"class":348},[115,1350,310],{"class":252},[115,1352,589],{"class":400},[115,1354,404],{"class":252},[115,1356,261],{"class":260},[115,1358,596],{"class":125},[115,1360,261],{"class":260},[115,1362,411],{"class":252},[115,1364,1366,1369,1371,1373,1375,1378],{"class":117,"line":1365},18,[115,1367,1368],{"class":348},"    list_ctrl ",[115,1370,404],{"class":252},[115,1372,691],{"class":348},[115,1374,319],{"class":252},[115,1376,1377],{"class":348},"ListControl",[115,1379,753],{"class":252},[115,1381,1383],{"class":117,"line":1382},19,[115,1384,331],{"emptyLinePlaceholder":330},[115,1386,1388],{"class":117,"line":1387},20,[115,1389,1390],{"class":227},"    # 個人コードで検索してクリック\n",[115,1392,1394,1397,1399,1402,1404,1407,1409,1411,1413,1415],{"class":117,"line":1393},21,[115,1395,1396],{"class":348},"    target_item ",[115,1398,404],{"class":252},[115,1400,1401],{"class":348}," list_ctrl",[115,1403,319],{"class":252},[115,1405,1406],{"class":348},"ListItemControl",[115,1408,310],{"class":252},[115,1410,589],{"class":400},[115,1412,404],{"class":252},[115,1414,1141],{"class":348},[115,1416,411],{"class":252},[115,1418,1420,1422,1424,1426],{"class":117,"line":1419},22,[115,1421,771],{"class":348},[115,1423,319],{"class":252},[115,1425,750],{"class":348},[115,1427,753],{"class":252},[115,1429,1431],{"class":117,"line":1430},23,[115,1432,331],{"emptyLinePlaceholder":330},[115,1434,1436],{"class":117,"line":1435},24,[115,1437,1438],{"class":227},"    # OKボタンまたはダブルクリック\n",[115,1440,1442,1445,1447,1449,1451,1453,1455,1457,1459,1461,1463,1465,1467,1469,1471,1473],{"class":117,"line":1441},25,[115,1443,1444],{"class":348},"    ok_btn ",[115,1446,404],{"class":252},[115,1448,691],{"class":348},[115,1450,319],{"class":252},[115,1452,696],{"class":348},[115,1454,310],{"class":252},[115,1456,480],{"class":400},[115,1458,404],{"class":252},[115,1460,705],{"class":437},[115,1462,367],{"class":252},[115,1464,710],{"class":400},[115,1466,404],{"class":252},[115,1468,261],{"class":260},[115,1470,717],{"class":125},[115,1472,261],{"class":260},[115,1474,411],{"class":252},[115,1476,1478,1480,1482,1484,1486,1488,1490],{"class":117,"line":1477},26,[115,1479,1214],{"class":407},[115,1481,729],{"class":348},[115,1483,319],{"class":252},[115,1485,514],{"class":348},[115,1487,310],{"class":252},[115,1489,738],{"class":437},[115,1491,441],{"class":252},[115,1493,1495,1498,1500,1502],{"class":117,"line":1494},27,[115,1496,1497],{"class":348},"        ok_btn",[115,1499,319],{"class":252},[115,1501,750],{"class":348},[115,1503,753],{"class":252},[115,1505,1507,1510],{"class":117,"line":1506},28,[115,1508,1509],{"class":407},"    else",[115,1511,761],{"class":252},[115,1513,1515,1518,1520,1522],{"class":117,"line":1514},29,[115,1516,1517],{"class":348},"        target_item",[115,1519,319],{"class":252},[115,1521,776],{"class":348},[115,1523,753],{"class":252},[115,1525,1527],{"class":117,"line":1526},30,[115,1528,331],{"emptyLinePlaceholder":330},[115,1530,1532],{"class":117,"line":1531},31,[115,1533,1534],{"class":227},"    # 確認ダイアログのOKをクリック\n",[115,1536,1538,1541,1543,1545,1547,1549,1551,1554,1556,1558,1560,1562],{"class":117,"line":1537},32,[115,1539,1540],{"class":348},"    confirm_dialog ",[115,1542,404],{"class":252},[115,1544,509],{"class":348},[115,1546,319],{"class":252},[115,1548,475],{"class":348},[115,1550,310],{"class":252},[115,1552,1553],{"class":400},"SubName",[115,1555,404],{"class":252},[115,1557,261],{"class":260},[115,1559,496],{"class":125},[115,1561,261],{"class":260},[115,1563,411],{"class":252},[115,1565,1567,1569,1572,1574,1576,1578,1580],{"class":117,"line":1566},33,[115,1568,1214],{"class":407},[115,1570,1571],{"class":348}," confirm_dialog",[115,1573,319],{"class":252},[115,1575,514],{"class":348},[115,1577,310],{"class":252},[115,1579,738],{"class":437},[115,1581,441],{"class":252},[115,1583,1585,1588,1590,1592,1594,1596,1598,1600,1602,1604,1606,1608],{"class":117,"line":1584},34,[115,1586,1587],{"class":348},"        confirm_ok ",[115,1589,404],{"class":252},[115,1591,1571],{"class":348},[115,1593,319],{"class":252},[115,1595,696],{"class":348},[115,1597,310],{"class":252},[115,1599,589],{"class":400},[115,1601,404],{"class":252},[115,1603,261],{"class":260},[115,1605,717],{"class":125},[115,1607,261],{"class":260},[115,1609,411],{"class":252},[115,1611,1613,1615,1618,1620,1622,1624,1626],{"class":117,"line":1612},35,[115,1614,506],{"class":407},[115,1616,1617],{"class":348}," confirm_ok",[115,1619,319],{"class":252},[115,1621,514],{"class":348},[115,1623,310],{"class":252},[115,1625,457],{"class":437},[115,1627,441],{"class":252},[115,1629,1631,1634,1636,1638],{"class":117,"line":1630},36,[115,1632,1633],{"class":348},"            confirm_ok",[115,1635,319],{"class":252},[115,1637,750],{"class":348},[115,1639,753],{"class":252},[115,1641,1643],{"class":117,"line":1642},37,[115,1644,331],{"emptyLinePlaceholder":330},[115,1646,1648,1650],{"class":117,"line":1647},38,[115,1649,536],{"class":407},[115,1651,1652],{"class":407}," True\n",[60,1654,1655],{"id":1655},"結果",[17,1657,1658],{},"事業者「9999」が正常に開かれ、業務メニューが表示された。",[17,1660,1661],{},[209,1662],{"alt":1663,"src":1664},"事業者オープン完了","/2026-01/2026-01-08/images/05_05_complete.png",[60,1666,1667],{"id":1667},"仮想クリックの実装",[101,1669,93],{"id":1670},"背景-1",[17,1672,1673,1674,1677],{},"通常の",[33,1675,1676],{},"Click()","メソッドはマウスカーソルを実際に動かすため、自動化中に他の作業ができない。マウスを動かさずに操作する「仮想クリック」を実装した。",[101,1679,1680],{"id":1680},"実装した方法",[106,1682,1684],{"className":218,"code":1683,"language":220,"meta":111,"style":111},"import ctypes\n\n# Win32 API定数\nWM_KEYDOWN = 0x0100\nWM_KEYUP = 0x0101\nVK_RETURN = 0x0D\n\ndef send_enter_to_window(hwnd):\n    \"\"\"ウィンドウにEnterキーを直接送信（フォーカス不要）\"\"\"\n    ctypes.windll.user32.PostMessageW(hwnd, WM_KEYDOWN, VK_RETURN, 0)\n    time.sleep(0.05)\n    ctypes.windll.user32.PostMessageW(hwnd, WM_KEYUP, VK_RETURN, 0)\n\ndef virtual_select(element):\n    \"\"\"仮想選択 - マウスを動かさずに選択\"\"\"\n    pattern = element.GetSelectionItemPattern()\n    if pattern:\n        pattern.Select()\n        return True\n    return False\n",[33,1685,1686,1694,1698,1703,1715,1727,1739,1743,1757,1766,1807,1822,1857,1861,1875,1884,1901,1910,1922,1929],{"__ignoreMap":111},[115,1687,1688,1691],{"class":117,"line":118},[115,1689,1690],{"class":407},"import",[115,1692,1693],{"class":348}," ctypes\n",[115,1695,1696],{"class":117,"line":154},[115,1697,331],{"emptyLinePlaceholder":330},[115,1699,1700],{"class":117,"line":170},[115,1701,1702],{"class":227},"# Win32 API定数\n",[115,1704,1705,1707,1709,1712],{"class":117,"line":345},[115,1706,35],{"class":129},[115,1708,253],{"class":252},[115,1710,1711],{"class":256}," 0x",[115,1713,1714],{"class":437},"0100\n",[115,1716,1717,1720,1722,1724],{"class":117,"line":414},[115,1718,1719],{"class":129},"WM_KEYUP",[115,1721,253],{"class":252},[115,1723,1711],{"class":256},[115,1725,1726],{"class":437},"0101\n",[115,1728,1729,1732,1734,1736],{"class":117,"line":420},[115,1730,1731],{"class":129},"VK_RETURN",[115,1733,253],{"class":252},[115,1735,1711],{"class":256},[115,1737,1738],{"class":437},"0D\n",[115,1740,1741],{"class":117,"line":444},[115,1742,331],{"emptyLinePlaceholder":330},[115,1744,1745,1747,1750,1752,1755],{"class":117,"line":462},[115,1746,336],{"class":256},[115,1748,1749],{"class":157}," send_enter_to_window",[115,1751,310],{"class":252},[115,1753,1754],{"class":348},"hwnd",[115,1756,441],{"class":252},[115,1758,1759,1761,1764],{"class":117,"line":503},[115,1760,837],{"class":260},[115,1762,1763],{"class":125},"ウィンドウにEnterキーを直接送信（フォーカス不要）",[115,1765,843],{"class":260},[115,1767,1768,1771,1773,1776,1778,1781,1783,1786,1788,1790,1792,1795,1797,1800,1802,1805],{"class":117,"line":524},[115,1769,1770],{"class":348},"    ctypes",[115,1772,319],{"class":252},[115,1774,1775],{"class":348},"windll",[115,1777,319],{"class":252},[115,1779,1780],{"class":348},"user32",[115,1782,319],{"class":252},[115,1784,1785],{"class":348},"PostMessageW",[115,1787,310],{"class":252},[115,1789,1754],{"class":348},[115,1791,367],{"class":252},[115,1793,1794],{"class":129}," WM_KEYDOWN",[115,1796,367],{"class":252},[115,1798,1799],{"class":129}," VK_RETURN",[115,1801,367],{"class":252},[115,1803,1804],{"class":437}," 0",[115,1806,411],{"class":252},[115,1808,1809,1811,1813,1815,1817,1820],{"class":117,"line":533},[115,1810,1313],{"class":348},[115,1812,319],{"class":252},[115,1814,452],{"class":348},[115,1816,310],{"class":252},[115,1818,1819],{"class":437},"0.05",[115,1821,411],{"class":252},[115,1823,1824,1826,1828,1830,1832,1834,1836,1838,1840,1842,1844,1847,1849,1851,1853,1855],{"class":117,"line":1269},[115,1825,1770],{"class":348},[115,1827,319],{"class":252},[115,1829,1775],{"class":348},[115,1831,319],{"class":252},[115,1833,1780],{"class":348},[115,1835,319],{"class":252},[115,1837,1785],{"class":348},[115,1839,310],{"class":252},[115,1841,1754],{"class":348},[115,1843,367],{"class":252},[115,1845,1846],{"class":129}," WM_KEYUP",[115,1848,367],{"class":252},[115,1850,1799],{"class":129},[115,1852,367],{"class":252},[115,1854,1804],{"class":437},[115,1856,411],{"class":252},[115,1858,1859],{"class":117,"line":1298},[115,1860,331],{"emptyLinePlaceholder":330},[115,1862,1863,1865,1868,1870,1873],{"class":117,"line":1310},[115,1864,336],{"class":256},[115,1866,1867],{"class":157}," virtual_select",[115,1869,310],{"class":252},[115,1871,1872],{"class":348},"element",[115,1874,441],{"class":252},[115,1876,1877,1879,1882],{"class":117,"line":1326},[115,1878,837],{"class":260},[115,1880,1881],{"class":125},"仮想選択 - マウスを動かさずに選択",[115,1883,843],{"class":260},[115,1885,1886,1889,1891,1894,1896,1899],{"class":117,"line":1331},[115,1887,1888],{"class":348},"    pattern ",[115,1890,404],{"class":252},[115,1892,1893],{"class":348}," element",[115,1895,319],{"class":252},[115,1897,1898],{"class":348},"GetSelectionItemPattern",[115,1900,753],{"class":252},[115,1902,1903,1905,1908],{"class":117,"line":1337},[115,1904,1214],{"class":407},[115,1906,1907],{"class":348}," pattern",[115,1909,761],{"class":252},[115,1911,1912,1915,1917,1920],{"class":117,"line":1365},[115,1913,1914],{"class":348},"        pattern",[115,1916,319],{"class":252},[115,1918,1919],{"class":348},"Select",[115,1921,753],{"class":252},[115,1923,1924,1927],{"class":117,"line":1382},[115,1925,1926],{"class":407},"        return",[115,1928,1652],{"class":407},[115,1930,1931,1933],{"class":117,"line":1387},[115,1932,536],{"class":407},[115,1934,1257],{"class":407},[101,1936,1937],{"id":1937},"動作する方法",[1939,1940,1941,1957],"table",{},[1942,1943,1944],"thead",{},[1945,1946,1947,1951,1954],"tr",{},[1948,1949,1950],"th",{},"方法",[1948,1952,1953],{},"動作",[1948,1955,1956],{},"マウス移動",[1958,1959,1960,1974,1986,2000],"tbody",{},[1945,1961,1962,1968,1971],{},[1963,1964,1965],"td",{},[33,1966,1967],{},"SelectionItemPattern.Select()",[1963,1969,1970],{},"○",[1963,1972,1973],{},"なし",[1945,1975,1976,1981,1984],{},[1963,1977,1978],{},[33,1979,1980],{},"PostMessage(WM_KEYDOWN)",[1963,1982,1983],{},"△（アプリ依存）",[1963,1985,1973],{},[1945,1987,1988,1993,1995],{},[1963,1989,1990],{},[33,1991,1992],{},"SetFocus() + SendKeys()",[1963,1994,1970],{},[1963,1996,1997],{},[20,1998,1999],{},"フォーカス奪われる",[1945,2001,2002,2006,2008],{},[1963,2003,2004],{},[33,2005,1676],{},[1963,2007,1970],{},[1963,2009,2010],{},[20,2011,2012],{},"カーソル移動する",[101,2014,2015],{"id":2015},"動作しなかった方法",[1108,2017,2018,2024,2030],{},[70,2019,2020,2023],{},[33,2021,2022],{},"InvokePattern.Invoke()"," → COMエラー (-2147220992)",[70,2025,2026,2029],{},[33,2027,2028],{},"LegacyIAccessiblePattern.DoDefaultAction()"," → COMエラー",[70,2031,2032,2035],{},[33,2033,2034],{},"BM_CLICK","メッセージ → 反応なし",[60,2037,2039],{"id":2038},"マウスフォーカスが奪われる問題windows仕様","マウス/フォーカスが奪われる問題（Windows仕様）",[101,2041,2042],{"id":2042},"調査結果",[17,2044,2045],{},[20,2046,2047],{},"結論：アプリケーション依存であり、完全なバックグラウンド操作は難しい",[1064,2049,2051],{"id":2050},"windowsの仕様","Windowsの仕様",[67,2053,2054,2072,2095],{},[70,2055,2056,2059,2060],{},[20,2057,2058],{},"WM_KEYDOWNの設計",": 「キーボードフォーカスを持つウィンドウに送られる」のがWindowsの基本設計",[1108,2061,2062],{},[70,2063,2064,2065],{},"参考: ",[2066,2067,2071],"a",{"href":2068,"rel":2069},"https://learn.microsoft.com/en-us/windows/win32/inputdev/wm-keydown",[2070],"nofollow","Microsoft Learn - WM_KEYDOWN",[70,2073,2074,815,2077],{},[20,2075,2076],{},"PostMessageの動作はアプリ依存",[1108,2078,2079,2082,2085,2088],{},[70,2080,2081],{},"Firefox、Acrobatでは動作する",[70,2083,2084],{},"Word、Notepadでは動作しない",[70,2086,2087],{},"「受信側アプリがどう入力を受け取るかによる」",[70,2089,2064,2090],{},[2066,2091,2094],{"href":2092,"rel":2093},"https://learncodebygaming.com/blog/how-to-send-inputs-to-multiple-windows-and-minimized-windows-with-python",[2070],"LearnCodeByGaming",[70,2096,2097,815,2100],{},[20,2098,2099],{},"pywinautoの制限",[1108,2101,2102,2108,2114,2127],{},[70,2103,2104,2107],{},[33,2105,2106],{},"click()"," (WM_*メッセージ) はマウスを動かさないが、アプリによっては動作しない",[70,2109,2110,2113],{},[33,2111,2112],{},"click_input()"," は実際にマウスを動かす",[70,2115,2116,2119,2120,2123,2124],{},[33,2117,2118],{},"set_focus()"," は ",[33,2121,2122],{},"SetForegroundWindow"," を使うため、",[20,2125,2126],{},"フォーカス移動は避けられない",[70,2128,2064,2129],{},[2066,2130,2133],{"href":2131,"rel":2132},"https://github.com/pywinauto/pywinauto/issues/1096",[2070],"pywinauto Issue #1096",[1064,2135,2136],{"id":2136},"達人の場合",[17,2138,2139],{},"達人は古いWin32アプリケーションで、UIAutomationパターンが完全にサポートされていない：",[1939,2141,2142,2151],{},[1942,2143,2144],{},[1945,2145,2146,2149],{},[1948,2147,2148],{},"パターン",[1948,2150,1953],{},[1958,2152,2153,2162,2171],{},[1945,2154,2155,2159],{},[1963,2156,2157],{},[33,2158,1967],{},[1963,2160,2161],{},"○ 動作する",[1945,2163,2164,2168],{},[1963,2165,2166],{},[33,2167,2022],{},[1963,2169,2170],{},"× COMエラー",[1945,2172,2173,2177],{},[1963,2174,2175],{},[33,2176,1980],{},[1963,2178,2179],{},"△ 一部動作しない",[1064,2181,2182],{"id":2182},"代替案",[67,2184,2185,2191,2197],{},[70,2186,2187,2190],{},[20,2188,2189],{},"別のデスクトップで実行",": 仮想デスクトップやRDPセッションで自動化を走らせる",[70,2192,2193,2196],{},[20,2194,2195],{},"ヘッドレス実行",": ロックされたPCでは制限がある",[70,2198,2199,2202],{},[20,2200,2201],{},"諦めてフォーカスを許容",": 自動化中は別の作業をしない",[1064,2204,2205],{"id":2205},"参考リンク",[1108,2207,2208,2213,2219,2226,2233],{},[70,2209,2210],{},[2066,2211,2071],{"href":2068,"rel":2212},[2070],[70,2214,2215],{},[2066,2216,2218],{"href":2131,"rel":2217},[2070],"pywinauto Issue #1096 - No active desktop required",[70,2220,2221],{},[2066,2222,2225],{"href":2223,"rel":2224},"https://github.com/pywinauto/pywinauto/issues/1153",[2070],"pywinauto Issue #1153 - Click() not working for background window",[70,2227,2228],{},[2066,2229,2232],{"href":2230,"rel":2231},"https://www.autohotkey.com/boards/viewtopic.php?t=17577",[2070],"AutoHotkey - Sending click to inactive window",[70,2234,2235],{},[2066,2236,2238],{"href":2092,"rel":2237},[2070],"LearnCodeByGaming - Send inputs to multiple windows",[60,2240,2241],{"id":2241},"今後の課題",[1108,2243,2244,2247,2250,2253],{},[70,2245,2246],{},"業務メニューからの操作自動化",[70,2248,2249],{},"複数事業者の連続処理",[70,2251,2252],{},"エラーハンドリングの強化",[70,2254,2255,2258],{},[20,2256,2257],{},"フォーカスが奪われる問題",": Windowsの仕様上、完全なバックグラウンド操作は難しい",[60,2260,2261],{"id":2261},"参考",[1108,2263,2264,2271],{},[70,2265,2266],{},[2066,2267,2270],{"href":2268,"rel":2269},"https://github.com/yinkaisheng/Python-UIAutomation-for-Windows",[2070],"uiautomation GitHub",[70,2272,2273],{},"Windows UI Automation APIはMicrosoftが提供するアクセシビリティAPI",[2275,2276,2277],"style",{},"html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sLkVR, html code.shiki .sLkVR{--shiki-default:#AB5E3F;--shiki-dark:#AB5E3F}html pre.shiki code .svWSF, html code.shiki .svWSF{--shiki-default:#BDA437;--shiki-dark:#BDA437}html pre.shiki code .sG7-3, html code.shiki .sG7-3{--shiki-default:#393A34;--shiki-dark:#393A34}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}",{"title":111,"searchDepth":154,"depth":154,"links":2279},[2280,2281,2282,2286,2293,2294,2295,2301,2304,2305],{"id":62,"depth":154,"text":62},{"id":93,"depth":154,"text":93},{"id":99,"depth":154,"text":99,"children":2283},[2284,2285],{"id":103,"depth":170,"text":104},{"id":187,"depth":170,"text":187},{"id":198,"depth":154,"text":198,"children":2287},[2288,2289,2290,2291,2292],{"id":201,"depth":170,"text":202},{"id":542,"depth":170,"text":543},{"id":663,"depth":170,"text":664},{"id":781,"depth":170,"text":782},{"id":791,"depth":170,"text":792},{"id":1124,"depth":154,"text":1124},{"id":1655,"depth":154,"text":1655},{"id":1667,"depth":154,"text":1667,"children":2296},[2297,2298,2299,2300],{"id":1670,"depth":170,"text":93},{"id":1680,"depth":170,"text":1680},{"id":1937,"depth":170,"text":1937},{"id":2015,"depth":170,"text":2015},{"id":2038,"depth":154,"text":2039,"children":2302},[2303],{"id":2042,"depth":170,"text":2042},{"id":2241,"depth":154,"text":2241},{"id":2261,"depth":154,"text":2261},"dev",null,"PythonのuiautomationライブラリでWindows UI Automation APIを使い、税務申告ソフト「所得税の達人」の事業者選択操作を自動化した記録","md",{},"/uiautomation-shotokuzei-tatsujin",false,"2026-01-08T00:00:00.000Z",{"title":5,"description":2308},"2026-01/2026-01-08/uiautomation-shotokuzei-tatsujin",[220,2317,2318,2319,2320],"rpa","windows","uiautomation","達人cube","done","o_tFJpSCBdC580rGN0P7xJfplO9HofWS2fUzi_8Y7Vw",[],[2325,2328,2332,2336,2340],{"title":2326,"path":2327,"publishedAt":2313},"達人Cube自動化の仮説 - Windows UI Automation APIを使ったアプローチ","/tatsujin-cube-automation",{"title":2329,"path":2330,"publishedAt":2331},"Kindle for PC デスクトップ版から全ページキャプチャ＋OCR取り込みパイプラインを組んだ日","/kindle-pc-capture-app","2026-06-23T00:00:00.000Z",{"title":2333,"path":2334,"publishedAt":2335},"Claude Code ステータスラインにレートリミット表示を追加した","/claude-code-statusline-ratelimit-2026-03-03","2026-03-03T00:00:00.000Z",{"title":2337,"path":2338,"publishedAt":2339},"電源を切ると直るバグを追う — ThinkPadキーボードのスクロールだけが死ぬ理由","/thinkpad-trackpoint-scroll-dies-after-sleep","2026-08-11T00:00:00.000Z",{"title":2341,"path":2342,"publishedAt":2343},"Claude Code の設定一式を Windows と Mac の2台で共有する移行作業","/dotclaude-two-machine-migration","2026-08-10T00:00:00.000Z","https://log.eurekapu.com/og/blog/uiautomation-shotokuzei-tatsujin.png?v=2026-01-08T00%3A00%3A00.000Z&title=%E6%89%80%E5%BE%97%E7%A8%8E%E3%81%AE%E9%81%94%E4%BA%BA%E3%82%92UI%20Automation%20API%E3%81%A7%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B&author=Kei%20Komatsu&sig=bf9c71949e2e948e",1786424288192]