10. GetMessage


GetMessage

函数功能:

GetMessage 函数的作用是从当前线程的消息队列里获取一个消息并填入 MSG 结构 中。

该函数只能获取调用线程的消息,不能获得其他线程的消息。成功获取消息后,线程将从消息队列中删除该消息。

使用 GetMessage 函数,如果消息队列为空,函数会一直等待直到有消息到来才有返回值。如果希望函数立刻返回(无论是否获取消息),请使用 PeekMessage 函数。

API 函数原型:

BOOL WINAPI GetMessage(
  _Out_     LPMSG lpMsg,
  _In_opt_  HWND hWnd,
  _In_      UINT wMsgFilterMin,
  _In_      UINT wMsgFilterMax
);

参数解析:

参数含义
IpMsg指向MSG结构的指针,用于存放获取到的消息
hWnd1.需要获取消息的窗口的句柄,该窗口必须属于当前线程
2.当其值是NULL时,将获取所有的当前线程的窗口消息和线程消息。
3.当其值是-1是,只获取当前线程消息
wMsgFilterMin指定被可以被获取的消息值的最小整数(消息其实就是一个被定义的整数)
wMsgFilterMax指定被可以被获取的消息值的最大整数

返回值:

  1. 如果函数取得 WM_QUIT 之外的其他消息,返回值是非 0;

  2. 如果函数取得 WM_QUIT 消息,返回值是 0;

  3. 如果出现了错误,返回值是 -1。

备注:

  1. 应用程序通常根据 GetMessage 函数的返回值决定是否结束消息循环并退出程序;

  2. 如果 hWnd 参数不为零,则 GetMessage 函数只获取属于 hWnd 窗口的消息,以及被 IsChild 函数确定为 hWnd 的子窗口的消息;

  3. wMsgFilterMin 和 wMsgFilterMax 参数限定消息获取的范围,如果二者都为 0,则消息获取的范围为所有消息;

  4. 注意,即便你通过 wMsgFilterMin 和 wMsgFilterMax 参数限定消息获取的范围,但 WM_QUIT 不受此范围影响(无法阻止此消息被 PeekMessage 函数获取);

  5. 调用此函数的过程中,如果接收到非排队消息 —— 也就是由该线程调用 SendMessage, SendMessageCallback, SendMessageTimeout, 或 SendNotifyMessage 发送给所属窗口的消息 —— 系统先暂时挂起等待,然后再获取过滤器匹配的第一个队列消息。如果不指定过滤器,那么按照以下顺序获取消息:

Sent messages
Posted messages
Input (hardware) messages and system internal events
Sent messages (again)
WM_PAINT messages
WM_TIMER messages

  1. PeekMessage 函数通常不会从消息队列中删除 WM_PAINT 消息,WM_PAINT 会持续保留在消息队列中直到它们被处理,除非一个 WM_PAINT 消息指定的区域为 NULL。

小甲鱼注释:大家应该还记得有三个消息 WM_QUIT, WM_PAINT, WM_TIMER 会被特殊处理,它们总是放在队列的最后面,直到没有其它消息的时候才被处理,连续的 WM_PAINT 消息将被合并成一个以提高绘图效率。

  1. 如果一个顶层窗口停止响应的消息超过几秒钟,系统认为窗口没有响应,并使用一个备用窗口替代,该窗口具有相同的 Z 序列、位置、尺寸和视觉属性。这使得用户可以移动、调整大小,甚至关闭该应用程序。然而,这些仅仅是动作,现有的程序事实上仍然没有响应(为了提高用户体验而制作的假象)。当一个程序被调试时,系统并不会为其生成备用窗口。
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
给这个方法添加单元测试: public TdsStpResponse processAuditData(String auditTrdStatusId,String source) throws CisTStpException { CisTStpTradeData tradeData = new CisTStpTradeData(); List<TdsStpAudit> l = new ArrayList<>(); TdsStpResponse res = new TdsStpResponse(); try{ tradeData.setTradeId(Integer.parseInt(auditTrdStatusId)); tradeData.setSource(source); tradeData.setIsAudit("Y"); TradeProcessor processor = sourceFactory.getProcessor(tradeData.getSource()); List<MessageDetails> messageDetails = processor.processAuditTrade(tradeData); if(messageDetails!=null){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd"); for(MessageDetails details : messageDetails) { ProductType prodType =details.getMessage().getTrade().getTd().getProductType(); if(prodType!=null && "CURR_SWAP".equals(prodType.getCisProductType())){ continue; } TdsStpAudit o = new TdsStpAudit(); o.setCisTradeId(""+details.getMessage().getTrade().getTh().getCisTradeId()); o.setScbmlPackageId(""+details.getMessage().getTrade().getTh().getScbTradeId()); o.setMurexPackageId(""+details.getMessage().getTrade().getTh().getMxLinkId()); o.setTradeDate(details.getMessage().getTrade().getTh().getTradeDate().toString().substring(0,10)); if("SIP".equals(source)){ if(details!=null && details.getEventDetails()!=null){ if(details.getEventDetails().getDrawDown()!=null && details.getEventDetails().getDrawDown()){ if(details.getEventDetails().getEventData() instanceof DDeData){ DDeData d = (DDeData) details.getEventDetails().getEventData(); if(d!=null && d.getOriginalMsg()!=null){ o.setMurexPackageId(""+d.getOriginalMsg().getTrade().getTh().getMxLinkId()); if(d.getOriginalMsg().getTrade().getTh()!=null){ TradeHeader th = d.getOriginalMsg().getTrade().getTh(); o.setTradeDate(th.getTradeDate().toString().substring(0,10)); } } } } if(details.getEventDetails().getExpiry()!=null && details.getEventDetails().getExpiry()){ EXPeData d = (EXPeData) details.getEventDetails().getEventData(); if(d!=null && d.getOriginalMsg()!=null){ if(d.getOriginalMsg().getTrade()!=null){ if(d.getOriginalMsg().getTrade().getTh()!=null){ TradeHeader th = d.getOriginalMsg().getTrade().getTh(); o.setTradeDate(th.getTradeDate().toString().substring(0,10)); } } } } } } o.setCounterpartyFmId((details.getMessage().getCpFmId()==null?"":details.getMessage().getCpFmId())); o.setLegalEntity(details.getMessage().getLegalEntity()); o.setProductFullName(details.getMessage().getTrade().getTd().getProductType().getProductFullName()==null?"":details.getMessage().getTrade().getTd().getProductType().getProductFullName()); o.setCisEventName(details.getEventDetails().getRefEvent().getCisEvent()); o.setCisTradeStateName(details.getMessage().getCisState()); o.setPortfolioName(details.getMessage().getPort1Name()); o.setPortfolioName2(details.getMessage().getPort2Name()); l.add(o); } }else{ log.info("No message details skip this trade id: " + auditTrdStatusId); } }catch(Exception ex){ log.info("Skip this trade id: " + auditTrdStatusId); log.info(ex.getMessage()); } res.setTdsStpAuditList(l); return res; }
最新发布
06-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值