Articles of winapi

在捕获鼠标的同时捕获键盘事件,但窗口未聚焦(Win32)

我正在实现可以启动拖动事件的自定义控件。 当用户通过处理WM_LBUTTONDOWN并调用SetCapture()按下鼠标左键时,我开始拖动。 这将导致所有的鼠标事件,甚至是我的控制客户区域以外的鼠标事件都被发送到它,完全按照我的意愿。 我也想能够捕获按键,所以如果用户按下ESC键( VK_ESCAPE ),我可以取消拖动。 由于我的控件没有键盘焦点(我不希望它从拥有它的控件中窃取焦点),所以我不能听WM_KEYDOWN 。 由于其他原因太复杂解释,我也不希望使用DragDetect()函数。 当拖动正在进行时,我的控件如何findESC按键?

挂钩OutputDebugStringA引发exception

我的目标是钩OutputDebugStringA,所以我可以阅读任何消息传递给它。 我不是想要挂钩任何其他的过程,而是现在的过程,只是为了学习如何挂钩。 我没有使用Detours,我宁愿不使用它们,因为我想了解如何在更深层次上进行挂钩。 我正在使用这个代码钩: void MakeJMP(BYTE *pAddress, DWORD dwJumpTo, DWORD dwLen); void myCallback(LPCSTR s); DWORD dwAddr = (DWORD) GetProcAddress(GetModuleHandleA("kernel32.dll"), "OutputDebugStringA"); // I cast it to byte and later to DWORD so it adds 5 DWORD dwRetAddr = ((BYTE)dwAddr) + 5; // +5 because I will override 5 bytes void __declspec(naked) My_OutputDebugStringA(){ __asm{ mov edi, edi […]

CFileDialog在debugging器窗口中发布“第一次机会exception”

我的Windows应用程序使用以下用于打开文件的C ++ / MFC代码: CFileDialog fd(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER, NULL, hParentWnd ? CWnd::FromHandle(hParentWnd) : NULL); fd.m_pOFN->Flags &= ~(OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_NODEREFERENCELINKS); fd.m_pOFN->Flags |= OFN_FILEMUSTEXIST; INT_PTR nRes = fd.DoModal(); //This call causes the warning 它运行良好,但我在VS 2008中的debugging器输出窗口中收到以下消息: MyApp.exe中0x00007ffb653d5bf8的第一次机会exception:0x000006BA:RPC服务器不可用。 这是我需要关心的吗?

拖动窗口的左边框时无法消除抖动

截至2015年3月26日,问题解决了,看到这个页面底部,一个很脏的伎俩。 截至2014年8月18日,部分解决:DWM是罪魁祸首(见最后的评论)。 我已经使用win32 API构build了自己的窗口样式。 在Windows XP和Windows 7下一切正常。但是,在Windows 8下发生了奇怪的事情:拖动窗口的左边缘导致右侧极端的抖动,而不应该移动。 看看这个 ,你会明白我的意思。 当我拖动右边框时,左侧不会按原样移动。 诚然,有一些闪烁,但这是可以接受的。 看到这个 我用几个标志尝试了SetWindowPos()和(begin/End)DeferWindowPos ,但无济于事。 即使使用SWP_NOREDRAW并阻止所有其他绘画也无济于事。 无论有没有CS_HREDRAW和CS_VREDRAW 。 当然,我正在使用双缓冲。 然而摆脱这种讨厌的抖动似乎是不可能的。 我也尝试了另一个驱动程序的英特尔HD 4000graphics引擎,再次无济于事。 我忽略了什么? 这是Windows 8的错误吗? 顺便说一句,当我打开“拖动时显示窗口内容”选项(在“高级系统设置”菜单中),所有其他应用程序显示相同的行为。 任何帮助将不胜感激。 干杯,爱德蒙。 PS:禁用“拖动时显示窗口内容”是没有select的,因为它是build立在我的应用程序的function。 编辑1:似乎d7samurai正在与同样的问题挣扎。 跟进:我已经尝试了很多东西来摆脱抖动,但没有任何帮助。 问题是W8根本就没有做它应该做的事情。 以SWP_NOREDRAW标志为例。 正如所料,被移动的窗户边的重新粉刷被压制了,迄今为止这么好。 但是…(窗户的)另一边,这仍然是有效的,这个重新粉刷! 这不仅是完全不必要和无用的,而且是用抖动重新绘制的! 而且,绘画比W7和XP要慢两倍。 在这个问题上花了整整一周之后,我完全用W8完成了! 这真的是一个POC和负责这个烂摊子工作的人是精神错乱。 我真的希望W9能够做得更好。 阿门。 你不要这样: 看起来,上述exception并不仅限于W8。 当W7被设置为“最佳外观”或者至less“启用桌面组合”和“在窗口和button上使用视觉样式”时,W7也显示相同的行为。 然后我认为有可能根本不使用SetWindowPos函数,而是通过发送ShowWindow( hWnd, SW_MAXIMIZE )命令并拦截WM_GETMINMAXINFO消息来指定所需的大小和位置。 你猜怎么了? 我仍然有抖动。 唉! 接下来做什么? 是否有可能在较低/较深的层次(钩?)上截取绘画,以便以一种体面的方式重新绘制窗户? 更新日03-26-2015,一个非常肮脏的把戏: find了! […]

replaceWindows Shell或限制应用程序窗口大小

我正在为家庭用户开发一个应用程序。 而这个应用程序涉及到完全替代Windows资源pipe理器的自定义应用 我想模仿任务栏的行为。 例如,当您在记事本中单击最大化button时,它不会与任务栏重叠。 我已经尝试使用api到AppBar,但是,当Windows资源pipe理器没有运行,其他窗口与我的任务栏重叠时,AppBar api不起作用。 任何想法我怎么能做到这一点? 如果我可以限制最大化窗口的大小,当有帮助我。 问题是其他应用程序不总是由我写。

什么可能会导致ShellExecute返回SE_ERR_OOM(错误8)?

我经常从本机C ++ / Win32应用程序中调用ShellExecute来执行GUI中由最终用户select的任何shell项目。 项目是可执行文件/脚本或链接(.lnk)。 在某些对我来说SE_ERR_OOM情况下,以下函数有时会返回8 ( SE_ERR_OOM错误;只是非常简要的logging)。 结果,该项目不被执行。 什么可能导致这个错误? int doExecute(LPCTSTR file, LPCTSTR args, LPCTSTR workDir) { assert(file && *file); HRESULT hRes = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); assert(hRes == S_OK || hRes == S_FALSE); int code = (int)ShellExecute(NULL, NULL, file, args, workDir, SW_SHOWNORMAL); doLog("ShellExecute returned: %d, %u", code, GetLastError()); // EDIT CoUninitialize(); return code; […]

Windows – 我们可以通过鼠标点击“clickable”来推断出什么?

正如标题所示,我在问什么可以通过点击屏幕上find。 更确切地说,能够检测到一个精确的元素(可以是在通用浏览器上打开新选项卡的+符号,或者在Open Office文档上的File然后Save as…元素)的点击并返回某种types点击了什么string? 通过使用Win32 API,我可以检测到鼠标左键是否被点击过: for(character=1; character<=222; character++) { if(GetAsyncKeyState(character) == -32767) { … switch(character) { case VK_LBUTTON: …; break; … } } } 当检测到点击的时候,我知道它被点击的地方(或者至less是发生点击的窗口的名称): void whichWindow(FILE *f) { HWND foreground = GetForegroundWindow(); char window_title[256]; if(foreground) { GetWindowText(foreground, window_title, 256); fputs(window_title, f); getMenuFromWindow(f, foreground); } else fputs("Problem retrieving window's title name", f); } 但是,我不知道点击了什么 […]

Windows:作为服务运行时查找屏幕分辨率

我有作为Windows服务运行的代码,想要确定直接连接的显示器的分辨率。 (是的,我明白,用户可能通过RDP,VDI等与机器交互,所以这并不总是有意义的 – 但这只是一种优化,所以在一般情况下,有一个直接连接桌面,它仍然是有用的。) 我想使用::GetSystemMetrics(SM_CXVIRTUALSCREEN)但它返回0,因为我在会话0中运行。同样, EnumDisplayDevices看起来像它只会用于目前的交互式会话。 即使没有用户login,我们也希望能够做到这一点。 有没有办法探索硬件屏幕分辨率甚至作为一项服务?

是否有可能在Windows中获得触摸联系人(位图)的物理形状?

我希望能够确定手指绘画应用程序的触摸接触的大小和旋转。 现在,对angular地放下一根长手指给了我一个巨大的方形,这不是我想要的,我想要一个长方形的angular度。 我想这将由系统提供,但即使是Surface Pro 4硬件也没有这个。 但是如果我有一个接触区域的位图,我可以提取信息。 到目前为止谷歌searchWM_INPUT相关的东西没有帮助。 这甚至有可能吗? 编辑:获取POINTER_TOUCH_INFO::orientation方法是我正在寻找,确切地说。 我的触摸屏没有把任何价值的这个领域。 编辑2:有关于此的一些有用的研究( http://hci.cs.umanitoba.ca/assets/publication_files/2009-UIST-wang-DirectTouchSurface.pdf ),我现在需要的是访问形状。 编辑3:我从@msdev得到了答案,他们还build议运动跟踪。 现在唯一缺乏的是连续跟踪,我想没有一个联系位图就无法可靠地解决这个问题。 也许教neural network可以工作。

MFC:在ON_COMMAND函数混淆?

好吧,这是这个function 。 。 ON_COMMAND(ID_COLOR_RED,OnColor) ON_COMMAND(ID_COLOR_GREEN,OnColor) ON_COMMAND(ID_COLOR_BLUE,OnColor) 。 。 。 无效CMainWindow :: OnColor() { UINT nID =(UINT)LOWORD(GetCurrentMessage() – > wParam); m_nCurrentColor = nID _ ID_COLOR_RED; } 因此,在这里,CurrentMessage的wParam的LOWORD应该包含消息的ID,没关系,但是m_nCurrentColor = nID _ ID_COLOR_RED是什么意思; 手段? 对于红色,绿色或蓝色,m_nCurrentColor可以分别为0,1或2 … 所以首先我们在第一个语句中将消息ID转换为UINT,但是我们在第二个函数中使用m_nCurrentColor = nID _ID_COLOR_RED来做什么? 谁能解释一下吗?