c# 调用 win32 API的 SendMessage 函数 ,里面的属性用法?

c# 调用 win32 API的 SendMessage 函数 ,里面的属性用法?,第1张

SendMessage 这个消息比较特别,因为它的参数返回值会根据不同的消息而不同

首先来解析一下这个函数

第一个参数HWND hWnd ,是要将这个消息发送的对象的句柄,hwnd一般指窗口句柄,但这里的窗口是广义上的,一个按钮,一个文本框,一个列表框等等控件这些都可以看成按钮,所以传它们的句柄也可以。

第二个参数UINT Msg就是要发送的消息是什么, 窗口消息一般都以WM开头,意思是WindowMessage 取了2个字母, 而按钮消息一般以BM开头即ButtonMessage,静态类的是

STM,列表框是LBM 等等。 总之你要发什么消息,这里就写什么消息。

第三个和第四个参数是针对消息的附加参数。 这2个参数会参着所传入的消息值的不同而变经。

WPARAM曾经在16位的WINDOWS当中是一个16位的整数即word parameter

LPARAM曾经在16位的WINDOWS当中是一个32位的整数即long parameter

当时要使用LPARAM一般都要用HIWORD和LOWORD宏来取LPARAM的高16位和低16位,因它们分别代表不同的东西。

而现在对于32位的 *** 作系统来说,它们没啥区别了,都是一个32位的整数,之所以没改名称,大概微软为了兼容性吧。

其实在winuserh中对它们都有定义,追踪过去一般都可以看到是long类型。

此函数的返回值也会因为所发消息的不同而不同

举个例子,当我们单击了窗口中一个按钮中,程序会将一个WM_COMMAND放入程序的消息队列中,于是窗口可以对WM_COMMAND消息进行处理

LRESULT CALLBACK WindowProc(

HWND hwnd, // handle to window

WM_COMMAND, // the message to send

WPARAM wParam, // notification code and identifier

LPARAM lParam // handle to control (HWND)

);

这是MSDN中的说明,第一个肯定是窗口的句柄,第二个就是消息

第三个参数,指明了按钮的通知码和ID

wParam

The high-order word specifies the notification code if the message is from a control If the message is from an accelerator, this value is 1 If the message is from a menu, this value is zero

The low-order word specifies the identifier of the menu item, control, or accelerator

高位的字代表通知码,低位字代表它的ID, 我们一般用HIWORD 和LOWORD来分离它们

比如id = LOWORD(wParam) 这样

lParam

Handle to the control sending the message if the message is from a control Otherwise, this parameter is NULL

这个代表了控件的句柄,就是所点击的那个按钮的句柄。

再比如这个:

SendMessage(

(HWND) hWnd, // handle to destination window

BM_GETCHECK, // message to send

(WPARAM) wParam, // not used; must be zero

(LPARAM) lParam // not used; must be zero

);

这个BM_GETCHECK消息可以获得一个复选框是否打勾

第一个参数,很显然该写上那个复选框的句柄

第二个参数,就是那个消息

第三和第四个参数在MSDN中写的很清楚,不使用,必须写0

所以调用时我们很明确要写成

SendMessage(hwndCtrl,BM_GETCHECK,0,0);

而它的返回值可以是下边的几个

BST_CHECKED BST_INDETERMINATE BST_UNCHECKED

这个些在winuserh中有宏定义的,它们本质就是一些整数,只不过这样宏定义以后更容易理解

所以有时候我们就可以用一个if句判断它是不是选中

if(BST_CHECKED == SendMessage(hwndCtrl,BM_GETCHECK,0,0))

{

//写上处理代码

}

这些东西都可以在MSDN中查到,OK 差不多就这些

void CMenuYX::OnPpcs()

{

UpdateData(TRUE);//获取复选框状态

if(m_Judge1)//注意m_Judge1成员变量是对应于复选框的BOOL变量

{

GetDlgItem(IDC_EDIT1)->EnableWindow(TRUE);

}

else

{

GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE);

}

}

//类似的问题我遇到过,关键在于要先获取复选框状态。

sendmessage,是发一个消息到MFC的消息循环里然后就会被执行了

OnCmdMsg(UINT nID, int nCode, void pExtra, AFX_CMDHANDLERINFO pHandlerInfo)重载这个就可以自己响应你发的消息了

MFC 里面都是用消息实现的

sendmessage也是有返回值的你可以自己处理这些返回

--------------------

BM_GETSTATE

这些都是被封装了的没公开

就算OnCmdMsg也只是在半路给我们踩一脚而已,底层不会公开的

GetDlgItem(IDC_23H)->ShowWindow(SW_SHOW),你这样写就是让控件显示,而不是判断状态。

判断窗口显示状态,用API函数IsWindowVisible(hWnd),或者用MFC的窗口函数GetStyle实现,代码大致如下:

if(radio2->GetCheck()==BST_CHECKED&&(GetDlgItem(IDC_23H)->GetStyle() & WS_VISIBLE))

获取复选框选中状态:

if (1 == pButton[i]) // 选中

{

// 你的处理

}

获取文本框的文本:

CString strText;

pEdit1GetWindowText(strText);

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

原文地址: http://outofmemory.cn/langs/12178316.html

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

发表评论

登录后才能评论

评论列表(0条)

保存