C++获取光标所在位置的句柄,并向光标处发送数据,用PostMessage(),要详细代码。

C++获取光标所在位置的句柄,并向光标处发送数据,用PostMessage(),要详细代码。,第1张

通过Windows API 函数“HWND WindowFromPoint(POINT Point)”可以获取光标所在处的窗口句柄。需要有一个触发消息来调用这个函数:比如按下键盘上的某个按键来触发这个函数调用。这是个简单的示范,能够模拟鼠标点击其他窗口的关闭按钮行为;要获得更完善的方案,可以给我私信。

具体 *** 作方法:运行程序,让后将鼠标指针移动至其他窗口之上,最好是在标题栏上;然后按下键盘上的任意按键(推荐按字母键)。

在VC++60“文件”菜单中,新建一个空的“Win32 AppLication”工程。然后新建一个cpp源文件,在源文件中写入如下代码:

#include <windowsh>

LRESULT CALLBACK WindowProc(HWND hdl_wnd, UINT msg_code, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)

{

 WNDCLASS wndcls;

 wndclscbClsExtra = 0;

 wndclscbWndExtra = 0;

 wndclshbrBackground = (HBRUSH)COLOR_BTNSHADOW;

 wndclshCursor = ::LoadCursor(NULL, IDC_ARROW);

 wndclshIcon = ::LoadIcon(NULL, IDI_APPLICATION);

 wndclshInstance = hInstance;

 wndclslpfnWndProc = WindowProc;

 wndclslpszClassName = "gethandle";

 wndclslpszMenuName = NULL;

 wndclsstyle = CS_VREDRAW | CS_HREDRAW;

 ::RegisterClass(&wndcls);

 ::CreateWindow("gethandle", "获取窗口句柄", WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, 200, 120, 400, 300, NULL, NULL, hInstance, 0);

 MSG msg;

 while (::GetMessage(&msg, NULL, 0, 0))

 {

   ::TranslateMessage(&msg);

   ::DispatchMessage(&msg);

 }

 return 1;

}

LRESULT CALLBACK WindowProc(HWND hdl_wnd, UINT msg_code, WPARAM wParam, LPARAM lParam)

{

 LRESULT value = 0;

 switch (msg_code)

 {

   case WM_CLOSE:

     ::PostQuitMessage(WM_QUIT);

   break;

    //注意:必须在本窗口获得键盘输入焦点的时候,WM_KEYDOWN消息才能生效!

    //如果想在本窗口没有焦点的时候都能生效,则需要安装全局的键盘钩子。

   case WM_KEYDOWN:

   {

     POINT pt;

     HWND hdl_other;

     ::GetCursorPos(&pt);  //获取鼠标指针的坐标

     hdl_other = ::WindowFromPoint(pt); //将该坐标传递给获取句柄的函数

     ::PostMessage(hdl_other, WM_CLOSE, 0, 0);  //用获取到的句柄,向目标窗口发送一个WM_CLOSE消息。WM_CLOSE消息相当于用户点击了窗口右上角的关闭按钮。

   }

   break;

   default:

   return ::DefWindowProc(hdl_wnd, msg_code, wParam, lParam);

 }

 return value;

}

一,常见数据类型

WORD:                16位无符号整形数据

DWORD:             32位无符号整型数据(DWORD32)

DWORD64:         64位无符号整型数据

INT:                       32位有符号整型数据类型

INT_PTR:             指向INT数据类型的指针类型

INT32:                  32位符号整型

INT64:                  64位符号整型

UINT:                    无符号INT

LONG:                 32位符号整型(LONG32)

ULONG:              无符号LONG

LONGLONG:      64位符号整型(LONG64)

SHORT:              无符号短整型(16位)

LPARAM:           消息的L参数

WPARAM:         消息的W参数

HANDLE:           对象的句柄,最基本的句柄类型

HICON:               图标的句柄

HINSTANCE:    程序实例的句柄

HKEY:                注册表键的句柄

HMODULE:       模块的句柄

HWND:              窗口的句柄

LPSTR:              字符指针,也就是字符串变量

LPCSTR:           字符串常量

LPCTSTR:         根据环境配置,如果定义了UNICODE宏,则是LPCWSTR类型,否则则为LPCSTR类型

LPCWSTR:       UNICODE字符串常量

LPDWORD:      指向DWORD类型数据的指针

CHAR:               8比特字节

TCHAR:             如果定义了UNICODE,则为WCHAR,否则为CHAR

