Introduction

前回はパッケージではなくexe単独での動作を確認した。
今回は、 Win32 API を呼び出すことができるかを確認する。
ソースは下記になります

Where is Window handle?

何がなくともハンドルがないと何もできないので、まずはその取得手段を探す。

と思ったら、やはり先人が調べていてくださった。

が…ちょっとこのissueが古い。
結果としては下記だけでOK.

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
using System;
using System.Runtime.InteropServices;

// https://github.com/microsoft/microsoft-ui-xaml/issues/2828#issuecomment-653825561
namespace _01_Win32API
{

[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("EECDBF0E-BAE9-4CB6-A68E-9598E1CB57BB")]
public interface IWindowNative
{

IntPtr WindowHandle
{
get;
}

}

/// <summary>
/// An empty window that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainWindow : Window
{

#region P/Invokes

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int GetWindowTextLength(IntPtr hwnd);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int GetWindowText(IntPtr hWnd, string lpString, int nMaxCount);

#endregion

#region Construtors

public MainWindow()
{
this.InitializeComponent();
}

#endregion

#region Event Handlers

private async void myButton_Click(object sender, RoutedEventArgs e)
{
// Require using WinRT;
var windowNative = this.As<IWindowNative>();
var hwnd = windowNative.WindowHandle;

var length = GetWindowTextLength(hwnd);

string lpString = new string('0', length + 1);
var ret = GetWindowText(hwnd, lpString, length + 1);

var cd = new ContentDialog
{
Title = "Hello Win32 API",
Content = $"GetWindowText returns '{lpString}' [{ret}]",
CloseButtonText = "OK"
};

cd.XamlRoot = this.Content.XamlRoot;
await cd.ShowAsync();
}

#endregion

}

}

COMを経由してるのか…とげんなりしつつも目的を達成。

app

Source Code

https://github.com/takuya-takeuchi/Demo/tree/master/WinUI/01_Win32API