今天读到一个自定义消息函数修改发包命令,下载文件的命令号是4, 没太看懂此处用位运算的逻辑。“4 << 1 | 0”
//int ret = SendCommandPacket(4, false, (BYTE*)(LPCTSTR)strFile, strFile.GetLength()); //修改前
int ret = SendMessageA(WM_SEND_PACKET, 4 << 1 | 0, (LPARAM)(LPCSTR)strFile); //用自定义消息函数发送下载文件命令
......
#define WM_SEND_PACKET (WM_USER + 1)
//自定义消息响应函数
/*用位运算合并参数*/
LRESULT CRemoteControlClientDlg::OnSendPacket(WPARAM wParam, LPARAM lParam)
{
int ret = 0;
int cmd = wParam >> 1;
switch (cmd)
{
case 4: //下载文件
{
CString strFile = (LPCTSTR)lParam;
ret = SendCommandPacket(cmd, wParam & 1,
(BYTE*)(LPCTSTR)strFile, strFile.GetLength());
}
break;
case 6://截取屏幕
{
ret = SendCommandPacket(cmd, wParam & 1);
}
break;
default:
ret = -1;
}
return ret;
}
该回答引用GPTᴼᴾᴱᴺᴬᴵ
这里的位运算逻辑是将命令号左移1位(相当于乘以2)然后与0按位或运算。这样做的目的是将命令号的最后一位用作一个标志位,表示是否需要等待服务器的回应。如果等待回应,标志位就是1,否则是0。这样通过位运算合并参数,就可以在发送命令时将等待回应的标志位一并传递给服务器。在自定义消息响应函数中,使用位运算将参数还原,并根据命令号执行相应的操作。