[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetCursorPos(out POINT lpPoint);在C# 引入这个API时
中 有个POINT类型 想问下这里的POINT与 .net中的Point 是不是一个东西,能不能通用
如果您知道 请告诉我
谢谢
解决方案 »
- 精谈“VS2010中水晶报表应用及实例”分享
- 软件发布.内附c# 写的sql server,压缩,DSHOW和u盘备份的源
- 十六进制转换的问题,3FFFFH怎么转换成2的18次方的?
- 向一个数组添加循环的值的问题
- 【求助】指定替换一次,且不重复[帮顶送分]
- 使用Workbooks.Open读取excel文件时出错,SOS
- 请问怎样让所有的新打开的窗口都在我的web Browser控件中打开阿?
- 急需要学生毕业设计成绩管理系统
- win32api里面的BOOL被.net封送成uInt32还是bool?
- 怎样才能让datetime字段去掉最后面的小时、分、秒??
- 时间比较!怎么回事?。。。
- C#怎么操作MP3文件,分割合并,MP3数据结构是什么样?
你可以定义10个类,内部的成员变量都一样,你能说他们之间通用么?
一般来说api的时候我们习惯性会这样定义[StructLayout(LayoutKind.Sequential)]
public struct POINT {
public int x;
public int y;
}但你完全可以不用POINT ,直接用point。
在p/invoke的时候,你传递一个结构相同的对象即可。但在.net下,POINT 和Point那是肯定不可以通用的。类似的结构体,我们都可以在对象相同的情况下,使用.net的类型。
例如c++的RECT,你可以用c#的rectangle对象。
[DllImport("user32.dll")]
public static extern bool GetCursorPos(out Point pt);
private void timer1_Tick(object sender, EventArgs e)
{
GetCursorPos(out p);
label1.Text = p.X.ToString();//X坐标
label2.Text = p.Y.ToString();//Y坐标
}
http://msdn.microsoft.com/en-us/library/ms648390(VS.85).aspx
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);
里面用的 RECT 还像就跟。net 里的rectangle 不一样
RECT 是对角线的 两个坐标
rectangle 是顶点 长 和 宽
不知道是不是我理解错了!
你创建控制台程序试试这个[DllImport("user32.dll", EntryPoint = "GetWindowRect")]
public static extern int GetWindowRect(
int hwnd,
ref Rectangle lpRect
);
[DllImport("user32.dll", EntryPoint = "GetDesktopWindow")]
public static extern int GetDesktopWindow();
static void Main(string[] args)
{
Rectangle rect = new Rectangle();
GetWindowRect(GetDesktopWindow(), ref rect);
Console.WriteLine(rect.ToString());
Console.ReadKey();
}
输出是《x=0,y=0,width=1280,height=800》
这个好像是一个坐标 加 长 和 宽吧
这不就通用了么?还有什么问题?
你刚不是说RECT记录的是X,Y,RIGHT,BOTTOM么。我这不给你演示用Rectangle一样可以通用得到正确width和height么?你别说你自己问的问题都忘记了啊。
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
class Program
{ [DllImport("user32.dll", EntryPoint = "GetWindowRect")]
public static extern int GetWindowRect(
int hwnd,
ref Rectangle lpRect
);
[DllImport("user32.dll", EntryPoint = "GetDesktopWindow")]
public static extern int GetDesktopWindow(); [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern int GetForegroundWindow(); static void Main(string[] args)
{
Rectangle rect = new Rectangle();
GetWindowRect(GetForegroundWindow(), ref rect);
Console.WriteLine(rect.ToString());
Console.ReadKey(); }
}
}用这个 好点吧 更能说明问题
的确不行。.net把width和height定义到前面了,修饰的时候又没有精确指定序列化的位置。
哈。举错例子了。Rectangle不行,不能通用。
不同的声明,就是不同的类,别指望通用了。
Point和POINT的定义都一样,只关心x,y所以正好碰巧,可以用Point来替换api中的POINT结构体。
Rectangle的确,是左上角坐标+尺寸的,RECT是左上角坐标和右下角坐标的。不能通用。
不过怎么 感觉自己学了这么久还像还没入门啊 悲剧啊 突然发现自己原来几乎什么都不清楚 其实这么久了 从来就没有建过控制台程序 太悲剧了 刚刚居然连System.Drawing命名空间 都引不进去
都说C#简单?? 难道是自己太菜了
十分感谢大家 !!