From ea1e58c3e06be80a9baff7224abec6742a6e4bcc Mon Sep 17 00:00:00 2001 From: Willy-Kimura Date: Wed, 6 Feb 2019 17:08:27 +0300 Subject: [PATCH] Added SourceApplication property to ClipboardChanged event arguments. --- Assets/sharpclipboard-preview-01.png | Bin 0 -> 38986 bytes README.md | 7 ++ SharpCliboard.Tests/MainForm.Designer.cs | 27 ++++- SharpCliboard.Tests/MainForm.cs | 5 +- SharpClipboard/SharpClipboard.cs | 135 ++++++++++++++++++++--- SharpClipboard/Views/ClipboardHandle.cs | 93 +++++++++++++++- 6 files changed, 237 insertions(+), 30 deletions(-) create mode 100644 Assets/sharpclipboard-preview-01.png create mode 100644 README.md diff --git a/Assets/sharpclipboard-preview-01.png b/Assets/sharpclipboard-preview-01.png new file mode 100644 index 0000000000000000000000000000000000000000..b28ea53a6a19fe89afc8d0e1b9280226b3d6d409 GIT binary patch literal 38986 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%0A<;e$fJqS{;yw~?TcL^%&%Eorqm4`} zYZaZBU?!EA2AqIgsSFcDa?E~m@ivLqyKcJC9#8S;y29EH3~Y$SJ(M9{*&BIc>$E)q z0<9Ik6__`7>E%{bx00UDf3V>+W*cj)+j-AK7@bu1IW5_yT4ZJ_GM(nNU7aV3P}4A7;GEXe z5&vNbZIGG&1U8r_2VG##-d0#0J2@Be@FWyGSWqf1d^UNv!$P_ zZ@2A+Ipwh|@O9VbetXmH3U95xL)1n7c#k_#wow0OPB)Wnk%@3v?h2eJ7tG@rY^)Oy za&3(iJ0ONVXL07fS)+4~kYj8=#aQHIF+jxNyEf+J+_o_U^ZVwZNZ`yp9oX%Hu8ERx@t+Z88LKSXi*uU+q}?? zc^EHiFQHff&ItKfJ9{%jCq9+g%0DU8SvTU$yl~k9c3FI8SZI!r$&a;Wfxzl*8!~Y% zYoE-nPP|XDjfqe{^!!o|W!ba|Xm3tJN;Z8mi>a`g^pkC?aLHTAKsEz^Elq`P+3x!F zhlR|fDoY;iz5pw$6fdQJ3Xw&m<6XJO6aPV9?GBC@H(XeSIVVg--^;C>FSd|eTz)5c zgjJRI%JnPHCInlm#ol`=ud#;|+r|rHJLbAwHU|C!pj<|&;k=YGZ*I4>i;va)?GlW& zqhVD%R7K2lns=3FI07dM5^)8Gl2w`a2U)$?iS87+KStDU%$_C|4}3Iro!~09g3~e2 zUgk_SPr=yLKP{u56WIe7YV)^Bl8d~LxZh*zVnMVVL$r$d$}K?k&RCf>7KUDE6eF|V zvh?%S{oB=Mt|_(fQRZNd=C|!+OUv@W_Dprh{l6O4t;7BV(^kq~Z-$2t)erGi(L5*A z?CoIR2)ez5;-R!G=_U^2!zZ_=e@{cErH~I|G$eK{GE-s*9Xb{+V|hgaU}^$O2>8W| z%gVnUP_M(Zz{j`Tp?oQj(05dMx-Cos`)vbCdE>2A<`Xc=PQ#L02aI+H=K2r&Xa6Ub z_$e3`6s77Smxix9r((#`ZI}V|w@VPccfN^a8N`BQJYCcd&y32#i=U*}wx{Y`x0dG@ z4*hPyBdPSS7@uJ!fp(NdjQYl&es-##zsKN!X6u&k&&l%t*#z(#Fcb3tKzYqj!Eq|Z z5RPm!;6RL{S${s>!B^DdD=640=uXV#i8jAQ1xp5~EI@eMxBy5Za6+eP0;ofS9xp`2 zD`eg~vu%Cf^$rj%5iM3nK|6*&DtG0Ka0Opyl$Cup6*#MG@%SU#Xf>?{7ch`mr7l$d^nRk7MojLxB>N_6Wf-FfdiF=u~f z94bxJ=pSBi(Bs7qu>}R3q4fEPVinm-`uP#NTFtKs$zHZ^;XoyIsC{+1$=j7v!M#gU z4pE^Ht{rcYROqfFz;*Qp>Fh$z6|6+d#7Mi?$+M>ia@41qX4)v&{&TlYixo_Eo5X~zlr zuX~StC3MeUc-K*EDTy*QIHIWa^cg5IJVMFQ!CJ>%CcA22*Q~aoEeDg;_fQowPt34J znEhBjrkTeU>0(RtXZ<_-MbA#As7NZ5$oGupoS=%vsZR~jHUmfow)8|aGi|e1-a`77 zR;Ma#Cou(TQMb@KtPmeAhfyQuewp#M*M{Pf3xclksSDG+ZO2%RzrKjNxOZcUd5xv3 zECm!P{w^g1CI>}aSUkOL?|~twLDA65p^^?$X)sTI^)T_PhM^%13l(Z+a-7jRHe*)R z%d`2PbV_?~<|xtffAkA{XC?L{F-Og((u9L)8PBco=j<<^qY>E>|-_D4Ab z+!LftRC%<$KG~BC5YjjOZ^!(4v;c+iE*w(XYFn-dYTGr>?zr8%vKNpp0pw8vhLaNc zWMkCt5x0j@G?9#6mnCE4KTy^Yu%8TljuA=gv6pi~*l%Eb#Ie1dKbw97be((p&T6Y{ zyr6I;55Bt9^#U%!&*K&v18CRmF3L6mxyQy~4&aA#r|-;CqeOe+AXz-fuDUgo0$;Xy zh(z1G{2u+5FMt1Y5XbSdivLc@**HWQI{-=N&JsPQ{UV%^UmueA<9CPslpjxW`(@4(#n!{-D5RY6cseDA7K;xX;c)^-L+PL$&B{Eviz4^J)3&qT$$#(&tFd4nU_Uz37#x%d@0TStk+ z;j?eq5uZ91#>>hhP*9owm06I7PQ7X@Z3zV?^v6zF%=@{8vM*{ci@J@;oMLhc`fHhG znt3Tf;E#M;!gPELJ=cM+Uw*ViKCK1=23R0>oF=?n>M(C43L4RN<&U^Ikh)S}v4#JY zpm|F}%(Pu5?Mo|2^^c#~nm_z{`!Vgs+ldE}@r#bFWnYNpapazDORrvu!UorCe{PWZ z$qrRy-~K9~U1Rn=*aQK0xf0E56YJ+MxJ$r~Byh(|auBy~al&zJz_r_vv~G|=f8#Hw zF*9%_G7XQ$JC&z6F4}?gins0bA9u$_UZ!9k6z?sG007Uiwm!UKoJ8sBPLJE*) z{n{Jk|H%f3D8QkRhOV-)ewX}{ZUwx1s?JcHGm2=&8pcF^>FAiBDl80G5EKAJ^>gAC z(gD+MiP4c(R`>trI&EcHVwGcqE-%Brh#*F)2DXRa&{!#m2{(oQLra+!P+4jKg_jSe zPHfL|fhs}GGJ`F+HYr?%A&L?5m1wtoh3n$S*pqch%$!kP%*|sg*eIC!ZPy%82Jxy~ zc(VFm`t%!-Wu(hKmR50c#CWKVhGm?*veeJI&iTg!39{LLV=9D>)KFXjsI+k_|3d3S@0;=O*}b>w3!imeRZXz z73*}aLVTyHcYr*CPQ5tzKIFA#pHoYm$5>OI{06WD00GAA_&#r)b+;7)^wv$(r!-Y3yGea+`~N!+L?_jz|O6@3vH6BvAd({wh64HP&_DT--@oZ$sx-e3Z2Z z>U@Pb!Ct2T;xv&)1>J43h;WQg%rUK3fFMtyG=LNXg_{j0tR!#6I)36NWZ&EwP~81D z*l$0>&0i)Ngv^A!l#GKJk`wHo^C$R)k|L>ZrpkL*h{ekA{ad%;FLRdpuUtO`15!uJ zZM*!JZzfB;c@PMDBMUIbTP?xQzX1-DoEa?uLNkaQg|vSg^A8|+wsjs^nd@GL`UXe8 zhxFyjka3;CU`~m?HRrUw@77X-i=Nct1nyF%1XOC}JP2%8zd$iUKL_PQhj-m_3IXak za6=4{3QN}Qinpt#=Ww77*{h(o7k2g8T#0r(^-}3KU~b5mFVGqX)gt6HBO&kHi>==4 zMgwf{dxFfB*jPLH{e;IJw^y$UbapGtxr>8VlGMLhqRH380CIwN=pb+njDhUiM(CtP zg57|^k^#&2gk#bJ!JOH2ky@+e%s;AXBA-l#3V(-7+Ae?S(ARfr;+R=eNV*|fuppt| zb)~iAc1Ixsp>U;6fpcZC*D+`Eey`|6#-MK<*5Mk#X(beqohfrLQVUd*|3H@sG`1)7 zuikMLq7GS#OE(L}Q|%)mdFA^Eb{?}A3Z|k*=WI{L5ev-JV%rOF^0_Ad=j!t54hNeL zIe+=G=1C^?X6dJb)LCoYn*WE_y3qwH;qlW{4-6crbB<-pd@y3I(m@(WbZVYgZa#8O zAiDNkZeG##w20kjxj+Pbnnys>Dk{6b#C!a%V3XQ1!f(d>+hiGPwEsOk@C(5tHrvf` zpA}{llhA*Y&e>zgXn8dP%PD~13q0cfqb$xOAjF$sj!kQR7qra5Qh%F>1Bne_Qvt`N zx~5YG!T%DwW^7EIoXeu?^qA6;!Y^1d_W0B2Q+ z&aG~$;PMkPuozWP78!S+{p{faG4$(Ct89Vp)awQm?2fZv%060)lY?y^@_`{G88c3+ ze0)t>JXsAUH@(*M@rhOjR863hvG>?iCjY$=Lzl6_Ih#JrAq$d;QQDb>J44Uz6x=&- zK)8C6t?d#* zU_UB_%+pn4`VP@@?nXIpKLZ)?rE`phVP1w&NhA1dtwJ7NqHekL$bN$7^AmLI-?EtM zCd}@C9Em(ac-DXF+oWH{(OO0YPWNZ=QrT68Bvg(`!9F=+PFjCFcFl7geTfE3NOJ>( zBipj=ai=@DZ-M5q`Y|#fRF%g(qPYG~k z^!QXt;yv~`Nk&c5lpy6u0@OX%r)KkjJY#z-fAVU=PLbe-j<g`U;7W~yz?tAuo>`sx*;ybD!z2Cod>3*9g^E@m1#ix++YB=6588z?{vH8f*xp zi!kpf)7IB*!bZPxzrq!TeN4X@r-$kWURsk&$Oh_6pX~YT{W3Qv^nlFOH8h*lq$6iW z@)&8~-t{EXE8xISa39WZ#lCg9{RQOdqmXPta%%$4D@`AGQH>q<3svG-FXP>t;b)GH zy%=#r?Ak@{FF?E)vl9p>w02XRfJ=Rd$KrpXYMK6@646WNVnHNhRVrsLFH&Da>!p;v zo&f`$FWMpy#gpMB`LxOx+vE4Ax@k+G;B@7%$pQ;1HJFo@J8{Vk_heFCRegz@O>&<-w@(exlDq8|L^8^L^FkA`-i=7=&E zr^TAxbH9i0ECi@i>htvd9uGxG+NEv4K{GsC;2=qK#DUcL)fWIcnK&})G!MR{6(t1s zNL}$2YKY6?o2z%cE#L3eX4oi9Ls{|b&X`|&;Pk<8g3vbb?KLwb;aL0YQvn|@D)`!I zD?AEgPPp4H=jLX>CDNE(U3e(KqkB=s9a(bl-h|e^(|KE` zOBef@B)RM<}wcdbWjU;uss2o;-yu;`;Ma94Pejrs5QR?I@i^Ogyr z7TG9|fajc@HVhDdXxrWM^7)?P<@<%4COd<(^;zXxfbcTVtDS?yH*MyLK>Ex}55SkRYAM^?&r{%-H2)aY4^T zaWya?U{2g~Z%ivFWg?(3A0S{~BF0iNNGM-mT>PSWdOzK8ng>eRiar18t81*+ zvg5HG^6nn)K$C)usdy=Ai4_7q9B@Owqa*;NV(?%%8sMRLmNt>UD`OdTAjI2K=h>KV z{HFk@NJdW^Hh6B(GAP5TqQW$iS>20)?Izari=0{f-uwxOhK6uvxy=u=pf3_F)i2z- zojf(`rL2afpv?GJzoS9xc?L+}wh_)wUP}lIjG{hCH+<(LCBg*xPv6;yq!98qlWPsu zL1E3uC-3^sohDa0G_e5C1Wt)Ae}$^sz@bqf@%V4Ewqa)|(a*0&H;ohdWPp5&?$!jI z^2M7g1H5;Wung?rFMIj_H@uml2CBRE(wRKt*zs(Gb@H!q0_kflICTmoAH%JClFbq9 zaEFzvFobDCGazkeM#D6OYL-W=Z zpfi2#)o$7kjB%xmQMGRR%p=kit4WR%$QFl8%_0+QUQtqXRt|6#asngBIIuD7XO}g3 zGx_UN3s>$hxdM*LuK?rcgE-(S*B@koobEI0Wq{lZFnm;p6x?xOs{EIfC5QBcM{n45=cH7OvF1z1T|qrOvHtWnW=Vt*~?x zxF=`ZA8#RMZ0Vf|*y5QKeE9$Ez3YB8&0}@;)=ia~Q^ma^WJ|+Dsjb~$(RWzF2HV`T z9RP)7_Li-R!c~!lwP2_thIbI1*&F(&6E8q-rEo(A+esd|mrfk#n<`&?DCyJ}Fl*Ab zoh!NSk%!}_8u1biWwAO8(HyhcP9H(wQp2!@miZJP_+&;Zy*fG;zME`n_3#T^)ynizmTjq`-3c zLF)K-=XWih<52SY3@AULjj|(nNqUU0+Vxo<1gqMcI&|=KHtHm$phihhB zq&yRlNAt}j4q^=L(Rc8ih0*;{?f#^O*yt3J+lteSZt_V)D*6e>Q5%5dfWxWrvkBa> zF4GsBN3_l`j5gsCeIZ?Pl8i=^o}80m%-~p&HJ414BoI2E+rcG29qG>TsC^-#av4sE)fpz@~wjl0~M}?*Ei8~2sP3= zUx3ZKPCV}XL>8*w6gA;1#B!*6zS&UJ;ZB@O-U{1Up>0D>CNf+Sp_{yS`8sp8TtcS2 zP1;8(*1?>Bwkbyj>wsl4mm%_jUlm-U#gr9!z<0%tfdN&NJ%LWJ8JtmTR}Op#u5076 z2q5Vq%`8U>FD^c}Z+^$=Zrq8_2;rkmq*u~Rv0-T~9zTJqf{o`ik9Z9&@2 zDhgWUS_@kQK3OetEzC!LE6#J$ErF5l9;u62C!&zGC!xtYl=a%*BUT?1pPCwzQ{P=W zl+-tj+qlO-qot{Ey3J-7R~awB$_mLh(`cA4J%6>l^!Wt)q8UcH-}CEKR^xt8YGqCv zX$qh^u9GnP*#TpZ808gJ@VKVJALXK}LEoE% z9O~8bF)l*#UC3+hZ*Vsyc_b~cfuYl5=O*P}g7xQPHQ;Q}Gi$%HG`|>Yj-akTYNNLK zq1=F%Ha3}pDaV%MOX8JTFO-_x6{*@Xp?P%*knh+@NX3KQb5FmEs1sbAf1L87r?lk5SpA3%IM>S1!B!#9pxobkN!CbX?= zieN%!R-VEy83@39wqeWbnQ}*ykLg>#$~SZj9qT6mpuU7gO=`KQba;TTt4(;VhYcg8 ztuaMSHE>RUJ0KNvr6wQ zfZLIm%7Yu2`=GXV&BeIx2|aE!&W+$dYf?A8ZTt>E`gx$K$8GWZ#{b&zfuF@I_`S43 zJR7^`@bM4YaSKkM4q?T|eQkjWW$HS>@aRM#96mB6UNSc65mQQh6jBWAsG5s$KsIe1 zg0p`^)Z|}9=bJT1yj9{AeqPlW==f3iN)qu$`;@(j1pFg>&@!Iy^=JQSchC75G(8%h z8V6-x<#>wRx+Z^}g#lQ%d|Sx=GvlWPXQn;dPF_2hVCF-D-qj7jPbtjgf1oo%opTw? z99wB8lz+F)Ch7}cpTdwsaKHuFF)qB#Yyi@Wi4o_8^Q5}($+T{*pVak-^w|Sf%`qP! zjcYqcJVi@FKABx-`d>}t&_?o5V{kd@>G@)}5C42th)1x5^~nEvaAr?r;xlO++cXyd zCrxe{G;s=e)~!6zaTFcn%xsf(QLtuL%+tua9@_cI9>AK2CXNfo>-S51s}PVDot#^F zQdM@yV{LyGsrJHPqXkx}^z7x{!1;dvelaSK)>SnQ|G8xJY$q#e)V`@BHK1z_*HwKu z-99Pg>_W-JN>Y^TixAO%XDGfa3uwlZaayVyHroyno~otM$Z6QfE5w?xen<^gm|+j> z(pqH`mL4?EG1f4NA#=@`0xU~${0biKzDe}0edXVaB$)|LW#d>bUMg7_vz20ksFm;M zdUNibAKxS&c_z|o%9XR$K_+(0bS^g~Va#&X&Yo&S04O2vB~N#-CrIi#qmx5Khn+?0 zVPnF>PVkMLP;n_snW%yzQfqCS!SdtU0UtY1(TVs_$+Rn+mCHaAu~?NqE49j=Yk$C? z&iLKvcdBB!39tCODhl!)br7&MM`WCFTi)6x+XHi%!uAjzM(_=%wN0h8KdNfHPMk4c zX=J-lI7R_y0HuAOK*E9Hm-IAjD))sLGaAU5pALTFE za_akt1+GpKD%&>WVu`u{?f3Jr#DjY@GVgS%pRqojU3689hmQ7IAd$-Za_j1yA#qmH zf_+nG>fzg~U32Izi8l+SqmDOn?Ax6@s&aWfhffm?HzM*n3k8;`E$T;Dt9kc}(#9R< zc(a)NvlpBm_nc^qX?IewxSlWpj|HEl$Qj9K~{aU@?rRpg32QnzYkk?8{8QT(j|lm~}>{NVHDjKO;~t^FcRNV)kcg zog-?wBQ_U8axQ*NJscRn_A;IaewFp2^hCX8bz#?3S1bi45ZuVf4E7bcv`<4d#T$cgiJ9CEIe0YVT>FcI zh{3}*$)aGC8gDLR$xc}ZKAxK-Zo-@ z#dnM*(&+$XFoVpD0y+*8)Nuy zce1YM4tlyFI`*?xdR<}|ymdnwqT>GlcjVCjM`r|_ZhD2T-ZF5?wc20Op`^M# z>02)-aL~E*7x{{Vf2mymS^_)BH7!87Ze7FtU(4+OQ2hGWD%-K4LACYeVB9tZfwnI) z@@)g;J@?x}-jp@^ZL@$Y2L2!Egk};0%m=xCV+1+u-B7BcykCyy5V+Bt7mSi0xi6cl z-(I0J;CfbWDrPRPN{2@x1)AZ^_q;-H$|9V!z&$+RMv&75-@z|gr{Ups7@MJrib{Xn z<}DTAu8K0yl^x@Z|8Z-Is*QIYhjSPCv`pjme_ZjRpI`^XriwsSmb0^WfE1c6XFV-DY8 z7E(;sh>+)mpP^wXPE~O70evlh{2x#8H1=u56Cz3%+6=pA`l~DYm1WaBfTDy0pIY4f zTKx3jNf%kKfFgR^V|}nn|4fxMzw{iK+y%0)5ZfHP^?6wT?Gv&to4Mi)M3IUmr^-$j zJta<-+FVJiITjX46A6lNPk09$WdHVje5ul(DFK}K?>KmRqpwMU!myempv?xWaRFZi zq_OPCx>#L6GK0m)M=Esj5%p1;kTd?c>2O9!-<2p<2tfkU@_-qVYj%j6=Ovi!f1Wk3 z4?3UW18}zr`}(gft2oZ%eJN=XOV$p2>2b{JhhX?HEejWIB)?9gIx<06H?5MoweH

%ZseTs;H2Zt`H%kXZOF2PNzT^jg|Tvw&g(U?4F=OmEyWBOPIJ$A&mu zY6x}+J^-WP@*@8vg&=MCqa^S5O+Zy&Yt7GTRr)7c;|&zj{QMO!%F8tb=^q(==pcJ^ zgd5LQJAJ5_PZ1TM;L}=jQEB!&o9l}#54q-j;$7df(5r6FKvb;QGP^wLXXCfz8LE$E zU5ewH>xB(=^mUzd0Y1fjg2AZ433KivylHt1*Ohq~PLoDhEW_%Q-Fx;|={dRP{{04^=m~6%jD5us3*I|7oxS z%OMdSj__s(x9-3pMvXg}7-rNj(6eY`I%Le5<2$jcU|(vT#bv^+(YLw|>dLEQ2JSOiVI5{>*Hd;gjb zKL0q%YzS)h?YdiK0LXCVU#sgPbOE6(AyGa(DJkGt48KmFjK$z(k!x@KmYYrG;t~a^ znW^a3R|^;-1#8(Cm6fjKQEK9r>+*^cSmesDONnT22 z3)M<2Ia1d$Yt#=50tv34tvYg5GJT|D@`Rv-`|dx zmi5;t>KrHdjBvh?4M2Uqqwzd90*sj4VP(Zge%(xMMgK^Cy}W<5{Ow+%jo<2r0A@k0 zLBpT+eG`f2ZPIe?~L&fQ6%Nf%*V>6Dyf1(h}BvF`)DmdhBQGp*o-3XeRjcN}I0A zlm|;+2thi z>FDmCe^XNuX2--hCZ?IilM>|Z1={NP(this.sharpClipboard1_ClipboardChanged); this.sharpClipboard1.MonitorClipboardChanged += new System.EventHandler(this.sharpClipboard1_MonitorClipboardChanged); // + // textBox1 + // + this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.textBox1.Location = new System.Drawing.Point(8, 212); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(236, 170); + this.textBox1.TabIndex = 9; + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -436,6 +450,7 @@ private void InitializeComponent() private System.Windows.Forms.Label label5; private System.Windows.Forms.Label label6; private System.Windows.Forms.ListBox lstCopiedFiles; + private System.Windows.Forms.TextBox textBox1; } } diff --git a/SharpCliboard.Tests/MainForm.cs b/SharpCliboard.Tests/MainForm.cs index 35b21c5..f970e42 100644 --- a/SharpCliboard.Tests/MainForm.cs +++ b/SharpCliboard.Tests/MainForm.cs @@ -47,7 +47,7 @@ private void chkObserveFiles_CheckedChanged(object sender, EventArgs e) private void sharpClipboard1_ClipboardChanged(object sender, SharpClipboard.ClipboardChangedEventArgs e) { - if (e.ContentType == WK.Libraries.SharpClipboardNS.SharpClipboard.ContentTypes.Text) + if (e.ContentType == SharpClipboard.ContentTypes.Text) { txtCopiedTexts.Text = sharpClipboard1.ClipboardText; @@ -79,6 +79,9 @@ private void sharpClipboard1_ClipboardChanged(object sender, SharpClipboard.Clip // --------------------------- // lstCopiedFiles.Items.AddRange(((List)e.Content).ToArray())); } + + textBox1.Text = $"Name: {e.SourceApplication.Name}, Title: {e.SourceApplication.Title}, " + + $"ID: {e.SourceApplication.ID}, Path: {e.SourceApplication.Path}"; } } } diff --git a/SharpClipboard/SharpClipboard.cs b/SharpClipboard/SharpClipboard.cs index f168757..e44c819 100644 --- a/SharpClipboard/SharpClipboard.cs +++ b/SharpClipboard/SharpClipboard.cs @@ -20,6 +20,7 @@ using System.ComponentModel; using System.Collections.Generic; using System.ComponentModel.Design; +using System.Runtime.InteropServices; using WK.Libraries.SharpClipboardNS.Views; @@ -57,12 +58,12 @@ public SharpClipboard(IContainer container) #endregion #region Fields - + private bool _monitorClipboard; private string _clipboardText; private string _clipboardFile; - private List _clipboardFiles = new List(); + private List _clipboardFiles = new List(); private Image _clipboardImage; private Timer _timer = new Timer(); @@ -191,7 +192,7 @@ public Image ClipboardImage get { return _clipboardImage; } internal set { _clipboardImage = value; } } - + #endregion #endregion @@ -209,18 +210,29 @@ private void SetDefaults() _timer.Tick += OnLoad; } + [DllImport("user32.dll")] + static extern IntPtr GetForegroundWindow(); + #endregion #region Public + ///

+ /// Gets the current foreground window's handle. + /// + /// + public IntPtr ForegroundWindowHandle() + { + return GetForegroundWindow(); + } + /// /// Starts the clipboard-monitoring process and /// initializes the system clipboard-access handle. /// public void StartMonitoring() { - if (MonitorClipboard) - _handle.Show(); + _handle.Show(); } /// @@ -229,8 +241,7 @@ public void StartMonitoring() /// public void StopMonitoring() { - if (_handle.Visible) - _handle.Close(); + _handle.Close(); } /// @@ -238,9 +249,9 @@ public void StopMonitoring() /// /// The current clipboard content. /// The current clipboard content-type. - internal void Invoke(object content, ContentTypes type) + internal void Invoke(object content, ContentTypes type, SourceApplication source) { - ClipboardChanged?.Invoke(this, new ClipboardChangedEventArgs(content, type)); + ClipboardChanged?.Invoke(this, new ClipboardChangedEventArgs(content, type, source)); } #endregion @@ -292,16 +303,25 @@ public class ClipboardChangedEventArgs : EventArgs /// /// The current clipboard content. /// The current clipboard-content-type. - public ClipboardChangedEventArgs(object content, ContentTypes contentType) + public ClipboardChangedEventArgs(object content, ContentTypes contentType, SourceApplication source) { Content = content; ContentType = contentType; + + _source = new SourceApplication(source.ID, source.Handle, source.Name, + source.Title, source.Path); } #endregion - + + #region Fields + + private SourceApplication _source; + + #endregion + #region Properties - + /// /// Gets the currently copied clipboard content. /// @@ -311,7 +331,17 @@ public ClipboardChangedEventArgs(object content, ContentTypes contentType) /// Gets the currently copied clipboard content-type. /// public ContentTypes ContentType { get; } - + + /// + /// Gets the application from where the + /// clipboard's content were copied. + /// + public SourceApplication SourceApplication + { + get { return _source; } + + } + #endregion } @@ -348,7 +378,7 @@ private void OnLoad(object sender, EventArgs e) public class WKDesigner : ComponentDesigner { private DesignerActionListCollection actionLists; - + // Use pull model to populate smart tag menu. public override DesignerActionListCollection ActionLists { @@ -384,7 +414,7 @@ public WKComponentActionList(IComponent component) : base(component) // Cache a reference to DesignerActionUIService so // that the DesignerActionList can be refreshed. - this.designerActionUISvc = GetService(typeof(DesignerActionUIService)) + this.designerActionUISvc = GetService(typeof(DesignerActionUIService)) as DesignerActionUIService; // Automatically display Smart Tags for quick access @@ -451,7 +481,7 @@ public override DesignerActionItemCollection GetSortedActionItems() new DesignerActionPropertyItem("MonitorClipboard", "Monitor Clipboard", "Behaviour", GetPropertyDescriptor(this.Component, "MonitorClipboard").Description) - + }; return items; @@ -475,7 +505,7 @@ public bool MonitorClipboard #endregion } - #region Observable Formats + #region Property Classes /// /// Provides a list of supported observable data formats @@ -488,7 +518,7 @@ public bool MonitorClipboard public class ObservableDataFormats { /// - /// Creates a new options class. + /// Creates a new options class-instance. /// public ObservableDataFormats() { @@ -561,6 +591,75 @@ public override string ToString() #endregion } + + /// + /// Stores details of the application from + /// where the clipboard's content were copied. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class SourceApplication + { + /// + /// Creates a new class-instance. + /// + /// The application's ID. + /// The application's handle. + /// The application's name. + /// The application's title. + /// The application's path. + internal SourceApplication(int id, IntPtr handle, string name, + string title, string path) + { + ID = id; + Name = name; + Path = path; + Title = title; + Handle = handle; + } + + #region Properties + + /// + /// Gets the application's process-ID. + /// + public int ID { get; } + + /// + /// Gets the appliation's window-handle. + /// + public IntPtr Handle { get; } + + /// + /// Gets the application's name. + /// + public string Name { get; } + + /// + /// Gets the application's title-text. + /// + public string Title { get; } + + /// + /// Gets the application's absolute path. + /// + public string Path { get; } + + #endregion + + #region Overrides + + /// + /// Returns a containing the list + /// of application details provided. + /// + public override string ToString() + { + return $"ID: {ID}; Handle: {Handle}, Name: {Name}; " + + $"Title: {Title}; Path: {Path}"; + } + + #endregion + } #endregion } diff --git a/SharpClipboard/Views/ClipboardHandle.cs b/SharpClipboard/Views/ClipboardHandle.cs index 196eb9b..83c2edc 100644 --- a/SharpClipboard/Views/ClipboardHandle.cs +++ b/SharpClipboard/Views/ClipboardHandle.cs @@ -14,11 +14,12 @@ using System; +using System.Text; using System.Drawing; using System.Windows.Forms; using System.ComponentModel; -using System.Collections.Generic; using System.Runtime.InteropServices; +using System.Diagnostics; namespace WK.Libraries.SharpClipboardNS.Views { @@ -40,10 +41,14 @@ public ClipboardHandle() const int WM_DRAWCLIPBOARD = 0x0308; const int WM_CHANGECBCHAIN = 0x030D; + private string _processName = string.Empty; + private string _executableName = string.Empty; + private string _executablePath = string.Empty; + #endregion #region Properties - + /// /// Gets or sets an active instance /// for use when managing the current clipboard handle. @@ -119,7 +124,9 @@ protected override void WndProc(ref Message m) SharpClipboardInstance.ClipboardFiles.AddRange(capturedFiles); SharpClipboardInstance.ClipboardFile = capturedFiles[0]; - SharpClipboardInstance.Invoke(capturedFiles, SharpClipboard.ContentTypes.Files); + SharpClipboardInstance.Invoke(capturedFiles, SharpClipboard.ContentTypes.Files, + new SourceApplication(GetForegroundWindow(), SharpClipboardInstance.ForegroundWindowHandle(), + GetApplicationName(), GetActiveWindowTitle(), GetApplicationPath())); } // Determines whether text has been cut/copied. @@ -129,7 +136,9 @@ protected override void WndProc(ref Message m) string capturedText = dataObj.GetData(DataFormats.Text) as string; SharpClipboardInstance.ClipboardText = capturedText; - SharpClipboardInstance.Invoke(capturedText, SharpClipboard.ContentTypes.Text); + SharpClipboardInstance.Invoke(capturedText, SharpClipboard.ContentTypes.Text, + new SourceApplication(GetForegroundWindow(), SharpClipboardInstance.ForegroundWindowHandle(), + GetApplicationName(), GetActiveWindowTitle(), GetApplicationPath())); } // Determines whether an image has been cut/copied. @@ -139,7 +148,9 @@ protected override void WndProc(ref Message m) Image capturedImage = dataObj.GetData(DataFormats.Bitmap) as Image; SharpClipboardInstance.ClipboardImage = capturedImage; - SharpClipboardInstance.Invoke(capturedImage, SharpClipboard.ContentTypes.Image); + SharpClipboardInstance.Invoke(capturedImage, SharpClipboard.ContentTypes.Image, + new SourceApplication(GetForegroundWindow(), SharpClipboardInstance.ForegroundWindowHandle(), + GetApplicationName(), GetActiveWindowTitle(), GetApplicationPath())); } } @@ -174,6 +185,78 @@ public void StopMonitoring() #endregion + #region Source App Management + + #region Win32 Externals + + [DllImport("user32.dll")] + static extern int GetForegroundWindow(); + + [DllImport("user32.dll")] + static extern IntPtr GetForegroundWindowPtr(); + + [DllImport("user32.dll")] + static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); + + [DllImport("user32")] + private static extern UInt32 GetWindowThreadProcessId(Int32 hWnd, out Int32 lpdwProcessId); + + #endregion + + #region Helper Methods + + private Int32 GetProcessID(Int32 hwnd) + { + Int32 processID = 1; + GetWindowThreadProcessId(hwnd, out processID); + + return processID; + } + + private string GetApplicationName() + { + try + { + Int32 hwnd = 0; + hwnd = GetForegroundWindow(); + + _processName = Process.GetProcessById(GetProcessID(hwnd)).ProcessName; + _executablePath = Process.GetProcessById(GetProcessID(hwnd)).MainModule.FileName; + _executableName = _executablePath.Substring(_executablePath.LastIndexOf(@"\") + 1); + } + catch (Exception) { } + + return _executableName; + } + + private string GetApplicationPath() + { + return _executablePath; + } + + private string GetActiveWindowTitle() + { + const int capacity = 256; + StringBuilder content = null; + IntPtr handle = IntPtr.Zero; + + try + { + content = new StringBuilder(capacity); + handle = SharpClipboardInstance.ForegroundWindowHandle(); + } + catch (Exception) { } + + if (GetWindowText(handle, content, capacity) > 0) + return content.ToString(); + + return null; + } + + #endregion + + #endregion + #endregion #region Events