Tag: winapi

WinApi Win32编程 – 按钮单击不发送WM_COMMAND消息

我一直在制作一个标签控制程序,并且最近才在StackOverflow上发布了求助信息。 目前该计划运行如下: 从winMain开始,创建main_hwnd生成WM_CREATE并wndProc tab_hwnd创建为SysTabControl32 tab0_hwnd , tab1_hwnd ,…, tab4_hwnd已创建 在tab0_hwnd ,创建静态文本和按钮 返回winMain并在main_hwnd , tab_hwnd和tab0_hwnd上调用ShowWindow() 输入循环直到程序关闭。 程序运行时,一切都可见; 但是,按钮无法正常工作。 同时,当我使用GetLastError()和FormatMessage()搜索错误时,我发现在创建Windows tab#_hwnd (其中#= 0,1,2,3和4)后,出现以下错误: 错误6:句柄无效 我不确定为什么会出现此错误以及该按钮无效的原因。 另一位用户在上一篇文章中建议了以下内容: “ WM_COMMAND被发送到直接父窗口,而不是祖父母,因此您也必须将选项卡控件子类化,或者让您的按钮将主窗口作为父窗口。” – Anton Kovalenko 编辑1:我不确定如何按照Anton Kovalenko的建议对我的选项卡控件进行子类化。 任何指向教程/解释注释的链接都非常有用。 这是当前的代码: #define WIN32_LEAN_AND_MEAN #pragma comment(lib, “comctl32.lib”) #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 #include […]

如何调用DeviceIoControl来检索它需要的内存量?

我正在尝试调用DeviceIoControl(IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS) API,如此处所示 ,但我需要它首先“告诉我”它需要多少内存(与我链接的代码不同。) 所以我称之为: //First determine how much data do we need? BYTE dummyBuff[1]; DWORD bytesReturned = 0; if(!::DeviceIoControl(hDevice, dwIoControlCode, lpInBuffer, nInBufferSize, dummyBuff, sizeof(dummyBuff), &bytesReturned, NULL)) { //Check last error int nError = ::GetLastError(); if(nOSError == ERROR_INSUFFICIENT_BUFFER || nOSError == ERROR_MORE_DATA) { //Alloc memory from ‘bytesReturned’ … } } 但它总是返回错误代码87 ,或ERROR_INVALID_PARAMETER ,我的bytesReturned始终为0。 那么我做错了什么?

WH_GETMESSAGE全局钩子无法正常工作

我试图在所有线程上设置一个全局GetMessage挂钩。 这是我的DLL: #include __declspec(dllexport) LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) { MessageBeep(0); return CallNextHookEx(NULL, nCode, wParam, lParam); } 如你所见,它并不多。 我只是希望它在调用时调用MessageBeep。 #include typedef LRESULT (CALLBACK *LPGetMsgProc)(int nCode, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nCmdShow) { if(!(HMODULE hDll = LoadLibrary(“library.dll”))) return 1; if(!(LPGetMsgProc pfnProc = (LPGetMsgProc)GetProcAddress(hDll, “GetMsgProc@12”))) return […]

WinINet无法将文件下载到客户端?

