Articles of winapi

为什么BOOL在Windows中是inttypes的?

为什么不把BOOL定义为如下的enum : enum BOOL {FALSE, TRUE}; 是否有任何理由为什么BOOL必须显式指定为int (或任何其他整型)?

Windows.h – 焦点input文本input时的通知

我试图想出一个解决scheme,当焦点进入一个文本字段时build立一个通知。 记住的最终目标是通过屏幕键盘重新创build您在移动设备上看到的functiontypes。 到目前为止,我一直在用EVENT_OBJECT_FOCUS探索SetWinEventHook ,用GUI_CARETBLINKING探索GUI_CARETBLINKING 。 从文档: EVENT_OBJECT_FOCUS 一个对象已经收到键盘焦点。 系统为以下用户界面元素发送此事件:列表视图控件,菜单栏,popup菜单,切换窗口,选项卡控件,树视图控件和窗口对象。 GUI_CARETINKINK插入符的闪烁状态。 如果插入符号可见,则该位置位。 使用这些方法我已经想出了这个解决scheme: void TextInputHelper::setupEventHook(FREContext iCtx) { ctx = iCtx; CoInitialize(NULL); evHook = SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_END, NULL, handleEventObjectFocus, 0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); } void CALLBACK handleEventObjectFocus(HWINEVENTHOOK hook, DWORD evt, HWND hwnd, LONG idObj, LONG idChild, DWORD thread, DWORD time) { GUITHREADINFO threadInfo; threadInfo.cbSize = sizeof(GUITHREADINFO); BOOL […]

帮助CredEnumerate

作为这个问题的后续,我希望有人可以帮助CredEnumerate API。 据我所知,PCREDENTIALS输出参数是“指向凭证指针数组的指针”。 我能够成功地使用C#调用CredEnumerate API,但我不确定如何将PCREDENTIALS转换为有用的东西(如凭证列表)。 编辑:这是我使用的代码: int count = 0; IntPtr pCredentials = IntPtr.Zero; bool ret = false; ret = CredEnumerate(null, 0, out count, out pCredentials); if (ret != false) { IntPtr[] credentials = new IntPtr[count]; IntPtr p = pCredentials; for (int i = 0; i < count; i++) { p = new IntPtr(p.ToInt32() + […]

处理无效的窗口句柄

应用程序使用Enum *例程检索窗口句柄。 恰巧在应用程序pipe理枚举/创build窗口的句柄(获取类名称,窗口统计信息…)的同时,该句柄不再有效。 代码pipe理窗口句柄使用try / catch块进行保护,但是窗口句柄被存储并且被连续用于pipe理表示的窗口。 如何处理窗口句柄的一生? 有可能检测到处理无效? 每当应用程序使用窗口句柄时,我都想避免try / catch块。

PrintWindow和Microsoft Edge

我们在Windows 10(Build 10166)上的PrintWindow函数有问题。 当我们调用PrintWindow( https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd162869 ( v= vs.85).aspx)捕获Microsoft Edge(Project Spartan)浏览器窗口的图像我们得到一个黑色的图像。 有没有人知道这个原因,如何解决/避免? 或者,也许有其他方式来捕捉窗口的图像,可以在后台和隐藏在另一个窗口后面? 更新 :我们试着发送WM_PRINTCLIENT和WM_PRINT消息,并用WM_PRINT调用DefWindowProc,但结果是一样的 – 只是一个黑色的图像。 我们也尝试使用BitBlt将窗口的DC复制到内存表面,但是它不工作。 我们现在最好的解决scheme是将浏览器窗口置于前台,捕获整个屏幕并将屏幕截图裁剪为窗口的客户端大小; 但由于切换当前正在使用的应用程序,它可能会中断和惹恼用户。

何时/为什么要使用heapmin?

客户对我们的应用程序有一些内存使用要求。 他们指出,虽然我们的承诺记忆是合理的,但保留的记忆是高的。 他们怀疑这是因为CRT堆增长,因为我们分配内存,但是当内存被释放时,CRT不返回页面到操作系统。 我们只是使用内置的运算符new / delete / new [] / delete [] – 以及malloc / free的一些用法。 他们问:“你的内存pipe理员在某个时候调用_heapmin来压缩堆? 呃,我们不明确地调用_heapmin。 我们应该吗? 有没有什么经验法则的使用?

Winapi win32编程 – 选项卡控件不显示

我一直在做一个选项卡控制,它只有在winMain中发布时才可见。 当我尝试在WM_CREATE消息句柄中创build选项卡时,什么也不显示。 这是我的代码: #define WIN32_LEAN_AND_MEAN #define IDC_STATIC -1 #define ID_FILE_EXIT 101 #define ID_HELP_ABOUT 102 #define ID_B_BLANK 1001 #define ID_B_HOME 1002 #define ID_B_SAVE 1003 #include <strsafe.h> #include <windows.h> #include <CommCtrl.h> #include <iostream> #include <ShlObj.h> #include <cstring> HWND main_hwnd, tab_hwnd, tab0_hwnd, tab1_hwnd, tab2_hwnd, tab3_hwnd, tab4_hwnd; HINSTANCE tab_hinst; TCHAR HomePath[MAX_PATH*2], SavePath[MAX_PATH*2]; WNDCLASSEX wc; bool success=FALSE; MSG msg; HWND […]

如何区分外部显示器与笔记本电脑的屏幕本身?

让我解释一下我的情况。 我写了一个程序,只有当用户看到屏幕时,才能执行某些绘图/渲染操作。 对于笔记本电脑,这意味着 – 只有当盖子打开时。 要确定我使用GUID_LIDSWITCH_STATE_CHANGE的PBT_POWERSETTINGCHANGE通知,这对于单个监视器系统非常有用。 当有一个或多个连接到笔记本的外接显示器时,会发生问题。 在这种情况下,主笔记本电脑屏幕可能保持不活动状态,只有外部显示器开机。 所以在这种情况下,盖子将被报告为封闭,这应该使我的程序继续渲染。 问题是如何检测这种情况。 我在想,我可以使用GetSystemMetrics(SM_CMONITORS)来计数显示器,但在这种情况下,我不知道显示器是从哪里来的,换句话说,它是笔记本的“原生”屏幕,还是外部插入的一。 所以我的问题是,我能区分插入到系统的任何外部显示器与笔记本电脑的“本机”屏幕之间?

拦截窗口打开文件

我正在试图制作一个可以拦截文件的打开过程的小程序。 目的是当用户双击给定文件夹中的文件时,Windows会通知软件,然后处理该请求并返回窗口文件的数据。 也许会有另一种解决scheme,如监视打开消息,强制Windows等待程序准备文件的内容。 这个概念的一个应用,可能是以一种透明的方式pipe理文件的解密encryption。 在这种情况下,encryption的文件将在磁盘上,当用户打开它(双击它或使用某些应用程序如记事本)时,后台进程将拦截该打开的事件,对文件进行解密并给出内容的文件到提问应用程序。 这是一个有点奇怪的概念,它可能像“中间人”的networking概念,但与文件,而不是networking包。 谢谢阅读。

如何使用SetWindowsHookEx和WH_KEYBOARD钩住外部进程

我想挂钩例如记事本没有成功。 做一个全局钩子似乎工作正常。 在XP SP2上testing。 编辑:修正的代码现在工作。 MyDLL代码 #include <windows.h> #include <iostream> #include <stdio.h> HINSTANCE hinst; #pragma data_seg(".shared") HHOOK hhk; #pragma data_seg() //#pragma comment(linker, "/SECTION:.shared,RWS") compiler error in VC++ 2008 express LRESULT CALLBACK wireKeyboardProc(int code, WPARAM wParam,LPARAM lParam) { if (code < 0) { return CallNextHookEx(0, code, wParam, lParam); } Beep(1000, 20); return CallNextHookEx(hhk, code, wParam, lParam); […]