在一个模态窗口,想要在本窗口中,通过调用win32,来使另一个窗口的控件进行移动(本身可以通过鼠标中键按下,移动,控件可以拖动)
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.MiddleButton != MouseButtonState.Pressed) return;
const int WM_MBUTTONDOWN = 0x0207;
IntPtr last = PmSoft.Common.Controls.RevitMethod.RevitHandle.RevitViewHandle;
POINT mp = new POINT(0, 0);
bool isGet = GetCursorPos(out mp);
if (isGet)
{
int xPosition = mp.X;
int yPosition = mp.Y << 16;
SendMessage(last, WM_MBUTTONDOWN, (IntPtr)(0x00000010), (IntPtr)(xPosition + yPosition));
e.Handled = true;
}
}
private void Window_MouseMove(object sender, MouseEventArgs e)
{
if (e.MiddleButton != MouseButtonState.Pressed) return;
const int WM_MOUSEMOVE = 0x0200;
IntPtr last = PmSoft.Common.Controls.RevitMethod.RevitHandle.RevitViewHandle;
POINT mp = new POINT(0, 0);
bool isGet = GetCursorPos(out mp);
if (isGet)
{
int xPosition = mp.X;
int yPosition = mp.Y << 16;
SendMessage(last, WM_MOUSEMOVE, (IntPtr)(0x00000010), (IntPtr)(xPosition + yPosition));
}
}
private void Window_MouseUp(object sender, MouseButtonEventArgs e)
{
if (e.MiddleButton == MouseButtonState.Pressed) return;
const int WM_MBUTTONUP = 0x0208;
IntPtr last = PmSoft.Common.Controls.RevitMethod.RevitHandle.RevitViewHandle;
POINT mp = new POINT(0, 0);
bool isGet = GetCursorPos(out mp);
if (isGet)
{
int xPosition = mp.X;
int yPosition = mp.Y << 16;
//PmSoft.Common.CommonClass.Win32Helper.Win32.SetCapture(last);
SendMessage(last, WM_MBUTTONUP, (IntPtr)(0x00000000), (IntPtr)(xPosition + yPosition));
e.Handled = true;
}
}
发送了鼠标中键按下,移动,和中键抬起事件,但是没有效果,不知道哪里出问题了。
对win32不太熟悉,请大家帮忙看看。
一般是 API 函数的参数没处理好。
然后按下和移动、抬起之间要加 5ms 的延迟。
这里有写好的代码,你参考下
[DllImport("user32.dll", EntryPoint = "mouse_event", SetLastError = true)]
public static extern void Mouse_event(EMouse dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
/// <summary>
/// 鼠标操作 dwFlags 〖Windows API〗
/// <para>表示鼠标的按下和抬起</para>
/// <para>参见 <see cref="API_窗口.Mouse_event(EMouse, int, int, int, int)"/></para>
/// </summary>
public enum EMouse {
/// <summary>移动鼠标(相对位置)</summary>
MOVE = 0x1,
/// <summary>模拟鼠标左键按下</summary>
LEFTDOWN = 0x2,
/// <summary>模拟鼠标左键抬起</summary>
LEFTUP = 0x4,
/// <summary>模拟鼠标右键按下</summary>
RIGHTDOWN = 0x8,
/// <summary>模拟鼠标右键抬起</summary>
RIGHTUP = 0x10,
/// <summary>模拟鼠标中键按下</summary>
MIDDLEDOWN = 0x20,
/// <summary>模拟鼠标中键抬起</summary>
MIDDLEUP = 0x40,
/// <summary>模拟鼠标滚轮</summary>
WHEEL = 0x800,
/// <summary>表明参数dX,dy含有规范化的绝对坐标。</summary>
ABSOLUTE = 0x8000,
/// <summary>移动鼠标到绝对位置</summary>
MOVETO = ABSOLUTE | MOVE
}
/// <summary>
/// 鼠标操作 dwFlags 〖Windows API〗
/// <para>表示鼠标的按下和抬起</para>
/// <para>参见 <see cref="API_窗口.Mouse_event(EMouse, int, int, int, int)"/></para>
/// </summary>
#region ◢ Mouse_event ◣
/// <summary>设置并移动鼠标位置为相对当前位置的 X, Y 。</summary>
public static void 偏移(int x, int y) { API_窗口.Mouse_event(EMouse.MOVE, x, y, 0, 0); }
/// <summary>通过 mouse_event 移动鼠标位置到 X, Y 。<para>有可能无效,请使用 <see cref="设置位置(int, int)"/> 函数代替。</para></summary>
public static void 移至(int x, int y) { API_窗口.Mouse_event(EMouse.MOVETO, x, y, 0, 0); }
/// <summary>按下鼠标左键 。</summary>
public static void 按下左键(int x, int y) { API_窗口.Mouse_event(EMouse.LEFTDOWN, x, y, 0, 0); }
/// <summary>抬起鼠标左键 。</summary>
public static void 抬起左键(int x, int y) { API_窗口.Mouse_event(EMouse.LEFTUP, x, y, 0, 0); }
/// <summary>按下鼠标右键 。</summary>
public static void 按下右键(int x, int y) { API_窗口.Mouse_event(EMouse.RIGHTDOWN, x, y, 0, 0); }
/// <summary>抬起鼠标右键 。</summary>
public static void 抬起右键(int x, int y) { API_窗口.Mouse_event(EMouse.RIGHTUP, x, y, 0, 0); }
/// <summary>按下鼠标中键 。</summary>
public static void 按下中键(int x, int y) { API_窗口.Mouse_event(EMouse.MIDDLEDOWN, x, y, 0, 0); }
/// <summary>抬起鼠标中键 。</summary>
public static void 抬起中键(int x, int y) { API_窗口.Mouse_event(EMouse.MIDDLEUP, x, y, 0, 0); }
/// <summary>距离: 正数表示向上滚动,负值表示向下滚动。
/// <para></para>轮击定义为 WHEEL_DELTA ,即 120 。</summary>
public static void 滚动(int x, int y, int 距离) { API_窗口.Mouse_event(EMouse.WHEEL, x, y, 距离, 0); }
/// <summary>利用 PostMessage 发送鼠标按下和抬起消息 给指定句柄的窗体</summary>
public static void 发点击信号(IntPtr 句柄, int X, int Y, int 按键时长 = 20) {
设置位置(X, Y);
API_窗口.PostMessage(句柄, (int)EwMsg.WM_LBUTTONDOWN, 0, X + Y * 65536);
if (按键时长 > 0) { Thread.Sleep(按键时长); }
API_窗口.PostMessage(句柄, (int)EwMsg.WM_LBUTTONUP, 0, X + Y * 65536);
}
#endregion