Articles of winapi

语言栏在c#.NET中改变语言

TL; DR :尝试解决InputLanguage更改input布局但不更新语言栏显示的问题。 我正在为Trados Studio编写一个自定义插件。 其中的一部分是与应用程序本身和Word中的语言进行交互,就像这个问题一样: Windows .NET框架的所有可用语言列表 我似乎无法解决的最后一个问题是,在我使用InputLanguage设置键盘inputen-US的代码的一部分。 要说明的是, API是有限的,所以我必须在某些方面实现自动化。 最好的方法是在应用程序中使用默认的快捷方式: 首先,我将input语言改为en-US。 然后我发送一些密钥给应用程序。 然后我将input语言改回原来的样子。 然后我显示一个表单。 这里是代码: //change input language to English InputLanguage currentLang = InputLanguage.CurrentInputLanguage; InputLanguage newLang = InputLanguage.FromCulture(System.Globalization.CultureInfo.GetCultureInfo("en-US")); if (newLang == null) { MessageBox.Show("The Upload Project function requires the En-US keyboard installed.", "Missing keyboard", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } else { InputLanguage.CurrentInputLanguage = newLang; […]

枚举EnumFontFamiliesEx函数时字体太多

我正在尝试创build一个供用户select的字体列表。 我通过使用EnumFontFamiliesEx函数来做到这一点,但不幸的是,返回的字体列表太长了。 有许多额外的字体看起来轻浮,重复,不同的语言,否则不希望显示给用户。 我的截图最好地说明了我想要过滤掉的垃圾。 我调用EnumFontFamiliesEx代码如下所示: LOGFONT lf; memset(&lf, 0, sizeof(lf)); lf.lfCharSet = DEFAULT_CHARSET; // screenDC is result of CreateCompatibleDC(NULL) EnumFontFamiliesEx(screenDC, &lf, GetFontsCallback, NULL, 0); 结果列表看起来像这样,按字母顺序sorting和删除重复的脸名称的字体: 正如你所看到的, ChooseFont字体公共对话框显示了一个非常合理的字体列表,用户友好和有意义。 另一方面,我的代码显示了一长串额外的字体:以“@”开头的字体(为什么?它们甚至是什么?),Arial字体的另外三种变体,以及其他一些未知目的的字体,如Aheroni,安达卢斯,Angsana New,Angsana UPC等等。 这是疯了。 如何过滤由EnumFontFamiliesEx返回的字体列表,使其与ChooseFont对话框中显示的列表完全匹配?

如何使用Win32 API制作多个窗口

我看到大量的教程和文章向我展示了如何制作一个简单的Windows程序,这很棒,但是没有一个告诉我如何制作多个窗口。 现在我有创build和绘制分层窗口的工作代码,我可以使用GDI来绘制任何东西,拖动它,甚至使其透明等等。 但是我想要第二个矩形区域,我可以拖动,等等。换句话说,第二个窗口。 可能希望它是一个孩子的窗口。 问题是,我该怎么做呢? 此外,如果有人知道任何良好的资源(在线优先)像Windows API中的窗口pipe理文章或教程,请分享。

是保持线程优化?

应用程序有一个辅助线程。 这个线程并不是一直运行,但主进程可以经常调用它。 所以,我的问题是,在CPU性能方面什么是最优化的:暂停线程,当它不被使用或保持活着,并使用WaitForSingleObject函数等待来自主进程的信号?

如何清除进程命令行?

我想从内部清除我的进程的命令行。 例如,在任务pipe理器/进程资源pipe理器中查看我的进程时,命令行条目将为空。 我想在当前正在运行的进程中执行此操作,而不是在可能的情况下重新启动进程。

获取窗口句柄的WNDPROC

存在任何Windows API函数来检索Windows句柄的WNDPROC ? 提前致谢。

AttachConsole的最低版本要求是什么?

