기능 추가 Ctrl+Shift+P , 한영 변경

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019WT2pzDE45iP4QMAAo7cyz
main v1.0.0
Claude 2026-10-21 06:48:40 +00:00
parent e7f39a7bc1
commit 46f40219a3
No known key found for this signature in database
1 changed files with 101 additions and 2 deletions

View File

@ -2,6 +2,7 @@ using System;
using System.Drawing;
using System.IO;
using System.Security.Cryptography;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;
@ -50,8 +51,8 @@ namespace WindowsKeyInfo
private const int HashSize = 32;
// 내장 마스터 암호 (변경 불가) — 원문 대신 솔트와 해시만 보관
private static readonly byte[] BuiltInSalt = Convert.FromBase64String("R2lR1GEm7i5aAldpu9RynQ==");
private static readonly byte[] BuiltInHash = Convert.FromBase64String("r5zE7lvhdNTDklWIrkDd47Vhqq8lVBt9So8aYMLGFnY=");
private static readonly byte[] BuiltInSalt = Convert.FromBase64String("nkeJJJqcUJ+4KYuNEcYFiQ==");
private static readonly byte[] BuiltInHash = Convert.FromBase64String("9Y8DuoR8YwDoIak79Wt0db3truf7+Z0rMPhEPY2c6og=");
/// <summary>내장 암호 또는 사용자 지정 암호 중 하나와 일치하면 true</summary>
public static bool Verify(string password)
@ -179,6 +180,100 @@ namespace WindowsKeyInfo
}
}
/// <summary>암호 입력칸용: 들어가면 영문 입력 + Caps Lock 끔, 나가면(창 닫힘 포함) 원래 입력 방식으로 복구</summary>
internal static class EnglishInput
{
[DllImport("imm32.dll")] private static extern IntPtr ImmGetContext(IntPtr hWnd);
[DllImport("imm32.dll")] private static extern bool ImmReleaseContext(IntPtr hWnd, IntPtr hIMC);
[DllImport("imm32.dll")] private static extern bool ImmGetConversionStatus(IntPtr hIMC, out int conversion, out int sentence);
[DllImport("imm32.dll")] private static extern bool ImmSetConversionStatus(IntPtr hIMC, int conversion, int sentence);
[DllImport("user32.dll")] private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
private const int ImeCmodeNative = 0x0001; // 한글 모드 비트
private const byte VkCapital = 0x14;
private const uint KeyEventFKeyUp = 0x0002;
public static void Attach(TextBox box)
{
InputLanguage saved = null;
bool active = false;
box.ImeMode = ImeMode.Alpha;
Action restore = () =>
{
if (!active) return;
active = false;
try
{
if (saved != null && !saved.Equals(InputLanguage.CurrentInputLanguage))
InputLanguage.CurrentInputLanguage = saved;
}
catch { }
};
box.Enter += (s, e) =>
{
if (active) return;
active = true;
saved = InputLanguage.CurrentInputLanguage;
try
{
// 1) 영어 키보드가 설치돼 있으면 그쪽으로 전환
InputLanguage english = null;
foreach (InputLanguage lang in InputLanguage.InstalledInputLanguages)
{
if (lang.Culture.TwoLetterISOLanguageName == "en") { english = lang; break; }
}
if (english != null && !english.Equals(InputLanguage.CurrentInputLanguage))
InputLanguage.CurrentInputLanguage = english;
}
catch { }
// 2) 영어 키보드가 없으면(또는 여전히 한글 IME면) IME를 영문 모드로
SetImeAlphanumeric(box);
// 3) Caps Lock이 켜져 있으면 끔
TurnOffCapsLock();
};
box.Leave += (s, e) => restore();
box.HandleDestroyed += (s, e) => restore();
}
private static void SetImeAlphanumeric(Control c)
{
try
{
IntPtr himc = ImmGetContext(c.Handle);
if (himc == IntPtr.Zero) return;
try
{
int conv, sent;
if (ImmGetConversionStatus(himc, out conv, out sent) && (conv & ImeCmodeNative) != 0)
ImmSetConversionStatus(himc, conv & ~ImeCmodeNative, sent);
}
finally
{
ImmReleaseContext(c.Handle, himc);
}
}
catch { }
}
private static void TurnOffCapsLock()
{
try
{
if (!Control.IsKeyLocked(Keys.CapsLock)) return;
keybd_event(VkCapital, 0x45, 0, UIntPtr.Zero);
keybd_event(VkCapital, 0x45, KeyEventFKeyUp, UIntPtr.Zero);
}
catch { }
}
}
/// <summary>처음 알림창: "Windows Key" + [확인]만 표시, 입력은 화면 밖 숨은 칸으로 받음</summary>
internal sealed class UnlockDialog : Form
{
@ -224,6 +319,8 @@ namespace WindowsKeyInfo
ShortcutsEnabled = false
};
EnglishInput.Attach(_hidden);
Controls.Add(lbl);
Controls.Add(btnOk);
Controls.Add(_hidden);
@ -285,6 +382,7 @@ namespace WindowsKeyInfo
Controls.Add(_box);
Controls.Add(btnOk);
Controls.Add(btnCancel);
EnglishInput.Attach(_box);
AcceptButton = btnOk;
CancelButton = btnCancel;
ActiveControl = _box;
@ -344,6 +442,7 @@ namespace WindowsKeyInfo
Controls.Add(_box);
Controls.Add(btnOk);
Controls.Add(btnCancel);
EnglishInput.Attach(_box);
AcceptButton = btnOk;
CancelButton = btnCancel;
}