魔法薇ㄦ的书馆

wherewhere的个人博客

众所周知,UWP 使用的窗口模型是 CoreWindow,但是 UWP 本身只是一个应用模型,所以完全可以创建 win32 窗口,那么我们可以不可以创建一个 win32 窗口,然后像 XAML 岛 (XAML Islands) 一样把 XAML 托管上去呢?本篇将讲述如何利用 WAS (Windows App SDK,俗称 WinUI3) 在 UWP 创建一个 XAML 岛窗口。

屏幕截图(754)

演示视频:https://x.com/wherewhere7/status/1721570411388039587

由于 WAS 在 win32 应用模型下本身就是个 XAML 岛,所以 WAS 对 XAML 岛的支持要比 WUXC (Windows.UI.Xaml.Controls) 要好多了,接下来的内容大多是将 WAS 中实现窗口的方法迁移到 C#。

首先,不管是 WUXC 还是 WAS 的 XAML 岛都会判断当前的应用模型是否为ClassicDesktop,所以我们需要利用Detours劫持AppPolicyGetWindowingModel方法。具体内容如下:

阅读全文 »

众所周知,WAS (Windows App SDK,俗称 WinUI3)在刚开始是支持 UWP 的,甚至最早只支持 UWP,但是微软在正式版发布前删除了对 UWP 的支持,不过真的删除了吗?初生之鸟2023年10月发现在 VS 调试下无视报错继续运行可以正常在 UWP 加载 WAS。随着 WAS 的开源,WAS 阻止在 UWP 上运行的原因也被找到,至此大家终于找到在 UWP 上使用 WAS 的方法了。

WAS 阻止在 UWP 上运行的方法很简单,就是检查注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WinUI\Xaml\EnableUWPWindow是否为00000001,如果不是就直接报错。

Window_Partial.cpp#L80-L114
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
// ----------------------------------------------------------------------
// IWindow
// ----------------------------------------------------------------------
Window::Window()
{
// The first window created internally by DXamlCore _must_ be a UWP Window. DXamlCore
// requires and controls the lifetime of a hidden UWP Microsoft.UI.Xaml.Window.
// note that this Window instance will be the 'real' window for UWP instances, but
// serves as a dummy for all other instances. dummy behavior is deprecated and being removed.
auto dxamlCore = DXamlCore::GetCurrent();
Window* window = dxamlCore->GetDummyWindowNoRef();

if (!window)
{
// Do a runtime check to see if UWP should be enabled
static auto runtimeEnabledFeatureDetector = RuntimeFeatureBehavior::GetRuntimeEnabledFeatureDetector();
auto UWPWindowEnabled = runtimeEnabledFeatureDetector->IsFeatureEnabled(RuntimeEnabledFeature::EnableUWPWindow);

// WinUI UWP
if (!UWPWindowEnabled && DXamlCore::GetCurrent()->GetHandle()->GetInitializationType() != InitializationType::IslandsOnly)
{
::RoOriginateError(
E_NOT_SUPPORTED,
wrl_wrappers::HStringReference(
L"WinUI: Error creating an UWP Window. Creating an UWP window is not allowed."
).Get());
XAML_FAIL_FAST();
}
m_spWindowImpl = std::make_shared<UWPWindowImpl>(this);
}
else
{
m_spWindowImpl = std::make_shared<DesktopWindowImpl>(this);
}
}
阅读全文 »

总说周知,UWP 是运行在沙盒里面的,所有权限都有严格限制,和沙盒外交互也需要特殊的通道,所以从根本杜绝了 UWP 毒瘤的存在。但是实际上 UWP 只是一个应用模型,本身是没有什么权限管理的,权限管理全靠 App Container 沙盒控制,如果我们脱离了这个沙盒,UWP 就会放飞自我了。那么有没有这种可能呢?

我们打开设置应用,通过任务管理器查看进程,就会发现它并没有 Runtime Broker 存在,这个进程是用来在沙盒间代理的,这说明微软给 UWP 开了一个后门。

