Skip to content

Commit 0e1d4cd

Browse files
committed
Added "Save File As..." menu item.
1 parent 26ba351 commit 0e1d4cd

File tree

3 files changed

+71
-28
lines changed

3 files changed

+71
-28
lines changed

WindowTextExtractor/Forms/MainForm.Designer.cs

Lines changed: 22 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

WindowTextExtractor/Forms/MainForm.cs

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Runtime.InteropServices;
66
using System.IO;
77
using System.Drawing;
8+
using System.Text;
89
using WindowTextExtractor.Extensions;
910
using WindowTextExtractor.Utils;
1011

@@ -19,6 +20,7 @@ public partial class MainForm : Form, IMessageFilter
1920
private readonly int _messageId;
2021
private bool _isButtonTargetMouseDown;
2122
private string _64BitFilePath;
23+
private string _fileName;
2224

2325
public MainForm()
2426
{
@@ -27,6 +29,7 @@ public MainForm()
2729
_processId = Process.GetCurrentProcess().Id;
2830
_messageId = NativeMethods.RegisterWindowMessage("WINDOW_TEXT_EXTRACTOR_HOOK");
2931
_64BitFilePath = "";
32+
_fileName = "";
3033
}
3134

3235
protected override void OnLoad(EventArgs e)
@@ -36,6 +39,7 @@ protected override void OnLoad(EventArgs e)
3639
Application.AddMessageFilter(this);
3740

3841
menuItemAlwaysOnTop_Click(this, EventArgs.Empty);
42+
OnTextContentChanged();
3943

4044
var font = new Font(DEFAULT_FONT_NAME, DEFAULT_FONT_SIZE, FontStyle.Regular, GraphicsUnit.Point);
4145
if (font.Name == DEFAULT_FONT_NAME)
@@ -104,12 +108,32 @@ private void btnTarget_MouseDown(object sender, MouseEventArgs e)
104108

105109
private void txtContent_TextChanged(object sender, EventArgs e)
106110
{
107-
UpdateStatusBar();
111+
OnTextContentChanged();
108112
}
109113

110114
private void txtContent_MultilineChanged(object sender, EventArgs e)
111115
{
112-
UpdateStatusBar();
116+
OnTextContentChanged();
117+
}
118+
119+
private void menuItemSaveFileAs_Click(object sender, EventArgs e)
120+
{
121+
var dialog = new SaveFileDialog
122+
{
123+
OverwritePrompt = true,
124+
ValidateNames = true,
125+
Title = "Save As",
126+
FileName = File.Exists(_fileName) ? Path.GetFileName(_fileName) : "*.txt",
127+
DefaultExt = "txt",
128+
RestoreDirectory = false,
129+
Filter = "Text Documents (.txt)|*.txt"
130+
};
131+
132+
if (dialog.ShowDialog() != System.Windows.Forms.DialogResult.Cancel)
133+
{
134+
_fileName = dialog.FileName;
135+
File.WriteAllText(_fileName, txtContent.Text, Encoding.UTF8);
136+
}
113137
}
114138

115139
private void menuItemExit_Click(object sender, EventArgs e)
@@ -151,7 +175,7 @@ protected override void WndProc(ref Message m)
151175
var password = Marshal.PtrToStringAuto(cds.lpData);
152176
txtContent.Text = password;
153177
txtContent.ScrollTextToEnd();
154-
UpdateStatusBar();
178+
OnTextContentChanged();
155179
}
156180
break;
157181
}
@@ -214,7 +238,7 @@ public bool PreFilterMessage(ref Message m)
214238
var text = element.GetTextFromConsole() ?? element.GetTextFromWindow();
215239
txtContent.Text = text == null ? "" : text.TrimEnd().TrimEnd(Environment.NewLine);
216240
txtContent.ScrollTextToEnd();
217-
UpdateStatusBar();
241+
OnTextContentChanged();
218242
}
219243
}
220244
}
@@ -229,10 +253,11 @@ public bool PreFilterMessage(ref Message m)
229253
return false;
230254
}
231255

