问题标签 [winapi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
1922 浏览

wpf - 那么我在这里的 WPF 中缺少什么?

背景:我有一个小的视频播放应用程序,其 UI 灵感来自古老的 Sasami2k,刚刚更新为使用 VMR9(即 Direct3D9 和 DirectShow)并且不太不稳定。目前,它是一个使用原始 Win32 的 C++ 应用程序,这是必要的:各种工具包都不值得一提。尤其是 WPF,由于其空域限制,它是不可能的。

好的,所以,既然 D3DImage 存在,混合和匹配 D3D/VMR9/DirectShow 和 WPF 可能是可行的。鉴于过去对 Win32 不可扩展性的不满,这似乎是件好事。

但是你知道,我在这里遇到了第一道障碍。

使用 Win32,我(非常容易)创建了一个可调整大小、按比例调整大小、捕捉到屏幕边缘并在最大化时占据整个屏幕(包括任务栏区域)的无边框窗口。这是一个视频应用程序,所以这些都是非常理想的属性。

好的,那么,如何对 WPF 做同样的事情呢?

在 Win32 中,我使用: WM_GETMINMAXINFO 控制最大化行为 WM_NCHITTEST 控制调整边框大小 WM_MOVING 控制对齐屏幕边缘 WM_SIZING 控制调整大小纵横比

但是,查看 WPF 似乎各种事件来得太晚了,除非我误解了文档?

例如,我不知道我什么时候移动,因为 LocationChanged 说它只有在窗口移动后才会触发(为时已晚)。同样,StateChanged 似乎仅在窗口恢复/最大化后触发(当我需要最大化之前的信息时,告诉系统正确的最大化大小)。

而且我似乎完全忽略了系统告诉我调整大小的位置。同样的命中测试。

所以,呃,我是不是在这里遗漏了什么,或者我别无选择,只能退回去挂钩这个东西的 wndproc?我可以在不连接 WndProc 的情况下做我想做的事吗?

如果我必须使用 WndProc,我不妨坚持使用我现有的代码库;我想要更简单、更干净的 UI 代码,而远离 WndProc 是这方面的基础。

如果我必须挂钩 WndProc,我不得不想知道——为什么?Win32 有 sizing/sized、moving/moved、poscharging/poschanged 窗口消息,它们都很有用。为什么 WPF 不复制同一组事件?这似乎是功能上不必要的差距。

另外,这意味着 WPF 与特定的 USER32 相关的实现相关联。这意味着 MS 不能(例如在 Windows 7 或 8 中)反转显示层以使 WPF“原生”并为旧版应用程序模拟 HWND 和 WndProcs——尽管这正是 MS 应该做的。

0 投票
2 回答
385 浏览

windows - 有什么类似于 Windows 上的 OS X InputManager 的吗?

Windows 上有什么类似的东西可以实现与 OS X 上的 InputManager 相同的功能吗?

0 投票
17 回答
235625 浏览

.net - 如何配置 OpenFileDialog 来选择文件夹?

在 VS .NET 中,当您为项目选择文件夹时,会显示一个类似于 OpenFileDialog 或 SaveFileDialog 的对话框,但设置为仅接受文件夹。自从我看到这个,我就想知道它是如何完成的。我知道 FolderBrowserDialog,但我从来没有真正喜欢过那个对话框。它开始太小,不让我利用能够键入路径的优势。

我几乎可以肯定现在没有办法从 .NET 中做到这一点,但我也很好奇你是如何从非托管代码中做到这一点的。如果没有从头开始完全重新实现对话框,您如何修改对话框以使其具有这种行为?

我还想重申我知道 FolderBrowserDialog 但有时我不喜欢使用它,除了真的很好奇如何以这种方式配置对话框。告诉我只使用 FolderBrowserDialog 有助于我保持一致的 UI 体验,但不能满足我的好奇心,所以它不会算作答案。

这也不是特定于 Vista 的东西。我从 VS .NET 2003 开始​​就看到了这个对话框,所以它在 Win2k 和 WinXP 中是可行的。这不是“我想知道执行此操作的正确方法”的问题,而是“自从我第一次想在 VS 2003 中这样做以来,我一直对此感到好奇”的问题。我知道 Vista 的文件对话框有一个选项可以做到这一点,但它一直在 XP 中工作,所以我知道他们做了一些事情来让它工作。Vista 特定的答案不是答案,因为问题上下文中不存在 Vista。

更新:我接受 Scott Wisniewski 的回答,因为它带有一个工作示例,但我认为 Serge 指出对话框自定义(这对于 .NET 来说是令人讨厌的,但它确实有效)和 Mark Ransom 找出那个 MS 值得称赞可能为此任务滚动了一个自定义对话框。

0 投票
4 回答
13877 浏览

winapi - CreateProcessAsUser 与 ShellExecute

作为另一个用户,我需要一些东西,目前我用那个调用ShellExecute启动了一个辅助进程,但这似乎太过分了(错误的父进程等)。有没有更好的方法来做到这一点?CreateProcessAsUserShellExecute

@PabloG:ImpersonateLoggedOnUser 不起作用:

将以登录用户身份启动 calc,而不是“其他用户”

@1800 信息:CreateProcess/CreateProcessAsUserShellExecuteVista 上的 UAC 不同,CreateProcess当您无法控制用户正在执行的程序时,它是无用的(CreateProcess如果您给它一个带有清单标记为的 exe 文件,则会返回错误)要求管理员)

