ν λ¬μ νλ²μ κΈμ μ¨μΌμ§ νλ λ§μμΌλ‘β¦
λ μΈμ§ κ³ λ―Όνλ€ μΌλ§ μ κ°λ°ν λ΄μ©μ 곡μ λλ¦΄κΉ ν©λλ€.
μ΄λ² μ£Όμ λ λ·λ·μΈλ― λ·λ·μλ λ·λ·κ°μ μ£Όμ μΈλ° μ½κ° κ΅μ μμ€μΌλ‘ λ΄μ£Όμ
λ λκ³
λ§μ§λ§μ μ΄κ±Έ μλ©΄ μ΄λ°κ±Έ μ’ λ μ μ΄ν΄ν μ μλ€ νλ λ΄μ©λ μμΌλ μ°Έκ³ ν΄ μ£ΌμκΈ° λ°λλλ€.
νλ‘κ·Έλ¨μ λ§λ€ λ 컨νΈλ‘€μ λ§λ€κ³ κ°λ°νλ©΄ λΉμ°νλ€ μκ°νλ λΆλΆλ€μ΄ μμ΅λλ€.
κ·Έλ €μ§κ³ , ν΄λ¦λκ³ , μ΄λνκ³ κ·Έλ°κ²λ€μ΄μ£ .
μ΄ λͺ¨λκ° λΉμ°νκ² λλ κ²λ€μ΄μ§λ§ μ€μ λ‘ μ’ λ 볡μ‘ν κ΅¬μ‘°κ° μ¨μ΄ μμ΅λλ€.
μ°μ WPFκ° μ¬μ©νλ OS(Operating system) μ¦ Windowsμ λν΄μ μ‘°κΈ μκ³ κ° νμκ° μμ΅λλ€.
μΌλ°μ μΌλ‘ OSλ SDK(Software development kit)λ₯Ό μ κ³΅ν΄ μ€λλ€.
Windows μ κ²½μ° SDKλ₯Ό CμΈμ΄λ‘ μ 곡 νκ³ μκ³ κ·Έ μμλ μ¬λ¬ λΌμ΄λΈλ¬λ¦¬μ ν€λνμΌμ΄ μμ΅λλ€.
κ·Έλ¦¬κ³ κ·Έ ν€λνμΌμ μ μΈ λμ΄ μλ ν¨μλ€μ API(Application Programming Interface)λΌκ³ ν©λλ€.
κ·Έκ²λ€μ ν΅ν΄μ μ°λ¦¬λ νλ‘κ·Έλ¨μ κ°λ°ν μ μμ΅λλ€.
μ΄λ° WinAPI λ₯Ό ν΅ν΄μ λ§λλ κ°λ¨ν μνμ VSμμ μ κ³΅ν΄ μ€λλ€.
μμ μλ μ¬λ¬ μμ€ μ€μμ μ°λ¦¬κ° λ΄μΌ ν κ²μ λ¨ 7μ€μ λλ€.
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Windows μμ λͺ¨λ νλ‘κ·Έλ¨μ κ°μμ λ©μΈμ§ νλ₯Ό κ°μ§κ³ μκ³
OSλ ν΄λΉ νλ‘κ·Έλ¨μ λ§λ λ©μΈμ§λ₯Ό νμ λ£μ΄ μ€λλ€.
νλ‘κ·Έλ¨μ μμ μ λ©μΈμ§ νμ λ©μΈμ§κ° λ€μ΄ μ€λ©΄
κ·Έκ²μ κ°μ Έλ€κ° λ©μΈμ§μ λ§λ λμμ ν©λλ€.
WPFλ κ·Έλ° λ³΅μ‘ν λ΄μ©λ€μ κ°μ²΄μ§ν₯μ μΌλ‘ μ λΆλ¦¬νκ³
λ©ννμ¬ μ°λμ¬λμκ² νΈμμ±μ μ 곡νλ νλ μμν¬μ
λλ€.
μ¦, APIλ₯Ό μμ°λκ² μλλΌ λ΄λΆμ μ¨κ²¨ λμ κ²λλ€.
μ€μ μ½λλ‘ λ³΄λ©΄ Dispatcher μμ λμνλ κ±Έλ‘ λ³΄μ΄λ€μ.
λ§μ΄ κΈΈμ΄ μ‘λλ° κ°λ¨ν μ 리νλ©΄
Windowsμμλ λͺ¨λ μ΄λ²€νΈ μ²λ¦¬λ λ©μΈμ§νμ μλ λ©μΈμ§λ₯Ό
ννν΄μ μ²λ¦¬ νλ€. μ΄λ₯Ό λ©μΈμ§ 루νλΌκ³ λΆλ₯Έλ€
μ λλ€.
κ·ΈλΌ λ§μ§λ§μΌλ‘ μ΄κ±Έ μ μμμΌ λλ? μ
λλ€.
WPFκ° λͺ¨λ APIλ₯Ό λ©νν΄ λμ WPF κΈ°λ³Έ κΈ°λ₯μΌλ‘
Windowsμ λͺ¨λ κΈ°λ₯μ μΈμ μλ€λ©΄ μ λ΄μ©μ λͺ°λΌλ μκ΄μ΄ μμ΅λλ€.
νμ§λ§ λͺλͺ κΈ°λ₯μ λν΄μλ μμ§ μ§μ λμ§ μλ λ΄μ©μ΄ μμ΅λλ€.
κ°μ₯ λνμ μΈ μλ‘ Clipboard Change μ λλ€.
μμ μ΄ λ§λ€ νλ‘κ·Έλ¨μμ Windows μ ν΄λ¦½λ³΄λλ₯Ό μ°λ κ²½μ°κ° μμμ μμ΅λλ€.
.net core WPFμμ ν΄λ¦½λ³΄λλ₯Ό μΈλλ System.Windows.Clipboard ν΄λμ€λ₯Ό ν΅ν΄μ
ν΄λ¦½λ³΄λμ λ°μ΄ν°λ₯Ό μ°κ³ μ½μ μ μμ΅λλ€.
νμ§λ§ ν΄λ¦½λ³΄λκ° λ³κ²½λμμλ μλ¦Όμ λ°μμ μλ κΈ°λ₯μ μμ§ κ΅¬ν λμ΄ μμ§ μμ΅λλ€.
λ©λͺ¨μ₯μμ κΈμ¨κ° λ³΅μ¬ λμμλ λ΄μͺ½μμλ λΆμ¬ λ£λ λ°μ΄ν°κ° μλ€λκ±Έ μμμΌ ν μ μμ΅λλ€.
ν΄λΉ κΈ°λ₯μ ꡬνν μλ₯Ό λ³΄μ¬ λλ¦¬κ² μ΅λλ€.
[DllImport("User32.dll")]
public static extern IntPtr SetClipboardViewer(IntPtr hWnd);
//........
WindowInteropHelper helper = new(this);
HwndSource.FromHwnd(hWnd).AddHook(new HwndSourceHook(WndProc));
next = SetClipboardViewer(hWnd);
// .......
private nint WndProc(nint hwnd, int msg, nint wParam, nint lParam, ref bool handled)
{
switch ((User32.WindowMessage)msg)
{
case User32.WindowMessage.WM_CHANGECBCHAIN:
if (wParam == next)
next = lParam;
else if (next != 0)
User32.SendMessage(next, (User32.WindowMessage)msg, wParam, lParam);
break;
case User32.WindowMessage.WM_DRAWCLIPBOARD:
ClipboardChanged();
User32.SendMessage(next, (User32.WindowMessage)msg, wParam, lParam);
break;
}
return IntPtr.Zero;
}
μμμ λ§μ λλ¦° λ©μΈμ§λ£¨νλ λ무 κΈΈμ΄μ λΊ WndProc κ°μκ±Έ μ΄λ μ λ
μ΄ν΄λ§ νκ³ κ³μλ©΄ μ΄λ° λ¬Έμ κ° μκ²Όμλ
κ²μ λ μμ€λ₯Ό λ³΄κ³ μ΄ν΄ νλλ° λμμ΄ λμ€κ±° κ°λ€μ.