winapi_winapi创建按钮 - CSDN
精华内容
参与话题
  • 最全的WinAPI手册

    热门讨论 2020-07-28 23:31:16
    WINAPI,WinAPI手册,最全的WINAPI函数手册,WINAPI开发必备 目录 1 内容简介 14 前言 14 第一章 Win32 API概论 14 为什么使用 Wiu32 API 14 Win32 API 简介 15 第二章 窗口管理函数 16 第一节 易用特性函数...
  • WINAPI是什么意思?

    千次阅读 2019-08-09 21:16:54
    WINAPI是一个宏名,定义如下: #define WINAPI _stdcall; 而std_call是新标准c/c++函数的调用方法,他是采用自动清栈的方式,而标准c调用(_cdecl方法,cdecl是C declare的缩写)采用的是手工清栈的方式。 那么...

    查阅windows程序设计,所示意思如下:

    WINAPI是一个宏名,定义如下:

        #define WINAPI _stdcall;

    而std_call是新标准c/c++函数的调用方法,他是采用自动清栈的方式,而标准c调用(_cdecl方法,cdecl是C declare的缩写)采用的是手工清栈的方式。

    那么就引出了一个新的问题,什么是自动出栈?什么是手动出栈?查阅baidu.com,整理如下:

    • 自动清栈,就是指,由调用者来处理,被调用者不需要处理。
    • 手工清栈,就是指,调用者不会管被调用的函数使用的栈,需要由被调用者自己处理。就是我原来说的__cdecl要手工清栈,所以不用担心压进去几个参数无所谓。所以像printf这种就是参数不限的调用,都是用__cdecl的,如果是自动清栈的话,他必定有长度要求,清理几个字节的堆栈,所以其他调用方式是不能实现参数个数不限的要求的。
    • 调用约定种类:一共有5中函数调用约定(calling convention),它决定一下内容:
    1. 函数参数的压栈顺序
    2. 由调用者还是被调用者把参数弹出栈
    3. 产生函数修饰名的方法(C者C++在编译和链接的时候会重新给函数起一个名字,而这个名字的起法是根据std_call,cdecl这些来指定的)。

     

    展开全文
  • 常用WinAPI函数整理

    2019-09-04 20:06:57
    之前的博客写了很多关于Windows编程的内容,在Windows环境下的黑客必须熟练掌握底层API编程。为了使读者对黑客常用的Windows API有个更全面的了解以及方便日后使用API方法的查询,特将这些常用的API按照7大分类进行...

    之前的博客写了很多关于Windows编程的内容,在Windows环境下的黑客必须熟练掌握底层API编程。为了使读者对黑客常用的Windows API有个更全面的了解以及方便日后使用API方法的查询,特将这些常用的API按照7大分类进行整理如下,希望对大家的学习有所帮助。

    一、进程

    创建进程:

    CreateProcess("C:\\windows\\notepad.exe",0,0,0,0,0,0,0,&si,&pi);

    WinExec("notepad",SW_SHOW);

    ShellExecute(0,"open","notepad","c:\\a.txt","",SW_SHOW);

    ShellExecuteEx(&sei);

    遍历进程:

    CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

    Process32First(hsnap,&pe32);

    Process32Next(hsnap,&pe32);

    终止进程:

    ExitProcess(0);

    TerminateProcess(hProc,0);

    打开进程:

    OpenProcess(PROCESS_ALL_ACCESS,0,pid);\

    获取进程ID

    GetCurrentProcesssId();

    获取进程可执行文件路径:

    GetModuleFileName(NULL,buf,len);

    GetProcessImageFileName(hproc,buf,len);

    遍历进程模块信息:

    CreateToolhelp32Snapshot(TH32CS_SNAPMODILE,pid);

    Module32First(hsnap,&mdl32);

    Module32Next(hsnap,&mdl2);

    获取指定模块句柄:

    GetModuleHandle(kernel32.dll);

    获取模块内函数地址:

    GetProcessAddr(hmdl,MessageBox);

    动态加载DLL

    LoadLibrary(user32.dll);

    卸载DLL

    FreeLibrary(hDll);

    获取进程命令行参数:

    GetCommandLine();

    任何进程GetCommandLine函数地址后偏移一个字节后的4字节地址为命令行地址。

    读写远程进程数据:

    ReadProcessMemory(hproc,baseAddr,buf,len,&size);

    WriteProcessMemory(hproc,baseAddr,buf,len,&size);

    申请内存:

    VirtualAlloc(0,size,MEM_COMMIT, PAGE_EXECUTE_READWRITE);

    VirtualAllocEx(hproc,0,size,MEM_COMMIT, PAGE_EXECUTE_READWRITE);

    修改内存属性:

    VirtualProtect(addr,size,PAGE_EXECUTE_READWRITE,&oldAddr);

    VirtualProtectEx(hproc,addr,size,PAGE_EXECUTE_READWRITE,&oldAddr);

    释放内存:

    VirtualFree( addr, size, MEM_RELEASE);

    VirtualFreeEx(hproc, addr, size, MEM_RELEASE);

    获取系统版本(Win NT/2K/XP<0x80000000)

    getVersion();

    读写进程优先级:

    SetPriorityClass(hproc,Normal);

    GetPriority(hproc);

    SetProcessPriorityBoost(hproc,true);

    GetProcessPriorityBoost(hproc,pBool);

    二、线程

    创建线程(CreateThread的线程函数调用了strtokrand等需使用_endthread()释放内存)

    CreateThread(0,0,startAddr,&para,0,&tid);

    _beginthread(startAddr,0,0);

    _beginthreadex(0,0,startAddr,0,0,&tid);

    CreateRemoteThread(hproc,0,0,func,&para,0,&tid);

    获取线程ID

    GetCurrentThreadId();

    关闭线程句柄(减少内核对象使用次数,防止内存泄漏):

    CloseHandle(hthread);

    挂起与激活线程(维护暂停次数)

    SuspendThread(hthread);

    ResumeThread(hthread);

    获取线程退出代码:

    GetExitCode(hthread,&code);

    等待线程退出(线程受信状态或超时)

    WaitForSignleObject(htread,1000);

    WaitForMultipleObjects(num,handles,true,INFINITE);

    遍历线程:

    CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);

    Thread32First(hsnap,&mdl32);

    Thread32Next(hsnap,&mdl2);

    获取线程函数入口:

    ZwQueryInfomationThread(hthread,ThreadQuerySetWin32StartAddress,&buf,4,NULL);

    打开线程:

    OpenThread(THREAD_ALL_ACCESS,false,&tid);

    获取线程函数地址所属模块:

    GetMappedFileName(hproc,addr,buf,256);

    读写线程优先级:

    SetThreadPriority(hthread,Normal);

    GetThreadPriority(hthread);

    SetThreadPriorityBoost(hproc,true);

    GetThreadPriorityBoost(hproc,pBool);

    终止线程:

    ExitThread(5);

    TerminateThread(hthread,5);

    线程同步临界区对象:

    InitializeCriticalSection(&cs);

    EnterCriticalSection(&cs);

    LeaveCriticalSection(&cs);

    DeleteCriticalSection(&cs);

    线程同步事件内核对象:

    OpenEvent(EVENT_ALL_ACCESS,false,name);

    CreateEvent(NULL,false,true,NULL);

    WaitForSingleObject(hevnt,INFINITE);

    SetEvent(hevnt);

    ResetEvent(hevnt);

    线程同步互斥内核对象:

    CreateMutex(NULL,false,NULL);

    WaitForSingleObject(hmutex,INFINITE);

    ReleaseMutex(hmutex);

    OpenMutex(MUTEX_ALL_ACCESS,false,name);

    三、注册表

    创建键:

    RegCreateKeyEx(HKEY_CURRENT_USER,TestNewKey,0,0,REG_OPTION_VOLATILE,KEY_ALL_ACCESS,0,&subkey,&state);

    打开键:

    RegCreateKeyEx(HKEY_CURRENT_USER,Control Panel,0,KEY_ALL_ACCESS,&subkey);

    关闭键:

    RegCloseKey(hkey);

    遍历键:

    RegEnumKeyEx(hsubkey,index,keyname,&nameSize,0,0,0,&time);

    FileTimeToSystemTime(&time,&systime);

    RegQueryInfo(hsubkey,0,0,0,&count,0,0,0,0,0,0,0);

    删除键:

    RegDeleteKeyEx(hmainkey,subkeyName);

    创建值:

    RegSetValueEx(hsubkey,test,0,REG_WORD,(BYTE*)&value,4);

    遍历值:

    RegEnumValue(hsubkey,index,name,&nameSize,0,&type,valuebuf,valueLen);

    RegQueryValueEx(hsubkey,name,0,type,buf,&size);

    删除值:

    RegDeleteValue(hsubkey,valuename);

    四、文件

    创建/打开文件:

    CreateFile(a.txt,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

    设置文件指针:

    SetFilePointer(hFile,0,NULL,FILE_END);

    读写文件:

    ReadFile(hFile,buf,len,&size,0);

    WriteFile(hFile,buf,len,&size,0);

    强制文件写入磁盘,清空文件高速缓冲区:

    FlushFileuffers(hFile);

    []锁文件区域:

    LockFile(hFile,0,0,100,0);

    UnlockFile(hFile,0,0,100,0);

    复制文件:

    CopyFile(src,des,true);

    CopyFileEx(src,des,func,&para,false, COPY_FILE_FAIL_IF_EXISTS);

    移动文件:

    MoveFile(src,des);

    MoveFileEx(src,des,false);

    MoveFileWithProgress(src,des,fun,&para, MOVEFILE_COPY_ALLOWED);

    删除文件:

    DeleteFile(filename);

    获取文件类型(FILE_TYPE_PIPE)

    GetFileType(hFile);

    获取文件大小:

    GetFileSize(hFile,&high);

    获取文件属性(例如FILE_ATTRIBUTE_DIRECTORY进行&运算)

    GetFileAttributes(hFile);

    遍历文件:

    FindFirstFile(nameMode,&wfd);

    FindNextFile(hFile,&wfd);

    创建管道:

    CreatePipe(&hRead,&hWrite,&sa,0);

    创建内存映射文件:

    CreateFile(d:\\a.txt,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,myMap);

    加载内存映射文件:

    MapViewOfFile(hmap,FILE_MAP_ALL_ACCESS,0,0,0);

    打开内存映射文件:

    OpenFileMapping(FILE_AMP_ALL_ACCESS,false,myMap);

    卸载内存映射文件:

    UnmapViewOfFile(baseAddr);

    强制写入内存映射文件到磁盘:

    FlushViewOfFile(baseAddr,len);

    创建文件夹(只能创建一层)

    CreateDirectory(D:\\a,NULL);

    CreateDirectory(C:\\a,D:\\b,NULL);

    删除文件夹(只能删除空文件夹)

    RemoveDirectory(C:\\a);

    检测逻辑驱动器:

    GetLogicalDrives();

    GetLogicalDriveStrings(len,buf);

    获取驱动器类型(DRIVE_CDROM)

    GetDriveType(D:\\);

    五、网络

    打开网络资源枚举过程(winnetwk.hMpr.lib):

    WNetOpenEnum(RESOURCE_GLOBAL,RESOURCETYPE_ANY,0,NULL,hnet);

    枚举网络资源:

    WNetEnumResource(hnet,&count,pNetRsc,&size);

    关闭网络资源枚举过程:

    WNetCloseEnum(hnet);

    打开关闭WinSocket库:

    WSAStartup(version,&wsa);

    WSACleanup();

    创建套接字:

    socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

    绑定套接字IP和端口:

    bind(sock,&addr,len);

    监听TCP连接:

    listen(sock,10);

    接收TCP连接请求:

    accept(sock,&addr,&len);

    客户端连接:

    connect(sock,&addr,len);

    发送TCP数据:

    send(sock,buf,len,0);

    接收TCP数据:

    recv(sock,buf,len,0);

    发送UDP数据:

    sendto(sock,buf,len,0,&addr,len);

    接收UDP数据:

    recvfrom(sock,buf,len,0,&addr,&len);

    六、服务

    打开SCM服务控制管理器:

    OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);

    创建服务:

    CreateService(mgr,"MyService"," MyService",SERVICE_ALL_ACCESS,      SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_IGNORE,path,NULL,NULL,NULL,NULL,NULL);

    打开服务对象:

    OpenService(mgr," MyService ",SERVICE_START);

    启动服务:

    StartService(serv,0,NULL);

    查询服务状态:

    QueryServiceStatus(serv,&state);

    关闭服务句柄:

    CloseServiceHandle(hdl);

    连接到SCM

    StartServiceCtrlDispatcher(DispatchTable);

    注册服务控制函数:

    RegisterServiceCtrlHandler("MyServicer",ServiceCtrl);

    设置服务状态:

    SetServiceStatus(hss,&ServiceStatus);

    控制服务:

    ControlService(serv,SERVICE_CONTROL_STOP,&state);

    删除服务:

    DeleteService(serv);

    遍历服务:

    EnumServicesStatus(hscm,SERVICE_WIN32|SERVICE_DRIVER,SERVICE_STATE_ALL,&srvSts,len,&size,&count,NULL);

    查询服务配置:

    QueryServiceConfig(hserv,&srvcfg,size,&size);

    七、消息

    发送消息:

    SendMessage(HWND_BROADCAST,WM_LBUTTONDOWN,0,0);

    接收消息:

    GetMessage(&msg,NULL,0,0);

    投递消息:

    PostMessage(HWND_BROADCAST,WM_LBUTTONDOWN,0,0);

    获取消息:

    PeekMessage(&msg,NULL,0,0);

    转换消息:

    TranslateMessage (&msg);

    分发消息:

    DispatchMessage (&msg);

    等待消息:

    WaitMessage();

    发送退出消息:

    PostQuitMessage(0);

    安装消息钩子:

    SetWindowsHookEx(WH_KEYBOARD,keyBoardProc,0,tid);

    卸载消息钩子:

    UnhookWindowsHookEx(hhk);

    以上是作者目前就相关技术所接触的最常用的一批API函数,这肯定不是最完整的,但是都是博主从一份份资料中挖掘出来的,也希望读者能多多补充,相互进步!

    展开全文
  • 基于WinAPI的窗口示例

    千次阅读 2018-11-12 23:10:36
    实现的主要功能如下: 程序默认图标为?,默认光标为左右箭头,在指定位置输出 文字消息 单击鼠标左键时,弹出对应点的位置坐标(注意坐标转换) 单击键盘的上下左右键时,弹出对应的对话框(键盘消息的处理方式) ...

    实现的主要功能如下:

    1. 程序默认图标为?,默认光标为左右箭头,在指定位置输出 文字消息
    2. 单击鼠标左键时,弹出对应点的位置坐标(注意坐标转换)
    3. 单击键盘的上下左右键时,弹出对应的对话框(键盘消息的处理方式)
    #include "windows.h"
    #include "stdio.h"
    
    LRESULT CALLBACK DealMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	PAINTSTRUCT pen;
    	HDC dc;
    	TCHAR *PP = L"你好,Windows";
    	switch (uMsg)
    	{
    		//鼠标左键按下
    	case WM_LBUTTONDOWN:
    		{
    			TCHAR buf[1024] = {0};
    			int x = 10, y = 10;
    			POINT pt;//CPoint pt;
    			GetCursorPos(&pt);//该函数检取光标的位置,以屏幕坐标表示, 如果为了与TextOut 相比的话,则需要将屏幕坐标转换为客户区坐标
    			ScreenToClient(hWnd, &pt);//的将屏幕坐标转换为客户区坐标//TextOut中就是客户区坐标
    			x = pt.x;
    			y = pt.y;
    			wsprintf(buf,TEXT("x = %d , y = %d"),x,y);
    			MessageBox(hWnd,buf,TEXT("坐标"),MB_OK);
    		}
    		break;
    		//关闭程序
    	case WM_DESTROY://WM_QUIT//只有发这个命令时,关闭调试程序时,代码上的调试才会结束 
    		PostQuitMessage(2);
    		break;
    	case WM_PAINT://输出文字
    		{
    			dc = BeginPaint(hWnd,&pen);
    			TextOutW(dc,20,20,PP,wcslen(PP));//客户区坐标
    			EndPaint(hWnd,&pen);
    			break;
    		}
    	case WM_KEYDOWN://当有键盘输入事件时,会产生 WM_KEYDOWN 消息
    		{
    			switch(wParam)//虚拟键
    			{
    				case VK_LEFT:
    					MessageBox(hWnd,TEXT("向左"),TEXT("坐标"),MB_OK);
    					break;
    				case VK_UP:
    					MessageBox(hWnd,TEXT("向上"),TEXT("坐标"),MB_OK);
    					break;
    				case VK_RIGHT:
    					MessageBox(hWnd,TEXT("向右"),TEXT("坐标"),MB_OK);
    					break;
    				case VK_DOWN:
    					MessageBox(hWnd,TEXT("向下"),TEXT("坐标"),MB_OK);
    					break;
    				case VK_RETURN:
    					MessageBox(hWnd,TEXT("键盘Enter"),TEXT("坐标"),MB_OK);
    					break;
    			}
    			break;
    		}		
    	default:
    		return DefWindowProc(hWnd, uMsg,wParam, lParam);
    	}
    	return 0;
    }
    
    int WINAPI WinMain(
    	HINSTANCE hInstance,
    	 HINSTANCE hPrevInstance,
    	LPSTR lpCmdLine,
    	int nShowCmd)
    {
    	HWND hWnd;
    	MSG msg;
    	WNDCLASS cs;
    	DWORD dWord;
    	cs.cbClsExtra       = 0;
    	cs.cbWndExtra       = 0;//这个写错了,写成了第一个参数,导致注册类不成功!!!!!
    	cs.hbrBackground    = (HBRUSH)GetStockObject(WHITE_BRUSH);//画刷北京BLACK_PEN
    	cs.hCursor          = LoadCursor(NULL,IDC_SIZEWE);
    	cs.hIcon            = LoadIcon(NULL,IDI_QUESTION);
    	cs.hInstance        = hInstance;
    	cs.lpfnWndProc      = DealMessage;
    	cs.lpszClassName    = TEXT("ABC");
    	cs.lpszMenuName     = NULL;
    	cs.style            = nShowCmd;
    
    	if (!RegisterClass(&cs))//这里可以查看是否注册成功//返回非零是成功,返回零是失败
    	{
    		MessageBox(NULL,TEXT("注册类失败,请检查参数是否成功设置"),TEXT("坐标"),MB_OK);
    	}
    
    	hWnd = CreateWindow(TEXT("ABC"), TEXT("hello,windows"), WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL, CW_USEDEFAULT,CW_USEDEFAULT
    		,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL);//CreateWindow中窗口类与 WNDCLASS中窗口类名必须一样才可以,否则也是运行不了
    
    	if (!hWnd)
    	{
    		return 0;
    	}
    
    	MoveWindow(hWnd,30,30,580,480,TRUE);//相对整个桌面屏幕的左上角。。。测试过
    
    	ShowWindow(hWnd,SW_NORMAL);
    
    	UpdateWindow(hWnd);
    
    	while (GetMessage(&msg,NULL,0,0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	
    	return 1;
    }
    
    展开全文
  • WinAPI 大全

    2019-10-08 06:52:19
    https://www.cnblogs.com/vanver/archive/2013/06/13/NO-2013_06_13pm.html 转载于:https://www.cnblogs.com/endenvor/p/11579993.html

    https://www.cnblogs.com/vanver/archive/2013/06/13/NO-2013_06_13pm.html

    转载于:https://www.cnblogs.com/endenvor/p/11579993.html

    展开全文
  • WinAPI 数据类型

    2019-07-19 15:06:17
    # 启动 MySQL 服务 sudo service mysql start # 使用 root 用户登录,密码为空 mysql -u root # 查看全部数据库 show databases; # 创建数据库 CREATE DATABASE mysql_...CREATE TABLE employee (id ...
  • WinAPI

    2016-06-03 11:24:44
    常用的winAPI.1.MessageBoxMSDN:实例记
  • winapi ···

    千次阅读 2013-05-02 00:40:19
    黑客常用WinAPI函数整理   之前的博客写了很多关于Windows编程的内容,在Windows环境下的黑客必须熟练掌握底层API编程。为了使读者对黑客常用的Windows API有个更全面的了解以及方便日后使用API方法的查询,特...
  • WINAPI

    2010-08-03 22:41:00
    WINAPI见windef.h这个头文件 <br />含义#define WINAPI __stdcall    默认情况下,我们的函数调用都是遵循__stdcall这个规则的。当然,也有诸如__cdecl、__pascal等规则。    ...
  • WINAPI

    千次阅读 2014-06-23 14:57:23
    一直搞不懂为什么在函数前面加上WINAPI、CALLBACK等是什么意思 又不是返回值 为什么加在前面 今天终于知道了 这是一个呼叫声明(姑且称之吧)。 引子: 看看这个函数: int PASCAL WinMain(HINSTANCE ...
  • WINAPI WinMain

    千次阅读 2007-05-20 17:01:00
    #include #include LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nShowCmd){ WNDCLASS wc
  • 在函数前面加上WINAPI、CALLBACK

    千次阅读 2016-01-26 19:59:06
    一直搞不懂为什么在函数前面加上WINAPI、CALLBACK等是什么意思 又不是返回值 为什么加在前面 今天终于知道了这是一个呼叫声明(姑且称之吧)。 引子: 看看这个函数: int PASCAL WinMain(HINSTANCE hInst,...
  • 函数类型+WINAPI+函数名

    千次阅读 2017-07-11 08:44:10
    int WINAPI WINMain 中,WINAPI含义 网友给出回答: 在windef.h头文件中有如下定义 #define WINAPI __stdcall #define APIENTRY WINAPI VC有两种函数调用方式 一种是__stdcall,另一种是__cdecl 函数的...
  • WinAPI文件操作

    千次阅读 2010-05-28 09:04:00
    API太多时间久了容易忘记,存在这儿,用的时候免得...//--------------------------------------------------------------- /* * WinAPI文件操作 * Compiled: VC2005 * Character Set: Multi-Byte * Auth: 陈相礼 * Dat
  • 使用winAPI 串口通信(一)

    千次阅读 2008-01-21 09:57:00
    串口和其他通信设备是作为文件... 使用winAPI来编写 串口通信程序时,读写操作可以有同步方式与重叠的异步方式. 所谓同步方式,就是当命令发出后,直到数据确实写入到缓冲区后,写函数才返回.这种方式操作简单,但当数
  • [c++] WINAPI

    2019-06-28 19:45:27
    int WINAPI WINMain 中,WINAPI含义 在windef.h头文件中有如下定义: #define WINAPI __stdcall #define APIENTRY WINAPI 函数的调用方式有两种一种是PASCAL调用方式,另一种是C调用方式 使用PASCAL调用方式,函数在...
  • 完整,干净的WINAPI窗口创建

    千次阅读 2013-05-11 06:34:55
    像C学习的第一个程序一样“hello world”级别的基础WIN32程序。 // WindowsApp.cpp #include // 包含windows头文件 #include #define BUFFER_LENGTH 50 // buffer长度 ...BOOL DesignClass(HINSTANCE
  • WinAPI 参考大全,可以通过索引查询各API函数
  • typedef int (WINAPI * PMESSAGE)(); WINAPI 调用约定,调用例子。
  • VC-winAPI函数大全(分类&中文对译)
1 2 3 4 5 ... 20
收藏数 69,615
精华内容 27,846
关键字:

winapi