任务管理器

那么我们是不是也有办法脱离沙盒运行呢?Ahmed Walid 在 2023年2月 发表了这样一个帖子

阅读全文 »

众所周知,C# 只支持对 基类/接口/class/struct/new() 以及一些 IDE 魔法的约束,比如这样

1
2
3
4
5
6
7
8
9
public static string Test<T>(T value) where T : ITest
{
return value.Test();
}

public interface ITest
{
string Test();
}

但是如果我们想要随心所欲的约束就不行了

1
2
3
4
public static string Test<T>(T value) where T : { string Test(); }
{
return value.Test();
}

最近无聊乱折腾 MSIL,弄出来好多不能跑的魔法,虽然不能跑但是反编译出的 C# 看着很神奇,其中正好就有想看看能不能弄个神奇的泛型出来,于是我胡写了一段代码

阅读全文 »

Announcing

We have packaged this project into winrt. With the winrt version, we can use it in cpp/winrt and other projects. You can find the winrt version in winrt branch.

How to use it

There are two way to reference it.

  • Reference to the project directly

    Fork this repository and change the branch to winrt.

    • If your project is face to uwp, add this to your .vcproj

      1
      2
      3
      4
      <ProjectReference Include="\path\to\AdvancedSharpAdbClient.WinRT.csproj">
      <Project>{083cdc04-9cc2-46e4-84c2-55b645be9d50}</Project>
      <SetTargetFramework>TargetFramework=uap10.0</SetTargetFramework>
      </ProjectReference>
    • If your project is face to desktop, add this to your .vcproj

      1
      2
      3
      4
      <ProjectReference Include="\path\to\AdvancedSharpAdbClient.WinRT.csproj">
      <Project>{083cdc04-9cc2-46e4-84c2-55b645be9d50}</Project>
      <SetTargetFramework>TargetFramework=net6.0-windows10.0.17763.0</SetTargetFramework>
      </ProjectReference>
  • Reference to the nuget package

    阅读全文 »

APK Installer LOGO

APK Installer

一个适用于 WIndows 的 Android 应用安装程序

CrowdinCrowdin

注意

  • 本应用已上架应用商店,请认准作者为 wherewhere,请不要使用来历不明的版本,如果因为使用不明版本而出现的故障请自行解决。
  • 本应用分为 WinUI3版WPF版,请根据需要选取

下载链接

APK 安装程序 - WinUI 3APK 安装程序 - WPF

如何安装应用

最低需求

  • Windows 10 Build 18362及以上
  • 设备需支持ARM64/x86/x64
  • 至少400MB的空余储存空间(用于储存安装包与安装应用)

使用应用安装脚本安装应用

阅读全文 »

【UWP】开发小技巧――判断类是否存在

#UWP# #爱编程# #电脑玩家#

不要问我这个需求是怎么冒出来的,自己没事找事要支持 10240,结果发现啥都不支持,真是太糟糕了。

一般而言,这类需求都是想办法通过类名新建对象,一开始我也是这么想的,不过网上那些教程都是单纯 .NET 的,不支持 UWP (也可能是我太菜了,不会用),所以直接白嫖是不可能了。。。

示例

不过判断是否存在不需要这么复杂,C# 有专门的 GetType 方法来找类,所以事情就简单了,直接 Type.GetType("类名") 就行了,不过真的是这样吗?

阅读全文 »

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

材质简介

由于基岩版没有红石百搭包,于是就自己做了一套红石显示,基于BareBones材质包,借鉴了XeKr红石显示。

材质自用,按照个人喜好设计,如果有建议欢迎提出,但不一定接受

BareBones材质简介:Bare Bones Texture Pack 官方都在用的朴素真理材质包

屏幕截图

Screenshot_20210204-201635_5c8300b655012b1930f2e0a7b81bf6a9

Screenshot_20210204-201715_5c8300b655012b1930f2e0a7b81bf6a9

阅读全文 »
0%