【问题标题】:Dynamics ax 2009: How to close form on a different user?Dynamics ax 2009:如何关闭不同用户的表单?
【发布时间】:2017-05-04 11:03:03
【问题描述】:


我正在寻找一种方法来关闭来自不同用户的所有活动 form 中的一个,例如作为函数终止。

SysClientSessions sys;
xSession ses
;

select firstonly sys where sys.UserId == 'some user';
ses = new xSession( sys.SessionId );
ses.terminate(); // in here client of 'some user' will be closed

【问题讨论】:

  • 不确定您是否可以像这样直接影响不同的用户会话,但不同的想法可能是自定义 SysSetupFormRun 类以持续检查,例如在条目的新表中(例如字段 UserIdFormName),如果找到条目,则表单将自行关闭。你可能想给用户一个超时警告。
  • 这个例子有效。在 SysSetupFormRun 中,我可以检查用户是否运行了表单并且什么都不做?
  • AX 可以选择在会话空闲一定时间后终止会话 (How to set up auto log out in Microsoft Dynamics AX)。我还没有调查过,但也许有一些东西可以用来检测空闲情况。

标签: winapi axapta x++


【解决方案1】:

如果您知道用户的表单hWnd,您可以通过以下方式关闭它:

WinAPI::sendMessageEx(hWnd, #WM_CLOSE, 0, 0);

所以你需要想出一个获取用户表单的方法。你可以做类似的事情:

http://sinedax.blogspot.com/2015/12/ax-2012-close-open-forms.html

【讨论】:

  • 如何获取不同用户表单的句柄(hwnd)?第二个winapi必须在客户端运行,是否可以从服务器向客户端发送命令来做某事?
  • 链接建议通过修改SysSetupFormRun类将所有窗口句柄存储在全局缓存中。但我认为WinAPI 调用不适用于在另一个客户端上运行的窗口,该客户端可能在不同的机器上运行。
  • 我认为你必须做两件事之一。客户端会主动检查他们是否需要关闭窗口,或者您必须向客户端发送事件以触发该操作。 EventInbox 的东西可能是最有意义的,因为它已经有了轮询和设置。似乎没有您希望的单线解决方案。
猜你喜欢
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多