我很好奇为什么我在使用这个function时遇到了麻烦。 我正在将Web上的PNG文件下载到目标路径。 例如,将Google图像下载到C:驱动器: netDownloadData(“ http://sofzh.miximages.com/c%2B%2B/logo1w.png ”,“c:\ file.png”); 下载后文件大小正确。 什么都没有返回假。 当我尝试打开它时,它不会显示图像。 任何想法都有帮助。 谢谢! 这是代码: bool netDownloadData(const char *strSourceUrl, const char *strDestPath) { HINTERNET hINet = NULL; HINTERNET hFile = NULL; char buffer[1024]; DWORD dwRead; String sTemp; FILE *fp = NULL; DWORD size = 0; // Open a new internet session hINet = netInit(); if (hINet == […]

如何阻止延迟加载的DLL抛出“从计算机中丢失”系统错误?

我昨天在插件中设置了延迟加载: #ifdef _WIN32 #pragma warning (disable : 4100) /* Disable Unreferenced parameter warning */ #include #include #endif … // Configuration Properties / Linker / Input / Additional Dependencies: ./lib/libcurl.lib;./lib/libxml2.lib;./lib/iconv.lib;./lib/zlib1.lib;%(AdditionalDependencies) // Configuration Properties / Linker / Input /Delay Loaded Dlls: libcurl;libxml2;iconv;zlib1;%(DelayLoadDLLs) #include “curl.h” #include “HTMLparser.h” #include “xpath.h” #ifdef _WIN32 #pragma comment(lib, “libcurl”) #pragma comment(lib, “iconv”) #pragma […]

尝试为我的屏幕保护程序显示配置窗口的问题(来自以高强制完整性级别运行的GUI应用程序)

我有一个带有自己的屏幕保护程序的旧项目。 该项目的GUI应用程序有一个“配置屏幕保护程序”选项,它应该显示我的屏幕保护程序配置窗口(通常从控制面板 – >显示 – >个性化 – >屏幕保护程序 – >设置。) 要显示配置窗口,需要使用/c参数调用屏幕保护程序进程,如此处所述 。 屏幕保护程序本身放在系统目录中,即”C:\Windows\System32″ 。 因此,要从我的(32位)GUI应用程序模拟这个,我执行以下操作: //Error checks are omitted for brevity BOOL bResult = FALSE; TCHAR buffSysFldr[MAX_PATH]; buffSysFldr[0] = 0; ::GetSystemDirectory(buffSysFldr, SIZEOF(buffSysFldr)); //Make the path, which basically becomes: // “C:\Windows\System32\mysvr.scr” /c TCHAR buff[MAX_PATH]; buff[0] = 0; ::StringCbPrintf(buff, sizeof(buff), L”\”%s\\mysvr.scr\” /c”, buffSysFldr); STARTUPINFO si = {0}; […]

即使以管理员身份运行,打开$ MFT文件也会导致访问被拒绝

我试图从MFT中删除文件记录,如果我打开原始分区并通过解析MFT文件到达所需的文件记录,我正在成功。 这种方法的问题是我必须首先锁定卷,以便我可以在任何MFT文件记录上写零,如果某个其他进程持有卷锁(非常非常可能),由于Windows操作系统,写入原始卷失败限制。 我想到的另一种方法是将“$ MFT”作为文件打开然后读写它。 通过这种方式我认为我不必锁定音量。 但是当我尝试通过createfile winapi函数打开$ MFT文件时,即使我以管理员身份运行程序,也会出现“拒绝访问”错误? 我的问题是如何打开$ MFT系统文件进行写入和读取? Windows OS是否允许系统文件以正常方式读写? 如果没有,我还能做什么? 任何帮助,将不胜感激。

使用win32 API在C中广播UDP套接字

我使用UDP套接字创建了一个客户端服务器应用程序。 应用程序工作正常,因为只有一个服务器和一个客户端。 但现在我想让我的服务器“广播”。 我怎么能这样做? 我一直试图这样做但它在BIND函数中出错并返回错误“10049”。 这是我的代码片段: #define broadcastPort 8888 WSADATA wsa; SOCKET s; //Initialise winsock printf(“\nInitialising Winsock…”); if (WSAStartup(MAKEWORD(2,2),&wsa) != 0) { printf(“Failed. Error Code : %d”,WSAGetLastError()); exit(EXIT_FAILURE); } printf(“Socket Initialised.\n”); //Create a socket if((s = socket(AF_INET , SOCK_DGRAM , IPPROTO_UDP )) == INVALID_SOCKET) { printf(“Could not create socket : %d” , WSAGetLastError()); } printf(“Socket […]

每次调整窗口大小时内存都会增加

我创建了一个简单的Win32应用程序,并尝试使用Color填充客户区。 当包含“Clear RenderTarget”行时,我看到每次调整窗口大小时内存都会增加几KB。 我的WindowProc: LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_SIZE: { if (pRenderTarget != NULL) { RECT rc; GetClientRect(globalWindowHandle, &rc); D2D1_SIZE_U size = D2D1::SizeU(rc.right, rc.bottom); pRenderTarget->Resize(size); InvalidateRect(globalWindowHandle, NULL, FALSE); } return 0; } break; case WM_CREATE: { HRESULT dx = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory); if (FAILED(dx)) { […]

CreateWindowEx创建后无效的X位置

我注意到,一旦使用“CreateWindowEx”创建一个窗口,其中x = 0,y = 0位置坐标,窗口似乎不位于​​屏幕的0,0角。 相反,它出现在x = 9 ,y = 0 。 我正在使用一台显示器。 我并没有在其他任何地方调整它的位置。 窗口创建为重叠的父窗口。 创建窗口时,使用x = 8,y = 31调用WM_MOVE。 (那些是“客户区”坐标) (WM_MOVE y坐标为31px有点奇怪,但在屏幕截图中你可以看到它应该是~38px ……) 窗口由以下内容创建: mHandle = ::CreateWindowEx(WS_EX_APPWINDOW, CLASS_NAME, APP_NAME, WS_OVERLAPPEDWINDOW, 0, 0, mWidth, mHeight, HWND_DESKTOP, nullptr, mInstance, this); 关于我可能做错的任何想法? 可能是什么原因?