Articles of winapi

C ++:使用Win32 API实现命名pipe道

我试图在C ++中实现命名pipe道,但是我的读者不读任何东西,或者我的作者没有写任何东西(或者两者兼有)。 这是我的读者: int main() { HANDLE pipe = CreateFile(GetPipeName(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); char data[1024]; DWORD numRead = 1; while (numRead >= 0) { ReadFile(pipe, data, 1024, &numRead, NULL); if (numRead > 0) cout << data; } return 0; } LPCWSTR GetPipeName() { return L"\\\\.\\pipe\\LogPipe"; } 这是我的作家: int main() { HANDLE pipe […]

在Windows中的桌面之间移动应用程序

我想弄清楚如何发送正在运行的应用程序来执行使用CreateDesktop创build的新Windows桌面。 我可以创build一个新的桌面,然后启动一个应用程序,错误我找不到用正在运行的应用程序的方式。 与桌面pipe理相关的所有function(例如,SetThreadDesktop)总是仅适用于当前线程 任何提示? 谢谢您的回答。 实际上,我需要做的是移动我没有开发的应用程序(即notepad.exe) 如果从Powertoys( http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx )查看Virtual Desktop Manager,它会在同一个WindowStation中创build多个虚拟桌面。 我知道有类似的应用程序可以将运行的应用程序(notepad.exe,calc.exe ..)从一个虚拟桌面移动到另一个虚拟桌面,而无需closures并重新打开它(然后传递新的桌面句柄[HDESK]对CreateProcess的调用),但即使阅读所有相关的MSDN文档,我仍然不知道如何做到这一点: 我也想到了SetProcessWindowStation,但是就我而言,所有使用CreateDesktop函数创build的新虚拟桌面都在同一个WindowStation上,所以… 也许我错过了什么?

获取当前进程的HWND

我有一个使用窗口API的c ++过程。 我想获得自己的进程的HWND。 请引导我如何才能使它成为可能。

如何处理表单标题右键单击

我想在标题栏右键单击上下文菜单 任何提示/示例在C#前? 更新 – 由于各种原因,右键单击表单将无法正常工作,因为表单不是空的,表单是dynamic合成的,所以….

从文本文件中读取一行并将其删除

我想逐行读取文本文件,执行一些检查,如果不需要该行,请将其删除。 我已经完成了阅读线的代码,但是如果不是我所要求的,我不知道如何删除那一行。 请帮我find最简单的删除线的方法。 这是我的代码片段,我试过了: char ip[32]; int port; DWORD dwWritten; FILE *fpOriginal, *fpOutput; HANDLE hFile,tempFile; hFile=CreateFile("Hell.txt",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); tempFile=CreateFile("temp.txt",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); WriteFile(hFile,"10.0.1.25 524192\r\n\r\n10.0.1.25 524193\r\n\r\n",strlen("10.0.1.25 524192\r\n\r\n10.0.1.25 524193\r\n\r\n"),&dwWritten,0); fpOriginal = fopen("Hell.txt", "r+"); fpOutput = fopen("temp.txt", "w+"); while (fscanf(fpOriginal, " %s %d", ip, &port) > 0) { printf("\nLine1:"); printf("ip: %s, port: %d", ip, port); char portbuff[32], space[]=" "; sprintf(portbuff, "%i",port); strcat(ip," "); […]

VS刚build好之后,“xxx.exe不是有效的Win32应用程序”

我已经在Windows-7-64 PC上成功开发了Visual Studio 2015(使用IDE)的WinAPI应用程序。 我通常在发行模式下testing程序。 然后我做了一些编辑来源。 该程序编译和链接没有错误,但程序并没有像我预期的那样,所以我切换到debugging模式,并试图build立和运行。 再次VS编译和链接没有错误,但后来抱怨 “无法启动程序”f:\ dropbox \ blah \ x64 \ Debug \ xxx.exe'。“f:\ dropbox \ blah \ x64 \ Debug \ xxx.exe”不是有效的Win32应用程序“。 我觉得这很奇怪,所以我又回到发布模式,再次尝试 – 程序开始正常。 我做了一些编辑,并重build了几次,但后来VS宣布 “无法启动程序”f:\ dropbox \ blah \ x64 \ Release \ xxx.exe“。”f:\ dropbox \ blah \ x64 \ Release \ xxx.exe“不是有效的Win32应用程序。 我试图干净的一切,重新启动VS,甚至重新启动我的电脑..但都无济于事,我仍然得到完全相同的错误。 编辑:在阅读了类似的报告后,我试着暂停Dropbox同步。 它似乎工作,但只有一次或两次,然后问题返回。 然后,我尝试closures多处理器编译,这似乎已经允许我的程序的版本再次运行。 自从编辑器重新编译运行了许多(50+?)次,没有任何问题 […]

从键盘获取input,而无需等待input

像fgets()和getch()这样的函数将在继续之前等待用户inputinput。 我想要的是这个function:如果用户按下“x”,variables将开始递减,“c”将导致variables开始递增。 问题是当我尝试获得input时程序停止。 我希望variables在等待用户input的同时继续递增或递减,不要“冻结”。 我正在使用visual studio 2008,编写交stream控制台应用程序。 谢谢!

内部文件path超过大约时会发生什么? 在Windows中有32767个字符?

在Windows中(假设从2000年开始),文件path的长度最多可以是大约32767个字符。 这个限制的存在是由于UNICODE_STRING在本地API中的内部处理(也在内核端,驱动等)。 到现在为止还挺好。 我知道这部分背后的理论。 限制的原因是UNICODE_STRING的Length和MaximumLength成员计算了Buffer的字节数,但它们本身是16位无符号整数。 我也知道为什么限制是一个近似而不是一个限制。 这主要是由于你的文件名(例如\\.\C:\boot.ini )被parsing为它的本机forms(例如\??\C:\boot.ini ),然后被parsing为前缀实际卷设备名称,然后是相对于该卷的path,例如\Device\HarddiskVolume2\boot.ini 。 此外,从Windows资源pipe理器遇到(“ANSI”) MAX_PATH限制时的已知症状是假装某些版本的Windows中不存在的文件或文件夹(可能会在某些点上得到修复)。 但是,当我调用CreateFile() ,path看起来像\\.\C:\…\filename.ext ,而整个path没有这个对象pipe理器,I / Opipe理器和文件系统驱动程序级别会发生什么超出限制,但达到它,在我的电话kernel32.dll的CreateFile() , 然后得到扩大? … 对于这个话题,SDK和WDK都没有特别的唠叨。 还是我看错了部分?

我如何检查一个窗口是否有可见的滚动条使用他的HWND?

我想检查外部应用程序的窗口是否使用窗口的HWND(句柄) 可见的垂直或水平滚动条,存在任何WinApi函数来获取此信息? 我真的尝试GetScrollInfo函数,但似乎没有检索有关滚动条的可见性的信息。

Win32 C ++控制台清除屏幕不闪烁

我见过一些控制台游戏,屏幕刷新/清除本身没有恼人的闪烁。 我已经尝试了很多解决scheme,下面是我现在得到的: while(true) { if(screenChanged) //if something needs to be drawn on new position { COORD coordScreen = { 0, 0 }; DWORD cCharsWritten; CONSOLE_SCREEN_BUFFER_INFO csbi; DWORD dwConSize; HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(hConsole, &csbi); dwConSize = csbi.dwSize.X * csbi.dwSize.Y; FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten); GetConsoleScreenBufferInfo(hConsole, &csbi); FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten); SetConsoleCursorPosition(hConsole, coordScreen); } […]