을 읽다가 공유 드리면 좋을거 같은 정보가 있어서 적습니다.
C/CPP 로 만든 DLL의 구조체나 클래스를 만들어 호출 하는 것을 마샬링이라고 합니다.
MS에서 제공하는 DLL 이 아닌 경우는 직접 마샬링 할수 밖에 없지만
MS에서 제공 하는 API의 경우 다 정해져 있는 상황에서
굳이 내가 그걸 또 마샬링 할 필요가 있을까요? 누군가 만들어 주면
가져다 쓰기만 하면 어떨까요?
네. 이미 있습니다.
해당 프로젝트는 CsWin32 로 변경 되어
더이상 지원 되지 않는다고 나오는데요.
저같은 경우는 예전부터 쓰던거라 익숙함을 버리지 못하고 그냥 쓰고 있습니다.
간단하게 사용법 보여 드리겠습니다. (mvvm이 중요한게 아니니 그냥 비하인드 코드로 작성했습니다.)
User32를 쓸거기 때문에 PInvoke.User32 를 nuget을 추가해 주시고요.
// xaml
<Window
x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="200"
Height="200"
KeyDown="Window_KeyDown"
mc:Ignorable="d">
<Grid>
<Button Click="Button_Click" Content="Test" />
</Grid>
</Window>
// cs
using PInvoke;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Input;
namespace WpfApp1;
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
User32.INPUT input = new User32.INPUT();
input.type = User32.InputType.INPUT_KEYBOARD;
input.Inputs.ki.wVk = User32.VirtualKey.VK_A;
User32.SendInput(1, [input], Marshal.SizeOf(input));
input.Inputs.ki.dwFlags = User32.KEYEVENTF.KEYEVENTF_KEYUP;
User32.SendInput(1, [input], Marshal.SizeOf(input));
}
private void Window_KeyDown(object sender, KeyEventArgs e)
{
MessageBox.Show(e.Key.ToString());
}
}
동작을 동영상으로 찍었는데 첨부가 안되네요…;;;
보시다 싶이 이미 모든 구조체가 마샬링 되어 있고
값또한 enum으로 잡혀 있어서 쓰기가 매우 편리합니다.
개인적 생각으론 Microsoft.WindowsDesktop.App.WPF 프레임워크에
해당 기능을 넣어 주면 어떨까 싶습니다.