UCHAR:            无符号CHAR

WCHAR:           16位Unicode字符

BOOL:                布尔型变量

BYTE:                 字节类型(8位)

CONST:             常量

FLOAT:              浮点数据类型

SIZE_T:              表示内存大小,以字节为单位,其最大值是CPU最大寻址范围

VOID:                 无类型,相当于标准C语言中的void

WINAPI:             Windows API的函数调用方式,常见于SDK头文件中对API函数的声明中,相当于_stdcall(更严格地说,这不是数据类型,而是一种函数调用约定

二,Windows数据类型命名规律

基本数据类型包括:BYTE、CHAR、WORD、SHORT、INT等。

指针类型的命令方式一般是在其指向的数据类型前加“LP”或“P”,比如指向DWORD的指针类型为“LPDWORD”和“PDWORD”

各种句柄类型的命名方式一般都是在对象名前加“H”,比如位图(BITMAP)对应的句柄类型为“HBITMAP”。

无符号类型一般是以“U”开头,比如“INT”是符号类型,“UINT”是无符号类型

根据这些命名规律以及自己的经验看到一些没见过的数据类型也就能知道它的代表的意思

三,Windows参数简写

1、  b 布尔

2、 by BYTE

3、 c chr 或WCHAR TCHAR

4、 n short

5、 i int

6、 x、y 分别表示x 坐标,y 坐标

7、 cx、cy 分别表示x 方向长度和y 方向长度

8、 b 或f BOOL(int),f 代表“flag”

9、 w WORD(无符号short)

10、l LONG 长整数

11、dw DWORD 无符号长整数

12、fn function 函数

13、s string 字符串

14、sz 以0 字节结尾的字符串

15、h 句柄

16、p 指针

17、lpfn 指向函数的长指针

18、cb 字节数

19、lpsz 指向以0 结尾的字符串的长指针

20、g_ 全局变量

21、c_ 常量

22、m_ 类数据成员

23、s_ 静态变量

24、CS_ 类风格选项

25、CW_ 创建窗口选项

26、DT_ 绘制文本选项

27、IDI_ 图标ID 号

28、IDC_ 光标ID 号

29、MB_ 消息框选项

30、SND_ 声音选项

31、WM_ 窗口消息

32、WS_ 窗口风格

33、rc 矩形

四,Windows数据类型与标准C数据类型的关系

       查看Windows数据类型的定义可以看到,所有的windows数据类型都是由C数据类型经过类型重定义得到的。

        DWORD实质上就是 unsigned long 数据类型,32位无符号整型。

HANDLE类型实质上是void,HANDLE定义为:

typedof    PVOID    HANDLE;

HANDLE实际上就是一个PVOID,那PVOID又是什么呢?

typeof     void      PVOID;

PVOID就是指向void的指针。

所有的Windows数据类型都是通过这种方式在SDK的头文件中进行定义的,它们都是来源于标准C的

生产窗体可以使用CreateWindowEx函数。函数功能:该函数创建一个具有扩展风格的层叠式窗口、d出式窗口或子窗口,其他与CreateWindow函数相同。函数原型:CreateWindowEx函数创建一个层叠的,自动d出的(pop-up)或是一个子窗口通过扩展格式。另外这个函数的作用与CreateWindow函数的作用相同。要获得的关于创建窗口的信息和关于CreateWindowEx函数参数的详细描述。参见CreateWindowHWNDCreateWindowEx(DWORDdwExStyle, //窗口的扩展风格LPCTSTRlpClassName, //指向注册类名的指针LPCTSTRlpWindowName, //指向窗口名称的指针DWORDdwStyle, //窗口风格intx, //窗口的水平位置inty, //窗口的垂直位置intnWidth, //窗口的宽度intnHeight, //窗口的高度HWNDhWndParent, //父窗口的句柄HMENUhMenu, //菜单的句柄或是子窗口的标识符HINSTANCEhInstance, //应用程序实例的句柄LPVOIDlpParam //指向窗口的创建数据);例程:include#includeLRESULT CALLBACK WinDouProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter);class CWnd{public: CWnd() { m_hWnd = NULL; } BOOL CreateEx( DWORD dwExStyle, // extended window style LPCTSTR lpClassName, // pointer to registered class name LPCTSTR lpWindowName, // pointer to window name DWORD dwStyle, // window style int x, // horizontal position of window int y, // vertical position of window int nWidth, // window width int nHeight, // window height HWND hWndParent, // handle to parent or owner window HMENU hMenu, // handle to menu or child-window identifier HANDLE hInstance, // handle to application instance LPVOID lpParam // pointer to window-creation data ); BOOL ShowWindow( int nCmdShow ); BOOL UpdateWindow();public: HWND m_hWnd;};BOOL CWnd::CreateEx( DWORD dwExStyle, // extended window style LPCTSTR lpClassName, // pointer to registered class name LPCTSTR lpWindowName, // pointer to window name DWORD dwStyle, // window style int x, // horizontal position of window int y, // vertical position of window int nWidth, // window width int nHeight, // window height HWND hWndParent, // handle to parent or owner window HMENU hMenu, // handle to menu or child-window identifier HANDLE hInstance, // handle to application instance LPVOID lpParam // pointer to window-creation data){ m_hWnd = ::CreateWindowEx (dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,(HINSTANCE)hInstance,lpParam); if(m_hWnd != NULL) return TRUE; else return FALSE;}BOOL CWnd::ShowWindow(int nCmdShow){ return ::ShowWindow(m_hWnd,nCmdShow);}BOOL CWnd::UpdateWindow(){ return ::UpdateWindow(m_hWnd);}int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // pointer to command line int nCmdShow // show state of window){ WNDCLASS wndclass; //先设计窗口类 wndclasscbClsExtra = 0; wndclasscbWndExtra = 0; wndclasshbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH); wndclasshCursor = LoadCursor(NULL,IDC_HELP); wndclasshIcon = LoadIcon(NULL,IDI_WARNING); wndclasshInstance = hInstance; wndclasslpfnWndProc = WinDouProc; wndclasslpszClassName = "Magic_Maggie"; wndclasslpszMenuName = 0; wndclassstyle = CS_VREDRAW | CS_HREDRAW; //某一个变量原油几个变量去掉一个特征,可以用取反(~)后再进行与(&) //例如:style上去掉CS_NOCLOSE,可以style&~CS_NOCLOSE; RegisterClass(&wndclass); ///注意先建立再注册昂 CWnd wnd; wndCreateEx(NULL,"Magic_Maggie","DouDou",WS_OVERLAPPEDWINDOW,0,0,800,600,NULL,NULL,hInstance,NULL); wndShowWindow(SW_SHOWNORMAL); wndUpdateWindow(); MSG msg; //消息循环 while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); //触发WinDouProc } return 0;} LRESULT CALLBACK WinDouProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter){ switch(uMsg) { case WM_LBUTTONDOWN: MessageBox(hwnd,"您按下了鼠标左键昂","豆豆的程序",MB_OK); HDC hdc; hdc = GetDC(hwnd); //The GetDC function retrieves a handle to a display device context for the client area of a specified window or for the entire screen You can use the returned handle in subsequent GDI functions to draw in the device context TextOut(hdc,0,0,"感谢您对豆豆程序的支持昂",strlen("感谢您对豆豆程序的支持昂")); ReleaseDC(hwnd,hdc); break; case WM_CHAR: char szChar[20]; sprintf(szChar,"Char is %d",wParam); MessageBox(hwnd,szChar,"豆豆的程序",MB_OK); break; case WM_PAINT: PAINTSTRUCT ps; HDC hDc; hDc = BeginPaint(hwnd,&ps); TextOut(hDc,0,0,"这个是重绘滴哦",strlen("这个是重绘滴哦")); EndPaint(hwnd,&ps); break; case WM_CLOSE: //这个case与下边的destroy这个case不要弄错了,否则窗口不出现,但任务管理器中运行 if(IDYES == MessageBox(hwnd,"您真的要退出么","豆豆的程序",MB_YESNO)) { DestroyWindow(hwnd); } break; case WM_DESTROY: PostQuitMessage(0); ////////////////////////////////////////// break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); // 别忘记了return } return 0;}

你这样没啥实际意义,实际上如果你想一下子显示一G多的是不可能的除非在**屏上!通常的做法是,将这1G的数据导入内存中,建立一个映射,以显示决定数据导出,就是说屏幕上显示哪块,就导入这块的数据!比如你可以用MFC的文档视图功能。

以上就是关于C++获取光标所在位置的句柄,并向光标处发送数据,用PostMessage(),要详细代码。全部的内容,包括:C++获取光标所在位置的句柄,并向光标处发送数据,用PostMessage(),要详细代码。、Windows常见数据类型、c++ 怎么用api扒数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9867342.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存