From 065d3413208a4c8bcecc38b92a213cecfdc6dba6 Mon Sep 17 00:00:00 2001 From: chendelian <116870791@qq.com> Date: Sun, 2 Aug 2026 22:07:12 +0800 Subject: [PATCH] feat(desktop-wake): restore SearchResultWindow2 n2-wake without maximize (1.2.10) Re-enable float subclass warm (2->122 verified locally); keep activate_maximize=false. Co-authored-by: Cursor --- pyproject.toml | 2 +- src/jiangchang_desktop_wake/ACCEPTANCE.md | 18 +++++------ src/jiangchang_desktop_wake/README.md | 2 +- .../native/desktop-wake.exe | Bin 18944 -> 18944 bytes .../native/wecom_wake.dll | Bin 120320 -> 118784 bytes .../native_src/DesktopWake/Program.cs | 28 ++---------------- .../native_src/N2/payload/wecom_wake.cpp | 23 +------------- src/jiangchang_desktop_wake/profiles.py | 6 ++-- .../profiles/wecom_search.json | 10 ++++--- src/jiangchang_desktop_wake/types.py | 2 +- tests/desktop_wake/test_profiles_and_types.py | 7 ++--- 11 files changed, 28 insertions(+), 70 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index cbd0339..a4d74e8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "jiangchang-platform-kit" -version = "1.2.9" +version = "1.2.10" description = "匠厂平台共享组件:Skill 实体 SDK + 桌面应用自动化 SDK + 桌面 UIA 暖树" readme = "README.md" requires-python = ">=3.10" diff --git a/src/jiangchang_desktop_wake/ACCEPTANCE.md b/src/jiangchang_desktop_wake/ACCEPTANCE.md index b9a8d2d..709af6c 100644 --- a/src/jiangchang_desktop_wake/ACCEPTANCE.md +++ b/src/jiangchang_desktop_wake/ACCEPTANCE.md @@ -1,4 +1,4 @@ -# jiangchang_desktop_wake 验收(ensure 主路径,1.2.9+) +# jiangchang_desktop_wake 验收(ensure 主路径,1.2.10+) 正式对外路径是 **`ensure`**(内部:`activate` → `desktop-wake --mode n2-wake` → `probe`)。 `n2-wake`:**仅 OBJID_CLIENT** 走 DuiLib;不做进程内 FindAll、不同步 GETOBJECT、不 SPI 读屏;判暖只看进程外 probe。 @@ -7,7 +7,7 @@ | profile | 窗 | 说明 | |---|---|---| | `wecom` | `WeWorkWindow` | 主窗(原有) | -| `wecom_search` | `SearchResultWindow2` | 搜索浮层;**不对浮层 Maximize / 不注入**(1.2.9+ 仅软唤醒;注入会崩企微) | +| `wecom_search` | `SearchResultWindow2` | 搜索浮层;**不对浮层 Maximize**;n2-wake **子类化浮层本身**(多 HWND;1.2.10+) | ## 0. 编译(企微先完全退出,含托盘) @@ -77,11 +77,11 @@ python -m jiangchang_desktop_wake probe --profile wecom --- -## C. 搜索浮层 wecom_search(1.2.9+) +## C. 搜索浮层 wecom_search(1.2.10+) -1. **建议先** `ensure --profile wecom` 暖主窗(可与浮层分步)。 +1. **建议先** `ensure --profile wecom` 暖主窗(可与浮层分步;验证多 HWND)。 2. 在搜索框输入联系人,**保持搜索结果浮层打开**(类名 `SearchResultWindow2`)。 -3. 验收(**禁止**对浮层 n2-wake/注入;profile 仅 `wm_getobject` + `msaa`): +3. 验收: ```powershell cd D:\OpenClaw\client-jiangchang\jiangchang-platform-kit @@ -93,10 +93,10 @@ python -m jiangchang_desktop_wake probe --profile wecom_search | 期望 | 说明 | |---|---| -| ensure **不**崩企微 | 故障模块不应再是 `wecom_wake.dll` | -| `warm=true`(或 soft poke 后 findall≫2) | markers 含 `search_result` / `user_item` | -| 企微 UI | 浮层保持打开、**不** Maximize、不白屏 | -| 若手动对浮层跑 `desktop-wake … n2-wake` | exe/DLL 应走 `popup_soft_only` / `popup_nudge_only`,**不**子类化浮层 | +| ensure 退出码 `0` | 浮层已暖 | +| `warm=true` | markers 含 `search_result` / `user_item`;findall 从 ~2 升到几十/上百 | +| `%TEMP%\jiangchang_desktop_wake_subclass.txt` | 含浮层 hwnd,`ok=1`(主窗已暖后再 ensure 浮层可 `slots>=2`) | +| 企微 UI | 浮层**不**被 Maximize、**不崩**、不无故关闭 | | `WINDOW_NOT_FOUND` | 浮层未打开——先展开搜索结果再测 | --- diff --git a/src/jiangchang_desktop_wake/README.md b/src/jiangchang_desktop_wake/README.md index 8c9ed6a..87f1813 100644 --- a/src/jiangchang_desktop_wake/README.md +++ b/src/jiangchang_desktop_wake/README.md @@ -42,7 +42,7 @@ print(rs.warm, rs.probe_after.findall_count, rs.probe_after.markers_found) | profile | 窗 | 说明 | |---|---|---| | `wecom` | `WeWorkWindow` | 主窗;markers=`con_op`,`searchedit` | -| `wecom_search` | `SearchResultWindow2` | 搜索浮层;markers=`search_result`,`user_item`;**禁止注入/n2-wake**(1.2.9+ 仅进程外软唤醒) | +| `wecom_search` | `SearchResultWindow2` | 搜索浮层;markers=`search_result`,`user_item`;不 Maximize;**n2-wake 对浮层子类化**(1.2.10+) | | CLI | 退出码 | |---|---| diff --git a/src/jiangchang_desktop_wake/native/desktop-wake.exe b/src/jiangchang_desktop_wake/native/desktop-wake.exe index 6a19f594f4202dd553ec0987f2be1739f188994e..61af5d35b4ce3e2489f03474cd56290600149378 100644 GIT binary patch delta 4244 zcmai23vg7`8UD|?@4K7L-o450<^>56xDbL6jDQ2kt09OePis(-s8nFU#S2!^PByfK z+K7~Ju=P1sIyw*^RpLmgj#H*uq*}#}wx$Ifrdq9~3N02;OZ%O3vjGM=W@f+p|KI;Q z=Rc2oC+%BU`xdt8ZmwV1+0l=0T-e!lRbt{oq8Wt0MMOvR&Kh6Tu4ThAM2_cru~bni5mX_+Z+k_)<=ORC_+Pl! zCA}EL8V=D28}aZ>C#aB)#hw*@1B6#Bey7*vi|bh0v%O-|NvG5I785a*WU-8llB|uA z+=oZFQwCZ=5s_ANOaJMV`@&hY4kyl)AS3+)uoW`?7a&~=nI(=4wqC#wizo7g8 zMkfP@q%-N$g9u-YD#gyIBs1G^uHJ;{2MJib_}G=Q6~RCZ#0dr|#2j2d=_SS6MrHn^ zbJLU|O&6lPWX^-@L2b}M$o(eFBuGxLaO>Tteq+omt{1Pwe z8NpB)SL&5`dP9Y0Y+O1lwb(1o`EsDpPU-1WtWM9M;eNVzF*05n%j9cnnd3J-MzK)4_OB7)GfaMz+v- z#B1epB;^NwfN5gw&*=R_h%Y#1{PKfK{4(S^!=qAd6u;7|Oovaxd8=31obk$XY1GJN z03fpA?#NOGLpI{d)r?@Q@GM|Z2D(rP%Yt<%A1ZcQHO>N@8wcaMQ5>>-VwCQBS3K^3}9M$1CJ9uY705k^E9 zM#003h-qTAljEI+_|Un8?=nPyN@C{2Y+O&Eke9&r)-?97w6!&PMnjLoAB@j9n-6_%XI#oQx0QTP$%wQ8nLTiKe1= z`0p*jk|kn9!s3T5F*Y%pACZhN)+PF}q_{PaDfu@RARJ?321&WGbx#lHh_@2uY`OR( zF`DgwQ(BBE9$)n*_;_aweRkS+4i3e^kLzKj*j&7V&DxyIG=AGbDjYd8X0_o?bb~Q~ zVR19ubY6p-(8FgPad~no`*?G*R6LO!#^RzAgZ?O4!>$mHw}`EVUaFblMlmv3sv}jG z60%14rnHE?UKw{|YNjW=8Em+inrb)ZVP1}?@$3AHVzjb6m@bE*r{f39t?*iLy?+_2 z6c4K=L+~tZC65&;c<4CpB=1-rBXA=5r;`S4 z7!b2pEgg$^D!PnpT(DA0X~*$lH?CJ3qJ0T%mOS3DU8tFC7Hz1D zvDqIc#b7kLwU6g?mtyijoz{OXA64OW zuTFU+Ivr+ECxT6SK<8x9*4{)M`}Tb${{zVBpFoX{>%3a0uM|Jnko;(%MomCQa}+L6 z{EdoV0n}+V(4cidM$($+^dmepdIYG`6Nda!e@dBut#BWZ(|bye(j9`V(J>%un=)N7 z(4-2WMRh<%7Xvv>Q1VPuPGG*07b$)z5d8z{d0L|k=Z6;M;W z-pgaUy(OcGOfUNoRh#_$MUyQgWb;7 z&=k7^*sQR{-UxZIy+z@J3Lj%Xqz(2qRzsWZr-3bYH}DZV$2#dr`$ZO~pWA!jxyybX z@*aC1dw>qwe_-25b2=c$fimZx*>lw2artv}fm6hHy7^UYV;BIFc-$i>B|E@EW|Ba42tAQDJ z4L?eQ+zwP30zF>VVl}KX$)|0*|^KoUv}Vlb@u$?n4-F zi(SOa*namV4C|O104eq>K7@I(-vIkNufs<+S>k>^l2ykJV^~9D$N5+`!#M?cd`#EY z(6rbdwwva}9L=MiJOVtr29$$&%N8w(WwbJuiw)9-(7IRy@F%fxz{i0#Xj(U$#9ody zL)POnwdqW@J&uw&EJy$NBCVD6=!;>U5MQCisX2ZJ{r~FNRh#%!it-n^MU93&fTC_Ipe(huHU)Cv0 zv<=wLUK7{U4#aow+SR74+jdXy9NhlGW6wO^ z)&0u&Lo6OxRf&Y1wSkH59hWvR@yW#PsU^MtFpyVro0O|NYtnq>Lh;*4Q@g917qRZd S>^8;G))KkLNN?ElStc|WJ_KIV^VAQnR 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 diff --git a/src/jiangchang_desktop_wake/native/wecom_wake.dll b/src/jiangchang_desktop_wake/native/wecom_wake.dll index 741fd329ba1216771939a482d8dafa74c48d6daf..b408356f2e2fb8a431df9496978b770c0e270355 100644 GIT binary patch delta 25188 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 BTlfF~ delta 26424 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 jV1#k;V7aUb2aXOICzr@0 /// 主窗可 Maximize;SearchResultWindow2 等浮层禁止 Maximize(会撑爆/关掉浮层)。 /// diff --git a/src/jiangchang_desktop_wake/native_src/N2/payload/wecom_wake.cpp b/src/jiangchang_desktop_wake/native_src/N2/payload/wecom_wake.cpp index d80ea40..4e58a4f 100644 --- a/src/jiangchang_desktop_wake/native_src/N2/payload/wecom_wake.cpp +++ b/src/jiangchang_desktop_wake/native_src/N2/payload/wecom_wake.cpp @@ -12,7 +12,7 @@ * - 不做进程内 UIAutomation FindAll;不做同步 SendMessage(GETOBJECT) * - 重入守卫;判暖交给进程外 probe * 1.2.8:支持多 HWND 子类化(主窗 + SearchResultWindow2),禁止「全局只装一次」。 - * 1.2.9:SearchResultWindow2 禁止子类化/DuiLib thiscall(会崩企微);浮层只异步 nudge。 + * 1.2.10:恢复对 SearchResultWindow2 子类化暖树(本机验证 2→122 且不崩);仍禁止 Maximize(exe 侧)。 */ #define WIN32_LEAN_AND_MEAN #include @@ -140,14 +140,6 @@ static void NudgeWinEvents(HWND hwnd) PostMessageW(hwnd, WM_NULL, 0, 0); } -static bool IsSearchResultPopup(HWND hwnd) -{ - wchar_t cls[256]; - if (!hwnd || !GetClassNameW(hwnd, cls, 256)) - return false; - return _wcsicmp(cls, L"SearchResultWindow2") == 0; -} - static bool ResolveDuiLib() { if (g_fnGetAccessible && g_fnOnGetObject) return true; @@ -331,19 +323,6 @@ static void DoSafeWake(HWND hwnd) int subclass_ok = 0; int dui_ok = 0; - /* 浮层:DuiLib thiscall / 换 WndProc 在宿主环境会直接崩企微(fault=wecom_wake.dll) */ - if (IsSearchResultPopup(hwnd)) { - NudgeWinEvents(hwnd); - NudgeWinEvents(hwnd); - sprintf_s(line, - "hwnd=%p sta_tid=%lu popup_nudge_only=1 subclass=0 dui=0 " - "dui_hits=%ld getobject_hits=%ld done=1\r\n", - hwnd, GetCurrentThreadId(), - (long)g_duiHits, (long)g_getobjectHits); - WriteMarker("jiangchang_desktop_wake_provider.txt", line); - return; - } - ResolveDuiLib(); dui_ok = (g_fnGetAccessible || g_fnOnGetObject) ? 1 : 0; subclass_ok = InstallDuiSubclass(hwnd) ? 1 : 0; diff --git a/src/jiangchang_desktop_wake/profiles.py b/src/jiangchang_desktop_wake/profiles.py index f90ac09..a064d58 100644 --- a/src/jiangchang_desktop_wake/profiles.py +++ b/src/jiangchang_desktop_wake/profiles.py @@ -44,12 +44,14 @@ _BUILTIN = { }, "wecom_search": { "id": "wecom_search", - "description": "企业微信搜索结果浮层 SearchResultWindow2;仅进程外软唤醒(禁止注入,1.2.9+)", + "description": "企业微信搜索结果浮层 SearchResultWindow2;n2-wake 对浮层子类化(1.2.10+),禁止 Maximize", "window_class": "SearchResultWindow2", "warm_min_findall": 20, "warm_markers": ["search_result", "user_item"], "activate_maximize": False, - "wake_strategies": ["wm_getobject", "msaa_from_window"], + "wake_strategies": ["activate", "native_helper"], + "native_helper": "desktop-wake.exe", + "native_args": ["wecom", "0x{hwnd_hex}", "--mode", "n2-wake"], }, } diff --git a/src/jiangchang_desktop_wake/profiles/wecom_search.json b/src/jiangchang_desktop_wake/profiles/wecom_search.json index 0bbb1b2..859a877 100644 --- a/src/jiangchang_desktop_wake/profiles/wecom_search.json +++ b/src/jiangchang_desktop_wake/profiles/wecom_search.json @@ -1,12 +1,14 @@ { "id": "wecom_search", - "description": "企业微信搜索结果浮层 SearchResultWindow2;仅进程外软唤醒(禁止 n2-wake/注入,1.2.9+)", + "description": "企业微信搜索结果浮层 SearchResultWindow2;n2-wake 对浮层子类化暖树(1.2.10+),禁止 Maximize", "window_class": "SearchResultWindow2", "warm_min_findall": 20, "warm_markers": ["search_result", "user_item"], "activate_maximize": false, "wake_strategies": [ - "wm_getobject", - "msaa_from_window" - ] + "activate", + "native_helper" + ], + "native_helper": "desktop-wake.exe", + "native_args": ["wecom", "0x{hwnd_hex}", "--mode", "n2-wake"] } diff --git a/src/jiangchang_desktop_wake/types.py b/src/jiangchang_desktop_wake/types.py index 69fbd5e..01c918d 100644 --- a/src/jiangchang_desktop_wake/types.py +++ b/src/jiangchang_desktop_wake/types.py @@ -30,7 +30,7 @@ class Profile: # 浮层窗(如搜索结果)禁止 Maximize,避免打乱搜索态 activate_maximize: bool = True # native_helper / n2-wake 目标窗 class;空则用 probe 窗本身。 - # wecom_search 留空;1.2.9+ 浮层禁止 native 注入,勿再设为浮层自身。 + # 1.2.10+ wecom_search 留空(对浮层自身 n2-wake);勿改注主窗。 native_hwnd_class: Optional[str] = None @classmethod diff --git a/tests/desktop_wake/test_profiles_and_types.py b/tests/desktop_wake/test_profiles_and_types.py index 123edbe..69b8f9c 100644 --- a/tests/desktop_wake/test_profiles_and_types.py +++ b/tests/desktop_wake/test_profiles_and_types.py @@ -34,11 +34,10 @@ class ProfileTests(unittest.TestCase): self.assertIn("search_result", p.warm_markers) self.assertIn("user_item", p.warm_markers) self.assertFalse(p.activate_maximize) - # 1.2.9+:浮层禁止 n2-wake/注入(会崩企微);仅进程外软唤醒 + # 1.2.10+:对浮层本身 n2-wake(多窗子类化);禁止 Maximize;不改注主窗 self.assertFalse((p.native_hwnd_class or "").strip()) - self.assertNotIn("native_helper", p.wake_strategies) - self.assertIn("wm_getobject", p.wake_strategies) - self.assertIn("msaa_from_window", p.wake_strategies) + self.assertIn("native_helper", p.wake_strategies) + self.assertIn("n2-wake", p.native_args or []) def test_resolve_native_hwnd_fallback_without_class(self): from jiangchang_desktop_wake.wake import resolve_native_hwnd