关于不同xp主题的精确坐标问题

aimeast 2009-09-06 11:33:17
我的程序有画图和鼠标控制功能,具体的坐标值是根据窗口位置计算出来的。

近期测试的时候发现,在不同的xp主题下,用 GetWindowRect(IntPtr hWnd, ref Rectangle rect)获取的rect大小是不相同的。

特别是在启用xp风格和关闭xp风格的区别,可以相差10个像素。

用什么样的方法能够避免因为不同主题造成的坐标偏差?
...全文
47 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
aimeast 2009-09-07
  • 打赏
  • 举报
回复
谢谢各位,自己已经研究出来了。
        [DllImport("user32.dll")]
static extern bool ClientToScreen(IntPtr hWnd, ref Point pt);
private void button1_Click(object sender, EventArgs e)
{
//Rectangle rect = new Rectangle();
//GetWindowRect(this.Handle, ref rect);
//Cursor.Position = new Point(50 + rect.X, 50 + rect.Y);

Point pt = new Point(50, 50);
ClientToScreen(this.Handle, ref pt);
Cursor.Position = pt;

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}
aimeast 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dylike 的回复:]
可以固定的.
定义一个矩形,这个矩形赋值时将窗体设置为无边框,然后将窗体矩形赋值给它.然后恢复普通窗体边框.
绘制时,以定义的矩形为基准即可.
[/Quote]

谢谢,但是我的程序是控制别的程序用的,没办法改变别人的程序。
wjq 2009-09-06
  • 打赏
  • 举报
回复
确实比较头疼~
要不搞一个空窗口,设置高度比如100,设置Style-FixFlat启动一次,GetWindowRect,再设置None一次,GetWindowRect。比较2次的高度差从而标题栏+边框高度。
dylike 2009-09-06
  • 打赏
  • 举报
回复
可以固定的.
定义一个矩形,这个矩形赋值时将窗体设置为无边框,然后将窗体矩形赋值给它.然后恢复普通窗体边框.
绘制时,以定义的矩形为基准即可.
redleafe 2009-09-06
  • 打赏
  • 举报
回复
不懂,帮顶。
可能是不同的风格的图片大小有差异吧?
aimeast 2009-09-06
  • 打赏
  • 举报
回复
使用如下代码测试。切换不同的主题,可能会发现label2的值会不同。
    public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

[DllImport("user32.dll")]
static extern bool GetWindowRect(IntPtr hWnd, ref Rectangle rect);

[DllImport("user32.dll")]
static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

const int MOUSEEVENTF_MOVE = 0x0001; //移动鼠标
const int MOUSEEVENTF_LEFTDOWN = 0x0002; //模拟鼠标左键按下
const int MOUSEEVENTF_LEFTUP = 0x0004; //模拟鼠标左键抬起
const int MOUSEEVENTF_RIGHTDOWN = 0x0008; //模拟鼠标右键按下
const int MOUSEEVENTF_RIGHTUP = 0x0010; //模拟鼠标右键抬起
const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; //模拟鼠标中键按下
const int MOUSEEVENTF_MIDDLEUP = 0x0040; //模拟鼠标中键抬起
const int MOUSEEVENTF_ABSOLUTE = 0x8000; //标示是否采用绝对坐标

private void button1_Click(object sender, EventArgs e)
{
Rectangle rect = new Rectangle();
GetWindowRect(this.Handle, ref rect);
Cursor.Position = new Point(50 + rect.X, 50 + rect.Y);
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
label1.Text = string.Format("{0}-{1}", e.X, e.Y);
}

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
label2.Text = string.Format("{0}-{1}", e.X, e.Y);
}
}

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