티스토리 뷰
======================================================
안녕하세요 Doridori 입니다.
빰빠라밤!!!
2년만에 드디어 유튜브 구독자분들이 1000명이 넘었습니다.!!!
2년이나 했는데 1000명이냐 라고 하실 수도 있겠지만 한분한분 댓글을 남겨 주시는 분들 때문에 중간중간 힘든 일들이 있었지만
지금 까지 이어 올 수 있지 않았나 싶습니다.!!
요즘도 쉬운 시기는 아니어서 예제에 대해 아쉬운 마음이 가득하지만 처음 준비 할 때 생각 했던 마음 그대로
새로운 기능 한가지 이상, 기존에 했던 부분들은 최대한 복습 가능 하도록 준비 하겠습니다.
모두들 화이팅 이십니다.!!!
======================================================
41. User32.dll (3) (Menu Control)
Source UI) (지난 강의 참고)
Soruce 전체) Study_41_User32.dll 3 (Menu Control).zip
교재) 41. User32.dll 3 (Menu Control).pdf
이번 강의까지 해서 User32.Dll로 부터 시작한 Copy And Paste Program 만들기가 마무리 됩니다.~!
연재 강의 같은 경우는 중간에 보시는 분들이 유입되기 어렵기 때문에 더 쉽지 않은 부분 같습니다.
개인적으로 Copy and Paste 라는 Program을 만드는 부분을 Main으로 하고 3가지 주제를 가지고 진행 해보았습니다.
1. User32.DLL을 가지고 Keyboard Hook 진행 하기
2. 프로그램을 혼자서 만들어 보는 과정을 진행해 보기
3. UI Control 중 Window 관련된 Control 확인 하기 (Menu 기능 사용 하기)
정도로 진행 한것 같습니다.
정말 간단한 프로그램 이기는 하지만 기능을 Test 하기 위한 예제가 아니고 사용 하기 위한 Program이기 때문에
만들고 사용해 본다는것에 대해서 정말 큰 의미를 가질 수 있다고 생각 합니다.
Menu Strip과 Context Menu Strip에 대해서 중점적으로 진행 해보았습니다.
(UI)
실제로 Menu Strip 같은 경우는 이 Program에는 필요 없는 기능 이긴 하지만 Context Menu Strip와 비슷한 기능을 가지기 때문에 양쪽을 다 사용해 보기 위해서 추가 하였습니다.
완성이후에는 Visible을 끄고 숨겨 놨습니다. ^^;;
강의)
Source)
지난번에 사용 했던 KeyboardHook Class는 포함 시키지 않았습니다. (이전강의에서 확인해 주시면 될 것 같습니다.)
Main의 경우 전체 Source를 올리는데 지난 강의와 중복되는 부분이 있기 때문에 확인 하시면 보시면 좋을듯 합니다.
(추가된 부분만 올리려고 하다가 중간에 예외처리한 부분도 있고 해서 Main 전체를 올렸습니다.)
개인적인 생각으로 몇줄 안되는 코드를 가지고 그럴듯한 모양새를 낼 수 있는거 보면 뭔가 기분이 좋아지는것 같습니다. ^^;;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 | using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace CopyAndPaste { public partial class Form1 : Form { CGlobalKeyboardHook _kbdHook = new CGlobalKeyboardHook(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, System.EventArgs e) { Version oVersion = Assembly.GetEntryAssembly().GetName().Version; this.Text = string.Format("{0} Ver.{1}.{2} / Build Time ({3})", "Copy&Paste", oVersion.Major, oVersion.Minor, GetBuildDataTime(oVersion)); //GetBuildDataTime(oVersion); _kbdHook.hook(); _kbdHook.KeyDown += _kbdHook_KeyDown; } public DateTime GetBuildDataTime(Version oVersion) { string strVerstion = oVersion.ToString(); // 날짜 등록 int iDays = Convert.ToInt32(strVerstion.Split('.')[2]); DateTime refData = new DateTime(2000, 1, 1); DateTime dtBuildDate = refData.AddDays(iDays); // 초 등록 int iSeconds = Convert.ToInt32(strVerstion.Split('.')[3]); iSeconds = iSeconds * 2; dtBuildDate = dtBuildDate.AddSeconds(iSeconds); // 시차 조정 DaylightTime daylighttime = TimeZone.CurrentTimeZone.GetDaylightChanges(dtBuildDate.Year); if (TimeZone.IsDaylightSavingTime(dtBuildDate, daylighttime)) { dtBuildDate = dtBuildDate.Add(daylighttime.Delta); } return dtBuildDate; } private void _kbdHook_KeyDown(object sender, KeyEventArgs e) { try { if (e.Control && e.KeyCode == Keys.C) { Thread.Sleep(400); lboxTextSave.Items.Add(Clipboard.GetData(System.Windows.Forms.DataFormats.UnicodeText).ToString()); } } catch (Exception) { } } private void LboxTestSave_SelectedIndexChanged(object sender, System.EventArgs e) { if (lboxTextSave.SelectedIndex != -1) { Clipboard.SetData(System.Windows.Forms.DataFormats.UnicodeText, lboxTextSave.SelectedItem.ToString()); } } private void Scroll_Change(object sender, EventArgs e) { this.Opacity = TBar.Value / 10.0; } private void cboxChange(object sender, EventArgs e) { if (cboxactivation.Checked == true) { //_bcboxactivation = true; lblactivation.Text = "활성화 상태(Ctrl + C 가능)"; lblactivation.Enabled = true; txtlbtextadd.Enabled = true; btnlbtextadd.Enabled = true; } else { //_bcboxactivation = false; lblactivation.Text = "비 활성화(붙여넣기만 가능)"; lblactivation.Enabled = false; txtlbtextadd.Enabled = false; btnlbtextadd.Enabled = false; } } private void btn_AddClick(object sender, EventArgs e) { TEST(); } private void txtlbtextadd_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { TEST(); //btn_AddClick(this, null); } } private void TEST() { string strText = txtlbtextadd.Text; if (strText != "" && !lboxTextSave.Items.Contains(strText)) { lboxTextSave.Items.Add(strText); txtlbtextadd.Text = ""; } } private void lboxKeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Delete) { if (lboxTextSave.SelectedItems.Count > 0) lboxTextSave.Items.RemoveAt(lboxTextSave.SelectedIndex); } } #region MStrip private void 저장하기ToolStripMenuItem_Click(object sender, EventArgs e) { fFileSave(); } private void 불러오기ToolStripMenuItem_Click(object sender, EventArgs e) { fFileLoad(); } private void 프ToolStripMenuItem_Click(object sender, EventArgs e) { fEmptyDelete(); } private void 모두삭제ToolStripMenuItem_Click(object sender, EventArgs e) { fAllDelete(); } private void 프로그램정보ToolStripMenuItem_Click(object sender, EventArgs e) { fProgramInfo(); } #endregion #region CMStrip private void 공백제거ToolStripMenuItem_Click(object sender, EventArgs e) { fEmptyDelete(); } private void 모두삭제ToolStripMenuItem1_Click(object sender, EventArgs e) { fAllDelete(); } private void 저장하기ToolStripMenuItem1_Click(object sender, EventArgs e) { fFileSave(); } private void 불러오기ToolStripMenuItem1_Click(object sender, EventArgs e) { fFileLoad(); } private void 프로그램정보ToolStripMenuItem1_Click(object sender, EventArgs e) { fProgramInfo(); } #endregion #region Event Function /// <summary> /// 공백제거용 함수 /// </summary> private void fEmptyDelete() { int iCount = lboxTextSave.Items.Count; for (int i = 0; i < iCount; i++) { lboxTextSave.Items[i] = lboxTextSave.Items[i].ToString().Trim(); } } /// <summary> /// 모두삭제용 함수 /// </summary> private void fAllDelete() { if(DialogResult.Yes == MessageBox.Show("등록되어 있는 Data를 초기화 합니다.", "ListBox Item Clear", MessageBoxButtons.YesNo)) { lboxTextSave.Items.Clear(); } } /// <summary> /// 저장하기용 함수 /// </summary> private void fFileSave() { SaveFileDialog SFDialog = new SaveFileDialog(); int ilbCount = lboxTextSave.Items.Count; string strFilePath = string.Empty; SFDialog.InitialDirectory = Application.StartupPath; SFDialog.FileName = "*.txt"; SFDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; try { if (SFDialog.ShowDialog() == DialogResult.OK) { strFilePath = SFDialog.FileName; StreamWriter swSFDialog = new StreamWriter(strFilePath); for (int i = 0; i < ilbCount; i++) { swSFDialog.WriteLine(lboxTextSave.Items[i].ToString()); } swSFDialog.Close(); MessageBox.Show("저장이 완료 되었습니다."); } } catch { } } /// <summary> /// 불러오기용 함수 /// </summary> private void fFileLoad() { OpenFileDialog OFDialog = new OpenFileDialog(); string strFilePath = string.Empty; OFDialog.InitialDirectory = Application.StartupPath; OFDialog.FileName = "*.txt"; OFDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; try { if (OFDialog.ShowDialog() == DialogResult.OK) { strFilePath = OFDialog.FileName; StreamReader srOFDialog = new StreamReader(strFilePath, Encoding.UTF8, true); while (srOFDialog.EndOfStream == false) { lboxTextSave.Items.Add(srOFDialog.ReadLine()); } } } catch { } } /// <summary> /// 프로그램 정보 함수 /// </summary> private void fProgramInfo() { string strProgramInfo = "반복작업을 조금이나마 수월하게!!! CNP!!!"; MessageBox.Show(strProgramInfo); } #endregion } } | cs |
'C# > C# 강좌 Winform' 카테고리의 다른 글
Doridori C# 강의 2) 43. 문자열 보간, 이스케이프 시퀀스 (0) | 2020.03.21 |
---|---|
Doridori C# 강의 2) 42. List 조금 더 알기 (2) | 2020.03.08 |
Doridori C# 강의 2) 40. User32.dll (2) (Copy&Paste) (6) | 2020.02.09 |
Doridori C# 강의 2) 39. User32.dll (Keyboard Hook) (4) | 2020.01.27 |
Doridori C# 강의 2) 38. Lock (8) | 2019.11.27 |
- Total
- Today
- Yesterday
- 모바일
- C#
- 가볼만한 곳
- 위스키
- C# 기초 강의
- 주말
- 광저우
- 도리도리
- 프로그램 강의
- 전통주
- 보드카
- 서울
- 소주
- 아이랑
- WinForm
- 맛집
- 가볼만한곳
- 나들이
- Visual Studio
- 도리도리 C#
- 칵테일
- 게임
- 맥주
- 와인
- 하이볼
- C# 강좌
- C# 강의
- 막걸리
- 술
- 증류주
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |