From ca29abd89cfa455da0a94264bed7307f9e3ef80e Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Sat, 28 Mar 2026 15:18:56 +1100 Subject: [PATCH] fix(windows): restore WGC monitor fallback --- electron/ipc/handlers.ts | 13 ++++++++ electron/native/bin/win32-x64/wgc-capture.exe | Bin 89600 -> 91648 bytes electron/native/wgc-capture/src/main.cpp | 23 ++++++++++++++ .../native/wgc-capture/src/monitor_utils.cpp | 28 ++++++++++++++++++ .../native/wgc-capture/src/monitor_utils.h | 1 + 5 files changed, 65 insertions(+) diff --git a/electron/ipc/handlers.ts b/electron/ipc/handlers.ts index 5cd55288..64c7cda4 100644 --- a/electron/ipc/handlers.ts +++ b/electron/ipc/handlers.ts @@ -3055,6 +3055,19 @@ body{background:transparent;overflow:hidden;width:100vw;height:100vh} config.displayId = Number.isFinite(screenId) && screenId > 0 ? screenId : Number(getScreen().getPrimaryDisplay().id) + + // Monitor handle IDs can drift across Electron/Windows capture boundaries, + // so also provide display bounds for a coordinate-based native fallback. + const allDisplays = getScreen().getAllDisplays() + const display = allDisplays.find((candidate) => String(candidate.id) === String(config.displayId)) + ?? getScreen().getPrimaryDisplay() + + if (display) { + config.displayX = Math.round(display.bounds.x) + config.displayY = Math.round(display.bounds.y) + config.displayW = Math.round(display.bounds.width) + config.displayH = Math.round(display.bounds.height) + } } windowsCaptureOutputBuffer = '' diff --git a/electron/native/bin/win32-x64/wgc-capture.exe b/electron/native/bin/win32-x64/wgc-capture.exe index c7b51cd5fcf719b13928097e4f6abaf661a93856..2973f783f9797c58f382135725ad36f10afb3f46 100644 GIT binary patch delta 27886 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 Ks|l_{F$ zZX~9-<)kKiP~gK& z*4Doaeov-veGlM%4+HP*6!^RP*98u^M|kAy>FE?>eM{dBvNn_rubeHZzj`TDYRo)4 zNEaa3stC)@@OJXdj$wUeX)lAQM3!o0;9ObKdMGL)EtREPlr66ko%K%k;Fl!?Z;0u_)rwD^^QWInh zTi)O@x$ob{B`LvNn_zZ}pKfw7HTuAAXmnMQOa<2GI-1OS)AV>n z_*0D}#rL}KoUh63W^!nL%D1`#seraWsKQ(kSYsmS!ely@QKJSBBo zU+4e0j$yZs@-c4lZ2eKb!)+;Rag+yYKkatI)*kgg$qQ<9a02ECOGu|1ZKUNcO zzG9mnUB079r0nt2HuCVmR=bVg)K#%hx0UbqTr9J)tvtx9ldi|BXps{d7~49%%2T{L zvf=~$d9MX5=m7s6=+OT1Sxwi=%ws?Q(|d48LNqx`j7%u%mT3O&jv>Juo>=f(rp{EH z_`vp5G@sHen62N(bDE{Fx1#u`&Dyc1`?#igOJC1-C8@xg**HG$Czf~7o>g~e5Xxw5 z&-*qHY5dV1RK!2}L)#~NczW|*9rN~5l&S>tdB`#ZlUQ#mxRj}}B@vgmGE&NPN6bju z+nsq$^9VVu{Ey}bWj22|-_s(Vh3@9}TMT5M@8aEkrnD>B?c{AGF_mtpFCt6~i$vcW zr<^aaF8#r7c$Hgy{9F9KQIgJAo6PPM&_nb`-FKUKz0Zs6rPuf>-&T5CM>1|q`Auw- zcJXrGv1}jbP5ch9ppE>5-*C3>ZSLX!7i+(Ry9Mm_ww*>B$D6BcAsZxVrhcI&hrb<= ztX)lF+v)Y(Kd>9?P{KzB4r5!l^PPbQn{@D3D zEXry!7nf26qN{C7OUko?H8MN4m9GeSO`lakKHn%-;^=uN<0x%2AxkXgMaCZNq`CZp z@vQ7~=q0EOtaRz_F4gVB*fAB4zHZy{5`Q`Lvd`r$YTiVtt`d`5SG2kuP-ju| zLZ$fP(Q@5)R1UJOvG8eOA29o79^JaT&zwTc3iFqyqDj~5LL4sM+{{IEDeTajye>S9effO3zD+Zkd2Zxk5pQ_E^M=}T5Au~7rSNYf#%afp z*jAFy2e<9X{$9;jw>`^#Ue5=%i(`A&^R?|Zw8}n28b?-3lKJ8tH&dn6j-ScAF3izx zZ{+dyPZ{}?_P(C&R#6pn$Kce~ZWS+R|08?*MV{H=jb_grP{Z%dRl;kJ@b4m0w5}w# z#pd$O9ec8a&+!jCo@LvMIqww5Qi}O!oucKRx#v?;!rJU3y{XT^|9>gQq#P6@#`DGs zQG~7VYrC<6Uw^7iH~)2#^xJtkQ+Lvrn%Mk-?ZQgJG-l0}%CN0|>}M+0?BiV`lLC^U zNDE&j7CzX5#^M)!$!_?458oac-{mf%{cAqQJalrI{~^XdMXx)#f(Le9!O}+Xmpcz> zQvL^(HX+Pti(bor?A({_Th2R1MatdzY&ky?)qx$`&1<6q*@30}pC~`K|4_}= zFXh3}6WEzTzC60nt0RU;g85>+`QvzVwJoHOH|rAFWj%J9J6->^aNTyHa3=G0+ok87 z4NpDKmvniVEnmW$b?xQx%o1v&2e#=;cuLnh?8F)#*DZ>f*YKs?lAb!Rr_4cNNv5KZ zJIzf6H#7BAjY!-6M;Ww4ku1r!SMVF z7vt_p3B_^WWBP<(Ez{eK-(!px5A`ycYi!rPqVYP~v%4wpPyON{Ci^)oyCM9|?%g`P ziNaLd?qn%Lawz%?Vd9>;7#D)tjkY@*d`|}H!-YW+3`}{;jZ&6dl(p`CS5&B>u+0@O zN@2IZ<|ynj%`2b_sjT%h%~94wH{0*`sca7(1?#Mo4#8qtrgn#8n@q6^?AeV>MZKJ& z9Kp`~s7X3HqL?-9K#B(Wr6I`T|3{F?$216%i<1h1Jm+F6TCR19Qi~;CL@{g5>=aG? zz5bZyD9FONx{Gl?IAZwNUjNZ<|1b5J+?_(m2!RN$MW;$=05r5$MnjDLa9o6rJ*Md; zLfp9+cef!#oBtkSN`(tTtbW!J0{f102)QA|dpnd6$2Au~VeBBrj}0;Q-2JcB$cdpC z>`@G??9MT+Vkkc9kYxB4W7Mn}Ap-u4!8%k4_zS8x0Ayj@e=f%T_V}<}@r@X^Se9yR zkza^m`)Jf^8iuWoP8zl$itV$%OU$Yf7}#owhk?Wp zLNQIC3gdpc829Vr#mxL#6f=p68S%MOF^8*@%Vd7XwCYbf_AYwLly{C>ySM405oPFy zGGIz~)gw6V-xhTA|6O?1kC<~gue?Hq|2RW2+zkVD^uSIn{Pu>zgH#I->fZ{VM$19* z&*LMeOghh9`gitRNj`A|y@(@d(MmqB zf4^?;)lerGZr(+f*#3H9Bdvx+Mg%q&yv6KH_0Fdo~o+sh6S9L4*a0$ut4ltW*wmt)APVQcTl8<4y^gg8l7t( zKRGD0t7-j{?iWDvnEON;1y1fCuIEkTd^|S>z*n(Hab4J1e_k2aF(;*3G}dezwO(Sa?LBPX)vNx}NN%}VM*T5EDq17KTxm;s zU+67$=YTQ(IQ5O%USi8r$h0{c_oqJ2RTWDw z3&s8p#dD;Hv8S0L6h6S5=%ZBPIfu&jEZ*7FjlISBY*VLM=?~#x)!p1iSWenz+`vIC zPp2N#3Q`%uoBxc9w&(r9R*u7reGy(UAxwBsvNb*`i<6trjltBl8y>EshxV-2a22Y!GLx%eGWBz=U#`6O#)r>4(2F$Xt-XJ0!M=e5Vry&Rbb4WwlXuwp9JtOSGwF;7JTc zw4tl8;HBD*pSIiUIA4<((QzD_+BE$JDTpS_MReQ7^HilxM4R%?&?s;->4$8}ZD~&Fic*UN@!j&WPn+x1bP# zI#-Cc8-G@9yY&!aER4>^sB>FvG8H!;jhdr*5>t8U_Nd6-h+S=4JXM@-G#9Z8(a9o% zhPxVUQAelN|Cs+hth=v4sAHB~jEkg}j-Vl}Uvq#D9o{=<6?&`Mb}AK3I~}1CidKZd zljaB&vPe|YR6Hmw12l?;)*FQEq5?6Wik0l5f(ntNG?&`%tHUMfgcfpJ7+hn}Wj4V^ zb@vz4vq*cVQ9PccaXlDo;;u=}bJk!XP#%;gqBN9|1PgtBH=LpKR)nQU`g|iueFQQv z-PKYlll7a)G*$Ekc3OYNT9HlG#l@*IVt*d1G)65kHN?b5*<+)Ai@F&X^;^uOiJAQ| zTrh<)dt(0AJFNB&hpS`t`PQsf7&JRyM3Kz8fHiRO#ap7g+-TvVxzZQHm`Rf|2g8j~ z%It@y%1C(ff+rF33wXj>>TvbE;;NsPz?3wbN5gIhf2ZYRDz_9BG7)9025&0PF^q0RXEJ4Q#?!pU5iyn) zf^=KYa=RVJPuhRf#idv`hRQINdQ-Le_9D@`V3PYO<<1{LmuTwP&|qdgRuGpFqO3|m zupQWbMQbT5PrLR+8Af4aMZ0v!L+1BK;0jw<@#q@cDWZ!FE@Jsd1NMRfxkj}OLlm0_ zt6@|A$fn-*ykb*xLb$OT++d@$lpzcz)c)_1P3|KbFI%!=^Qyz<8Wf=SDv;gq2GSF0 z=n%W%8pbkRmnGAfK7p~1tE&kh2Vqf4IpIqDD&oL~wshFpZ=^E6Awg&SDb}y4T&WdL+D=lNgFm$c9iTC-DG2w2>jnPTJr1LMw zWU-2Se9YL0KL6nGfcZGO%JwTLy3{ijWrlf;9@`&V`(0DsUF;H?&UU&8{LN&(Z!-UZ z=ou*#y;UARHP*G!0A`R8bQX-zO&DZ12O~R-G9`>64MQ(Mu z46V6xCht71MTW;Of_R*4sVT%Aeuk&>i zf}2i*KJ6psL>oQgl#k}8CUjtizj)n*K;u}AjC0<3amh*bwxizHsopu*Cu~L2MZM#( zCfXKF7xiup8uP-oa5^6`F^qMe&X-IKWj-{$%3gNN##2)JuswO) zlG@5J(uO#By(GL2GGC?}>IrrIZ2W`Nl&8K`ZZ?gkydDx>;(Vg8zA9Vkxc8)7S6jvR ze9Y9#Y{G5cYTEZ~S`KeAy`6qDR+KCslX-yF)JwBIhsRBiGi<QD zC-Cjl4J={_KQ_I4w~%kCK+CllP(!tds|SD5i1|zX`*Z?fT&Fv3(+liNf3_P=E#|G# zUSSW$ackNtcJnnpa7IL*xN&q`SMI8>*t&y@wkA@ae>Agyk;^=~o!^Fs)H^|RKkfUN zvd1{ScSZ;87CbOj+ZJ8nw`PR(bNQP>2mR+SAlyRxn(*Q-f}ZSg=uXnso9w!;k#(mP zQ8z#(;JA}b3pft-y0d@relw$)#|oY~v+dNg%gNOz_9UaZ9&fQmW9s}Wt}b*PGcc;^ zx1$A$4elS7e!raPzeyEL+O-qm?_`=JhrIXJ#Au zdmcWkl_r`NEdIre(0&{LB!58#g#Nt(i;$&MARW|W6&U^}e`8iOdwH3t!0=_{3Kj5u zRDpvlNTfT1Ya3hcHc^3>Fx^EdwJ5b(fnwyN0x#@VEATGyPgbC`mM=(e!O^pe3Iec=QTa7%~6K1{Tru3$c*nO+sqrqX$b+N1_T9LI?q4HDX8cB#>d=kxWm z`?G1w`L)?C*~~ut_t{UgfTeukoDs5(Z<^DV1!r*UoNzW~9=FXYVH-c^%jO2P&%!Q1 zb0n(`Y8X3L_>5nQ(0{)yLbu+j`ky$LpPSo(1%J-#=LX4k?m2HQ-u^C~8{B^MEhiVo zIl@KTY`D1fl5nBfp}Ocjhkre<1N-NuaPcMYH2->wg}*=_CtDN7mS!3;X5FY?c))_R zp#R)=blDwH)MZJ^y;8C6!~1;eg0L0|pTToc@EtvMx(AJrNL$Qj{F4Raw`7j*OdpXU4DW*fV^~GiO-$3_f;I6nkY6H!n(HSsDD(MT6xZx$)U4x?;sa zLYT?6`eVNC*^o(BKXh_=!I?P@=27JR&N;6-GbPSUp0my354kq8PsCV^NZMP(qBRl> zrj?mt0h>%2Mm1yH0zN-8Xutr-^ab6;&=Uqdgdm&*nACXsGvWM^euCC7o7{(b?tyqb z`IZ*6VolElygD-=;G3r@2QTO7^>ka4S*DJ}x?!lE&skQ#q{|=K?RnomjQ#Ch+=$K# zOU-O*>VZYj(VYj8O#-7LFxp;$pmGR49U-?vu=-xigljA99k|C>`BC}$taoL0E{3Np z33T84gDA??`F!P)`Rx82es@U-ldp1Jwx9eRZ<9TkZLi@Avkk1UhOfyEXC-s_;q1`H zy~Vv4j^fcZ{ARWvGtK3{WgCsZ(Ir#fN~=U=!D;6^@Fj`ZL+RCjitRe@wzQXDW30P$ z(5b~(vg3xxLI1+nF73~rnZw^-8qwHCTvsJV*gQYjuq=>8&gQ|(dios|ms4>yrd|)w z3VHpcOf9YCuU_HLEDK?$)1lyp_vM9((V)EX!zXs`3uk}`j)@DycgRxfU^}} zu^#JqQciPrra%8{MK{*19gkjlg^h~hjh>5@C-Onh4QB6k=Ifqo>o*Zwwfe)^j<$)Q zbPSUTk^IVYx$H`ja5J(WpPAE(U2MZ&%ZX=R*ZEI5qq-T}V2PuxBN}7m@C@o@-HT&j zJ8}(8GQ(VPc)$Yq8HDP}J7o-ClG|$Rw|E4ApK#yhhuaG)+mSNO&7QdHkWFO7sKdtf^L=GW5FVxE#Jel660ZD*u845?9 zROnxU5>X-c&g2VLwPf|J`TA8pVe6Fe2Iug5ltO<+bw{CR^6FJa_Fx9$2S?i=w3n!X zg`x;Yx{rw;g}Xk3_gmc}IIOj}4k*NYK!YZ}fe`(bJH=u{`|F zmf3(DeyeCJOM8(oTRV=eYRx}hJ6wl{-Vz)C1(VMfw6DCgd9=(nui%C2f>`4yzGq#Z zW`%nxZ`vND_yFu3-@5PD@#Do^S=l=NQ*m6&uR>9vybF<&&;RRtnbnCr`Grm_xHHdx zp#!@Z$&b9SAmsEil)h++Z@l^X(Bi;u2}Mi1aMY(7n{Bq}NZ#*7U$$u%ANOLY_DvkJ zs%_@oJnzLYW~k!(UX1lC$N7_PmrkSmlxxE6xc|`28_8Kog6FWm;XH4kHs+42ZS@~~ zV#!dyjzj4@KFj#%b~>>;wbp``+*)GfNxY+14$k(`AL908P*^1HA%^l|-jBr=@hf~j zbAP(L&&G~2`^?1WZOUO&2lF2{`3B7zjCxlNjKPDwJ$B9V&L;EFblNyv?S^0Dc2<;b?O-=-z|vT^#+AtD2bF)h zMJuxzi^}U>@@8yAM)|{6k{SDJJ|DI18y4J$$81kzXZ!N!w-05D`tobrqgj@PyO)MC z`6TaHYVj(=UWjRe=Vq*AK_ABQYo+aVE9Z&jI`MbA;eOBZCOh!i*t%Z)+IGr{$*@DXL~8N;hz8^b(~@vvRtK0n0aY2ZU84~mz; z+6}wA^QpVK8QzM4kLh@B#n}FY&Py@2`wRKOUESE67=C-#GwkP>^0B+8%1`a;O2G!k znDQRjvm!AyUKt31SvM#eGskT@#zL_na*jG%W<~SwU+=<3bmc*NX8U&QPNuj`qFuRF z-tq{E9^!qw^KE?0kQId2e?%GMc;W zYZcoO;S!4RAd9;KV}JTSfu`x${$zyr0iOSw9qY*cIf~EP7sP6!_?msK*nud1V4r`_ z7o+~g<>+69zi0n74btMe!t=FS(BZ66q9?P8I2NkneAv@$?}cO|1s0kZdeJ{)c#_8uZxQ`;v-S)YcF7gX@Y@ZIh|l^S!aAee-8Sp!9R4<~DdW>tm3Wn(I6G8x_5CUIlZcHm^!ssaXrM5v+?e zg`oQX_Kq=gT3(g0Qu7R0jmTIC>IAfEaEUb*^q^Lk;Qk@v#S_=-QdW2Rq|6w4uID+t zC^KuKAkNcuM~c<5_GYD~HAt*yRKyk_{qQ-WS)&7`Klz={vrSC;ll8a&(EL@(^G-wz zdglN%S6xEu$)?}0np)|srDUo*0n}Sw+}M=&)mgCn!S>gm{MzuWL4=2w+GfwX19g3& zl>dC9jeEC=V$m3q%|lLx=KRtUUT9j~2Vpnt3MIDcB<=;Q;-bc6Z@qymd^IR*9r+s8v=^|6;2Dw?+ay#Tj2`)y55YI8X z1cwlY6{Ar^JGMf+gu~a})v=?-@P4N}0+lu>e*k~cxc|1&6J)B%e8q0K+LF&W6~kU^ z$+w^C!2;jlpPdS1nm71^Q!zQ!hoNu&G;0+z(XD}?#A`t~Qv%(PT7;4B-fTnl>h*-j4EkGAFQ<2JIl`>8^uY8le zfWL9Nxp!S}yFDx0G+h_iM|A3^z4^zd*EfFw^F;LC`PfnDG-Ga`yhD81nf88@k%42} zr&(^c->`<`d7a)V>P(0D+h+zOcGwEDQ&Bs=?D$f9P`%D)Ey44Y7v6b#p{f`i6G9+1 z$9b8G;_B^&w}MfBtEn^5I~2M&(O2QG2J^(Xdo+Fh6*8EJ`-0zVsGncqmbZ}n97f7X}15yYQAJAh3O;+M~kWNv{x#2TRcGXSBmy~g4j*8o1m+Lgry^5?9{Y+3-n zX3g?DKZ)}DoCdn%O&4wG9vpFQ2k~w1wBXtA==>~-M#&Qzdr8AThn~Lmo2=M4m_IF- zzxq-7ok(wp)I-QG2>O^v_lopuk**Wz3nHx&>Ha|Sa9gCGh_noKu(v)b(s@EMS)^3~ zcr$2kJwPyBL>ewqUy*u<^lxGIlStErI>7xXbfM+*97L8pndn@D4Yyr-Zyiu5;; zri=75RBWWZ^+sPR-7r!15 z`{W}&mGTEQ*o&}X4TVm{dRCW@3lG)4miWvDo{G_@F2BJ+6%`;2*PyBaDb($96rd;> zFLh}0o6J987Dw7%KEadU4a;fXU=T?LPJA};zv8A-btp=Bw1H2h{M!w@N!U9A7OyQO z-br8N?`qJGMgG9LjSYedGH~Kci67LEA47av126QGU*$b7wqc=)d97%tT@Jo@t>~DITlt?CL)fU}JfL!kT*!H4Yxz1q zQ5nEYEBPmtM)uOzJmyl6Jes$t>fC$Nvvk7VRD$v#NRrKP41C_oROOFNQf=STW3@RE zUj@*gqKx~K7USYA(6${&=6O}anduL{u`-NVzTzh<{h4-!2r=#}p8Z~sJc^IG)VcTQ zMURL0m|h+`h1k8?IfUOI4I$=^;^!|7XW9oM#MoL9qH384;aAHaR0gswBl+g{I`=j_ z^LUI+<&VdhfhX~XYJ5uX!qsZDAITeCZk^L*%cH>&L46a}z$=5Pffs${(!h)SYxtB( z9bAGx+Q27~zkIw;R`b&Zj~B}-p90>yF0(<9N(x>0rOVOs;PQu;Kaz7?hR~rwl0F-( z;A$27tMdCQZ&k5SM$$>mcktJe6#Et<6ud#@!&Lq=`pO8uZ7NPvaE=tJ3ceVoD7>uV z6cxLu_+p}xzgERbDsG_$>ZaoF5){2$700Uh!B9nhOvRZ3=SY%&ypj>C;%O?*SMlpA zKCR+wD!#4adKLepVy~wae_d3Ztl|t6m#DamFyc!!s^GqgyQn1;?S+KqB7V7a?j`J| z;!7%45YFdn0UZ1%YSaIu;&UplQ1M}4iZ88J1?ehIQgL4uyNpz7RIT!k09&5m>r)gx zt2#CgsyJPhUwdNA{4hoq@g4r8h%t(TCMtGhx&`s0uYI|HTsycB%P0M=SQJ>g*V-%EznN;dj9k{8|U^sQ&}i(HAOy zPsNWMJTd*&sQD>R$SYL&Nk;(Hf$7N#sJtV-v`y{fjVg8oj!af+_?aqCQu*(m(DPU2 z4m&Hys&HE6)71ReReqa_OH`b%;%O?5RdKkA-%~MD zalPs*e7bbSk?XCaQz;=_dwhK6M?QuB0tb z^r7#&${!RvaKnWvS4^ z(%)4c1JkA&KQzA|vHq4wt*p@zul|z!ECaN18`;k?M=OVrX0}7qLw0FV;iP(lXn$FP z30$?X+|bH?u)7a)%WSQzx7285ttHZ3)_6nf(N9>&7OSfqN@F8f$Yps91xEDNyg^g!9~xyu0_Wi#Lce@$`2;nrPt@%Dwl@rwivi{Qp6NubgI zsg2>#NhLSXvZyiIQq2~1amu~{8Y&kR4`^@+27iqx1vyoQc=eYGS~XKD(*#W( zWLee(QG`hg^skF&m6OShAj^ACWcvm;c#H_P`0G&V9Zk?8=qnfRbf?^0&?w>p9V!`2 z%^l(b$zIY9XiG-`o0D<`{wz2NpcrAqp%hi%V=Z5K%0Aqyk(VXH6XgxI4Ddw6{yMoC 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 I$&2Ox17;2Nod5s; diff --git a/electron/native/wgc-capture/src/main.cpp b/electron/native/wgc-capture/src/main.cpp index dd80bee2..2f61d046 100644 --- a/electron/native/wgc-capture/src/main.cpp +++ b/electron/native/wgc-capture/src/main.cpp @@ -33,6 +33,11 @@ struct CaptureConfig { int fps = 60; int width = 0; int height = 0; + int displayX = 0; + int displayY = 0; + int displayW = 0; + int displayH = 0; + bool hasDisplayBounds = false; bool captureSystemAudio = false; bool captureMic = false; }; @@ -127,6 +132,18 @@ static bool parseSimpleJson(const std::string& json, CaptureConfig& config) { config.captureSystemAudio = findBool("captureSystemAudio"); config.captureMic = findBool("captureMic"); + int dx = findInt("displayX"); + int dy = findInt("displayY"); + int dw = findInt("displayW"); + int dh = findInt("displayH"); + if (dw > 0 && dh > 0) { + config.displayX = dx; + config.displayY = dy; + config.displayW = dw; + config.displayH = dh; + config.hasDisplayBounds = true; + } + return true; } @@ -198,6 +215,12 @@ int main(int argc, char* argv[]) { } } else { HMONITOR monitor = findMonitorByDisplayId(config.displayId); + if (!monitor && config.hasDisplayBounds) { + std::cerr << "Monitor ID match failed, attempting coordinate-based match: " + << config.displayX << "," << config.displayY << " " << config.displayW << "x" << config.displayH << std::endl; + monitor = findMonitorByBounds(config.displayX, config.displayY, config.displayW, config.displayH); + } + if (!monitor) { std::cerr << "ERROR: Could not find monitor for displayId " << config.displayId << std::endl; return 1; diff --git a/electron/native/wgc-capture/src/monitor_utils.cpp b/electron/native/wgc-capture/src/monitor_utils.cpp index e6b0d03d..a175bd7f 100644 --- a/electron/native/wgc-capture/src/monitor_utils.cpp +++ b/electron/native/wgc-capture/src/monitor_utils.cpp @@ -1,5 +1,6 @@ #include "monitor_utils.h" #include +#include static BOOL CALLBACK enumMonitorCallback(HMONITOR hMonitor, HDC, LPRECT, LPARAM lParam) { auto* monitors = reinterpret_cast*>(lParam); @@ -39,6 +40,33 @@ HMONITOR findMonitorByDisplayId(int64_t displayId) { return nullptr; } +HMONITOR findMonitorByBounds(int x, int y, int width, int height) { + auto monitors = enumerateMonitors(); + + for (const auto& m : monitors) { + if (m.x == x && m.y == y && m.width == width && m.height == height) { + std::cerr << "Found monitor by exact bounds: " << x << "," << y << " " << width << "x" << height << std::endl; + return m.handle; + } + } + + for (const auto& m : monitors) { + if (m.x == x && m.y == y) { + std::cerr << "Found monitor by top-left point match: " << x << "," << y << std::endl; + return m.handle; + } + } + + RECT rect = { x, y, x + width, y + height }; + HMONITOR monitor = MonitorFromRect(&rect, MONITOR_DEFAULTTONULL); + if (monitor) { + std::cerr << "Found monitor via Windows OS MonitorFromRect fallback" << std::endl; + return monitor; + } + + return nullptr; +} + MonitorInfo getMonitorInfo(HMONITOR monitor) { MonitorInfo info; info.handle = monitor; diff --git a/electron/native/wgc-capture/src/monitor_utils.h b/electron/native/wgc-capture/src/monitor_utils.h index 8889410d..90f3ac39 100644 --- a/electron/native/wgc-capture/src/monitor_utils.h +++ b/electron/native/wgc-capture/src/monitor_utils.h @@ -16,4 +16,5 @@ struct MonitorInfo { std::vector enumerateMonitors(); HMONITOR findMonitorByDisplayId(int64_t displayId); +HMONITOR findMonitorByBounds(int x, int y, int width, int height); MonitorInfo getMonitorInfo(HMONITOR monitor);