From b5ede5e6cbfe4fa699cdf63916cfefe0bdb75fc9 Mon Sep 17 00:00:00 2001 From: Edward Jakubowski Date: Fri, 23 May 2014 06:50:49 -0400 Subject: [PATCH] MsgHook Native library updates MsgHook Native library works from native test application, still introducing library to java side through jni. --- build.xml | 3 + native/MsgHook.suo | Bin 21504 -> 24576 bytes native/MsgHook/MsgHook.cpp | 75 ++++++++++++++----- native/MsgHook/MsgHook.vcxproj | 4 ++ native/MsgHook/MsgHook.vcxproj.filters | 6 ++ native/MsgHook/bin/MsgHook32.dll | Bin 7680 -> 7680 bytes native/MsgHook/bin/MsgHook64.dll | Bin 9216 -> 9216 bytes native/MsgHook/dllmain.cpp | 12 ++-- native/MsgHook/org_synthuse_MsgHook.cpp | 29 ++++++++ native/MsgHook/org_synthuse_MsgHook.h | 29 ++++++++ native/MsgHook/stdafx.h | 11 ++- native/MsgHookTest/MsgHook.h | 28 +++++--- native/MsgHookTest/MsgHookTest.aps | Bin 53528 -> 54412 bytes native/MsgHookTest/MsgHookTest.cpp | 65 ++++++++++++----- native/MsgHookTest/MsgHookTest.rc | Bin 9868 -> 11288 bytes native/MsgHookTest/bin/x32/MsgHook.dll | Bin 7680 -> 7680 bytes native/MsgHookTest/bin/x32/MsgHook.exp | Bin 768 -> 1135 bytes native/MsgHookTest/bin/x32/MsgHook.lib | Bin 1874 -> 2590 bytes native/MsgHookTest/bin/x32/MsgHookTest.exe | Bin 74240 -> 76288 bytes native/MsgHookTest/bin/x64/MsgHook.dll | Bin 9216 -> 9216 bytes native/MsgHookTest/bin/x64/MsgHook.exp | Bin 779 -> 1125 bytes native/MsgHookTest/bin/x64/MsgHook.lib | Bin 1872 -> 2554 bytes native/MsgHookTest/bin/x64/MsgHookTest.exe | Bin 75776 -> 77312 bytes native/MsgHookTest/resource.h | Bin 2816 -> 3560 bytes src/org/synthuse/MessageHookFrame.java | 10 ++- src/org/synthuse/MsgHook.java | 80 ++++++++++++++++++++- src/org/synthuse/SynthuseDlg.java | 2 +- src/org/synthuse/XpathManager.java | 2 +- 28 files changed, 304 insertions(+), 52 deletions(-) create mode 100644 native/MsgHook/org_synthuse_MsgHook.cpp create mode 100644 native/MsgHook/org_synthuse_MsgHook.h diff --git a/build.xml b/build.xml index 2a69e30..557de61 100644 --- a/build.xml +++ b/build.xml @@ -77,5 +77,8 @@ + + + \ No newline at end of file diff --git a/native/MsgHook.suo b/native/MsgHook.suo index ee98348e8ebc82b77d69436f479a05949c15d284..e708592a778c812446604620beceaf1106e98f22 100644 GIT binary patch delta 3154 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 + Event.lParam = cwps->lParam; + Event.wParam = cwps->wParam; + Event.nCode = cwps->message; + Event.dwHookType = WH_CALLWNDPROC; + memset((void *)&Event.wParamStr, '\0', sizeof(TCHAR) * 25); + memset((void *)&Event.lParamStr, '\0', sizeof(TCHAR) * 25); + //if (cwps->message == WM_SETTEXT && cwps->lParam != 0) + // _tcscpy_s(Event.lParamStr, 25, (const wchar_t*)Event.lParam); - Event.lParam = cwps->lParam; - Event.wParam = cwps->wParam; - Event.nCode = cwps->message; - Event.dwHookType = WH_CALLWNDPROC; - - BOOL bRes = SendMessage(pData->g_hWnd, WM_COPYDATA, 0, (LPARAM)(VOID*)&CDS); // ask the controlling program if the hook should be passed + BOOL bRes = (BOOL)SendMessage(pData->g_hWnd, WM_COPYDATA, 0, (LPARAM)(VOID*)&CDS); // ask the controlling program if the hook should be passed } - return CallNextHookEx(pData->g_hHook, nCode, wParam, lParam); // pass hook to next handler + return CallNextHookEx(pData->g_CwpHook, nCode, wParam, lParam); // pass hook to next handler //return bRes; // Don't tell the other hooks about this message. } -extern "C" __declspec(dllexport) BOOL SetHook(HWND callerHWnd, DWORD threadId) +LRESULT CALLBACK MsgHookProc(int nCode, WPARAM wParam, LPARAM lParam) +{ + COPYDATASTRUCT CDS; + HEVENT Event; + + CDS.dwData = 0; + CDS.cbData = sizeof(Event); + CDS.lpData = &Event; + + //if (nCode == HC_ACTION) + { + //For WH_GETMESSAGE hook a pointer to a MSG structure that contains details about the message. + MSG *msg = (MSG *)lParam; + Event.hWnd = msg->hwnd; + Event.lParam = msg->lParam; + Event.wParam = msg->wParam; + Event.nCode = msg->message; + Event.dwHookType = WH_GETMESSAGE; + memset((void *)&Event.wParamStr, '\0', sizeof(TCHAR) * 25); + memset((void *)&Event.lParamStr, '\0', sizeof(TCHAR) * 25); + //if (msg->message == WM_SETTEXT && msg->lParam != 0) + // _tcscpy_s(Event.lParamStr, 25, (const wchar_t*)Event.lParam); + //if (msg->message == WM_COMMAND || msg->message == WM_MENUCOMMAND) //infinite loop? + BOOL bRes = (BOOL)SendMessage(pData->g_hWnd, WM_COPYDATA, 0, (LPARAM)(VOID*)&CDS); // ask the controlling program if the hook should be passed + } + + return CallNextHookEx(pData->g_MsgHook, nCode, wParam, lParam); // pass hook to next handler + //return bRes; // Don't tell the other hooks about this message. +} + +extern "C" __declspec(dllexport) BOOL SetMsgHook(HWND callerHWnd, DWORD threadId) { if(bStartingProcess) // if we're just starting the DLL for the first time, { pData->g_hWnd = callerHWnd; // remember the windows and hook handle for further instances - pData->g_hHook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)HookProc, (HINSTANCE)pData->g_hInstance, threadId); + pData->g_CwpHook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)CwpHookProc, (HINSTANCE)pData->g_hInstance, threadId); + //pData->g_MsgHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MsgHookProc, (HINSTANCE)pData->g_hInstance, threadId); - return (pData->g_hHook != NULL); + return (pData->g_CwpHook != NULL); //pData->g_CwpHook != NULL && } - else - return false; + else + return false; } extern "C" __declspec(dllexport) BOOL RemoveHook() { if (pData == NULL) return false; - if(pData->g_hHook) // if the hook is defined + if(pData->g_MsgHook) // if the hook is defined { - bool ret = UnhookWindowsHookEx(pData->g_hHook); + UnhookWindowsHookEx(pData->g_MsgHook); + pData->g_MsgHook = NULL; + } + if(pData->g_CwpHook) // if the hook is defined + { + BOOL ret = UnhookWindowsHookEx(pData->g_CwpHook); pData->g_hWnd = NULL; // reset data - pData->g_hHook = NULL; + pData->g_CwpHook = NULL; return ret; } return false; diff --git a/native/MsgHook/MsgHook.vcxproj b/native/MsgHook/MsgHook.vcxproj index f613a06..33a1f06 100644 --- a/native/MsgHook/MsgHook.vcxproj +++ b/native/MsgHook/MsgHook.vcxproj @@ -70,9 +70,11 @@ false + $(JAVA_HOME)\include;$(JAVA_HOME)\include\win32;$(IncludePath) false + $(JAVA_HOME)\include;$(JAVA_HOME)\include\win32;$(IncludePath) @@ -142,6 +144,7 @@ copy /Y "$(TargetPath)" "$(ProjectDir)bin\MsgHook$(PlatformArchitecture)$(Target + @@ -161,6 +164,7 @@ copy /Y "$(TargetPath)" "$(ProjectDir)bin\MsgHook$(PlatformArchitecture)$(Target + Create Create diff --git a/native/MsgHook/MsgHook.vcxproj.filters b/native/MsgHook/MsgHook.vcxproj.filters index c8c6ca7..61ce41a 100644 --- a/native/MsgHook/MsgHook.vcxproj.filters +++ b/native/MsgHook/MsgHook.vcxproj.filters @@ -24,6 +24,9 @@ Header Files + + Header Files + @@ -35,5 +38,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/native/MsgHook/bin/MsgHook32.dll b/native/MsgHook/bin/MsgHook32.dll index 7aa62dd0c2a2276caf70e224bb7dd9de237e10c5..fc01f289c8ff928e4c82eaa6e8a0e570748bc986 100644 GIT binary patch delta 2683 zcmc&#eNa@_6~Av;V38FU*d;rF2_K6Zr@-6y_VJcoWr)GL!wBI^3I;*ME$hlx*j+=? zq)S7n(gz(j&vep`X(cfk+u8&*({3}?5TPL&Owd?kC*-3Y+O9QGrnU)2lh@yUV1~&| z+nM~+yZbxm-E+^m_jk^@Z?|_{@4Df2%zSA5z1#Pjr`x9=I$3lZZ_H*DoyYu**^Hud zsx}tAt7?;K|09!I^p5KPO3`PkJ+bJ5s&f|ovsGQStHne23}u=_bGoRfvV)XAI zaw?Ojxqn11W$ujYT}8;7gphRk0VX@{5r&ZI49r5AX>yn`GGRO{%k#T?{P4LDFaLvC zr74ea4(Dltnt=JonaK+MJl1L05q9J6c|JLV<;w2T4P&^@h z6Z!?~(5;(_Qdz5*v>C)up_mRp^^f`2c*(-YLl`1AX-(W97WyVEo_Xk@A-We`B9)41 zpSq$SdXgHeyaohn0YyHl%?v*4;)%gusF-x{TK^j`_kUxA+G<~mu7F|&y7ZI9I@rl1 z6=bqlOO;~MBj8H^WXbu5J4k^B?f+C;Bm`7%uqOklp>Yuhe|94FE>zQu?*lz`lfbZv&ATt z>xOD9s7lo&jBqE=#vW)mt${}d<`&9461$8LFNa;ejbfKYZp49@iDoQq(DhB2hc;WZ zl_*ask~pF!p_jJk7D`en>8eoB!_+)zp&T3esfY_1E~F;E7rkodXr_6*`<&uJ{oAi$bqE6|^ z|E8GwA1ERiBq5#4Y10Cl>*JS0Q7DU2>**y#{!UD8!ZkB7L}H`S8LcJSEdM&@IpMAt zLar2gUI$sv7{p|B4N{|7N4|h#eLZ;hKdj&?pP(*bh{y->aO@i9Gx@i%_a%2zr^}=8 zSA^}fgF=a%rh6$SoC(L1@*i~VDPuPjWnklM-xo~4f;2O}RZ$%|azn0*t7E3+qj8xl zqj4$5C!=+sjf0eNNuhV}Q9Togj%3N#;ywtzk3{OdxZx}%F$bZTT#$Y1JqRKJotKHc zOnp3YS~B+Kn`(p0>2c3G@QRGk<#Dgk^C4yC!@KY$VY=N#%5Yu@=#_v@F?GRIe`Tjv z7kPw+$z}2R%m(?<_}u(l1dhWVqi&}%MMR_uyg$8^HumYIde=52P#ZpsV@@8HmH6~! zbUI3>qnKtgQ*xUA=~$A5OfIL&ujpUQ8Kw+!dQ@4X$~wp;S7eHM%F8{Preyi^%t&<5-SehQT1N7D{u0ZG7o4k5F^Yrv0y9-s@@3X}rB z02}}v2P~KaCxG+7Cjh}(0+0e^06&DS+d_5_FCH3z4FCr`26%8F9Z7hmV+MrI051b` zz*k2{G8(#M;BTOsPEmJKApgk_+;9-3q!+ZRx}^GFeQ(ZQxw>lO^FP?%KKIh0DQe&9 zXy|D6@7m*TsB*Wtn|^Fa?h*er zdh~2#GLv>sbkl>ruC`tNu4ccd$w%^I9&GWoH2d**e7Es#O=xvO@OG=F(Q?`d?II3i z9tK_q49SFyCE>mS8GwB?A@>3^Sc`|&kSIhkXZ{GNc% z-L$ye)a`EX+~Y2D`+UuS&`45^#f6(9AJrT`X4Yzh z4aj2|yNbP!t!0DkUiQcAarRYql0D15&A!Y2jlIh1ttM-_HQTz@T4HrsH(M*L?bdg! zA6w_GS}upn<%&5MSI#}a^>TyUGu-dFv)qSVguBWm@>zTyU&1%@J^W+*UVe~&hJS&7 zi+_**JAaKg+3vLE+cpJl4Yp=mt1W1I+%{}GXnWrFE8B$ajO~5fC$$!oq3cufla9zM!!{DtNmfUQ8745Lb%X;@u)EieiztQQRz6i(ADV zqF3w|zboz)2gN7E1LAYysCYtrRXitN6lcUgi}PYo5o7E|`(5@NyWL)9ud{d9zi%J5 zpS7R2U$@WO!-c;qe5>%|LdFs6=y3QQ4?B7tA;$}jn-1cig+hE;powi=G&Y*5a&dgzf4mqp|{u{_*Ca(Yh delta 2304 zcmc&!eN0nV6u++)C|IB<1qE?M!0DXuzIczms6nNZZ89s>q7m_nYU%1=()yKcHDTSv zXBY5Jf?Jm0oW`j03!==Zs~=m9(W(0qjZWs*%D@GqE{N#cxh?9p|Mu5z`a9>|bAIRE zbI-YbYsRe^S2vF8t{*?ybNFsfc~9L$@hNV^UKM*`eIxdo_%Nh9#d{(Bd&qt__`Rrv z`1#_6ko^zwQAl6z=U)lw;)+FfvM2i2Fq;sXN<|>s#&;~>N)5T&kt%&46@!o#mT}>T z>v}wb${sytI6^9vPa&iW{hsUavTh_ob0A_WUPWb4cKjJ7QZ4oAskobprebg}HB!|X ziASiGQ@fitsg_Xnv}S`k$zze{YHE50#D5qCJ1d#q`~;-4!$HXB?R%^!4rC72Lq0Vp zwPCBT?~$TRw_WNfH?jj z+|iY_nHVkKMwmfSwX-yVd^M?7fC!}MwZQC5>-Rrh$IAKwpcgCpL~zSRecahrxHOs* z90N+eHTSp{rNQ-I(jgtu1T#HyS522;Goq1>`=-{^XO-Q$68T+?&(sw#wUg5Vrkl_a zRBH-)6?cvtCtKC>E1KG(9$!)W^xB#CWj)EYq}J3WPf|NxGY3rFBv(bhJ(Ptu?3Y#6 z=_OFHFT$zKXe_&#`GUTQx{(%1k=RbkxMNN)-kc@P}s0g@#I&)w$-W#2TOxz$Ky1b5qL(He>Q$6l)6JSElsgmNfT6@}32y7f#WAy}(|Bi0x=I;BY2XF`(6JSn; z2K1kh&~3o5ep}cRmaakM>-5jj|A8al6toEcs`GfxLoLapDz+3@#&)eNNv-;AO2eqy z&U+J9-6rMWunI8M@TGtkPjyo*CpcU4Bz$pMd2%+`_gxX+!13;Ml9m_6v zI#IE0Y2|VoX&|!LTtqh?QzcRRhp5$_LfABh9!XE5t+b17q?_qubbvlf|43h@JLqmY ziqSF2%nQs&CZ8!_3Yn=)3G*?tlWAf6%q`{)gIEn4$1?0Bwvb)IzQ?X*ee4EyJKMtk z#NJ@L*#~SYm&xUFMchJe3AdEARHG0!bRbVa9s!rPlO0jE2fB9;uvv)Xc5aqm$+VR5X*lM+r)?B z6R|b#NZz@;J9(5b%J`PiWn67sW2`ssHa;>UDOr-FDUwB+BQ26DrADbq+9mCmTBW1X jN$Iq7UV?%fLOxNN diff --git a/native/MsgHook/bin/MsgHook64.dll b/native/MsgHook/bin/MsgHook64.dll index 845c912a086c57d436a0ae3829549568fbec971c..a62d7053a9d0ff73dc48bd6ce9a43f11b76cba30 100644 GIT binary patch delta 3970 zcmeHKe^6A{6~1rT2g|~`AUp*H-Gzm$#!+O|ptyEH*FNYHSFMpm3{VB6TBWim8BLd; zg*T5?^d)A-+NmaO?T=|%wVL2G(={+IwzOJJ6KdP3)uvgCsZ7R>#;C8~y?e1qJJUb= zS9j*T@7!~~bMCo!&%JNAO>UF>mkRd|xR=-XkG!6m{xDoRA$!!S(kU44QJ*iB7=F1l zo8eYw&+cAZn#TC&NBt%xl@tFYEkgRk${91-_PS8*7u90Xs4%j|KX&VORkk8?FT`qZ( z7+_U?=4gdEdNG+0UD|IY#1}$1b*aN81B|0y(WM`y5aQCi!-0jeve)6Ek0Sag@X>T~ zsE@^XU18T{YIe$z6^@{d2sG;&#QH*FTq=@M_Su-(1+&+6!56A>_2+7qVD*=}^cqd3#x~^Uz$0BB`OHT~jka~q ztd~RE90PLut!pR{+1Jeg&|UXFrT$J!;IC>Z`4l2rxmujXCaaVmibgM9oh=@7jj6tj{PZ9*~zfTT;$GKTmnbwxZTL}60qwCmE+Sa>&cmY_K(3FQDfhn$11 zFoTg1x$~B@&D{tZDO1CNMJQ`EjR{FPsEO55rg(y^GF`f8p>tRYD5EzQ*bB~2)+q9sQ8Ou^r0(c(vTME^&@eX-QPWzK&u*ybE8oTxa~M)md9nO$@_L@u`6 zoUY|1IJ4-nqfM=j>e5=OD`Fo_r-(1wwZ??{RU4-h(jB($%f&|M!zxt}3HbPo%jK!C{g=nIRZ`!mOrcC>3n02WE zJfC_En_}%c#4=f4VveViv`SM}upfSTv6lqim(>dJZFEfQ+)Wk5OY|$)*EKA}$b1$z z28?nC*P5^RlNQleJRbOtPyNKF-WbC{7}2FhP<6@0a)`+^KoKnf#eEysm$&;vYxfNT ztFg!Z!A$M0X+f|N$@qf43knt_^7ZV;5FM6003^{Kk&v-vXakuh4_W2|B4Pu4boJ3M z!QCBh=>owTBM?B;3v)y)0m}eZ_lGTJS&hg&VlgbZS$s2Rq4n)Zw;YD(yXbVxm|CF@ zou<^;fzy3m#qEkf~is^e2Cu0mkK)$%`dDLz`!wZs;&;K67zl_dQ)#M-^Obox0Gn z5S7gLspnmnu_@6;_#O{#J)nbZ$*c{S7aOi7YIn?bAx@i;^i}IR^kn4YybjW(Ixq$yc6@@>jRJweQ*y76wr52AamB%c5rfXX*OA?RM-4D5sCTOo)<|PJWqgFb~(M*#L z8g~9gJ2I(gwg+vc=M}PN7JJgx(ep;}q%V?;^|5t|R_)QG8O!gbVL`j-+p$2G(kMr* zqG}4%73yf2>-V~p{3+c;DPR{(IQ2NK+WKT^2lABNz2Z}{+n~`T9$ay@>cJ5`FCQ^_ zo|8Riv*#T4oXei0^zz7iHBK9`_8Ovb+A}F$!;6!(Z>BT{{dw4Dd}=rbICgP7%JB@x zoz57)isMR-i#TR+G;#d<6EXgIj^E?h7sDWF<%TAXS2@;j^mB}*A>{4+n0A%pEsh4x z%ja0YaT&*z9DmCB-)6X#kbT_H!7;$`IgaHVk8tecE1M{2Hn&fV@9>?v&hauwlUAGd zguNi0w9zy6>CeP3NAxOLqMb-vm0M%~){*t)>8lRyJUISCHS-%Z;<+VN+iL@jyXvZ1 z7cHn-qxsVpCR4i*Zy@o7h61fGy(s4$v^GsM6{qwe#Gf6*ROoTI7uvG5zozF;rZgIR zHC!z<(h( z*991p6W6d<7PA(f*nHZb4Tn!=84bY>{IRJ-+x7!HQ0G#r1Fu8S{jC0{u@0)!_0V-u zo#G>|r=+8|A(c6V;QW()kSgf?z?*mrZ-#ygn1=(}3*8B1Z_XAdCvi;Qfg=oT z!g2irbc#I?I$19;40%8~z r0S{+`NC$^8IL#gOQn=1^Y|`IeGuaIB{l|unT{?CuHRrYvhi~qmUWeA; delta 3699 zcmd^C|5H@g6~Fu3hr6)LqVQA{b%6y*Xzc1jh85Q=%En7vD@sPOFiH@N8kDW>T7Pi5 z7(m%PH$`3({iTT}v14p!YSf9rF?Lg^s4*$gsoy%&WJXO_(MU}u!G`+!Id9)O{ssM| zJ9FRXoO3_t+;i_c=RRoTZM=J~A->16AiOQ~^oF@vmG0!IX}s#52fe28y4$1SH||mm z?`!tbmMiXZjqh_$0M3XExu4VUON~Dxa!tc!>({KKm`wjw`xtB5nZlah*j|&g4YRyV zdzz5SSUODO6XvpsN}ge+@Q+2xGQ&*sU=d?=m^h_G40S@luqStNk6;oWSd>(u&`^AA zmhe}DGHA%?F^ZX9BV$|^ho=Kv{XEj)a4M6GKM6a@?z#{k6o5PWiB{Lgqkf0eb+O_j zM%Ku2M=h};ryLEy_?0xqRB4xuF@F?cK&j}}i1Jx3Us9#tW-#XZzB3k_>Zdq7x?3ap zTrt;09tk?^s`PWB#CZF;u*##`9nQ56{)ptnag6y~=Xhk{BWNl(zG#IJY6{d5a)JNC zbSU3Kfwu~Eg6)KO7wX!`!f8BOiS;6tj-r7|hkX)`MwLczdVp1G3cP} zP$pri7xUa*+DIlju|qKGpazRn>GzoRoIs%96fEn5^^Eueo(3MN&ES!MiAS76W4&Fa z&uadks?rXMCnt{V_TERTdf|zmw`TbY-hQ_Mu_~s4=L+LhR643D@v=`| zB^j`YHbE3;=edxlN@mfeFL2rVaXu|lh1Dw^yh`?Jg118UX3&w_v03=eHNqE!GF5s8 zFAHuv;pUe=^~-0tY?iO6l6AQ@;YS8k1GH9qf5Ylkb$!XCk!?|%XC)k2aGqZlD1Tx7zcSGbyuH-OEEbltD3Z>QCa@wYKRUSO!7Mt=DoC$yAi{CoAm>Wp`DT7LXhf zx6`T-abupc(zJHT;v8Dg_Ikbn`JJtl??=QrFg0`8Sm2~ka;<47gO~ROC-=t3&>q?? zRGP!w_QBLxE@Pn^Ln##>!<)(Cps1No?re78?<%2sYSAOXcO}+3ODD3 z4`H6WeJps3%ZtI!Af593H3< zjiJ3&@T3f`);NQ)tk+9{OyA3((OC7!;{d$!ISl#Owh=ZanVr@17&62bHhy$K37 zBh^-VwWWi_l?SujN><(e-IMmgrckW224%9k=QD zU11`^*E)W#VH0C9-EdsT-|6_8j+b>jttXaDWP@%`>Lt3Kr{j1Xd7<(zp-}W@vNrr3 zG|`&;Qwqh&URFNHTvE+n9X;{({^F|Fru3b>_jy_-wc&y}^_9(An_F4~^~=|93BA-} zuL*{l*0IrN`6-9Sj3<>N>f%@-p$F0 zOK`>n#;oZ42J`@7F7!-bcaCy8t1wJ7@)?UeWFy95(CBAKHL}!_6qY(WC15rhm~lR1 zN$y_woW~dhmoULKY256IMrJx{42)?IoF$mAMyy;4n8Da4jNjmkoof=9DY%<#;m5}8 zO(NUWBr~(2iwRD~$eI2eG^7YDWwzin=t(x zU>khGcOPs=?0a%2{J*!un*TvN9IKdUHdxce)xX>lXjvZ&ycAq_ta*}0Se|SQ3qH&S zygh0V8Y9$ru$eGo_;;fLV-nbUs z2v_6p`8HG^;d>YX$VY&+2we}EmN<%W95O8_WF}-g@HvdGJbciAZ(;laoc+Lu5@Wkz z9|e}8sg6J{1BNi}=ApW`LHIL1pre==1h%2YjBqC0i$RO+0}f(1AQPIg_hInstance = hModule; // so set the instance handle - pData->g_hWnd = NULL; // and initialize the other handles - pData->g_hHook = NULL; + pData->g_hInstance = hModule; // so set the instance handle + pData->g_hWnd = NULL; // and initialize the other handles + pData->g_CwpHook = NULL; + pData->g_MsgHook = NULL; } DisableThreadLibraryCalls((HMODULE)hModule); } diff --git a/native/MsgHook/org_synthuse_MsgHook.cpp b/native/MsgHook/org_synthuse_MsgHook.cpp new file mode 100644 index 0000000..a5665c1 --- /dev/null +++ b/native/MsgHook/org_synthuse_MsgHook.cpp @@ -0,0 +1,29 @@ +/* + * Copyright 2014, Synthuse.org + * Released under the Apache Version 2.0 License. + * + * last modified by ejakubowski7@gmail.com +*/ + +#include "stdafx.h" +#include "org_synthuse_MsgHook.h" + +/* + * Class: org_synthuse_MsgHook + * Method: setMessageHook + * Signature: (JJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_synthuse_MsgHook_setMessageHook(JNIEnv *env, jobject obj, jlong jhWnd, jlong jthreadId) +{ + return SetMsgHook((HWND)jhWnd, (DWORD)jthreadId); +} + +/* + * Class: org_synthuse_MsgHook + * Method: removeMessageHook + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_org_synthuse_MsgHook_removeMessageHook(JNIEnv *env, jobject obj) +{ + return RemoveHook(); +} \ No newline at end of file diff --git a/native/MsgHook/org_synthuse_MsgHook.h b/native/MsgHook/org_synthuse_MsgHook.h new file mode 100644 index 0000000..93144b7 --- /dev/null +++ b/native/MsgHook/org_synthuse_MsgHook.h @@ -0,0 +1,29 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class org_synthuse_MsgHook */ + +#ifndef _Included_org_synthuse_MsgHook +#define _Included_org_synthuse_MsgHook +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_synthuse_MsgHook + * Method: setMessageHook + * Signature: (JJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_synthuse_MsgHook_setMessageHook + (JNIEnv *, jobject, jlong, jlong); + +/* + * Class: org_synthuse_MsgHook + * Method: removeMessageHook + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_org_synthuse_MsgHook_removeMessageHook + (JNIEnv *, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/native/MsgHook/stdafx.h b/native/MsgHook/stdafx.h index bf473c9..2ee36f5 100644 --- a/native/MsgHook/stdafx.h +++ b/native/MsgHook/stdafx.h @@ -10,6 +10,7 @@ #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers // Windows Header Files: #include +#include #include #include @@ -19,15 +20,20 @@ typedef struct { + HWND hWnd; int nCode; DWORD dwHookType; WPARAM wParam; LPARAM lParam; + TCHAR wParamStr[25]; + TCHAR lParamStr[25]; }HEVENT; typedef struct { - HHOOK g_hHook; + HHOOK g_CwpHook; + HHOOK g_MsgHook; + //HHOOK g_hHook; HWND g_hWnd; HANDLE g_hInstance; }GLOBALDATA; @@ -35,6 +41,9 @@ typedef struct #ifndef GLOBAL_VARS_H // header guards #define GLOBAL_VARS_H +extern "C" __declspec(dllexport) BOOL SetMsgHook(HWND callerHWnd, DWORD threadId); +extern "C" __declspec(dllexport) BOOL RemoveHook(); + //Global variables , remember not to initialize here extern HANDLE hMappedFile; extern GLOBALDATA* pData; diff --git a/native/MsgHookTest/MsgHook.h b/native/MsgHookTest/MsgHook.h index bc22199..792d5e6 100644 --- a/native/MsgHookTest/MsgHook.h +++ b/native/MsgHookTest/MsgHook.h @@ -1,12 +1,19 @@ +/* + * Copyright 2014, Synthuse.org + * Released under the Apache Version 2.0 License. + * + * last modified by ejakubowski7@gmail.com +*/ + #include #define MSGHOOKER_FILE TEXT("MsgHook.dll") HINSTANCE msgHookDll; -//BOOL SetHook(HWND callerHWnd, DWORD threadId) -typedef BOOL (* SETHOOK)(HWND, DWORD); -SETHOOK SetHook; +//BOOL SetMsgHook(HWND callerHWnd, DWORD threadId) +typedef BOOL (* SETMSGHOOK)(HWND, DWORD); +SETMSGHOOK SetMsgHook; //BOOL RemoveHook() typedef BOOL (* REMOVEHOOK)(VOID); @@ -14,10 +21,13 @@ REMOVEHOOK RemoveHook; typedef struct { + HWND hWnd; int nCode; DWORD dwHookType; WPARAM wParam; LPARAM lParam; + TCHAR wParamStr[25]; + TCHAR lParamStr[25]; }HEVENT; /* @@ -30,16 +40,16 @@ typedef struct { } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT; */ -BOOL InitHook(HWND hw, int threadId) +BOOL InitMsgHook(HWND hw, int threadId) { msgHookDll = LoadLibrary(MSGHOOKER_FILE); if (msgHookDll != NULL) { - SetHook = (SETHOOK)GetProcAddress(msgHookDll, "SetHook"); + SetMsgHook = (SETMSGHOOK)GetProcAddress(msgHookDll, "SetMsgHook"); RemoveHook = (REMOVEHOOK)GetProcAddress(msgHookDll, "RemoveHook"); - if (SetHook) + if (SetMsgHook) { - return SetHook(hw, threadId); + return SetMsgHook(hw, threadId); } } return false; @@ -195,8 +205,8 @@ void InitializeMsgLookup(int allowList[], int allowSize) case WM_CTLCOLORDLG: _tcscpy_s(MSG_LOOKUP[i], _T("WM_CTLCOLORDLG")); break; case WM_CTLCOLORSCROLLBAR: _tcscpy_s(MSG_LOOKUP[i], _T("WM_CTLCOLORSCROLLBAR")); break; case WM_CTLCOLORSTATIC: _tcscpy_s(MSG_LOOKUP[i], _T("WM_CTLCOLORSTATIC")); break; - case WM_MOUSEFIRST: _tcscpy_s(MSG_LOOKUP[i], _T("WM_MOUSEFIRST")); break; - //case WM_MOUSEMOVE: _tcscpy_s(MSG_LOOKUP[i], _T("WM_MOUSEMOVE")); break; + //case WM_MOUSEFIRST: _tcscpy_s(MSG_LOOKUP[i], _T("WM_MOUSEFIRST")); break; + case WM_MOUSEMOVE: _tcscpy_s(MSG_LOOKUP[i], _T("WM_MOUSEMOVE")); break; case WM_LBUTTONDOWN: _tcscpy_s(MSG_LOOKUP[i], _T("WM_LBUTTONDOWN")); break; case WM_LBUTTONUP: _tcscpy_s(MSG_LOOKUP[i], _T("WM_LBUTTONUP")); break; case WM_LBUTTONDBLCLK: _tcscpy_s(MSG_LOOKUP[i], _T("WM_LBUTTONDBLCLK")); break; diff --git a/native/MsgHookTest/MsgHookTest.aps b/native/MsgHookTest/MsgHookTest.aps index af32054611395a6bfa565aeec0e6887caf774429..b48c55daae795bc73061088f936c009649d2b76b 100644 GIT binary patch delta 2250 zcma)6T}&KR6h3!`U3RghK>sOS78XrO|Ja4)Pupafox;$a-A#9pZN*NTiY>7P0<|v3cmPcXpJw8LhXwQv2pR-nT4HgF>y9K=icx8 z&bjBFd+uEQOuX{BIOt~OLnWSl*Jc5Z)whKMn)1Bdrp6kZB9X(I9Mjs=-qTH8U9V{E zy?y(7P60iA!q5lx>m*%0sz{MA_`rr|96JZ>07@{X2cl73Q?!r_-ik`d=3r0{G(=jo zhDhAN92`?kjDRX|nt&WvG@AP%htCz=k_Evv@RSM1)IcaiKrO7}0Oet1i?6dBwtnc> zO$Ty09MpqKAQWlzg4b6E8%(7fR5SuADk>n)M5HEJI;=}-kfT1x2mHyoX`sMDR&u5a zHd-K_x`}S$sD4NZ$$Cr+9MO2ypwd@UQUpx_U?gFBAh_a=Mrse_<}s4<+~y+ex+*cM3(h9)J>l zSp5ClGByi6tQo%*>Ya4TohSP`F0|urR?&89X+1?ZtD7Nuy3`PHO`VaG z^IpXVwP|?mdtxjuQm_>| zF1=)r-p zaxZ`_(F!W)5Ca)B`pFQdH$Va$DMo?_DO3nRn0n>AvE8E!V}ne%E@J=0J|}&>_`^QI z8xt~n3m;8*=v_SdF)PAvCimx?G=Gc0qWMsck0vXbANNm{rCd|gYeb!z+C7kVpf7eb z8x*(;b=18;{{*Gh4!zW(Zc2!cdTA@CY2+qdCv?Mk;(F5|QX?T+K)Pq?yKTmK1J>Gf zJy%=Srx|zD;0JK5I;vEuMp`aR^-!r=?*H{`g(&Hd7(V~y5i&GKO;IZGRl^hMUSkIt zheKC5^GU#^XbYTxU62cl`03=v^&ELOg*;eATA<6&{K=7Rrp81bioEWZjIcO3HP7B3 z?V4U>tQ=pw?XmR<0PhWbSZr@1!5$I6xb3nxlgCvN@6a$vs3RNywz)8GCQInf#xLzI zdy)ik2iDJ&3a_ri<1;QHu>t$ZOy=P*nZaVbNhZDv=gHjLi%BvgF?8K=3EeN@K{A6K zc%01Dv)E7O-Z>m5Gjb7clIgyT^JJFZ!6cbmU!iN(CA|GT9wf7L29J};8^`|HLi-Y> zH!_aHgxs3In`9nN;5-r6DZ}U#CJAYpLDyV^P<01C`mqT6=e7ua=J3IEft_UV+$>Jd M`Gga*n4By87fBE?j{pDw delta 1719 zcmbVNUrbwN6hGg+?WL3sic9#@e}k3XG(qQWfys!Hb#1W~`bS!k#cp?VFzBe>g;KIO zV`hBXVw&M`iHUz6_QYOBB0dlk6I_%E48gzyPt0U7F^e&a(L|r>`C6OR?rD6@`TBjo z^ZU+s&bjBF`{8ZzlUw4AHWry{cY1p70r>io{_)xIw00>ulFDSyrQ6~&*|C(?=26^A zGB&MU96vvkNrp2MK~0;&qk3Bnz)c3wf&XkCn)|p#j;r2SOihFmLjiCrT_6F3{KIP4 z8;T4Jd&2~JdciQaWItBRHGb85GWuHLWOTI1HgYUn!U*Vwx)Kl=4JByb114-^O=k{p zG^EDE-k~9ad!e2KJ~bSFIT(!&CIWHJJ`N54!KXsLXaqc9F74w9ZzAM_=iKlN0QnnN zBT+Rx-~)G;03+r?l1paX0GqX`$nhOL$&ccv*^f%h_BY!nTT55 zOK3CM?4+u$MSeHvX_gj8OrEdVUA(pu!rc`G9eKI=D(J7iPSL0odjJyj3&1EOFq`jO z{38DmYxt7^r2?py^d#@&{d{|^f!_ka#xS)SU{PFHb<(`O`YE%cw)T9ZKU5+B-OOT* z(1{CcUF-#Xu-0MzpXv&!n%6spfFE@md+aoRzG46J$1TPp_|v9S&pW^pbpWR@BVfJg zkPcF2e-`i^TIT4A76~6p4(To}?@4%l%TY}IS2dLS!@}Q2JY%vRArt&HE)+x(q3D;{ zT&pWCXqqQoumSIwE%H2tWpR`Dz&gGDi6SQ1#|COWbW&u z56V>PYt>W=;PN%xyG~Zg*Aok6Dz&yMDi6T0jBkHyk!DGCc>?z)Eizx;_>P~dCn2Y3 zC>43-&&2gT=2k2h$Uc}>IJK7KEzYEu>hU8uK@q-K)bk3PDCsLq@e2Gb&(9Yt@Cp4A yAv>#R+~~)xZJn^ZhV`2^{A0UGfc4^1-f0qkSjYYykL|a0Zbu@a4-Ab;m;VI}Yq2N* diff --git a/native/MsgHookTest/MsgHookTest.cpp b/native/MsgHookTest/MsgHookTest.cpp index a9c6580..2db2094 100644 --- a/native/MsgHookTest/MsgHookTest.cpp +++ b/native/MsgHookTest/MsgHookTest.cpp @@ -1,3 +1,10 @@ +/* + * Copyright 2014, Synthuse.org + * Released under the Apache Version 2.0 License. + * + * last modified by ejakubowski7@gmail.com +*/ + // MsgHookTest.cpp : Defines the entry point for the application. // @@ -21,11 +28,17 @@ bool filterWmNotify = false; bool filterAbove = false; +const int MAX_TEST_SIZE = 100; +TCHAR testWmSettextL[MAX_TEST_SIZE] = _T("This is a test"); +TCHAR testWmSettextW[MAX_TEST_SIZE] = _T("0"); +TCHAR testWmCommandL[MAX_TEST_SIZE] = _T("0"); +TCHAR testWmCommandW[MAX_TEST_SIZE] = _T("1"); + // Forward declarations of functions included in this code module: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); -INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); +INT_PTR CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { @@ -127,7 +140,7 @@ void StartMessageHook() return; } - if (InitHook(mainHwnd, tid)) + if (InitMsgHook(mainHwnd, tid)) { AppendText(txtbox, _T("Hook successfully initialized\r\n")); } @@ -175,7 +188,7 @@ bool OnCopyData(COPYDATASTRUCT* pCopyDataStruct) // WM_COPYDATA lParam will have if (_tcscmp(msgName, _T("")) != 0) { TCHAR tmp[200]; - _stprintf_s(tmp, _T("msg: %s (%ld), wparam: %ld, lparam: %ld\r\n"), msgName, Event.nCode, Event.wParam, Event.lParam); + _stprintf_s(tmp, _T("%d hwnd: %ld, msg: %s (%ld), wparam: '%s'[%ld], lparam: '%s'{%ld}\r\n"),Event.dwHookType, Event.hWnd, msgName, Event.nCode, Event.wParamStr, Event.wParam, Event.lParamStr,Event.lParam); AppendText(txtbox, tmp); } } @@ -185,11 +198,22 @@ bool OnCopyData(COPYDATASTRUCT* pCopyDataStruct) // WM_COPYDATA lParam will have void SendWmSettext() //ID_TESTMSGS_WM { //SetWindowText(targetHwnd, _T("This is a test")); - TCHAR txt[] = _T("This is a test"); - SendMessage(targetHwnd, WM_SETTEXT, 0 , (LPARAM)txt); + //TCHAR txt[] = _T("This is a test"); + TCHAR *stopStr; + long wparam = _tcstol(testWmSettextW, &stopStr, 10); + SendMessage(targetHwnd, WM_SETTEXT, wparam, (LPARAM)testWmSettextL); //PostMessage(targetHwnd, WM_SETTEXT, 0 , (LPARAM)txt); } + +void SendWmCommand() //ID_TESTMSGS_WM +{ + TCHAR *stopStr; + long wparam = _tcstol(testWmCommandW, &stopStr, 10); + long lparam = _tcstol(testWmCommandL, &stopStr, 10); + SendMessage(targetHwnd, WM_COMMAND, wparam, lparam); +} + // // FUNCTION: MyRegisterClass() // @@ -299,11 +323,17 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case ID_TESTMSGS_WM: SendWmSettext(); break; + case ID_TESTMSGS_WMCOM: + SendWmCommand(); + break; case ID_FILE_SETTINGS: - DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, About); + DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc); break; case IDM_ABOUT: - DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); + DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, DlgProc); + break; + case ID_FILE_CLEAR: + SetWindowText(txtbox, _T("")); break; case IDM_EXIT: DestroyWindow(hWnd); @@ -334,7 +364,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } // Message handler for about box. -INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) @@ -342,26 +372,28 @@ INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) case WM_INITDIALOG: { //IDC_EDIT1 - HWND classnameHwnd = GetDlgItem(hDlg, IDC_EDIT1); - if (classnameHwnd != NULL) - SetWindowText(classnameHwnd, targetClassname); - + SendDlgItemMessage(hDlg, IDC_EDIT1, WM_SETTEXT, 0 , (LPARAM)targetClassname); if (filterWmCommand) SendDlgItemMessage(hDlg, IDC_CHECK_CMD, BM_SETCHECK, BST_CHECKED, 0); if (filterWmNotify) SendDlgItemMessage(hDlg, IDC_CHECK_NOT, BM_SETCHECK, BST_CHECKED, 0); if (filterAbove) SendDlgItemMessage(hDlg, IDC_CHECK_ABO, BM_SETCHECK, BST_CHECKED, 0); - + SendDlgItemMessage(hDlg, IDC_WMCOMW, WM_SETTEXT, 0 , (LPARAM)testWmCommandW); + SendDlgItemMessage(hDlg, IDC_WMCOML, WM_SETTEXT, 0 , (LPARAM)testWmCommandL); + SendDlgItemMessage(hDlg, IDC_WMSETW, WM_SETTEXT, 0 , (LPARAM)testWmSettextW); + SendDlgItemMessage(hDlg, IDC_WMSETL, WM_SETTEXT, 0 , (LPARAM)testWmSettextL); } return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK) //only save on OK { - HWND classnameHwnd = GetDlgItem(hDlg, IDC_EDIT1); - if (classnameHwnd != NULL) - GetWindowText(classnameHwnd, targetClassname, 100); + GetDlgItemText(hDlg, IDC_EDIT1, targetClassname, 100); + GetDlgItemText(hDlg, IDC_WMCOMW, testWmCommandW, MAX_TEST_SIZE); + GetDlgItemText(hDlg, IDC_WMCOML, testWmCommandL, MAX_TEST_SIZE); + GetDlgItemText(hDlg, IDC_WMSETW, testWmSettextW, MAX_TEST_SIZE); + GetDlgItemText(hDlg, IDC_WMSETL, testWmSettextL, MAX_TEST_SIZE); // check filter options if (SendDlgItemMessage(hDlg, IDC_CHECK_CMD, BM_GETCHECK, 0, 0) == BST_CHECKED) // the hard way filterWmCommand = true; @@ -375,6 +407,7 @@ INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) filterAbove = true; else filterAbove = false; + InitMsgFiltersAndLookup(); } if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) diff --git a/native/MsgHookTest/MsgHookTest.rc b/native/MsgHookTest/MsgHookTest.rc index aa283073a4cb2c4474e6ede145b873cfcc76cfcf..9c8e9a571406865f44944618d0cb5d15a12b33d4 100644 GIT binary patch delta 600 zcmZvZO-lk{5Xb*ZSh=f4mX9wf>LE&yY}NIJAQF)XTzixB6m^g;y-3=nlOG_0n2R5x zL$J`bQ>Q*b=e|H)f^N;TiWzv=XJ&Th`TggaxikCCr%iSK5Ebm9gaiKS*u??GwS={$ z&MK2r&N9x?!YQul%M+ot7NVZ&;=fe}F~*8(4TaXUFx~qD^z8{yTlLbBOE}6*H!0=z z)1xM=zUz2q%0SNgS?DMZ9T^yOtSG(eN%pjI7=OJZrrDj;i9ipa4o z3>6opnt!0i3if;c^e%)EX|Rr5QXLI>kGqk5Nk*36{UUU_6|2#|sw!vXIAzb1>+D60 k(WI`N<`^$7d4sxf-v7#k^&IR@@y4AZGaduR&2MB F697hN9c};s diff --git a/native/MsgHookTest/bin/x32/MsgHook.dll b/native/MsgHookTest/bin/x32/MsgHook.dll index c61865312bf68b880add7fcc9d6f77a4873396ea..fc01f289c8ff928e4c82eaa6e8a0e570748bc986 100644 GIT binary patch delta 2665 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 diff --git a/native/MsgHookTest/bin/x32/MsgHook.exp b/native/MsgHookTest/bin/x32/MsgHook.exp index 1d8c88c8c0580c8b1a950abe3c478d9d111dcb44..a93c2a08dad7067e9244d9238964ffb8efcdd53b 100644 GIT binary patch literal 1135 zcmbtT%Wl&^6g^G>^A_p0EG&^l5y(oDAVpOxMHEnhHk3r_0*z#*@nEbvapZB*z=jXt z2ar&IfG=Rro_}G@qTD+Z7t=}+h^x%;nKSo}XU=tYoC-eO`OyDa0dB&C{o4hw5Mw)%vV)yrlIn^Bk*i-mQns`5lGEDHrCW(EjFG!4jo8*wxW? znjZRLk|1~{r!q*hDA4al`P+$B!F)N$)G(c@U8S{*6c=>bi_*2q%ejpfdS(NzM4uMz zTg~msEV#H$$R~2)5%P^()Ceycwn})_ur}c(!|oGaGi<{kSJa8Iqb_@j%Z9ZGZy5H7 z@QPu){|_3E$-Ww#Dp9;z7bBU+Qzd#TQBo^Wc%x=x+`~rIr7S+94L;AxF*z6yvQ(#U za&NVF*V}p8eGY-mDh5YkY0u)uYNoKYF7~oC%H+^{5+_QF-&^d*dLk3ApHIR#_15Zs zUF>g(gLov8cy#D#{>zU=ug&Bf^U literal 768 zcmb7C%}&BV5T1fsH70^rJoLZ;gJ}x!Knx~CjDd(~AmQRBq|lXATDED+PmCAe!JFY- zd?lX%XSNip@#3U2JM(pC=bN2vDJdwvy>zQ7fPIjn=-e_xGYZH)pjxOOs3g0nHT-mo z52mAhmoSo31t5c(lp16%DW)1RPFt{?)EN7FRp2%lHG~-Jmg7K&yJE&Egf0)|3J2?R zR5(U2jjDo%c1wDBwA<1vpe5ca7-)B-cZzmTdS}woU&{ML)sSQplq|YXKWA5b#vS3Y zo*hh0N9%@D%NAPMC>iYD7f*Z`25e20b-2ULfXA`U7akO$npN>AA{Yr>c5aCc+CyIi z;xW_;ofECqY~R2uTx4N5xBgprO#t|UQz{Z0`KGH~+YU!|n>s&xC>grJdUZCiC(N-Y zW2DOgj-ZmIG4&I7eux;2tsh^0Z75t%x2@dr9abx9F8OjOJq^Kg+jQ~3Dn=3FkGvTM xKog0PXctW;M&@@uKDo*U$+r!Z5;T4xWuRvjWuYVIM=MF{n`#6gl0h%o)E5JMi~Ilp diff --git a/native/MsgHookTest/bin/x32/MsgHook.lib b/native/MsgHookTest/bin/x32/MsgHook.lib index c6192c3aec1fcf3590b2717f543add945a4bd323..80a7bdeb8b9523c68a9cdd0e8934945ea1bc399d 100644 GIT binary patch literal 2590 zcmcImOK(y^6#f9A6kL$%!lW_5*hJkRkBdMw2DB!{0&Re){NRcYA9(@6qn8(47DWOa+MX%3>sY!9Pb7LHtM5V<7^ z-LVTebpsb3ps);_QB8V*9#sk}JXpdlxZ!~FYV3lTe5$cGH(7o3M3dup4c=TYX0rl4 z26TVRC>cuw0#4+xWN4_iw`YfQR`waGn9RdnU(Vsemxo6szk_m%;zh*~s@2~eG}cP} zDUhMTXEl+18i7}#R;|*ltVPw*T^jtL`dbQ!8b~92F7=*CF>ce~lB&{Uc^biUC-o~J z0#Wg6hkArN0p=Rpd8vJRqdFT`Mw)`TznGDWec13>R$~z( zNXZ#@P86xV*~iYO9d|CKMC0nkW~Ml8rhK=-F~spqso6_|Mq^4$Ntr3%)I|2ol>fqj zdE$DXKur92EPQK;Q&PhqV;P*reC>G9%L}EM^PF~k^ETixKKOr%U@ks93G4~Gr X+vtw8@m#OKG(QgdY6$HkrP;=y#o5U_IVQK*Pj}Idg15icqPM}3hlg~3tPZnW&23HEvt;wzo(>?hDrxwV> x$x}H^5tfLX8bS?J0EN*1{|pR1j384*fu=Gta4^7vfWfyo9ppy6l$;y}E&xZwRI~s9 diff --git a/native/MsgHookTest/bin/x32/MsgHookTest.exe b/native/MsgHookTest/bin/x32/MsgHookTest.exe index 773a3873e049f147759604fabb7291abed398bc5..a6aafd48ea50a6e12211c60a01d528f1110ed8fd 100644 GIT binary patch delta 9157 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 z z;tFdX6V_xd5pHEZ5D>}DD7L1qT0YZS{G{j-RI{fHoiSwn6J^#l%~NN8=(STL-<9nY zf@i9Qqp~JW0}G+O?;O*-_T_e2vtsUHFPnj5PFVXlV4K849mlZeHV87s*z}elN36wT? zCNTP-X9AUnJrjty;+epO|Mp10#^Sm;)(a!=&q(tF$INasP=g`P>F|6<#c%9i}8W4+pgp$$1vty zNgGQJ>?U*Jlg8$Yzn)hzMW1In>@}J2naXCf)Vj}<+{4H2DLD)0gUP|c?W>zNl1t;B zt9xZ6Hy(-)M{=)l!F7v9aVgy7x>rVVI?hn{85Wc4yaKt0#VwSy@K>p2D4WUti^Vf| znBk~|-iu+MvNARFiC1Ni?sB+NL)>cEt;)eyMsl~a%rX+<65&@aYUf$@pT>n7G5jjx zexPtJYhwyYn8|Y34Crn)3^@}fME!sIV{mlNMf{8Qq|#4$;ENlzq|CT&P^B)yq*D(Oa&%oJdnWQsTC zniiQJH&vS)rgu%vrW2-i(|OZfQ*82_8BaDw2O~z@) zbmMGek#VK5#rVFl&G=X2W#e_@ZKFKaKXyW_DR#z;*s9oVv2Vq`7kfUoB5qUM_PBTA zPQ|syMaS#or^Xk=za4)l{-=0V!nlO!1Y<&S!ea?#2~Q_%NvKKKm9Qt_wS>lmw-OE| W98IV@6v_pAH6}J4`z)06_WCzp_wEe< delta 8293 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 J!FNgG{tw@YOAP=3 diff --git a/native/MsgHookTest/bin/x64/MsgHook.dll b/native/MsgHookTest/bin/x64/MsgHook.dll index b47b70ca74c8e7f6b2a28505524468079fc5093b..a62d7053a9d0ff73dc48bd6ce9a43f11b76cba30 100644 GIT binary patch delta 4011 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 CH`&kt delta 3686 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 TghG2v?ron4?W4U>ZTtKM*c3%1 delta 400 zcmew*e1UI*44av`v9XEqmooomL{c+(532w(Nc=o2JF>W_k%bw$-r&2FFS5#SR%7QvRyjF} zQ-l*}La;c{`3#fGIrWi@H!*>ETLBc3|Nk>Eq_lw)ivZO!0(}Ye7T9~f#pxhgFC{03 F0RWY1VO{_L diff --git a/native/MsgHookTest/bin/x64/MsgHookTest.exe b/native/MsgHookTest/bin/x64/MsgHookTest.exe index 17878341886b0f570a648c8bc5264077a74d26b2..0cad9a2f811c8a9ab8bb178db4df4b074a4fc360 100644 GIT binary patch delta 11374 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 TEOSx*+@sIc?sD{0E-L>6qGcaM delta 10486 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 bCP}Be*l9P$kB*{jSIw@?2knEU@1*|%>MK*m diff --git a/native/MsgHookTest/resource.h b/native/MsgHookTest/resource.h index 36293d58949b1820475d5887a36e2a4d89681685..596d9a1db605785d008d07b01e67f14dd6a05a5f 100644 GIT binary patch delta 230 zcmZn=dm+7{i*51-W)|*n2499?23Lj2kab^ zRk*|^FJNbz?7=R^3ek9wU7gWvav_^4r!#{O&_#|6L6aGo)Iq9&mK3r{v->inGUPFo qPTt6*JNW<`AEO1x>dkB%a!ibtlN-4-Cx75%nHgI7 delta 45 zcmaDM-5|E1i*2$V7tdxkjvU6x8<<%(zvGf)n!JruY;qm1$Ye8KqseF3K 1) ? parts[parts.length - 1] : null; + // Split filename to prexif and suffix (extension) + String prefix = ""; + String suffix = null; + if (filename != null) { + parts = filename.split("\\.", 2); + prefix = parts[0]; + suffix = (parts.length > 1) ? "."+parts[parts.length - 1] : null; + } + File temp = null; + try { + // Prepare temporary file + temp = File.createTempFile(prefix, suffix); + temp.deleteOnExit(); + } catch(Exception e) { + e.printStackTrace(); + } + if (!temp.exists()) { //some reason the temp file wasn't create so abort + System.out.println("File " + temp.getAbsolutePath() + " does not exist."); + return; + } + + // Prepare buffer for data copying + byte[] buffer = new byte[1024]; + int readBytes; + // Open and check input stream + InputStream is = MsgHook.class.getResourceAsStream(path); + if (is == null) { //check if valid + System.out.println("File " + path + " was not found inside JAR."); + return; + } + // Open output stream and copy data between source file in JAR and the temporary file + OutputStream os = null; + try { + os = new FileOutputStream(temp); + while ((readBytes = is.read(buffer)) != -1) { + os.write(buffer, 0, readBytes); + } + os.close(); + is.close(); + } catch(Exception e) { + e.printStackTrace(); + } + // Finally, load the library + System.load(temp.getAbsolutePath()); + } + + public native boolean setMessageHook(long hwnd, long threadId); + public native boolean removeMessageHook(); + } diff --git a/src/org/synthuse/SynthuseDlg.java b/src/org/synthuse/SynthuseDlg.java index c673b80..94ec29a 100644 --- a/src/org/synthuse/SynthuseDlg.java +++ b/src/org/synthuse/SynthuseDlg.java @@ -215,7 +215,7 @@ public class SynthuseDlg extends JFrame { helpBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { String about = ""; - about += "Synthuse Version " + VERSION_STR + " create by Edward Jakubowski ejakubowski7@gmail.com\n\n"; + about += "Synthuse Version " + VERSION_STR + " created by Edward Jakubowski ejakubowski7@gmail.com\n\n"; about += "Application information: \n"; about += " alwaysOnTop - " + config.isAlwaysOnTop() + "\n"; diff --git a/src/org/synthuse/XpathManager.java b/src/org/synthuse/XpathManager.java index d2cf170..b00ad18 100644 --- a/src/org/synthuse/XpathManager.java +++ b/src/org/synthuse/XpathManager.java @@ -235,7 +235,7 @@ public class XpathManager implements Runnable{ ++matches; } } - lblStatus.setText(results + " matches"); + lblStatus.setText(results + " match(es)"); if (cPos > 0 && matches == 0 && !alwaysFromTop) { //ask if user wants to search from top int result = JOptionPane.showConfirmDialog(target.getTopLevelAncestor(), "No more matches found. Do you want to search from the top of the document?", "Find", JOptionPane.YES_NO_OPTION); if (result == JOptionPane.YES_OPTION) {