From 53fc1b9887fff978dea88797ace5a5e14eba2380 Mon Sep 17 00:00:00 2001 From: Ben_Dizer Date: Fri, 16 Dec 2022 13:10:47 +0300 Subject: [PATCH 1/3] Beta 0.1.1 --- Form1.cs | 103 ++++++++++++++---- ...ework,Version=v4.5.2.AssemblyAttributes.cs | 4 + ...ework,Version=v4.7.2.AssemblyAttributes.cs | 4 + ...ework,Version=v4.8.1.AssemblyAttributes.cs | 4 + ...amework,Version=v4.8.AssemblyAttributes.cs | 4 + obj/Debug/DFPl.exe | Bin 93184 -> 93184 bytes obj/Debug/DFPl.pdb | Bin 40448 -> 40448 bytes obj/Debug/ru/DFPl.resources.dll | Bin 3072 -> 3072 bytes ...amework,Version=v4.8.AssemblyAttributes.cs | 4 + obj/Share/DFPl.exe | Bin 93184 -> 93184 bytes obj/Share/DFPl.pdb | Bin 40448 -> 40448 bytes obj/Share/ru/DFPl.resources.dll | Bin 3072 -> 3072 bytes 12 files changed, 100 insertions(+), 23 deletions(-) create mode 100644 obj/Debug/.NETFramework,Version=v4.5.2.AssemblyAttributes.cs create mode 100644 obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs create mode 100644 obj/Debug/.NETFramework,Version=v4.8.1.AssemblyAttributes.cs create mode 100644 obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs create mode 100644 obj/Share/.NETFramework,Version=v4.8.AssemblyAttributes.cs diff --git a/Form1.cs b/Form1.cs index 3ef1486..c9f8cdc 100644 --- a/Form1.cs +++ b/Form1.cs @@ -14,12 +14,14 @@ using Reloaded.Injector; using IWshRuntimeLibrary; using System.IO.Compression; +using System.Security.AccessControl; +using System.Security.Principal; namespace DFPl { public partial class Form1 : Form { - string Version = "DFPL 0.1.0"; + string Version = "DFPL 0.1.1"; public Form1(string[] Ags) { bool SL = false; @@ -119,39 +121,61 @@ private void button4_Click(object sender, EventArgs e) if (System.IO.File.Exists(GP + "\\Dwarf Fortress.exe")) { string NMLOC = ""; - switch (listBox1.SelectedItem.ToString()) + try { - case ("Dwarf Fortress v50.02 - Локализация DFRUS"): - NMLOC = "Dwarf Fortress v50.02__v1_DFRUS.zip"; - break; - case ("Dwarf Fortress v50.03 - Локализация DFRUS"): - NMLOC = "Dwarf Fortress v50.03__v1_DFRUS.zip"; - break; + switch (listBox1.SelectedItem.ToString()) + { + case ("Dwarf Fortress v50.02 - Локализация DFRUS"): + NMLOC = "Dwarf Fortress v50.02__v1_DFRUS.zip"; + break; + case ("Dwarf Fortress v50.03 - Локализация DFRUS"): + NMLOC = "Dwarf Fortress v50.03__v1_DFRUS.zip"; + break; + } + } + catch + { + } if (NMLOC != "") { - try + if (System.IO.File.Exists(Environment.CurrentDirectory + @"\loc\" + NMLOC)) { - using (ZipArchive archive = ZipFile.OpenRead(Environment.CurrentDirectory + @"\loc\" + NMLOC)) - { - foreach (var archiveEntry in archive.Entries) + //if (HasWritePermission(GP)) + //{ + + try { - string fullPath = Path.Combine(GP, archiveEntry.FullName); - if (archiveEntry.Name == "") + using (ZipArchive archive = ZipFile.OpenRead(Environment.CurrentDirectory + @"\loc\" + NMLOC)) { - Directory.CreateDirectory(fullPath); - } - else - { - archiveEntry.ExtractToFile(fullPath, true); + foreach (var archiveEntry in archive.Entries) + { + string fullPath = Path.Combine(GP, archiveEntry.FullName); + if (archiveEntry.Name == "") + { + Directory.CreateDirectory(fullPath); + } + else + { + archiveEntry.ExtractToFile(fullPath, true); + } + } } + MessageBox.Show("Локализация установлена!", "Успех!", MessageBoxButtons.OK, MessageBoxIcon.Information); } - } - MessageBox.Show("Локализация установлена!", "Успех!", MessageBoxButtons.OK, MessageBoxIcon.Information); + catch + { + MessageBox.Show("Не удалось установить локализацию!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + //} + //else + //{ + // MessageBox.Show("Папка игры доступна только для чтения!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information); + //} } - catch + else { - MessageBox.Show("Неудалось установить локализацию!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information); + MessageBox.Show("Архив локализации не найден!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information); } } else @@ -164,5 +188,38 @@ private void button4_Click(object sender, EventArgs e) MessageBox.Show("Файл игры не найден!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information); } } + + //private static bool HasWritePermission(string FilePath) + //{ + // bool rez = false; + // DirectoryInfo dir = new DirectoryInfo(FilePath); + // DirectoryInfo[] alldir = dir.GetDirectories(); + // WindowsIdentity wi = WindowsIdentity.GetCurrent(); + // foreach (DirectoryInfo name in alldir) + // { + // DirectorySecurity ds = name.GetAccessControl(AccessControlSections.Access); + // AuthorizationRuleCollection rules = ds.GetAccessRules(true, true, typeof(SecurityIdentifier)); + // foreach (FileSystemAccessRule rl in rules) + // { + // SecurityIdentifier sid = (SecurityIdentifier)rl.IdentityReference; + // if (((rl.FileSystemRights & FileSystemRights.WriteData) == FileSystemRights.WriteData)) + // { + // if ((sid.IsAccountSid() && wi.User == sid) || + // (!sid.IsAccountSid() && wi.Groups.Contains(sid))) + // { + // if (rl.AccessControlType == AccessControlType.Allow) + // { + // rez = true; + // } + // else + // { + // rez = false; + // } + // } + // } + // } + // } + // return rez; + //} } } diff --git a/obj/Debug/.NETFramework,Version=v4.5.2.AssemblyAttributes.cs b/obj/Debug/.NETFramework,Version=v4.5.2.AssemblyAttributes.cs new file mode 100644 index 0000000..f1a77a1 --- /dev/null +++ b/obj/Debug/.NETFramework,Version=v4.5.2.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.5.2", FrameworkDisplayName = ".NET Framework 4.5.2")] diff --git a/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs b/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs new file mode 100644 index 0000000..3871b18 --- /dev/null +++ b/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] diff --git a/obj/Debug/.NETFramework,Version=v4.8.1.AssemblyAttributes.cs b/obj/Debug/.NETFramework,Version=v4.8.1.AssemblyAttributes.cs new file mode 100644 index 0000000..0af6d86 --- /dev/null +++ b/obj/Debug/.NETFramework,Version=v4.8.1.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8.1", FrameworkDisplayName = ".NET Framework 4.8.1")] diff --git a/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs b/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs new file mode 100644 index 0000000..15efebf --- /dev/null +++ b/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] diff --git a/obj/Debug/DFPl.exe b/obj/Debug/DFPl.exe index 0e5555a1a06aa1ed7c47ad3851e7f41481b1dfcc..8f7acdeabb05d56e5037f0be66471035e0d8ad67 100644 GIT binary patch delta 2193 zcmZ9O3v82B6vzMPevf`%zjj-PT}LJ|tUzbS5P>oQ5@Jd0U!V_V85{l*qKYR zl1ei3#1ezPkxyAS1RhlRRFObK0P-)ZvK*%@o^=Y2He<5@|0pYD&9GEqY$nUpQUeW6 zY&M56F7=PHL$+LKk4gK0kS{rhtz<&^PJDjINnWKw7k0=^R&f}+T4_J4xf~2HQlu;| zxZX8LGNr74l{X9yK)-RIb1eXk0ZM11ItF!!qUT&#y7jki0?l7EK0V zrfTGJr#yev2-{TlD*3E)W3+LEZ7EwDHN(?+L(J4BS?pdoXU~W_N7>rQ)+wVPxk62{ zMH8Qvnd%);KWxYiZh8KR5jO9NnK~hlxz{f|t?ZRN|LO4&JN5U!DtUXhr>APiTK|2s z|BT_!P!PLgxHL7zl6U#H&`kNezk#ad-QI1qULNzVqjq_Ipi!*1bKV_Q_4IKm|kj*M682;LK6-t|AUYQchl4G(KdRIUSieNPJyTeNEBg=_?{ zLo4ZA;65(`IFnWDL=UUqvudMwg_U`+>LQ&x?MRw0veK+TWYrta>mrB^T0P-d zfnHWSv}$vj?YRizt*mOd^H_b5Rd;eO2R~)i8qVcF@Et$ABQ|p3Y1L6U;9dzC%Mawf zD{@sHM&7%@)!wm8BEL_JpF;boCs={~bljUxm0}THK||Q*pF^d1+g-x9Pi#1G@MFZU{-VUslb>X?`HhQ0Ci#%)+Tiq}^M4!8voe%BDXuB8+Z0C5B+s*MOI&R{4 zkErJQ{Ww6+(S96r!Z;{yB__h&i&RPPSQ+XSz4RKrFP^2hxP#-pL;YeI9if1ND8nfH#Vo=YqYP0@V8(F?bE@X$nhEV+gL3v4Yv*RoIxI}HwHj-g_u(OQeF>}DEWqxTiYiB3(tZ_&arkYT! zS<57|S@RInZ;r)GF^)$Rv&48*iit?@5heIqPKZf7Ci9rWV=9m7JjzgmP888PYNj)E z`yV7kju<0Mell3F`Az5Y?d<2v{BrjMKkRpiKIU3`fZ3sW$T`h%Jn)rvzSUX9r1t}J znNXD(PtkJ}m)iq!S7DQ}fR@X#qoXBpF+sfv!S8^7|KegSKTpr`5G1b&$ zTPvmnj5Zep5fxNaf{)@FT1BJ;d>}?ejTBRr*l28w7++DNM$f%$w6e+l^8f!i_uQSG z$!z<8)jnW7*kuM1{oA`YJZF8}K$s=3Uv!bYiwfu(*-fnl1Es+7i2wm`0egBausw%l zoJ!I)Vv#|+<)hXTuR_&Z!UD~{{M(AB9Ic~sfvizh$hzP?E(6hv*|#h<(CkF#v5dx5 z-3CH-Qw7VWO63EwOGAOCDkUA*A*X3R%jhM_yX>l2oSq(5QC28xvX77(tzkD2u^>WD zDCQPK6YTj+9(5_JDbIf%3s+;+Bm21#+5yKGn)b zzm?+hq(6rFtG{~ea=xC(;yTn60lEBpMXDDk_|9Qzx+7R`q^bmAzgNv%g9Xf^nor>h z)>om9nLs`BZY*PN)739DyKtQd;qgF{xluGSH_<9FhM&XL%+a_<3Xi)RdGD}x z9oTDc6#_ZqRjtFsR(q>l77C}f3L9G@I>cdaad2m`a)<;V@9;&qK)b2i~-L6IuEg5&eoy+dtjBDgtHlEJ7HC)Ta-qTKh(HtDm zuDkFvcMifi>NFU+Z(3^tZ-{?gaHV%N{XpJvk(fq%=!M`c?4kF)=@b{WG@FLelNG1Q zIN;XNbTs%$`W;I|HEKmt+=Sn8KI^N*(qJR45JAyItHlAoRlb;ComxvrXr9Q$I)gj!f2wsG>s=zj{d>?$J82Kzb@K6wxR#j6_nxCTy6|Ak>Z9L9>G2 z@touCPkNdq;`E6(TCCv2#z9&`<3$M`!EaU>KL9_AGK|7s%rMS2$`C;@Glr?ma?RPA zl{#O58JySYWSM3Xm!~*diB{(AxYtPN(VbY2JhKxL?-`wFV?LSTdMq*zX?+N3yudn% zKIT5|8PfR>CtsRFIvK{3oDb_c!`RJ78l2e(Syvlja;8litY($vaC`CgQ_=AX_%CqGIh53mO1h7qf!o1TSWOi%zJ11Gk z{I7NLt*$CIdEYay7OFGtDSD3LHTIzVuCUEmK+EOIv5}HeF;V^P@x}i4DHZ4P`}B-V z_KuxYTPi;0cl{X^(adxIpOuRf{8BwL8{j{L|7WG?sb~EXq-p8m=mx{8Jja}2%D&j# z^m&t8DfhDIpSLdgd+xk_6+Nq_Z2Nj~x^GIDoY4Ua zT9&=5rmL^QfA8?GC-{~6(%5aznNMRzUs+dG*OfZ<&4fiYHT&Z)zZQ)iJFxlLO1gP- O(Jj=~n_WdePWlI^wYu^E diff --git a/obj/Debug/DFPl.pdb b/obj/Debug/DFPl.pdb index 635a16c71751a811dee72c0d5d9cf6005270cb57..47d2b7738d1958bb3e9166ff2b402b65b0903d11 100644 GIT binary patch delta 2967 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 diff --git a/obj/Debug/ru/DFPl.resources.dll b/obj/Debug/ru/DFPl.resources.dll index 0ba4ca5288dd725a66bd8f9e8276500d4bebd8d7..e48383872a434082162af7c57c44225c3215245e 100644 GIT binary patch delta 36 scmZpWXporD!MxpZ&c^OqHi1A}mh?1_w_baf{z%=E*kHO@g8c;x016-u+yDRo delta 36 scmZpWXporD!5lGh_Qvj7HUW>1j6XGJFY@gzopVzB>?_C366`Nn02oaVxc~qF diff --git a/obj/Share/.NETFramework,Version=v4.8.AssemblyAttributes.cs b/obj/Share/.NETFramework,Version=v4.8.AssemblyAttributes.cs new file mode 100644 index 0000000..15efebf --- /dev/null +++ b/obj/Share/.NETFramework,Version=v4.8.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] diff --git a/obj/Share/DFPl.exe b/obj/Share/DFPl.exe index c71470f0bada16469c89d01ea27715af6a241dbf..8ca557e56ed2a3c09d4569f81887fbb3eceb64d2 100644 GIT binary patch delta 2193 zcmZ9O3v82B6vzMPevf`%zjj+UyACHZtUzaBhyxr^gi+_15R?E;Q4~@HC&tc7GIW@3 z4haY(%sT}fhKG+x5D;rb;)?~87)W$#95W6z^O56rnF{sUkJM&3a zQ+al#m~YTG@(JsPz=JBEE){4DK>lS_PsVABXPt(l&Db=+Uu1=>DV8dXO=X#0V4%^7 zP3JJirT!v2WXn1B@Qe=#`BF33N+p!<#IFrGsjF4!!VbBq8V+OEDD7ue%fa9xrONU` z-q-*_{@6@bqY)1x3X@ynOwMhh;1r+xqRBWG1@f5wv?@n`oZbEA!d5LEORfKv1dq~qik*D>XcEOTB0V| zqM1+2Om_{bA2j3|cXDC(5Sw?!On1wZ?)7s%Q}$Axzk5`~PXGO{O5L98>8aWg)_>pZ zKV$GS6vvhgmZm3I@=pI|nkvuw8>vp-<=sXP$dlf6v`JnNXc7-ta!DY}*51H9!?yBQ zjxLyoHDy2nZ)vo4K^>nrIm9tyz75x)r#2x8y;4ct6V$w`gRKso3(1=g=_?{ zT`TEa=sqg~_&ldpi~X$5=F~dzA}jL})kQjY*pUohWMgx(#g4F=pHr_ouZSSlX!V$5 z1-e*m*J`cPV%H*w*K=x;`3!FT-Nj@ZbDr&W7NpL-Q#tT2%O zmdICm7zJ+yS9mA0iNYQ+Y62ak{lO|6q<6eYR4wMxl{A3o{WEAR-f-vh?Xx(rR89*= zf(_Ilf})Y`5pM)m$z-@TvzFeb>7oGZ#TGY=cG2T*WamBm5!xmO0^2xV@9yCEBONz$ zyhqe={Xra}XXqeKI$<0Zw-OU!Zy#0Dn^u;(L>IkGZ;Pktb?)GJZ&I&VNGGTjQSl!0 zd0!Z<;(O1Q<;9UqFCC^$&S~m`I-Xrr75tw2^teCkZnmhV552HxV8=!mt)z=YIXdy1 zRl&#ni>N>m{$iG5xKV*9Ml<8Mlv$~Hg=RwgvoM+cdD^*IGl@AFwpL&j^Ikk;)all3 z*nlFl4HEAdZD?jbnd1g5Fpui^D6%-faT14_uW(Jj_WRlCH~Y0SfG61>(0vB5mzOk1 zbu%c5pkRCxTfo)b&XB#;CgVCn5>pA|_*ux|f8ADAgWA+(~nO_<$+S$qc!8oD`Q%xw- zT+Af1Me_*LZ;rrJF_K3V)5IuLi!n&>5heIqPKa?l#`BoKqmsuY9u=rZ2TEx*wb18u z`yV7ko)|7nell3F`Az5Y?d<2v{0g_5ANJct4|A2>$86U;;(W$&Jn)rvzSUX9l=mZZ zp-`1sPtkJ}7ukJsS4p!mn-<9t!=mMJF1K^tWnLyX z#UoTDe~Oi4_r#m1;K+(u=kIIWP;T$st?FN7|_ALEIPJ)H-n-Dcb$2^=%eIwb)CP@Il8QJ-HThw61414 J-qmzw%s&}$#@_${ delta 2129 zcmZ9N3v3is6o&tE=dm-L*|uBg16QHADQvq?Fa<=x!qQ@?NTe1h0%~=A6cJl0rka{; zYr#MOrMX2AUmzk9e1MzKDk>20iSexzQK%SJ1k+%NzCpL5UM*_q6? z^;&Jc*2XnvS9#Ufo$H^rKB^~7me|NpOMY(&uw)cK09?SHPy=ksA{nRR z)GRU2pgr;tYk@aI)tkctO}_lwiYFbdqtk$lAy&w`=p8Nt(M#Aj&o|KIM5nWi##P-0 zLU!W}mW>t42V$3n0*#eQIT^`QTyArR=d2zS^DQu&SIhU@NjaMa#eAV=^Cnr4G54aKD!zedKVFn? zHy`=eHQuPsvqh_?diw`$P6u*(#t`v~Dfee=B$8EL69r|Dcddw9GVbTg@&1KWBOCk{ zipx`e9`jd!#jquOJ(2mfm{ka5^Y0a@nqSR#4hvK5!8#*ZDF`onRm_!`%{-?01g>Cx z6>6E)sAJxZ#mt9w^>fWNxK@PlSRldd5)I5vv|QxzbGU*z6!!>qByexRakq>24rteo z{q|NNkTp`(+D&Y=x5~w#aB{1#u_dBI9OV`VcNQsk6t9b1{$2KJ*N)458y=#?s@91; zf$hRWrFI>BkPRPmwUf?pcbD+7CGGAO&#-$g?be7CyPmXbu=A7r1f5FTHanl4Q=*QL z&P&dVB8bV_J>XdWA$D`MyVq&6s}MwU+HJ72*{w>u2Cik|$+TO^wM^_k{&m4+-m%pEImboyc-lwL1}9@5z3WY&xTv8iG=RMsaTlun36^cJ-vBHm~24dkL-oc3&aM_zuimtLR^&Ph59b>p_vK+hS#9zN0_HO-&|e9IuUE9sJIa!DQLl4>fX4%QLf8sXMS zRz$ZJ(-HI;6*{k=6zZ)CuHME}gQ~gup^?zlgx-~)W7uLPbag3LPa7S&x|a2?#%?A| zBn`E#klAO{Gru(2bh3?k+Bl>MQ*9{JtY^Y((>%m<%@LR?M)HcFTohrt7>yZxi)M%z zud%$w@w$Ll8Lx@FN>PU{gsGL1)K7swi1?{ISKeQcTm7B@9u}W4@3i}votlT7Q>P&fxo}+lR-6y{-XfnVFgDD?Md)94PBPP)0kmhJT#1 z>pL}FeHH$DhkqTxuh5sqZgbX5${TuRZDno!`tMKQysLcX#=r8WR*vtAZhoqQZrWUU N3$5wStfU`D{{vJnx}X36 diff --git a/obj/Share/DFPl.pdb b/obj/Share/DFPl.pdb index 33108303314136f13688229dffbb7cbed4241c4b..331e8ab3517f832eb18e709c04164dc3882853ab 100644 GIT binary patch delta 2967 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 diff --git a/obj/Share/ru/DFPl.resources.dll b/obj/Share/ru/DFPl.resources.dll index ec63385d22b023b7752d8fcb9bde18c507b94130..5600854ef8d74374dc694b6a8e0415561946feb9 100644 GIT binary patch delta 36 scmZpWXporD!Mxvb&c^OqHi7aZYddPEnLADjG5+{#mP!0(3HBE(035Opp#T5? delta 36 scmZpWXporD!JII0_Qvj7Hi0Q^@1(bJaJnxQ_Sn~>8MkP&1p5mX00s9B2><{9 From 8b917b5900cbc32b9ef20cb0d22e2d4b21fada91 Mon Sep 17 00:00:00 2001 From: Ben_Dizer Date: Sat, 17 Dec 2022 14:58:15 +0300 Subject: [PATCH 2/3] Beta 0.1.2 --- App.config | 3 + Form1.Designer.cs | 31 +++++- Form1.cs | 47 +++++++- Form1.resx | 104 +++++++++++++++--- Properties/Settings.Designer.cs | 12 ++ Properties/Settings.settings | 3 + obj/Debug/DFPl.Form1.resources | Bin 13023 -> 15591 bytes obj/Debug/DFPl.csproj.GenerateResource.cache | Bin 207 -> 207 bytes obj/Debug/DFPl.exe | Bin 93184 -> 97792 bytes obj/Debug/DFPl.exe.config | 3 + obj/Debug/DFPl.pdb | Bin 40448 -> 40448 bytes .../Properties.Resources.Designer.cs.dll | Bin 4096 -> 4608 bytes obj/Debug/ru/DFPl.resources.dll | Bin 3072 -> 3072 bytes obj/Share/DFPl.Form1.resources | Bin 13023 -> 15591 bytes obj/Share/DFPl.csproj.GenerateResource.cache | Bin 207 -> 207 bytes obj/Share/DFPl.exe | Bin 93184 -> 97792 bytes obj/Share/DFPl.exe.config | 3 + obj/Share/DFPl.pdb | Bin 40448 -> 40448 bytes .../Properties.Resources.Designer.cs.dll | Bin 4096 -> 4608 bytes obj/Share/ru/DFPl.resources.dll | Bin 3072 -> 3072 bytes 20 files changed, 184 insertions(+), 22 deletions(-) diff --git a/App.config b/App.config index 2474c97..66647a9 100644 --- a/App.config +++ b/App.config @@ -16,6 +16,9 @@ + + + diff --git a/Form1.Designer.cs b/Form1.Designer.cs index 4f5303b..6f1538a 100644 --- a/Form1.Designer.cs +++ b/Form1.Designer.cs @@ -38,6 +38,9 @@ private void InitializeComponent() this.button2 = new System.Windows.Forms.Button(); this.button4 = new System.Windows.Forms.Button(); this.listBox1 = new System.Windows.Forms.ListBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.label1 = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.SuspendLayout(); // @@ -92,14 +95,36 @@ private void InitializeComponent() this.listBox1.FormattingEnabled = true; this.listBox1.Items.AddRange(new object[] { resources.GetString("listBox1.Items"), - resources.GetString("listBox1.Items1")}); + resources.GetString("listBox1.Items1"), + resources.GetString("listBox1.Items2")}); resources.ApplyResources(this.listBox1, "listBox1"); this.listBox1.Name = "listBox1"; // + // groupBox1 + // + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // groupBox2 + // + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.ForeColor = System.Drawing.Color.Indigo; + this.label1.Name = "label1"; + // // Form1 // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; resources.ApplyResources(this, "$this"); + this.Controls.Add(this.label1); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); this.Controls.Add(this.listBox1); this.Controls.Add(this.button4); this.Controls.Add(this.button2); @@ -110,6 +135,7 @@ private void InitializeComponent() this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; this.Name = "Form1"; this.ShowIcon = false; + this.Load += new System.EventHandler(this.Form1_Load); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -127,6 +153,9 @@ private void InitializeComponent() private System.Windows.Forms.Button button2; private System.Windows.Forms.Button button4; private System.Windows.Forms.ListBox listBox1; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Label label1; } } diff --git a/Form1.cs b/Form1.cs index c9f8cdc..3f3a0c0 100644 --- a/Form1.cs +++ b/Form1.cs @@ -21,7 +21,7 @@ namespace DFPl { public partial class Form1 : Form { - string Version = "DFPL 0.1.1"; + string Version = "DFPL 0.1.2"; public Form1(string[] Ags) { bool SL = false; @@ -40,6 +40,14 @@ public Form1(string[] Ags) InitializeComponent(); } textBox2.Text = DFPl.Properties.Settings.Default["Gamepath"].ToString(); + if (DFPl.Properties.Settings.Default["DF_VER"].ToString() != "") + { + label1.Text = "@Версия игры: " + DFPl.Properties.Settings.Default["DF_VER"].ToString(); + } + else + { + label1.Text = "@Версия игры неизвестна"; + } this.Text = Version; } @@ -48,6 +56,26 @@ private void button3_Click(object sender, EventArgs e) { folderBrowserDialog1.ShowDialog(); textBox2.Text = folderBrowserDialog1.SelectedPath; + string GP = DFPl.Properties.Settings.Default["Gamepath"].ToString(); + if (System.IO.File.Exists(GP + "\\Dwarf Fortress.exe")) + { + var secondLine = System.IO.File.ReadLines(GP + @"\data\vanilla\vanilla_creatures_graphics\info.txt"); + foreach (string lines in secondLine) + { + string[] plines = lines.Split(':'); + if (plines[0] == "[DISPLAYED_VERSION") + { + label1.Text = "@Версия игры: " + plines[1].Split(']')[0]; + DFPl.Properties.Settings.Default["DF_VER"] = plines[1].Split(']')[0]; + } + } + } + else + { + MessageBox.Show("Файл игры не найден!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information); + DFPl.Properties.Settings.Default["DF_VER"] = ""; + label1.Text = "@Версия игры неизвестна"; + } } private void button1_Click(object sender, EventArgs e) @@ -73,6 +101,7 @@ private void DFSTART() startInfo.WorkingDirectory = GP; Process DF = Process.Start(startInfo); int ProcID = DF.Id; + Thread.Sleep(1000); try { Injector injector = new Injector(DF); @@ -125,11 +154,14 @@ private void button4_Click(object sender, EventArgs e) { switch (listBox1.SelectedItem.ToString()) { - case ("Dwarf Fortress v50.02 - Локализация DFRUS"): - NMLOC = "Dwarf Fortress v50.02__v1_DFRUS.zip"; + case ("Dwarf Fortress v50.02 - Локализация DFRUS v0.1"): + NMLOC = "Dwarf Fortress v50.02__v0.1_DFRUS.zip"; break; - case ("Dwarf Fortress v50.03 - Локализация DFRUS"): - NMLOC = "Dwarf Fortress v50.03__v1_DFRUS.zip"; + case ("Dwarf Fortress v50.03 - Локализация DFRUS v0.1"): + NMLOC = "Dwarf Fortress v50.03__v0.1_DFRUS.zip"; + break; + case ("Dwarf Fortress v50.03 - Локализация DFRUS v0.2"): + NMLOC = "Dwarf Fortress v50.03__v0.2_DFRUS.zip"; break; } } @@ -189,6 +221,11 @@ private void button4_Click(object sender, EventArgs e) } } + private void Form1_Load(object sender, EventArgs e) + { + + } + //private static bool HasWritePermission(string FilePath) //{ // bool rez = false; diff --git a/Form1.resx b/Form1.resx index 94db228..9e96f8b 100644 --- a/Form1.resx +++ b/Form1.resx @@ -119,7 +119,7 @@ - 270, 145 + 266, 223 75, 23 @@ -141,7 +141,7 @@ $this - 6 + 9 @@ -169,7 +169,7 @@ $this - 4 + 7 12, 57 @@ -190,7 +190,7 @@ $this - 5 + 8 17, 17 @@ -220,10 +220,10 @@ $this - 3 + 6 - 170, 145 + 166, 223 94, 23 @@ -244,13 +244,13 @@ $this - 2 + 5 - 12, 145 + 85, 166 - 152, 23 + 175, 23 10 @@ -268,16 +268,19 @@ $this - 1 + 4 - Dwarf Fortress v50.02 - Локализация DFRUS + Dwarf Fortress v50.03 - Локализация DFRUS v0.2 - Dwarf Fortress v50.03 - Локализация DFRUS + Dwarf Fortress v50.03 - Локализация DFRUS v0.1 + + + Dwarf Fortress v50.02 - Локализация DFRUS v0.1 - 42, 83 + 42, 104 265, 56 @@ -295,13 +298,82 @@ $this + 3 + + + -9, 83 + + + 376, 10 + + + 12 + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + -9, 195 + + + 376, 10 + + + 13 + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 12, 228 + + + 145, 13 + + + 14 + + + @Версия игры неизвестна + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + 0 True - 357, 178 + 357, 258 @@ -380,10 +452,10 @@ - 373, 217 + 373, 297 - 373, 217 + 373, 297 DFPL 0.1.0 diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs index 644fe47..2f05281 100644 --- a/Properties/Settings.Designer.cs +++ b/Properties/Settings.Designer.cs @@ -46,5 +46,17 @@ public string DLLpath { this["DLLpath"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string DF_VER { + get { + return ((string)(this["DF_VER"])); + } + set { + this["DF_VER"] = value; + } + } } } diff --git a/Properties/Settings.settings b/Properties/Settings.settings index 19f28d5..f682150 100644 --- a/Properties/Settings.settings +++ b/Properties/Settings.settings @@ -8,5 +8,8 @@ + + + \ No newline at end of file diff --git a/obj/Debug/DFPl.Form1.resources b/obj/Debug/DFPl.Form1.resources index a7e63e4eee39c704a9ceb65437fc70242525ef05..613bac2d425061cadde508aff55f2275e3f45bb1 100644 GIT binary patch delta 2252 zcmaJ>drVVz6#m`Y7WxLEJoRQo zV_X&&na^!ZMXU(Up=NV4(`X8A#u+BbMzX~{GUFDU{K3AiA1W}WFwe)4X8+UDaA(w&j>rk%fjW%_*E@yxTcA7|Fzd6xOC=H%?{#p*e$ zzN?#~DBPBvo?n|S7aFpQ`f_u!uDNq|PQ04a_u-cjIUD|J&FwKb7BA$I7e8rnF21eU zwuC;FM0=JOtXr|<(wSA^vySBJdR&F4UrH@(ys&ahk&>}L)rXht}Jy$Sv+#2+v$l`^&kbrxJD@bseDT{M3S zkpa)Wh#ow^Byf4CX#`%Z@Gy1^-~n+m6h?!Hh43VreTFDRbOC<^JPGDMVCr@>J_zh7 z4Ek|xN5r6hCbT!;rNA(ah=hv>wx0`Ppq3HUsQwhwqM@H!2I3lTdo)%`Hf}+{_~Fnwd6cIw61Kx&mWhf==3>cg8QaP>VtPJ`vEj7=q7^I$ zO$s0@V^t82>6QYw7ug!N95Gf4KbtcB9+^hYOBo z%pg9h8!htD!p&TsfVq_5V@L2K1_~R)0uuiy`mr4XhuAkHDPiS|YUMh*=yw z%^!{?k6f?x8y*uG8?V<>mSVipzknt&b;^?T*cCdeFbxtP>*TK>L(>TBTI;b46sRcecpb`0EC0QCj&M26~`0@@tLMi!9hgCY6y_n`o-a z${S3ShwP$>UPrbfhTcc^N({BDEL;^?)H=GL2{p&X;>F0vS**Z+DfTxNE4P%DuqtfD zl~{^XTh00AF*M7-SE8oKOa*Ey?>5tJwUL(#bPCyNfo`dd+GYW3F?85J(ioi&0htD& zfCKCAS!EekvrS{v#>NeUa``F9wi~KW?bGnz>&i%{oRA&N12Z7+X%^sYX6cpfijU=W8%BwNujauQ8rx6 z(iFDDMu{3*e4P#Nj2oL&jtv<4F!;OM6BvslpIk?~HCq050{yHpikmI#1R>CG8iC(1 z9-xB{n=rub(uDF~OrSYh8-H^GxwSF;t9II}wMmr|8KVxzVPzq{XFNicLE978)ANa; zBydvigOILqyq%*vjw3;vK-)R*%D6C&n@XkD8g4Q@#qSiVj<4a;NNGD9t|%%i-Lx^Y zw9>`N;wy?v%DK%{ZH$@Bw~pI?scSf z&6aT7BsyW+!=-wi31*HB+MCNmm2_0fI;CT*(?{GaLHKQJY2&&{- z{Bn+2zPEiX9osvqeQh241z(%bi)63hYxlJvY4x24Tivk(`8lkmJvl8{*gPpYCE(tL a`zJ|hG7)!)Bhv55Qm$C+<~`_KDES+DGacUm delta 1121 zcmZuvd2Ew)7=C}hwxh?_dt<%7udUr-rCYZOmWYla#IO_{LKp-HE-MBIhjR-%&^bjp zQUmkdADAiA$Ut$7K-nK?T)1N55e-WunZXPag1SFQCPtDa8lR3}jG@ib?|qK6d(6KCA2a)yoTXmE5A!dXoDB_ObCz?r)}we4}j+--*2@ zZCU@vl?x}k9;-Vwp1Av7U+V0Yu_s5COxO2)KT|)me`v{upWj((%I?X`Z_Z_m+F<6E zFW%T75{-99s~VGg53N41xPSG)<%%^^X;ah6KTS_nD}NmgBx-dZNokM7_Wa>KIPW0bAz~dBK+h9YzRv^&{VEBAN!b>)-*)1W`9K zSAhn2HSm6iPS8KW^Dp$=L%m3%2i_#C82C2PLv#kk9V~hi=GVX%2oECk78-v5D&Tzw zz7gIq>f1QdgL()=*$eF~Zd*$fat{s#1M>}f%L95{yj(|G2b5U(P1 z2ngZwbGH2FhJ88_;;>~duQMsES)zuSxo~HdjTWO6r5v(&ZR_YcYNZzJZ>5e>zF;Xg zub>xcJB026t&+J?p0<=rvxj#nDyJ1imU^J5=2g^5yO0YNoVYyV;SZFs9Psc3B_@Xo z%=@m@D2EGzm$#S|8TE3~8db}@`0mZrPHlMaq#cx`1ie68s0-6B6*6vq+v-p^`yP^8 zg-i$fw)uF}8kLkc>C4RmKcHYkcn_rIkIc*Ee2|us5MP+Y*dm#pcd=%_r5X_C^ z?~nN^$Tw_J_1ob8R;B)P(n}$Z*rO4P`jE_nIS!Zsu673GB9-SkReh3PQTcgiOn$2J zZf8&~)xb*lGp9rTrm@}S=We^ha7QE3IIMU$=QPTLVHk0lh|Kzh=*S5Vc%9@1T6V9y7P|rmC31 zhCzLWk$f$2+HevJXIZ|odPEwO2UHy4J+%uZrcN&?=DH`e`(;Y}J4pX1vYbhMn14Ur Gp!)~;^c8;q diff --git a/obj/Debug/DFPl.csproj.GenerateResource.cache b/obj/Debug/DFPl.csproj.GenerateResource.cache index 3ed3092153171aabded9bc8433566bb7408058ce..d04495700845e3cb864296b007b394693a73b49d 100644 GIT binary patch delta 22 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 L9CX!-{~7*&b{ulV delta 8046 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 diff --git a/obj/Debug/DFPl.exe.config b/obj/Debug/DFPl.exe.config index 1bc8c44..b6013ba 100644 --- a/obj/Debug/DFPl.exe.config +++ b/obj/Debug/DFPl.exe.config @@ -16,6 +16,9 @@ + + + diff --git a/obj/Debug/DFPl.pdb b/obj/Debug/DFPl.pdb index 47d2b7738d1958bb3e9166ff2b402b65b0903d11..3fea948857aa88479732cd03346f7783e20e95c3 100644 GIT binary patch delta 7409 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 BTFd|d diff --git a/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll b/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll index 8dde005c5cd593da9555df4f4f8dc89803b67190..146ab0dec19a66ed473f593bb5a794a98d9b03fa 100644 GIT binary patch delta 1154 zcmZWoSxA&o6#mY=I`cc`G%kt8L^BqYC8V@rNED5>Z(3HgSg5p;rA9{7*n*`{X@8{9 zLMze&MH4{_6(RN#Jp@4yLG@7dpwvS|L{#6s{z1`!^WF1(=iEE@-2Y5-qQ>AZ~haa$=FHmkc1YP$8QI8c2t#U+13F**WWgZMrTU2w+T}8qG2Wl?{X4 z=Xy%3K3&(^v{UjV^Q^N*kt34EWF_6SNOq7BeNP2cwoH0ldKv<-=D*neBn8Y1ezG^rRp$yQm`;`GaPvb`SrE@85E!{TUh zUNWh1%S*mvQlrOX0bJ+j`QWi32$OvsV77~7{IaYgXQ;l(nKB>jj{J`)$kM`BFrDWT z1IQEL`7+kxTwIeVN_gfxtYH7bHhsKspSn#vhP%Y~@{st`;%oJU@hSb( zD$i`zU@qKw{#aabJTrMnkeJj={U0mioS3oxW7`n1;lJ9zH2tmZLN8y>vy%CBH9NM{ zPR07##;RCZRb^>88oW@ImM8lC$F;jJb?xx97>BhAl_*6y_pUAqpZNSh7PPi)br#p` we4O}_dRsEKcz=I$c#DZ69noynRN%fy8<)rk)<{YO7(~6RB#|EcBprqR-x&3?D*ylh delta 991 zcmY*YT}V_x7(Fw0y?b4^byr0cBzCoja)Z`~5G#a2F@sRD6(ZB{2N7Z`e+YeW)kspZ zcDoTp5*d;f5z>lKL4rsT7X3Wviw{0XLQT z91>|*4*-klfUqY#rHNYEDcpr}cNXA6aedbgTRIMu-7^eIH0mMaB4jIvBaK6K&0=J52o9A8oKkVXM6=jwm>AOd z2N^~tYFOgJJA9QU*65gc236B%w9{FZ<>YhnhV)=b&IlLoVuR=t8&OV!=#wr~35CT( z6DOgTg*3*EN&44VW8$%B*E^bQMCj(cs5Bal06AUZMTDx1EnDy*B8P|!N@vrc@Ne);yC2o~M#aOd427D&46AOIpSA9L9_~Wj6Fc zY{hhJ@^E}a6Zu3J_7J@&(N3Ah4q`5PH6J7v;4pE&i4h!O`3T005UQ0$d?YG~my8pb zKv*^s8)XYOQoUdT+4f(v#qM_I>|K_#Y^N75h#$pk;x~#Y6KS#icO zK)x+PJW=&c|KkELl8WtK^4zz2y_n%1=s0xzd~46Sw(>;Ox@p*%?q+qFpMR)7I~Ja* xj^+8MKbx(m6EXL!$oiD}!PL6%iu>b%T)7&wBc6Tf{^U>l`(VQ7{VC!h=RYm$r6m9W diff --git a/obj/Debug/ru/DFPl.resources.dll b/obj/Debug/ru/DFPl.resources.dll index e48383872a434082162af7c57c44225c3215245e..5ede9c9cd841429d290cce900818ae98d9d34be1 100644 GIT binary patch delta 36 ucmV+<0Nek77=Rd%hy$*vow1931`w5cIq^ozIzX(Dq=}WlAi%R22j~PP#t<(6 delta 36 scmZpWXporD!MxpZ&c^OqHi1A}mh?1_w_baf{z%=E*kHO@g8c;x016-u+yDRo diff --git a/obj/Share/DFPl.Form1.resources b/obj/Share/DFPl.Form1.resources index a7e63e4eee39c704a9ceb65437fc70242525ef05..613bac2d425061cadde508aff55f2275e3f45bb1 100644 GIT binary patch delta 2252 zcmaJ>drVVz6#m`Y7WxLEJoRQo zV_X&&na^!ZMXU(Up=NV4(`X8A#u+BbMzX~{GUFDU{K3AiA1W}WFwe)4X8+UDaA(w&j>rk%fjW%_*E@yxTcA7|Fzd6xOC=H%?{#p*e$ zzN?#~DBPBvo?n|S7aFpQ`f_u!uDNq|PQ04a_u-cjIUD|J&FwKb7BA$I7e8rnF21eU zwuC;FM0=JOtXr|<(wSA^vySBJdR&F4UrH@(ys&ahk&>}L)rXht}Jy$Sv+#2+v$l`^&kbrxJD@bseDT{M3S zkpa)Wh#ow^Byf4CX#`%Z@Gy1^-~n+m6h?!Hh43VreTFDRbOC<^JPGDMVCr@>J_zh7 z4Ek|xN5r6hCbT!;rNA(ah=hv>wx0`Ppq3HUsQwhwqM@H!2I3lTdo)%`Hf}+{_~Fnwd6cIw61Kx&mWhf==3>cg8QaP>VtPJ`vEj7=q7^I$ zO$s0@V^t82>6QYw7ug!N95Gf4KbtcB9+^hYOBo z%pg9h8!htD!p&TsfVq_5V@L2K1_~R)0uuiy`mr4XhuAkHDPiS|YUMh*=yw z%^!{?k6f?x8y*uG8?V<>mSVipzknt&b;^?T*cCdeFbxtP>*TK>L(>TBTI;b46sRcecpb`0EC0QCj&M26~`0@@tLMi!9hgCY6y_n`o-a z${S3ShwP$>UPrbfhTcc^N({BDEL;^?)H=GL2{p&X;>F0vS**Z+DfTxNE4P%DuqtfD zl~{^XTh00AF*M7-SE8oKOa*Ey?>5tJwUL(#bPCyNfo`dd+GYW3F?85J(ioi&0htD& zfCKCAS!EekvrS{v#>NeUa``F9wi~KW?bGnz>&i%{oRA&N12Z7+X%^sYX6cpfijU=W8%BwNujauQ8rx6 z(iFDDMu{3*e4P#Nj2oL&jtv<4F!;OM6BvslpIk?~HCq050{yHpikmI#1R>CG8iC(1 z9-xB{n=rub(uDF~OrSYh8-H^GxwSF;t9II}wMmr|8KVxzVPzq{XFNicLE978)ANa; zBydvigOILqyq%*vjw3;vK-)R*%D6C&n@XkD8g4Q@#qSiVj<4a;NNGD9t|%%i-Lx^Y zw9>`N;wy?v%DK%{ZH$@Bw~pI?scSf z&6aT7BsyW+!=-wi31*HB+MCNmm2_0fI;CT*(?{GaLHKQJY2&&{- z{Bn+2zPEiX9osvqeQh241z(%bi)63hYxlJvY4x24Tivk(`8lkmJvl8{*gPpYCE(tL a`zJ|hG7)!)Bhv55Qm$C+<~`_KDES+DGacUm delta 1121 zcmZuvd2Ew)7=C}hwxh?_dt<%7udUr-rCYZOmWYla#IO_{LKp-HE-MBIhjR-%&^bjp zQUmkdADAiA$Ut$7K-nK?T)1N55e-WunZXPag1SFQCPtDa8lR3}jG@ib?|qK6d(6KCA2a)yoTXmE5A!dXoDB_ObCz?r)}we4}j+--*2@ zZCU@vl?x}k9;-Vwp1Av7U+V0Yu_s5COxO2)KT|)me`v{upWj((%I?X`Z_Z_m+F<6E zFW%T75{-99s~VGg53N41xPSG)<%%^^X;ah6KTS_nD}NmgBx-dZNokM7_Wa>KIPW0bAz~dBK+h9YzRv^&{VEBAN!b>)-*)1W`9K zSAhn2HSm6iPS8KW^Dp$=L%m3%2i_#C82C2PLv#kk9V~hi=GVX%2oECk78-v5D&Tzw zz7gIq>f1QdgL()=*$eF~Zd*$fat{s#1M>}f%L95{yj(|G2b5U(P1 z2ngZwbGH2FhJ88_;;>~duQMsES)zuSxo~HdjTWO6r5v(&ZR_YcYNZzJZ>5e>zF;Xg zub>xcJB026t&+J?p0<=rvxj#nDyJ1imU^J5=2g^5yO0YNoVYyV;SZFs9Psc3B_@Xo z%=@m@D2EGzm$#S|8TE3~8db}@`0mZrPHlMaq#cx`1ie68s0-6B6*6vq+v-p^`yP^8 zg-i$fw)uF}8kLkc>C4RmKcHYkcn_rIkIc*Ee2|us5MP+Y*dm#pcd=%_r5X_C^ z?~nN^$Tw_J_1ob8R;B)P(n}$Z*rO4P`jE_nIS!Zsu673GB9-SkReh3PQTcgiOn$2J zZf8&~)xb*lGp9rTrm@}S=We^ha7QE3IIMU$=QPTLVHk0lh|Kzh=*S5Vc%9@1T6V9y7P|rmC31 zhCzLWk$f$2+HevJXIZ|odPEwO2UHy4J+%uZrcN&?=DH`e`(;Y}J4pX1vYbhMn14Ur Gp!)~;^c8;q diff --git a/obj/Share/DFPl.csproj.GenerateResource.cache b/obj/Share/DFPl.csproj.GenerateResource.cache index 3ed3092153171aabded9bc8433566bb7408058ce..d04495700845e3cb864296b007b394693a73b49d 100644 GIT binary patch delta 22 ecmX@lc%E^BI;Ttcy~|b)ZgDV9ER>$;-2wn% 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 Ll&eAf&*1+9NltYk delta 8046 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 diff --git a/obj/Share/DFPl.exe.config b/obj/Share/DFPl.exe.config index 1bc8c44..b6013ba 100644 --- a/obj/Share/DFPl.exe.config +++ b/obj/Share/DFPl.exe.config @@ -16,6 +16,9 @@ + + + diff --git a/obj/Share/DFPl.pdb b/obj/Share/DFPl.pdb index 331e8ab3517f832eb18e709c04164dc3882853ab..294dd10bfb5632a24b01f2dac84f77dee024f459 100644 GIT binary patch delta 7409 zcmeI0dw5mFwZLcZoE-8Za7akt02%^9LPE%cAW0zPMZzNi!b=4W90*S%L_ov}W@CBF zLoyY?a<8CP@k$j4QmRy;*ZRELD15cHSi$0z&mxLKm0X4UTl>rjY47Lv`Tyd!E{99I|-Ol>5$!C9I=_EU{(GwnC|8)m-G^A;F zz&pZ|G~vwI-(6aJrt#{fS5AB$e=PmgudAEGf3ad%<+goC@*d0Hu)lb_)fhD*>CXSS z@r5hfD$id`uc>N(`>H=}*|_A?_Li3_ude&aTOX~Tlp%HpVn;;%I72@zzu4`sUq1YD z%9g$RF0Wg?vgknc`yYgzSbnPFTvoR%BC;e_! zx5lh^Z#=s6812sz-ECRDyq!@L#OO7y0wa9}s|1wQG5ShY$xx}!R$i5@`uSvx58J_^ z#-#O0#AbSoQtm9wnYCnES^2cd!^f+9eIY;1Z97gEjg3f43Jbb)X!TU83%*N3zKdIZ z^?ZE)sN3~b6D%8+Y z*V~t8%=2L^<^}q6cAU32DLNQ6Fxx89LkAA%wBmW4O7h8cBktUj zREuZLT)3dNa^8Yj!J0DhIf1O9Y@YG+<0qYJ>sN=zVsz5_TRm7Wm;B*rVM&x(&RW}f&sv$`UAfzmzi;gO`?@~YhGVBk7v?3{<+h%jH=)5xDNkQ{ z9rMsL?_G4wRh5-bm{>f1q7+Hbc2RhaUWk3jCV`GgIUQ~tg^F=O`xDro#r|W;A2W4^ zMosMX$%4rAC5y@`E5`)xFeB!{{tU7KpV!*>$cTmM+w!ls!t{###N4*+ja#&E=E$;O zn?vwDg>=W>kCD8GwAs$}eSBzbWXZ&kl*vX9~KI`@W#AA(GbQ;RQkub$EC47Vf|X8yVQPk?AyW zFe2y^vI`9^@AH2KcRTj`uz!dOFPeH~l}MAhZ5_r`RgNu1>8@;?_Tuz&@>?*H&WICg z6|Q>>?b4mp9t=jIIBX1(F_0Gu*VRLlx>NWBQjFr5F_7^k=3=mE=;G0<8tqkYS*ySC zuGwhux7KH`UC=g0E;obIW^5F#dUrEI?%BoxV_5af8(5@hY2` zsH|bZ1tRh5Tem~fFN;Xv8yKhShxHEcP010xW7zSkr%0Xu;)?SOOebjVh5g|lUk%P?2pSv0Sqij;EWr%%mwc`cvk=G&{DDpEzc@l_&ZFp^oV z5iSXbji%oclO-v^w>^~LE4?p(=;R=9WUA#I*tBYB1Bz-Ag>VLBES#B!^Pw0nH2J$> z5#`HZG294C;7%xZyC4hC*$vC!+i*Di8kWP0umWC!(vD3}8^ke&gs?pvK|!p^cZBrT z@xjrsH>`wtka2S)GLM0y;aDi6)Lsohh9T7m-Qbba$)}bgT~t3c(AD`>AM%}UQk^-- zI?Dj@bY|0ZRpXHwH!a6oUzO^X$v>$m#9)QRR1%z~&=g7ZB;4i~`y0m7C%UF4K#5Nj zIepd!@s~K@FRE^JO$~D zyOdal&fm%31HXat#+Tu}9R51NmGB05KkNg4sxOy} z)PpMN+dPr+>X1QGskQ?`ypk{LAVD#53z9$!DryF;a>PE zl!o4hza;+-d=`FU^yeUTI-k?NqB7?^3MzBtY^5^C3x5UM8Fq$JVWP<=K~|B|6Vj-Y z315JvQ0yw;i{wYZBXAu24Xifh6X46_CpM5cN@5y32B*W{!T^*G)Iq6mnc+Q<cEQ)+ZumMp2;YFeg1?6ihe=2SFTi(Eya?Ze@4(~m_wWR4 zhGO>~`~&&p@O}8-kbUBO3O|5nq1b%}S$)pm;7ND|eh9BZ_E9Lp=x55)d{wH4>V>pY ze^mZ?Asa;nPh%^zFkSXWFVAUep)&PXQ(Gw1EknnN{9eUR{IZCHN3G=^yAc!-y49*M zJ$uBA1}2}#s~mQWN`tIv_x#)q`;%vhx#uJ^>zU5Ilu0d-NVtMTIf~7Yez~*8=5zLwmm}r3unNi~RKwGd=;(X}*=+7$ zPK1eeF!ZLvTgd0bDX;=gh11|PSO=#QQho_*B@(_&VipC>a31^^&WB&a+o60=OJwW> z*|knDD3MWqQQQSf;8HjN-VJNvy|4~0hxfo0@Bt_R@82M!?mPz_NgN}w5*~;5!%yH( z;Wuyy77D%BlEr;ZxI z>Uf=rI*D9FIH=57G02d0C z*V&-Fa(+wVUfvEU4n@0n5Mt3yH;;+;c0}16?cQF9Qf?5s zdwnQBi`Fy7Ci^}!O@@9!MC*sf4!c3#gU?(=@0Hap!IIDNuSm;r5^y~%73tmw#EeU^ z=SS;7<2FP-ZVG}I1t-U)L_TXY5w2-cb&5^@Hdp&~ElGN{xw<4W*a1uR)EA24^ttMy z+@CR`dyu2Z8RR>p3yVX3p;scch=XiL4kG`BoM{S-f68ijkWo9r1j&yZ8NjD;6^=xN z!;N0nu;f|zE-xAV^He4Jki0=c(hnK?4^6(avH8T#~O%J_wTJ$DT?WbB?c?Nk}P9GjNxTiLDnsvV|+Vv}EK^2dy$#38Yh zfGP|a?l2WzGWMH{-3n9B+on9rl;2|Xvm`IW^1V@H8N=IbJ%3VRV<(T^J1NzQ*jnt@ z<0i-IE0YdcmVSP6KnKSAb>>ZTtvbEqroNF9u)jkh^cyz~$bN!a_aR3R*{G+GbI7-d zhn|Ht>_E~*NTt2M_(`jAN~#sm{iftt*}8`RIl6I5j=nr4S~pXYt6QezGz^m8vp292 z_~n43N42?dLzkdZ+mvMv%H+wq@tTh;G7q;nt(SCde1c`hhr=hqw9}iB@u-ZMGnXt} ziQPVE+4 z7(w4mPQFlMyFB{Jw8VcXh$DT`I+9@ z?>znY>1oysog65zX6l+ij#aB0157soxH*t&&DJe}Y&$DcXUrH7lO=aNvF^-9>3K8$ zr?IxXbyWALt%y1pB|YW~Ew*Vvt=EcL$7IRV#csN9RxO^PhuGQnD(%h7M?JQ%}bC){XBlpht&GCmzP>s|V zs94U1JU1orG+I(NVg5Wuhfw(4qUP3=gik^zMqF3d%=L#S5VI3>U~Xb~I;jqBs-RU@ z-KvwD=AfP28wc%Hlj@8|T;sfW`;nNYgn8TS19cre)^pldUz#h|ZLf4C0P_ZNip!4c zj*jIbA6fE&C0`@%4`r4USF2q5>h<*xca`v$fiV7Zy}?23ey*vUt;Mfd`AycM3j4=h z=r4`%L_I<;<)MSVl=D_&zl}e5$G_tBe;o<`Iuhha_z@dj-?#duAB?(9*RNms|1}D1 z+GaP_dAh8tsFk0F>cRrG;FT}7jNSI;{ChvuhkG}5uR9yoeh5X!2?!Dh+;DNn4}}YU zf4M*LMnee~Wk>}gU*jVYA`91NO2r}ZND)HBm)~iMXv3#yFyur)`5+yN6zXI3Q+pJX WDnUw-a%4F2522>A$=Y@`?0*5xzFYhN delta 5678 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 diff --git a/obj/Share/TempPE/Properties.Resources.Designer.cs.dll b/obj/Share/TempPE/Properties.Resources.Designer.cs.dll index 1b76e9608c11651a0907f7a0ab92fdf3751d9699..122358bcca45e26828f1898ba4c7058f73f69820 100644 GIT binary patch delta 1154 zcmZWoTS$~a6#mYP?yhTYt81cRw5vgxLIz#1B$8IUQ&?Kj#lobUWT}M_wRW=$RBL~f z(1q+mSV7TB(1n5!dy#@5=pm>ciXN0+N+P2AX8ePq1LvFbedo;VocYhThFizPkL11R zx=;((-XSlXD#bv6f*KOf6t&-|PL37qMl+e|{KqVS2zhCWR7o?#aBI7M2*B zLsv*fb{Si5bOjUw7NLIot`}lqb)qdh(v=OJ^7#4?30|&A*c^$zjvKZj_KB*I=S8dYqHNYWz z=(64DAnS42E4j$m>37+HWtkDs9N%konYpNCXMAV%b+T2KwfP3*7TI2xeV1IaxM4B0 z`Cc)pao0`0XHuibWq#b^=lSTe5y&MQ9AdVMWc;$MJ$t0S!GISrFOXT7B?VGwaXxNJ1f@K40amboVVfRaxLPvSoDgFGhwwD?9nWqeLQ zvr3=M8q9&Sz#EMzj%SF61c*tk)c>&x&WRc8Kei2F8~&>eP1E1nF7)#CTq|AJuzp8< z-3)A~Yp#h_)Kr&OqR9pg_a_^z|*Jq*W$IH40clPwo xs6UPiXQaE2OlINg0jab>&)y1_Q9Mv=X~GX``wwj{oDEjW0&)m zPu^}uB36+XND(2xOGC!ZpM}xK^+^v4fofGGa#c{A_LzKtd9NA~g~F$1#gUv9mgqRl zA(4c&Ah3`O2sP;|j@8Hx;mwoV(*X|(>N~e6>DpUz!vgaAxWENWXkOdZ(H?H=)X$l4 z11+5M>uLc9@M~UCS6Rl{uex2u5g!>BAwxSHNgTRs79)j2aOgbXmYM@Ln#5Mi#-PF9 zNU>5;%@PmZ;*+$oO2@`i=$c-ujn0xRC7+d}(uYMkEj+k|bz+)Wk8m15uk@foXe=Pw zI1armWH4$?(Z9kP8;?Yr+0l3-!Zhbcxz%U|$>|C|!c-+}*+Ck@a*%i)L&N|^P!rG} za4~y>&k|^$iU7*_D6dgYnWS<~KvBI+s8-yhT1colafiF}HKCS`$_#>`oOyYVxiX{1 zodN3sRfADO&a!wy)t69fBA04Rs|bdiIVLSUOC%SWv@jo6rc)Odjf!TwtZ9A9Z0N4o zjLF#G;iM65(CG z>SQCaQ8sfU^$RAEq5jy-s>_|Zb4kvyogO?Vz89~EpAEj2^W>MTH^zBqvg(Dq?3AmY z{J#kCMD;iQi*vk4I{x?K=f2tN!8G^4#Qv(YE!}5YOJfn|x}{RRP5LsY&+YPiRz{DG x$EutI(eFQEW8N8&{vq*$>2+T;4@84ma-~p(eY=wb@t^kBzF3<7n}~+oe*ut~rI`Q# diff --git a/obj/Share/ru/DFPl.resources.dll b/obj/Share/ru/DFPl.resources.dll index 5600854ef8d74374dc694b6a8e0415561946feb9..c8200779bc04ffc61ba687c1abf6f68c026433ce 100644 GIT binary patch delta 36 ucmV+<0Nek77=Rd%hy&57ow1931`ty3Fr>5kzDAfI*J;yp=6kak2j~Phy%AIZ delta 36 scmZpWXporD!Mxvb&c^OqHi7aZYddPEnLADjG5+{#mP!0(3HBE(035Opp#T5? From 4bed1f226ef19c267dc39ef0718c600ffa455baf Mon Sep 17 00:00:00 2001 From: Ben_Dizer Date: Tue, 27 Dec 2022 00:45:43 +0300 Subject: [PATCH 3/3] Beta 0.1.3 --- DFPl.csproj | 18 +++ DFPl.sln | 28 ++++ Form1.Designer.cs | 24 ++- Form1.cs | 363 +++++++++++++++++++----------------------- Form1.resx | 99 +++++++++--- Form2.Designer.cs | 63 ++++++++ Form2.cs | 25 +++ Form2.resx | 120 ++++++++++++++ Models/Game.cs | 171 ++++++++++++++++++++ Program.cs | 7 +- README.md | 48 +++--- globalKeyboardHook.cs | 165 +++++++++++++++++++ nlog.config | 21 +++ 13 files changed, 911 insertions(+), 241 deletions(-) create mode 100644 DFPl.sln create mode 100644 Form2.Designer.cs create mode 100644 Form2.cs create mode 100644 Form2.resx create mode 100644 Models/Game.cs create mode 100644 globalKeyboardHook.cs create mode 100644 nlog.config diff --git a/DFPl.csproj b/DFPl.csproj index f12320b..298068d 100644 --- a/DFPl.csproj +++ b/DFPl.csproj @@ -73,14 +73,26 @@ Form1.cs + + Form + + + Form2.cs + + + Form1.cs + Designer Form1.cs + + Form2.cs + ResXFileCodeGenerator Resources.Designer.cs @@ -92,6 +104,9 @@ True + + PreserveNewest + SettingsSingleFileGenerator Settings.Designer.cs @@ -106,6 +121,9 @@ + + 5.1.0 + 1.2.5 diff --git a/DFPl.sln b/DFPl.sln new file mode 100644 index 0000000..1a3f6f0 --- /dev/null +++ b/DFPl.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32519.379 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DFPl", "DFPl.csproj", "{F45DC1BE-8065-435C-85FC-0E6BD4B76424}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + Share|Any CPU = Share|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F45DC1BE-8065-435C-85FC-0E6BD4B76424}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F45DC1BE-8065-435C-85FC-0E6BD4B76424}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F45DC1BE-8065-435C-85FC-0E6BD4B76424}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F45DC1BE-8065-435C-85FC-0E6BD4B76424}.Release|Any CPU.Build.0 = Release|Any CPU + {F45DC1BE-8065-435C-85FC-0E6BD4B76424}.Share|Any CPU.ActiveCfg = Share|Any CPU + {F45DC1BE-8065-435C-85FC-0E6BD4B76424}.Share|Any CPU.Build.0 = Share|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {7E103C92-EA0E-4625-9188-6D17B0AD5E4B} + EndGlobalSection +EndGlobal diff --git a/Form1.Designer.cs b/Form1.Designer.cs index 6f1538a..51b43e2 100644 --- a/Form1.Designer.cs +++ b/Form1.Designer.cs @@ -41,6 +41,8 @@ private void InitializeComponent() this.groupBox1 = new System.Windows.Forms.GroupBox(); this.groupBox2 = new System.Windows.Forms.GroupBox(); this.label1 = new System.Windows.Forms.Label(); + this.button5 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.SuspendLayout(); // @@ -96,7 +98,9 @@ private void InitializeComponent() this.listBox1.Items.AddRange(new object[] { resources.GetString("listBox1.Items"), resources.GetString("listBox1.Items1"), - resources.GetString("listBox1.Items2")}); + resources.GetString("listBox1.Items2"), + resources.GetString("listBox1.Items3"), + resources.GetString("listBox1.Items4")}); resources.ApplyResources(this.listBox1, "listBox1"); this.listBox1.Name = "listBox1"; // @@ -118,10 +122,26 @@ private void InitializeComponent() this.label1.ForeColor = System.Drawing.Color.Indigo; this.label1.Name = "label1"; // + // button5 + // + resources.ApplyResources(this.button5, "button5"); + this.button5.Name = "button5"; + this.button5.UseVisualStyleBackColor = true; + this.button5.Click += new System.EventHandler(this.button5_Click); + // + // button6 + // + resources.ApplyResources(this.button6, "button6"); + this.button6.Name = "button6"; + this.button6.UseVisualStyleBackColor = true; + this.button6.Click += new System.EventHandler(this.button6_Click); + // // Form1 // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; resources.ApplyResources(this, "$this"); + this.Controls.Add(this.button6); + this.Controls.Add(this.button5); this.Controls.Add(this.label1); this.Controls.Add(this.groupBox2); this.Controls.Add(this.groupBox1); @@ -156,6 +176,8 @@ private void InitializeComponent() private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button6; } } diff --git a/Form1.cs b/Form1.cs index 3f3a0c0..aebb070 100644 --- a/Form1.cs +++ b/Form1.cs @@ -1,262 +1,231 @@ using System; +using System.Diagnostics; using System.IO; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; +using System.IO.Compression; using System.Windows.Forms; -using System.Diagnostics; -using System.Runtime.InteropServices; -using System.Threading; -using System.Reflection; -using Reloaded.Injector; +using DFPl.Models; using IWshRuntimeLibrary; -using System.IO.Compression; -using System.Security.AccessControl; -using System.Security.Principal; +using NLog; +using Reloaded.Injector; namespace DFPl { public partial class Form1 : Form { - string Version = "DFPL 0.1.2"; - public Form1(string[] Ags) + // Constants + private const string Version = "DFPL 0.1.3"; + private const string GamePathSetting = "Gamepath"; + private const string ShortcutName = "Запуск DF.lnk"; + private const string ShortcutIcon = "ico\\DFPLQS.ico"; + private const string QuietStartArg = "-quiet_start"; + private const string GameVersionStr = "@Версия игры "; + private const string GameVersionStrN = "неизвестна"; + + // Fields + private readonly string[] _args; + private readonly Logger _logger; + + + + public Form1(string args = "") { - bool SL = false; - foreach (string A in Ags) - { - if (A == "-quiet_start") - SL = true; - } - if (SL) + _args = args.Split('|'); + _logger = LogManager.GetCurrentClassLogger(); + _logger.Info("App started with args: " + String.Join(", ", args)); + + InitializeComponent(); + textBox2.Text = DFPl.Properties.Settings.Default[GamePathSetting].ToString(); + this.Text = Version; + } + + private void button1_Click(object sender, EventArgs e) + { + DFPl.Properties.Settings.Default[GamePathSetting] = textBox2.Text; + DFPl.Properties.Settings.Default.Save(); + + try { - DFSTART(); - Application.Exit(); + var game = new Game(DFPl.Properties.Settings.Default[GamePathSetting].ToString(), _logger); + game.Start(); } - else + catch (Exception ex) { - InitializeComponent(); + _logger.Error("Failed to start game", ex); + MessageBox.Show("Failed to start game!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Information); } - textBox2.Text = DFPl.Properties.Settings.Default["Gamepath"].ToString(); - if (DFPl.Properties.Settings.Default["DF_VER"].ToString() != "") + } + + private void button2_Click(object sender, EventArgs e) + { + try { - label1.Text = "@Версия игры: " + DFPl.Properties.Settings.Default["DF_VER"].ToString(); + CreateQuietStartShortcut(); } - else + catch (Exception ex) { - label1.Text = "@Версия игры неизвестна"; + _logger.Error("Failed to create quiet start shortcut", ex); + MessageBox.Show("Failed to create quiet start shortcut!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Information); } - this.Text = Version; - } private void button3_Click(object sender, EventArgs e) { folderBrowserDialog1.ShowDialog(); textBox2.Text = folderBrowserDialog1.SelectedPath; - string GP = DFPl.Properties.Settings.Default["Gamepath"].ToString(); - if (System.IO.File.Exists(GP + "\\Dwarf Fortress.exe")) - { - var secondLine = System.IO.File.ReadLines(GP + @"\data\vanilla\vanilla_creatures_graphics\info.txt"); - foreach (string lines in secondLine) - { - string[] plines = lines.Split(':'); - if (plines[0] == "[DISPLAYED_VERSION") - { - label1.Text = "@Версия игры: " + plines[1].Split(']')[0]; - DFPl.Properties.Settings.Default["DF_VER"] = plines[1].Split(']')[0]; - } - } - } + DFPl.Properties.Settings.Default[GamePathSetting] = folderBrowserDialog1.SelectedPath; + DFPl.Properties.Settings.Default.Save(); + _logger.Info("New path set and saved. Path: " + DFPl.Properties.Settings.Default[GamePathSetting].ToString()); + var game = new Game(DFPl.Properties.Settings.Default[GamePathSetting].ToString(), _logger); + string GV = game.DeterminingGameVersion(); + if (GV != "") + label1.Text = GameVersionStr + GV; else - { - MessageBox.Show("Файл игры не найден!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information); - DFPl.Properties.Settings.Default["DF_VER"] = ""; - label1.Text = "@Версия игры неизвестна"; - } + label1.Text = GameVersionStr + GameVersionStrN; } - private void button1_Click(object sender, EventArgs e) + + // TODO + // 1. Download localization from the server + // 2. Request avalible versions from the server + private void button4_Click(object sender, EventArgs e) { - DFPl.Properties.Settings.Default["Gamepath"] = textBox2.Text; + string gamePath = textBox2.Text; + DFPl.Properties.Settings.Default["Gamepath"] = gamePath; DFPl.Properties.Settings.Default.Save(); - DFSTART(); - } - private void DFSTART() - { - string GP = DFPl.Properties.Settings.Default["Gamepath"].ToString(); - if (System.IO.File.Exists(GP + "\\Dwarf Fortress.exe")) + + if (!System.IO.File.Exists(gamePath + "\\Dwarf Fortress.exe")) + { + _logger.Error("Game file not found at path: " + gamePath); + MessageBox.Show("Game file not found at path!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + + string localizationFile = ""; + + switch (listBox1.SelectedItem?.ToString()) + { + case ("Dwarf Fortress v50.02 - Локализация DFRUS v0.1"): + localizationFile = "Dwarf Fortress v50.02__v0.1_DFRUS.zip"; + break; + case ("Dwarf Fortress v50.03 - Локализация DFRUS v0.1"): + localizationFile = "Dwarf Fortress v50.03__v0.1_DFRUS.zip"; + break; + case ("Dwarf Fortress v50.03 - Локализация DFRUS v0.2"): + localizationFile = "Dwarf Fortress v50.03__v0.2_DFRUS.zip"; + break; + case ("Переводы из мастерской - UNIT"): + localizationFile = "WorkshopMod.zip"; + break; + case ("Dwarf Fortress v50.03 - Локализация DFRUS v0.3"): + localizationFile = "Dwarf Fortress v50.03__v0.3_DFRUS.zip"; + break; + } + + if (localizationFile == "") + { + _logger.Error("No localization file selected"); + MessageBox.Show("No localization file selected!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + + string localizationArchivePath = Environment.CurrentDirectory + @"\loc\" + localizationFile; + if (!System.IO.File.Exists(localizationArchivePath)) + { + _logger.Error("Localization archive not found at path: " + localizationArchivePath); + MessageBox.Show("Localization archive not found!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + + try { - String strDLLName = GP + "\\df-steam-translate-hook.dll"; - if (System.IO.File.Exists(GP + "\\df-steam-translate-hook.dll")) + using (ZipArchive archive = ZipFile.OpenRead(localizationArchivePath)) { - try + foreach (var archiveEntry in archive.Entries) { - ProcessStartInfo startInfo = new ProcessStartInfo(); - startInfo.FileName = GP + "\\Dwarf Fortress.exe"; - startInfo.CreateNoWindow = false; - startInfo.UseShellExecute = true; - startInfo.WorkingDirectory = GP; - Process DF = Process.Start(startInfo); - int ProcID = DF.Id; - Thread.Sleep(1000); - try + string fullPath = Path.Combine(gamePath, archiveEntry.FullName); + if (archiveEntry.Name == "") { - Injector injector = new Injector(DF); - injector.Inject(strDLLName); - injector.Dispose(); + Directory.CreateDirectory(fullPath); } - catch + else { - MessageBox.Show("Неудалось применить моды!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information); + archiveEntry.ExtractToFile(fullPath, true); } } - catch - { - MessageBox.Show("Не удалось запустить игру!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - - } - else - { - MessageBox.Show("Перевод не найден!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information); } + + _logger.Info("Localization installed at path: " + gamePath); + MessageBox.Show("Localization installed!", "Done!", MessageBoxButtons.OK, MessageBoxIcon.Information); } - else + catch (Exception ex) { - MessageBox.Show("Файл игры не найден!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.Error("Error installing localization", ex); + MessageBox.Show("Error installing localization!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Information); } } - private void button2_Click(object sender, EventArgs e) + private void CreateQuietStartShortcut() { - object shDesktop = (object)"Desktop"; + string appPath = Application.StartupPath; + string shortcutPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), ShortcutName); + string exePath = Path.Combine(appPath, "DFPl.exe"); + + if (System.IO.File.Exists(shortcutPath)) + { + System.IO.File.Delete(shortcutPath); + } + WshShell shell = new WshShell(); - string shortcutAddress = (string)shell.SpecialFolders.Item(ref shDesktop) + @"\Запуск DF.lnk"; - IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutAddress); - shortcut.TargetPath = Environment.CurrentDirectory + @"\DFPL.exe"; - shortcut.Arguments = "-quiet_start"; - shortcut.IconLocation = Environment.CurrentDirectory + @"\ico\DFPLQS.ico"; + IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutPath); + shortcut.Description = "DFPl Quiet Start"; + shortcut.TargetPath = exePath; + shortcut.WorkingDirectory = appPath; + shortcut.Arguments = QuietStartArg; + shortcut.IconLocation = Path.Combine(appPath, ShortcutIcon); shortcut.Save(); } - private void button4_Click(object sender, EventArgs e) + private void Form1_Load(object sender, EventArgs e) { - DFPl.Properties.Settings.Default["Gamepath"] = textBox2.Text; - DFPl.Properties.Settings.Default.Save(); - string GP = DFPl.Properties.Settings.Default["Gamepath"].ToString(); - if (System.IO.File.Exists(GP + "\\Dwarf Fortress.exe")) + //globalKeyboardHook gkh = new globalKeyboardHook(); + ////Keys[] keys = {Keys.LShiftKey, Keys.F5}; + //gkh.HookedKeys.Add(Keys.PageDown); + //gkh.KeyUp += new KeyEventHandler(gkh_KeyUp); + if (_args.Length > 0 && _args[0] == QuietStartArg) { - string NMLOC = ""; + DFPl.Properties.Settings.Default[GamePathSetting] = textBox2.Text; + DFPl.Properties.Settings.Default.Save(); + try { - switch (listBox1.SelectedItem.ToString()) - { - case ("Dwarf Fortress v50.02 - Локализация DFRUS v0.1"): - NMLOC = "Dwarf Fortress v50.02__v0.1_DFRUS.zip"; - break; - case ("Dwarf Fortress v50.03 - Локализация DFRUS v0.1"): - NMLOC = "Dwarf Fortress v50.03__v0.1_DFRUS.zip"; - break; - case ("Dwarf Fortress v50.03 - Локализация DFRUS v0.2"): - NMLOC = "Dwarf Fortress v50.03__v0.2_DFRUS.zip"; - break; - } + var game = new Game(DFPl.Properties.Settings.Default[GamePathSetting].ToString(), _logger); + game.Start(); } - catch + catch (Exception ex) { - + _logger.Error("Failed to start game", ex); + MessageBox.Show("Failed to start game!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Information); } - if (NMLOC != "") - { - if (System.IO.File.Exists(Environment.CurrentDirectory + @"\loc\" + NMLOC)) - { - //if (HasWritePermission(GP)) - //{ - try - { - using (ZipArchive archive = ZipFile.OpenRead(Environment.CurrentDirectory + @"\loc\" + NMLOC)) - { - foreach (var archiveEntry in archive.Entries) - { - string fullPath = Path.Combine(GP, archiveEntry.FullName); - if (archiveEntry.Name == "") - { - Directory.CreateDirectory(fullPath); - } - else - { - archiveEntry.ExtractToFile(fullPath, true); - } - } - } - MessageBox.Show("Локализация установлена!", "Успех!", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - catch - { - MessageBox.Show("Не удалось установить локализацию!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - //} - //else - //{ - // MessageBox.Show("Папка игры доступна только для чтения!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information); - //} - } - else - { - MessageBox.Show("Архив локализации не найден!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - else - { - MessageBox.Show("Необходимо выбрать версию!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - else - { - MessageBox.Show("Файл игры не найден!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information); + //Close(); } } - private void Form1_Load(object sender, EventArgs e) + private void gkh_KeyUp(object sender, KeyEventArgs e) + { + var game = new Game(DFPl.Properties.Settings.Default[GamePathSetting].ToString(), _logger); + game.INEJ(); + } + + private void button5_Click(object sender, EventArgs e) { } - //private static bool HasWritePermission(string FilePath) - //{ - // bool rez = false; - // DirectoryInfo dir = new DirectoryInfo(FilePath); - // DirectoryInfo[] alldir = dir.GetDirectories(); - // WindowsIdentity wi = WindowsIdentity.GetCurrent(); - // foreach (DirectoryInfo name in alldir) - // { - // DirectorySecurity ds = name.GetAccessControl(AccessControlSections.Access); - // AuthorizationRuleCollection rules = ds.GetAccessRules(true, true, typeof(SecurityIdentifier)); - // foreach (FileSystemAccessRule rl in rules) - // { - // SecurityIdentifier sid = (SecurityIdentifier)rl.IdentityReference; - // if (((rl.FileSystemRights & FileSystemRights.WriteData) == FileSystemRights.WriteData)) - // { - // if ((sid.IsAccountSid() && wi.User == sid) || - // (!sid.IsAccountSid() && wi.Groups.Contains(sid))) - // { - // if (rl.AccessControlType == AccessControlType.Allow) - // { - // rez = true; - // } - // else - // { - // rez = false; - // } - // } - // } - // } - // } - // return rez; - //} + private void button6_Click(object sender, EventArgs e) + { + var game = new Game(DFPl.Properties.Settings.Default[GamePathSetting].ToString(), _logger); + game.INEJ(); + } } } diff --git a/Form1.resx b/Form1.resx index 9e96f8b..56d2995 100644 --- a/Form1.resx +++ b/Form1.resx @@ -119,7 +119,7 @@ - 266, 223 + 266, 255 75, 23 @@ -141,7 +141,7 @@ $this - 9 + 11 @@ -169,7 +169,7 @@ $this - 7 + 9 12, 57 @@ -190,7 +190,7 @@ $this - 8 + 10 17, 17 @@ -220,10 +220,10 @@ $this - 6 + 8 - 166, 223 + 166, 255 94, 23 @@ -244,7 +244,7 @@ $this - 5 + 7 85, 166 @@ -268,22 +268,28 @@ $this - 4 + 6 - Dwarf Fortress v50.03 - Локализация DFRUS v0.2 + Переводы из мастерской - UNIT - Dwarf Fortress v50.03 - Локализация DFRUS v0.1 + Dwarf Fortress v50.03 - Локализация DFRUS v0.3 + Dwarf Fortress v50.03 - Локализация DFRUS v0.2 + + + Dwarf Fortress v50.03 - Локализация DFRUS v0.1 + + Dwarf Fortress v50.02 - Локализация DFRUS v0.1 42, 104 - 265, 56 + 270, 56 11 @@ -298,7 +304,7 @@ $this - 3 + 5 -9, 83 @@ -319,7 +325,7 @@ $this - 2 + 4 -9, 195 @@ -340,13 +346,13 @@ $this - 1 + 3 True - 12, 228 + 12, 260 145, 13 @@ -367,13 +373,70 @@ $this + 2 + + + False + + + 283, 226 + + + 58, 23 + + + 15 + + + FAQ + + + button5 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + False + + + NoControl + + + 166, 226 + + + 111, 23 + + + 17 + + + Горячий OFF/ON + + + button6 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + 0 True - 357, 258 + 357, 293 @@ -452,10 +515,10 @@ - 373, 297 + 373, 332 - 373, 297 + 373, 332 DFPL 0.1.0 diff --git a/Form2.Designer.cs b/Form2.Designer.cs new file mode 100644 index 0000000..f0b0f58 --- /dev/null +++ b/Form2.Designer.cs @@ -0,0 +1,63 @@ +namespace DFPl +{ + partial class FAQ + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.textBox1 = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(12, 12); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Horizontal; + this.textBox1.Size = new System.Drawing.Size(379, 426); + this.textBox1.TabIndex = 0; + this.textBox1.Text = "В: Игра вылетает при переходе на карту, в меню и т.д\r\nО: "; + // + // FAQ + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(403, 450); + this.Controls.Add(this.textBox1); + this.Name = "FAQ"; + this.ShowIcon = false; + this.Text = "Form2"; + this.Load += new System.EventHandler(this.FAQ_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox textBox1; + } +} \ No newline at end of file diff --git a/Form2.cs b/Form2.cs new file mode 100644 index 0000000..c7b297b --- /dev/null +++ b/Form2.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace DFPl +{ + public partial class FAQ : Form + { + public FAQ() + { + InitializeComponent(); + } + + private void FAQ_Load(object sender, EventArgs e) + { + + } + } +} diff --git a/Form2.resx b/Form2.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/Form2.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Models/Game.cs b/Models/Game.cs new file mode 100644 index 0000000..eadc7b0 --- /dev/null +++ b/Models/Game.cs @@ -0,0 +1,171 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using IWshRuntimeLibrary; +using NLog; +using Reloaded.Injector; +using Reloaded.Injector.Interop.Structures; +using Reloaded.Injector.Interop; + +namespace DFPl.Models +{ + public class Game + { + // Constants + private const string GameExe = "Dwarf Fortress.exe"; + private const string TranslationDll = "df-steam-translate-hook.dll"; + private const string GameInfoPath = @"\data\vanilla\vanilla_creatures_graphics\info.txt"; + + // Fields + private readonly string _gamePath; + private readonly Logger _logger; + + static private bool LocT = false; + static public Injector injector; + static public string injectorP; + static public string _injectionDllPath; + public Game(string gamePath, Logger logger) + { + _gamePath = gamePath; + _logger = logger; + } + + public void Start() + { + try + { + _logger.Info("Starting Game. Path: " + _gamePath); + + if (!CheckGameFilesExist()) + { + + LocT = false; + _logger.Error("Required game files not found!"); + throw new Exception("Required game files not found!"); + } + + ProcessStartInfo startInfo = new ProcessStartInfo + { + FileName = Path.Combine(_gamePath, GameExe), + CreateNoWindow = false, + UseShellExecute = true, + WorkingDirectory = _gamePath + }; + Process df = Process.Start(startInfo); + int procId = df.Id; + try + { + _logger.Info("Injecting Game"); + injector = new Injector(df); + injectorP = Path.Combine(_gamePath, TranslationDll); + injector.Inject(injectorP); + //injector.CallFunction(injectorP, "Spam", default); + LocT = true; + } + catch (Exception ex) + { + + LocT = false; + _logger.Error("Failed to apply mods", ex); + throw new Exception("Failed to apply mods!", ex); + } + } + catch (Exception ex) + { + + LocT = false; + _logger.Error("Failed to start game", ex); + throw new Exception("Failed to start game!", ex); + } + } + + private bool CheckGameFilesExist() + { + return System.IO.File.Exists(Path.Combine(_gamePath, GameExe)) && + System.IO.File.Exists(Path.Combine(_gamePath, TranslationDll)); + } + + public string DeterminingGameVersion() + { + string GV = ""; + if (!CheckGameFilesExist()) + { + _logger.Error("Required game files not found!"); + throw new Exception("Required game files not found!"); + } + var secondLine = System.IO.File.ReadLines(_gamePath + GameInfoPath); + foreach (string lines in secondLine) + { + string[] plines = lines.Split(':'); + if (plines[0] == "[DISPLAYED_VERSION") + { + GV = plines[1].Split(']')[0]; + } + } + return GV; + } + + public void INEJ() + { + if (LocT) + { + Eject(); + } + else + { + Inject(); + } + } + public void Eject() + { + try + { + injector.Eject(_injectionDllPath); + injector.Dispose(); + } + catch (Exception ex) + { + _logger.Error("Failed to off mods", ex); + throw new Exception("Failed to off mods!", ex); + } + } + + public void Inject() + { + try + { + injector.Inject(injectorP); + } + catch (Exception ex) + { + _logger.Error("Failed to on mods", ex); + throw new Exception("Failed to on mods!", ex); + } + } + + //public static List TryGetModules(Process targetProcess, int timeout = 1000) + //{ + // List modules = new List(); + // Stopwatch watch = new Stopwatch(); + // watch.Start(); + + // while (watch.ElapsedMilliseconds < timeout) + // { + // try + // { + // modules = ModuleCollector.CollectModules(targetProcess); + // break; + // } + // catch { /* ignored */ } + // } + + // if (modules.Count == 0) + // throw new Exception($"Failed to find information on any of the modules inside the process " + + // $"using EnumProcessModulesEx within the { timeout } millisecond timeout. " + + // "The process has likely not yet initialized."); + + // return modules; + //} + } +} diff --git a/Program.cs b/Program.cs index 5b07cb0..8a01e4f 100644 --- a/Program.cs +++ b/Program.cs @@ -15,7 +15,12 @@ static void Main(string[] Ags) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Form1(Ags)); + string Agss = ""; + for(int i = 0; i < Ags.Length; i++) + { + Agss += Ags[i] + "|"; + } + Application.Run(new Form1(Agss)); } } } diff --git a/README.md b/README.md index c80e1ea..3c66d1c 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,24 @@ -# DFPL - -#### Проект лаунчера для игры Dwarf Fortress Steam c поддержкой модификаций -#### Сайт https://vk.com/dwarffortresspluslauncher - -# Поддержать проект - -#### Сбер: https://www.sberbank.com/ru/person/dl/jc?linkname=VINhW8MouCVwpK7uZ -#### Donationalerts: https://www.donationalerts.com/r/ben_dizer - -# Инструкция - -#### 1) Скачать последнюю версию программы из релиза -#### 2) Распаковать архив в любое удобное место -#### 3) Запустить DFLP.exe -#### 4) При первом запуске необходимо указать папку с игрой нажав на "..." -#### 5) Выбрать версию игры и локализации из списка -#### 6) Нажать кнопку "Установить локализацию" -#### 7) (Опционально) создать ярлык для быстрого запуска игры с модификациями -#### 8) Играть - -# Контакты - -#### E-MAIL: andtu6@gmail.com +# DFPL + +#### Проект лаунчера для игры Dwarf Fortress Steam c поддержкой модификаций +#### Сайт https://vk.com/dwarffortresspluslauncher + +# Поддержать проект + +#### Сбер: https://www.sberbank.com/ru/person/dl/jc?linkname=VINhW8MouCVwpK7uZ +#### Donationalerts: https://www.donationalerts.com/r/ben_dizer + +# Инструкция + +#### 1) Скачать последнюю версию программы из релиза +#### 2) Распаковать архив в любое удобное место +#### 3) Запустить DFLP.exe +#### 4) При первом запуске необходимо указать папку с игрой нажав на "..." +#### 5) Выбрать версию игры и локализации из списка +#### 6) Нажать кнопку "Установить локализацию" +#### 7) (Опционально) создать ярлык для быстрого запуска игры с модификациями +#### 8) Играть + +# Контакты + +#### E-MAIL: andtu6@gmail.com diff --git a/globalKeyboardHook.cs b/globalKeyboardHook.cs new file mode 100644 index 0000000..c9ac5eb --- /dev/null +++ b/globalKeyboardHook.cs @@ -0,0 +1,165 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace DFPl +{ + class globalKeyboardHook + { + #region Constant, Structure and Delegate Definitions + /// + /// defines the callback type for the hook + /// + public delegate int keyboardHookProc(int code, int wParam, ref keyboardHookStruct lParam); + + public struct keyboardHookStruct + { + public int vkCode; + public int scanCode; + public int flags; + public int time; + public int dwExtraInfo; + } + + const int WH_KEYBOARD_LL = 13; + const int WM_KEYDOWN = 0x100; + const int WM_KEYUP = 0x101; + const int WM_SYSKEYDOWN = 0x104; + const int WM_SYSKEYUP = 0x105; + #endregion + + #region Instance Variables + /// + /// The collections of keys to watch for + /// + public List HookedKeys = new List(); + /// + /// Handle to the hook, need this to unhook and call the next hook + /// + IntPtr hhook = IntPtr.Zero; + #endregion + + #region Events + /// + /// Occurs when one of the hooked keys is pressed + /// + public event KeyEventHandler KeyDown; + /// + /// Occurs when one of the hooked keys is released + /// + public event KeyEventHandler KeyUp; + #endregion + + #region Constructors and Destructors + /// + /// Initializes a new instance of the class and installs the keyboard hook. + /// + public globalKeyboardHook() + { + hook(); + } + + /// + /// Releases unmanaged resources and performs other cleanup operations before the + /// is reclaimed by garbage collection and uninstalls the keyboard hook. + /// + ~globalKeyboardHook() + { + unhook(); + } + #endregion + + #region Public Methods + /// + /// Installs the global hook + /// + public void hook() + { + IntPtr hInstance = LoadLibrary("User32"); + hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, hInstance, 0); + } + + /// + /// Uninstalls the global hook + /// + public void unhook() + { + UnhookWindowsHookEx(hhook); + } + + /// + /// The callback for the keyboard hook + /// + /// The hook code, if it isn't >= 0, the function shouldn't do anyting + /// The event type + /// The keyhook event information + /// + public int hookProc(int code, int wParam, ref keyboardHookStruct lParam) + { + if (code >= 0) + { + Keys key = (Keys)lParam.vkCode; + if (HookedKeys.Contains(key)) + { + KeyEventArgs kea = new KeyEventArgs(key); + if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null)) + { + KeyDown(this, kea); + } + else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null)) + { + KeyUp(this, kea); + } + if (kea.Handled) + return 1; + } + } + return CallNextHookEx(hhook, code, wParam, ref lParam); + } + #endregion + + #region DLL imports + /// + /// Sets the windows hook, do the desired event, one of hInstance or threadId must be non-null + /// + /// The id of the event you want to hook + /// The callback. + /// The handle you want to attach the event to, can be null + /// The thread you want to attach the event to, can be null + /// a handle to the desired hook + [DllImport("user32.dll")] + static extern IntPtr SetWindowsHookEx(int idHook, keyboardHookProc callback, IntPtr hInstance, uint threadId); + + /// + /// Unhooks the windows hook. + /// + /// The hook handle that was returned from SetWindowsHookEx + /// True if successful, false otherwise + [DllImport("user32.dll")] + static extern bool UnhookWindowsHookEx(IntPtr hInstance); + + /// + /// Calls the next hook. + /// + /// The hook id + /// The hook code + /// The wparam. + /// The lparam. + /// + [DllImport("user32.dll")] + static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, ref keyboardHookStruct lParam); + + /// + /// Loads the library. + /// + /// Name of the library + /// A handle to the library + [DllImport("kernel32.dll")] + static extern IntPtr LoadLibrary(string lpFileName); + #endregion + } +} diff --git a/nlog.config b/nlog.config new file mode 100644 index 0000000..b646e42 --- /dev/null +++ b/nlog.config @@ -0,0 +1,21 @@ + + + + + + + + + + + \ No newline at end of file