@Brian R. Bondy:我已经知道这个信息(不要误会,它的好东西),但它是题外话(恕我直言)我要求一个ShellExecuteAsUser,而不是作为另一个用户启动进程,我已经知道怎么做。

0 投票
8 回答
162227 浏览

c++ - 如何从 Windows 注册表中读取值

给定一些注册表值的键(例如 HKEY_LOCAL_MACHINE\blah\blah\blah\foo)我怎么能:

  1. 安全地确定存在这样的密钥。
  2. 以编程方式(即使用代码)获得它的价值。

我绝对无意将任何内容写回注册表(如果我能提供帮助,在我的职业生涯中)。因此,如果我不正确地写入注册表,我们可以跳过关于我体内每个分子以光速爆炸的讲座。

更喜欢 C++ 中的答案,但主要只需要知道获得该值的特殊 Windows API 咒语是什么。

0 投票
5 回答
4832 浏览

winapi - Win32 rsync 端口的技术障碍

尽管我主要是 Windows 用户,但我是 rsync 的忠实粉丝。现在,我不想争论 rsync 与任何其他工具的优点……这不是我的意思。

我发现在 Windows 上运行 rsync 的唯一方法是通过构建为在 Cygwin 之上运行的版本,并且由于 Cygwin 存在 Unicode 问题,rsync 也是如此。

是否有人足够熟悉 rsync 的工作原理,可以说将 rsync 移植到本机 Win32 二进制文件是否存在任何真正的技术编程障碍?

还是可能是 Windows 用户从来没有足够的兴趣来关心移植它?

部分原因是因为我正在考虑尝试承担启动端口的任务,但我想确保我没有遗漏任何东西,因为它可能无法实现。

0 投票
14 回答
5693 浏览

c++ - C++中的异常被捕获后找出源头?

我正在寻找 MS VC++ 中的答案。

在调试大型 C++ 应用程序时,不幸的是,它大量使用了 C++ 异常。有时我比我真正想要的晚一点才发现异常。

伪代码示例:

我可以在调试时用断点捕获异常。FunctionA()但是如果异常发生在orFunctionB()或其他函数中,我无法追溯。(假设广泛的异常使用和上述示例的巨大版本)。

我的问题的一种解决方案是确定调用堆栈并将其保存在异常构造函数中(即在它被捕获之前)。但这需要我从这个基异常类派生所有异常。它还需要大量代码,并且可能会减慢我的程序。

有没有更简单的方法需要更少的工作?无需更改我的大型代码库?

其他语言有没有更好的解决这个问题的方法?

0 投票
9 回答
22659 浏览

c# - 如何在 C# 中将 IP 地址字符串解析为 uint 值?

我正在编写使用 Windows IP Helper API 的 C# 代码。我试图调用的函数之一是“ GetBestInterface ”,它采用 IP 的“uint”表示。我需要的是解析 IP 的文本表示以创建“uint”表示。

我通过 Google 找到了一些示例,例如this onethis one,但我很确定应该有一种标准方法来使用 .NET 实现这一目标。唯一的问题是,我找不到这种标准方式。IPAddress.Parse 似乎是在正确的方向,但它没有提供任何获取“uint”表示的方式......

还有一种使用 IP Helper 的方法,使用ParseNetworkString,但同样,我宁愿使用 .NET - 我相信我对 pInvoke 的依赖越少越好。

那么,任何人都知道在 .NET 中执行此操作的标准方法吗?

0 投票
3 回答
1581 浏览

c++ - 你必须注册一个对话框吗?

所以,我是任何Windows相关编程的初学者。我一直在玩,Windows API并遇到了几个关于如何初始化创建窗口等的例子。

一个示例创建了一个常规窗口(我缩写了一些代码):

第二个示例创建一个对话框(除了 WinMain 参数没有缩写):

第二个示例不包含对 register 函数的任何调用。它只是创建附加了 DialogProc 进程的 DialogBox。

这工作正常,但我想知道注册窗口类然后创建对话框是否有好处(如果这可能的话)。

0 投票
2 回答
1890 浏览

winapi - 如何获取“特殊”Windows 文件夹(回收站等)的本地化名称?

我正在尝试找出“正确”的 Windows API,以找出“特殊”文件夹的本地化名称,特别是回收站。我希望能够通过适当本地化的对话框提示用户,询问他们是否要将文件发送到回收站或直接删除它们。

我在互联网上(和 Stackoverflow 上)找到了很多关于如何进行实际删除的信息,而且看起来很简单,我只是真的希望能够将文本本地化。