232-
private void UpdateStatusBar()
256+
private void OnTextContentChanged()
233257
{
234258
lblTotalChars.Text = "Total Chars: " + txtContent.Text.Length;
235259
lblTotalLines.Text = "Total Lines: " + txtContent.Text.Split(new string[] { Environment.NewLine }, StringSplitOptions.None).Length;
260+
menuItemSaveFileAs.Enabled = txtContent.Text.Length > 0;
236261
}
237262
}
238263
}

WindowTextExtractor/Forms/MainForm.resx

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -126,25 +126,25 @@
126126
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
127127
<data name="btnTarget.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
128128
<value>
129-
iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
130-
YQUAAAPxSURBVGhD7dm9rk1REAfw6zuEEhVajVKCSqHgCVDjKfQiqCR4ATUV8QAoqDVENAqiQKFAfMzv
131-
5kyysuyz99n37HPu2Yl/8s9dd/asmVlfs2bvs7ZAbAk+m1B7dNgR/Dmh9uiwM/h/AMvCtuDJ4NXgw+Cr
132-
4Ofg7wm1yTyjQ1efTceh4PXg+2AGOyv10ZeNpWN/8E7we/BPUEBvgreDF4LHggeDuYW0yTyjQ1c/ZIMt
133-
NpeCi8FPQUH/CN4PngjWqbLtDNDVR1822GLTABcGQdwN5hZ4EjwanIZZDzEbbKVdPrYHB8We4KOgJf8W
134-
vBzsQt8sdCXItkHwtTs4CDjP4D8EjwebsDV4Ongr+DT4MZizqk3mGR26TWCbD774HGQlctsw3LRlpMNL
135-
wdfBDLiLdPVpSqV88EWP77ngwDJkaZtmnrOXQTpm7W3wWvBM8Egwt5A2mWd0Uv9FsGlS+MrttOGDLa1l
136-
tmna8+eCX4MCeRc8HyxndNoZoENXH33ZOBus4UzwLYYNpVi5mQEZoobg5W/PpcJ9wRpdh1gffdlgq2kQ
137-
mZ3E0gtuR0bl6HqJ/W/WGL5BMAVZTju8beU0G2yx2eRLDGLpdWO74i2vGSph+e35pmdNEHhb8Am28kzU
138-
BzufiWkmMKBO0cltWULmMFv2716CgWA75Zngo4QYyMVUD64RKkVBqlfK2ZO7M1U6hEODTbb5KO8JMYjF
139-
M7F1QrlLWdFVwgVkJqTBmWaiJ9jMFMtXCbGQi60TanbKdf51ixqAXL4osM03XyXEQi62TnjxoKz8LSGb
140-
kLuQurAraNa+TKhN1gW2+eCrhFjIxfYP7DF5OplvUgcKGapnrMDhQjYtwwiY7q8JtestmSj9u7H5Vkqk
141-
DL1PkIutlK/7fx6UZ5MUsZSlXCClTN+mQZh1gTt0pyZtzmvo666Q6/PSS//abXLUt9cAavkQA7BdMsg6
142-
0C75+gAYKZdlM7aQsgPLLZQyLLdQyqb6bzvEAlm5Q1yjLY2Sb2YafbD+XwdGf5FtZilhguYuJcxEfqha
143-
djHHdlMxRz5zMQejLqdhmS80N4NsDfpCA31eKZu2k1ydF46cXUMffdlga9BXSihf6r1g11j5l3ro81kF
144-
pUG53IXkxs4BaJN5lqkSF/pZJXEvaKZm+bBFj1N/29p09akPLPDBF725P2yB5X8cZJDhppUAudsF5BZ1
145-
cFfm0yL40JqDsLSj+ribMBuj/bxewqHK7CRHS4VuyzrXtw2Arj76ssEWm3Mf2FkhrcnN8rdtJQD1iqJL
146-
EMrflf2JqYTb0RWftVMf6qNv7xt2EZAOVYrK3VH9zNqGvllo5TD6AQh61APIchrbyuk5sLb2FzTcBEbA
147-
sEjtAAAAAElFTkSuQmCC
129+
iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAA/FJREFUaEPt
130+
2b2uTVEQB/DrO4QSFVqNUoJKoeAJUOMp9CKoJHgBNRXxACioNUQ0CqJAoUB8zO/mTLKy7LP32ffsc+7Z
131+
iX/yz1139qyZWV+zZu+ztkBsCT6bUHt02BH8OaH26LAz+H8Ay8K24Mng1eDD4Kvg5+DvCbXJPKNDV59N
132+
x6Hg9eD7YAY7K/XRl42lY3/wTvB78E9QQG+Ct4MXgseCB4O5hbTJPKNDVz9kgy02l4KLwU9BQf8I3g+e
133+
CNapsu0M0NVHXzbYYtMAFwZB3A3mFngSPBqchlkPMRtspV0+tgcHxZ7go6Al/xa8HOxC3yx0Jci2QfC1
134+
OzgIOM/gPwSPB5uwNXg6eCv4NPgxmLOqTeYZHbpNYJsPvvgcZCVy2zDctGWkw0vB18EMuIt09WlKpXzw
135+
RY/vueDAMmRpm2aes5dBOmbtbfBa8EzwSDC3kDaZZ3RS/0WwaVL4yu204YMtrWW2adrz54JfgwJ5Fzwf
136+
LGd02hmgQ1cffdk4G6zhTPAthg2lWLmZARmihuDlb8+lwn3BGl2HWB992WCraRCZncTSC25HRuXoeon9
137+
b9YYvkEwBVlOO7xt5TQbbLHZ5EsMYul1Y7viLa8ZKmH57fmmZ00QeFvwCbbyTNQHO5+JaSYwoE7RyW1Z
138+
QuYwW/bvXoKBYDvlmeCjhBjIxVQPrhEqRUGqV8rZk7szVTqEQ4NNtvko7wkxiMUzsXVCuUtZ0VXCBWQm
139+
pMGZZqIn2MwUy1cJsZCLrRNqdsp1/nWLGoBcviiwzTdfJcRCLrZOePGgrPwtIZuQu5C6sCto1r5MqE3W
140+
Bbb54KuEWMjF9g/sMXk6mW9SBwoZqmeswOFCNi3DCJjurwm16y2ZKP27sflWSqQMvU+Qi62Ur/t/HpRn
141+
kxSxlKVcIKVM36ZBmHWBO3SnJm3Oa+jrrpDr89JL/9ptctS31wBq+RADsF0yyDrQLvn6ABgpl2UztpCy
142+
A8stlDIst1DKpvpvO8QCWblDXKMtjZJvZhp9sP5fB0Z/kW1mKWGC5i4lzER+qFp2Mcd2UzFHPnMxB6Mu
143+
p2GZLzQ3g2wN+kIDfV4pm7aTXJ0XjpxdQx992WBr0FdKKF/qvWDXWPmXeujzWQWlQbncheTGzgFok3mW
144+
qRIX+lklcS9opmb5sEWPU3/b2nT1qQ8s8MEXvbk/bIHlfxxkkOGmlQC52wXkFnVwV+bTIvjQmoOwtKP6
145+
uJswG6P9vF7CocrsJEdLhW7LOte3DYCuPvqywRabcx/YWSGtyc3yt20lAPWKoksQyt+V/YmphNvRFZ+1
146+
Ux/qo2/vG3YRkA5VisrdUf3M2oa+WWjlMPoBCHrUA8hyGtvK6TmwtvYXNNwERsCwSO0AAAAASUVORK5C
147+
YII=
148148
</value>
149149
</data>
150150
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">

0 commit comments

Comments
 (0)