- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在尝试使用 SystemParametersInfo 时卡住了。我使用 Dvorak 键盘,所以我试图制作一个 exe,只要我想更改键盘布局,就可以双击它。我在 C# 中使用 SystemParametersInfo。我可以很好地检索当前的输入语言。但是,当我尝试设置输入语言时,返回值为 false,并且输入语言没有改变。
提前感谢您的帮助。
这是我使用的代码:
class KeyboardSwitcher
{
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref uint pvParam, uint fWinIni);
private const uint SPI_GETDEFAULTINPUTLANG = 0x0059;
private const uint SPI_SETDEFAULTINPUTLANG = 0x005A;
private const uint SPIF_UPDATEINIFILE = 0x01;
private const uint SPIF_SENDWININICHANGE = 0x02;
private const uint DVORAK = 0xF0020409;
private const uint QWERTY = 0x04090409;
static void Main(string[] args)
{
uint currentLayout = 0;
uint newLayout = 0;
bool result = false;
int error = 0;
SystemParametersInfo(SPI_GETDEFAULTINPUTLANG, 0, ref currentLayout, 0);
if(currentLayout != DVORAK) {
newLayout = DVORAK;
/*result = SystemParametersInfo(SPI_SETDEFAULTINPUTLANG, 0, ref newLayout, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);*/
result = SystemParametersInfo(SPI_SETDEFAULTINPUTLANG, 0, ref newLayout, SPIF_SENDWININICHANGE);
error = Marshal.GetLastWin32Error();
}
else {
newLayout = QWERTY;
/*result = SystemParametersInfo(SPI_SETDEFAULTINPUTLANG, 0, ref newLayout, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);*/
result = SystemParametersInfo(SPI_SETDEFAULTINPUTLANG, 0, ref newLayout, SPIF_SENDWININICHANGE);
error = Marshal.GetLastWin32Error();
}
Console.WriteLine(">>> Current Layout <<<");
Console.WriteLine("0x" +currentLayout.ToString("X"));
Console.WriteLine(">>> New Layout <<<");
Console.WriteLine("0x" +newLayout.ToString("X"));
Console.WriteLine("Change Successful >>> " +result);
Console.WriteLine(error);
Console.WriteLine(">>> Final Layout <<<");
uint finalLayout = 0;
SystemParametersInfo(SPI_GETDEFAULTINPUTLANG, 0, ref finalLayout, 0);
Console.WriteLine("0x" +finalLayout.ToString("X"));
Console.WriteLine("Press any key to continue...");
Console.ReadKey(true);
}
}
更新:
我投入了 Console.WriteLine(Marshal.GetLastWin32Error());与其余的打印语句一起返回 0。在阅读评论之前,我还通过导入 Kernel32.dll 尝试了 GetLastError(),它也返回了 0。感谢您的回复。
更新 2:我更改了我的代码以显示我对 GetLastWin32Error() 的用法。
这是我将 Dvorak 设置为默认输入语言时的输出。
>>> Current Layout <<<
0xF0020409
>>> New Layout <<<
0x4090409
Change Successful >>> True
Error Code >>> 0
>>> Final Layout <<<
0x4090409
Press any key to continue...
这是我将 Qwerty 设置为默认输入语言时的输出。
>>> Current Layout <<<
0x4090409
>>> New Layout <<<
0xF0020409
Change Successful >>> True
Error Code >>> 0
>>> Final Layout <<<
0xF0020409
Press any key to continue...
当我将每个布局设置为默认值时,我使用 SPI_GETDEFAULTINPUTLANG 得到了布局的十六进制值。您认为它返回的值可能与我需要发送的值不同吗?
我对 InputLanguage 类做了一些研究,我认为它不适合这种情况,因为 DefaultInputLanguage 属性没有 setter ,也没有其他方法来设置默认输入语言。
更新 3:当我将 SystemParametersInfo 的第四个参数更改为 SPIF_SENDWININICHANGE 时,它变得更接近工作。 SET 的结果是 True,当我来回运行程序时,它会来回切换语言。所以这意味着 Windows 中的一些东西确实正在被改变。但是,更改是新的反射(reflect)在控制面板中,键盘实际上并没有改变。我觉得我确实需要 SPIF_UPDATEINIFILE 来插入更改。我使用的值是正确的,不是吗?我还更新了代码和输出,使输出更加冗长。
最佳答案
要在不重新启动的情况下通知应用程序语言已更改,您需要向应用程序窗口发送一个 WM_INPUTLANGCHANGEREQUEST,然后是一个 WM_INPUTLANGCHANGE 消息,其中 lParam 是区域设置标识符。
关于c# - 帮助使用 SystemParametersInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9669352/
我已经尝试了这些帖子中指定的所有解决方案: How to change the windows 10 wallpaper with C++? How to change desktop backgro
最近我一直在尝试从托管代码调用 SystemParametersInfo 方法,但没有成功。 问题是,调用该方法后,该方法返回false(表示失败),但是GetLastError(由Marshal.G
我在尝试使用 SystemParametersInfo 时卡住了。我使用 Dvorak 键盘,所以我试图制作一个 exe,只要我想更改键盘布局,就可以双击它。我在 C# 中使用 SystemParam
我才开始尝试 JNA,并且一直尝试在没有异常的情况下调用此函数 原生原型(prototype): BOOL WINAPI SystemParametersInfo( __in UINT u
我刚刚学习 C++,正在尝试编写一个小程序来更改桌面墙纸。使用文档 here ,我写了这个程序: #include #include #pragma comment(lib, "user32.li
我正在编写这个用户模式可执行文件,它可以在登录用户的上下文中从 Windows 平台上的本地服务运行。它的主要目的是配置所有登录用户的桌面。它调用以下 API 来设置屏幕保护程序: if(!Syste
我目前正在使用函数 SystemParametersInfo 来检索 SPI_GETICONTITLELOGFONT。根据 MSDN 文档,这是 http://msdn.microsoft.com/e
我的应用程序需要在被外部工具(通过 API)调用时获得焦点,我知道默认情况下,它应该只在任务栏中闪烁,但在这种情况下,这绝对不是行为我想要的。在这种情况下,我尝试通过“this.Activate()”
抱歉,我不太明白两者之间的区别。当我设置桌面墙纸时,只有末尾带有 A 的墙纸有效。但是,另一个没有给我错误。怎么回事? 最佳答案 SystemParametersInfo 是一个扩展为 SystemP
我尝试更改我的桌面墙纸。当我这样使用它时它工作得很好: SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "C:\\1.jpg", SPIF_SENDCHAN
我想从 C# 调用 SystemParametersInfo。此函数的第一个参数是大量可能值(如 SPI_GETACCESSTIMEOUT)中的一个,这些值列在文档中,但似乎没有在任何地方定义。 我可
我正在尝试使用 winapi crate 和 SystemParametersInfo 在 Rust 中设置 Windows 背景,但它会将背景设置为黑色。在 C++ 中,这通常意味着 pvParam
#include #include using namespace std; int main(){ LPWSTR test = L"c:/aizen.png"; int resu
我正在使用 JNA 从 user32 调用 SystemParametersInfo。这是我的JNA接口(interface)方法: boolean SystemParametersInfo(
我这样做正确吗? [DllImport("user32", CharSet = CharSet.Auto)] internal static extern long SystemParametersI
我基本上是直接从 MSDN documentation 中复制以下代码: #include #include #pragma comment(lib, "user32.lib") int main
在 Windows 平台上似乎有两种设置和获取用户屏保参数的方法: 1:通过 SystemParametersInfo() API: //To read SystemParametersInfo(SP
我有一些代码可以扩展触摸屏 PC 上运行的应用程序的系统滚动条的大小。这段代码是用Delphi 7编写的,已经运行了好几年了,但我发现在Windows 7上运行它时似乎有问题。 代码如下所示: pro
我是一名优秀的程序员,十分优秀!