기능 추가 Ctrl+Shift+P , 한영 변경
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019WT2pzDE45iP4QMAAo7cyzmain v1.0.0
parent
e7f39a7bc1
commit
46f40219a3
103
Program.cs
103
Program.cs
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue