Articles of winapi

阅读多个HID报告

我将报告大小设置为64个字节,并希望将单个报告(现在称为2)传送给主机。 我的理解是有一个ReadFile缓冲区,这些报告可以坐。 在主机上,我有一个64字节的缓冲区,用来读取单个报告。 如果我从设备发送一个报告,主机读取它的罚款。 如果我在循环中使用两个ReadFile ,则第二个ReadFile会超时。 该设备正在发送两个报告。 我不知道他们是否同时进入ReadFile缓冲区,所以当主机读取第一个报告的结束点时,缓冲区被清除,我失去了第二个报告? 如果ReadFile缓冲区中确实有两个报告,我是否需要一次读取它们? 我怎么知道缓冲区上有多less个报告?

进程间内存编辑 – 查找更改的地址

我目前正在将这些游戏培训师当作一个小型项目。 我已经遇到了一个问题。 当你“进入一个不同的层次”时,诸如燃油,现金,子弹,地址等地址都会改变。 这也会发生,如果你要重新启动应用程序。 我怎样才能重新定位这些地址? 我觉得这是一个相当基本的问题,但对我来说这是“这是或不是可能的”问题之一。 我应该停止查看,完全忘记这个概念吗? “太难?”

(Windows)何时删除对象和设备上下文?

假设我创build了一个在内存中处理位图并返回的函数 HBITMAP paint (HWND hwnd) { HDC windc = ::GetWindowDC(hwnd); HDC memdc = ::CreateCompatibleDC(windc); HBITMAP bitmap = ::CreateCompatibleBitmap(windc,100,100); //Don't bother with the height and width ::SelectObject(memdc,(HGDIOBJ)bitmap); /* DeleteDC(windc) here? */ //do the painting //… //painting done /*DeleteDC(memdc) here? */ return bitmap; /* Code does not reach here */ /* So where do I put DeleteObject(bitmap)? […]

如果有几个以太网适配器,您将如何通过MAC地址亲自识别工作站?

我必须通过必须稳定的唯一标识符来识别工作站。 我决定使用MAC地址,但如果有几个以太网适配器(其中一些可能属于安装的VMWare),该怎么办? 我应该select哪一个? 我使用GetAdaptersInfo函数处理IP_ADAPTER_INFO结构。 也许你会select另一种方法来独特(和稳定)的工作站ids比使用MAC地址? 对我来说这是一个可怜的工作站是“只读”的。 我不能自动生成一些独特的标识符来在工作站上创build,存储和重用。

得到线程函数的处理

整个代码下载: http : //tunps.com/tmp/UsbAutoCopy.zip 这里是WinMain: int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), hWnd, DlgProc); return 0; } 在全球范围内: typedef struct ArgsTag { CHAR vol; HWND hWndDlg; } Args, *pArgs; 在消息循环中: pArgs arg; arg = malloc(sizeof(struct ArgsTag)); arg->vol= FirstDriveFromMask(lpdbv->dbcv_unitmask); arg->hWndDlg = hWndDlg; _beginthread ((LPVOID)CopyThread, 0, (LPVOID)arg) ; 这里是Dialog程序的函数原型: […]

自定义查找/replace对话框

首先,请记住我是Windows编程的新手。 我会尽量详细地回答我的问题,希望答案也是如此。 简短介绍: 我正在复制使用Win32 API和纯C编写类似于记事本的应用程序。对于熟悉Petzold的Windows编程的人员,这是他用来描述通用对话框的POPPAD程序的修改版本。 我正在为了教育目的而严格地写这篇文章,所以请不要发表评论,比如“为什么你使用旧技术,使用.NET”,因为那些评论不会帮我解决我的问题:)。 问题描述: Petzold在他的POPPAD程序中使用通用对话框来编写这个类似于记事本的应用程序。 他使用编辑控制来提供基本文本编辑器的所有function。 POPPAD就像一个记事本,也有查找和replace对话框,你可以find东西并replace它! 令人难以置信,我知道。 所以这就是我想通过阅读过去的章节来testing我新近获得的知识的地方,因为我决定写我自己的查找和replace对话框。 当然,这可能是最简单的forms。 它能有多难? 你有一个文本字段,你input一些文本,你有一个奇特的button,说:“查找! 在上面。 现在我想再次提醒您,我是Windows编程的新手,所以请原谅我的任何可能的新手问题。 此外,我想指出,我将专注于使查找对话框工作,因为replace应该不太难实现。 所以我在Visual Studio中使用了资源编辑器,几个小时后,我得到了这个: (stackoverflow实际上并不允许我发布图像,所以下面的链接) http://img.zgserver.com/c/R98x4.png 我将这个对话框命名为“Find”(带引号),所以我不必在我的程序中使用MAKEINTRESOURCEmacros,就像Petzold的学派一样。 我将“确定”button的标题更改为“查找下一个”,并将ID从IDOK更改为IDC_FIND 。 IDC_CANCEL IDCANCEL更改为IDC_CANCEL ,单行Edit Control为IDC_FIND_FIND 。 现在到更严重的事情。 在我的主程序的Windows程序中,我有这样一段代码: case IDM_SEARCH_FIND: hDlgModeless = CreateDialog (hInst, TEXT ("Find"), hwnd, FindDlgProc) ; return 0 ; IDM_SEARCH_FIND是菜单项的消息标识符,单击时应打开“查找”对话框。 CreateDialog函数用于创build一个无模式对话框并将其句柄存储到全局variableshDlgModeless 。 FindDlgProc是对话框程序的名称,我认为所有的代码都是查找文本的。 所以,不用再烦恼了,下面是我的查找对话框过程的代码: BOOL CALLBACK FindDlgProc (HWND […]

如何在没有资源编译器的情况下将自定义窗口资源添加到可执行文件

我能够将一个位图对象( LoadImage )加载到可执行文件(并将其实现为一个图标)。 但是,当我将其作为独立可执行文件发布时,该图标消失。 我发现它需要位图在目录中运行时才能使用。 但是,即使在当前目录中存在位图,我的可执行桌面图标也不会从默认图标改变。 我假设发生这种情况,因为桌面图标应该在编译时确定。 因此,我想知道是否有一种方法可以在不需要资源编译器的情况下将资源添加到可执行文件中? 我的愿望是把所有的事情都用winapi来完成。 如果这是不可能的,那么我会考虑替代scheme。

hover在BS_OWNERDRAWbutton的可视状态不同

我有一个BS_OWNERDRAWbutton创build: HWND hwndClose = CreateWindow(WC_BUTTON, _T(""), BS_PUSHBUTTON | BS_OWNERDRAW | WS_CHILD | WS_VISIBLE, 0, 0, 16, 16, win->hwndTocBox, (HMENU)IDC_TOC_CLOSE, ghinst, NULL); 当光标在button上方时,我想绘制它。 每当光标进入/离开我的button,我都希望得到WM_DRAWITEM消息,但似乎并不是这样。 即使标准窗口button在hover情况下显然有不同的视觉状态,我也只能得到一次。 是否有可能很容易让窗户发送WM_DRAWITEMhover状态更改时,而不做枯燥乏味的事情,如子类button窗口和手动处理WM_MOUSEMOVE / WM_MOUSELEAVE消息?

将窗口部分移出屏幕顶部

我试图移动一个窗口部分屏幕的顶部。 但是,Windows的默认行为将在完成移动后popup。 是的,我明白为什么这个特定的function存在; 然而,我仍然不希望为我的窗口。 然后我注意到我可以使用SetWindowPos设置一个窗口部分离开屏幕的顶部,它不会popup。 例如, SetWindowPos(…., -100, -100, ….)将我的窗口设置在屏幕上方100像素,它将停留在那里。 所以,而不是正常移动我的窗口(如发送SendMessage(hwnd, WM_SYSCOMMAND, SC_MOVE | 0x0002, 0);我想使用SetWindowPos移动我的想法是处理WM_MOUSEMOVE并检查鼠标左键是否closures。鼠标左键closures,我调用SetWindowPos ,对当前鼠标位置,鼠标位置进行一些math运算,并通过SetWindowPos传递给SetWindowPos 。 到目前为止,我有它的工作,但不是很好。 首先,如果鼠标移动得很快,根本不能工作。 其次,当鼠标缓慢移动时,窗户会随着移动而摇晃。 这是我的WinProc: LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static int lastMouseX = 0; static int lastMouseY = 0; switch (message) /* handle the messages */ { case WM_LBUTTONDOWN: lastMouseX […]

等待两个近同步事件的策略

我有一个库正在编写使用Win32 API处理按键事件。 每次击键发生时,几乎同时发生两个单独的事件( 这个和这个 )。 在我的库中,我有两个独立的线程,每个事件(钩子和原始的)。 线程1(挂钩)等待线程2(原始)获取其数据,然后继续。 它目前使用类似屏障的机制来实现这一点。 所以这两个事件必须在任何一个实际处理之前进入。 到现在为止还挺好。 但是有一个问题(当然)。 在一个理想的世界里,我一定会得到这两件事。 不幸的是,由于我不明白的原因,有时候Windows决定不把这两个事件中的一个传递给我(通常是另一个应用程序暂时与input有关)。 所以如果我input“Hello world”,线程1可能正在处理“H”,而线程2可能从来没有得到“H”事件,跳到“e”。 所以这些事件不同步,所有的事情都打破了。 基本上我想要的是:我想以一种合理的方式配对事件。 如果线程1得到一个“H”事件,线程2得到一个“e”,它应该或者(1)试图等待正确的“H”事件,或者(2)超时(是的,线程1可以优雅地失败如果必须的话)。 既然我知道事件都应该在一定的时间范围内进行,那么我认为这是一个实时的编程任务。 我对实时编程一无所知。 有没有解决scheme/数据结构呢? 如果是这样,他们是什么? 如果不是的话,那么这种types的问题的一般方法是什么(保持两个时间上紧密的事件同步)? 谢谢。