我正试图赶上移动并在全球范围内调整事件大小。 我找到了通过Win32 API WinEventProc使用EVENT_SYSTEM_MOVESIZESTART事件的方法(实际上我正在使用C#P / invoke)。 但我找不到有关它的详细信息。我有一些问题:
Q1。有没有办法在引发EVENT_SYSTEM_MOVESIZESTART事件时区分 MOVE或RESIZE,而不轮询窗口大小/位置。
public static void __WinEventDelegate(IntPtr hWinEventHook, Native.EVENT eventType, IntPtr hWnd, Native.OBJID idObject, Native.CHILDID idChild, uint dwEventThread, uint dwmsEventTime)
{
if (eventType == Native.Event.SYSTEM_MOVESIZESTART)
{
switch (__something__)
{
case __THIS_EVENT_IS_MOVE:
doSomethingWhenMoveStarted();
break;
case __THIS_EVENT_IS_RESIZE:
doSomethingWhenResizeStarted();
break;
(恕我直言,Windows并没有在内部区分它们??)
Q2。是否有像EVENT_SYSTEM_MOVINGRESIZING这样的事件或方式,如mousemove event on javascript/DOM一样不断提高?
如果你有另一种方法可以做Q1,Q2,请告诉我! 感谢。
答案 0 :(得分:0)
您指定的事件EVENT_SYSTEM_MOVESIZESTART
由系统发送。
我怀疑此事件是否被DefWindowProc
识别。
但在这种情况下,我猜窗口会收到WM_ENTERSIZEMOVE
。
然后你可以处理被覆盖的窗口过程函数的case语句。
wParam
指定SC_MOVE
或SC_SIZE
值,以确定其是移动还是调整大小。
以下是伪代码:
LRESULT CALLBACK WndProc(HWND hWNd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_ENTERSIZEMOVE:
if(wParam == SC_MOVE)
{
//MOVE
}
else
{
//RESIZE
}
default:
//Call to default winproc
}
}
正如您所说的C#,WM_ENTERSIZEMOVE
中有WM_EXITSIZEMOVE
和System.Windows.Forms
相关联的事件。它们是ResizeBegin
和ResizeEnd
。但我不确定这些事件是否可以处理Move
。