在线PSDK文档状态5.1(WinXP): 要编译使用此函数的应用程序,请将_WIN32_WINNT定义为0x0501或更高版本。 有关更多信息,请参阅使用Windows头。 要求 最低支持的客户端 :Windows XP [仅限桌面应用] 最低支持的服务器 :Windows Server 2003 [仅适用于桌面应用程序] 老版本的PSDK doc与上面的模糊不清,并试图说明5.0(Win2k)或5.1: 要编译使用此函数的应用程序,请将_WIN32_WINNT定义为0x0500或更高版本。 有关更多信息,请参阅使用SDK头。 要求 客户端:需要Windows Vista或Windows XP。 服务器:需要Windows Server“Longhorn”或Windows Server 2003。 最后,PSDK标题(相当老)也主张Win2k: #if(_WIN32_WINNT >= 0x0500) WINBASEAPI BOOL WINAPI AttachConsole( __in DWORD dwProcessId); #define ATTACH_PARENT_PROCESS ((DWORD)-1) #endif /* _WIN32_WINNT >= 0x0500 */ 我没有任何比WinXP SP3更老的东西来检查kernel32.dll导出目录,所以请赐教我什么是真正的最低支持的版本, 5.0或5.1 ?

无限的Windows消息循环

我在我的程序中有这个消息循环: while (true) { if (PeekMessage(&msg, window, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { MessageBox(NULL, L"Quit", L"", 0); break; } TranslateMessage(&msg); DispatchMessage(&msg); } else { Render(); } } 这个循环不会结束。 即使主窗口消失,它也不会显示消息框。 这是WndProc代码: switch (msg) { case WM_CLOSE : DestroyWindow(hwnd); break; case WM_DESTROY : PostQuitMessage(0); break; default : return DefWindowProc(hwnd, msg, wParam, lParam); break; } […]

Windows应用程序中的窗口消息,无窗口

我有一个应用程序,我想在后台运行没有可见的窗口或控制台。 要做到这一点,我创build一个Windows应用程序,但我不创build一个窗口。 当请求closures时(即,当用户注销时),应用程序需要做一些清理。 我怎样才能确定什么时候结束? 我可以简单地创build一个处理WM_CLOSE消息的消息循环吗? 但是,我没有WndProc来处理WM_CLOSE消息。

内核模式下的线程本地存储?

是否有与Windows中的内核模式驱动程序等效的线程本地存储(TLS)(准确地说是Win32)? 我试图实现的是: 最后从我的驱动程序的调度例程中,它可能会调用许多其他function(可能有一个深层的调用堆栈)。 我想提供一些特定于正在处理的请求的上下文信息。 也就是说,我有一些结构,指针应该在所有被调用的函数中可见,而不必将其作为参数明确地传递给每个函数。 使用静态/全局不是一个完美的select(multithreading,同步对象等)。 如果这是一个用户模式的代码 – 在这种情况下显然会使用TLS。 但是AFAIK没有像TlsGetValue / TlsSetValue这样的内核模式函数。 这是有道理的 – 对于那些需要工作的函数,必须先分配一个进程范围的TLS索引。 OTOH驱动程序代码可以在任意线程上调用,而不限于特定的进程。 但是,我实际上并不需要一个持久的线程特定的存储。 我只需要一个特定于线程的存储,用于我的顶级函数调用。 我想我知道如何“实施”红绿灯系统,虽然是一种骇人听闻的方式。 我将永远使用预定义的索引(比如index = 0),而不是分配TLS索引。 在顶层函数中,我将保存存储的TLS值,并用所需值覆盖它。 完成后保存的值将被恢复。 幸运的是我知道如何在Win32中实现TLS。 每个线程都有一个TIB结构(线程信息块)。 在每个线程中可以使用FS:[18h]select器访问。 TIB包含(除其他之外)由TLS使用的数组。 其余的很简单。 不过,我宁愿使用官方的API来实现类似的东西。 有一个官方的内核模式API来实现我所需要的吗? 有没有理由避免我打算做的事情? 我知道再入口可能存在问题(例如,某些代码调用了我,我覆盖了TLS值,最终调用了可能依赖于TLS的原始代码)。 但是在我的具体情况下这是不可能的? 有没有更less的肮脏方法来解决这个问题 提前致谢。 PS One理论上可以使用SEH(也存储了每个线程的信息)。 也就是说, __try/__except用__try/__except包装顶级代码__try/__except ,还需要在需要上下文信息的地方使用一些参数来引发可继续的exception,在__except块中用上下文信息填充参数,然后恢复执行。 这是一个100%有效的程序stream程,不使用未logging的function。 但是,这对我来说似乎是一个丑陋的黑客,更不用说性能的复杂性了。