首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C# EM_CHARFROMPOS如何将一个点投射到Intptr?

C# EM_CHARFROMPOS如何将一个点投射到Intptr?
EN

Stack Overflow用户
提问于 2020-04-28 23:19:16
回答 1查看 58关注 0票数 0

在我使用GetCaretPos接收到Caret (x,y)位置后,我想要SendMessage() of EM_CHARFROMPOS。问题是lParam的类型应该是IntPtr,而GetCaretPos的结果是一个点。如何正确地将点转换为IntPtr?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-29 01:34:40

代码必须是different if you target a Rich edit control vs an Edit control,但您可以从.NET代码中获得灵感(并且您可以定义多个版本的SendMessage来满足您的需求):

对于文本框:https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/TextBoxBase.cs,1754

代码语言:javascript
运行
复制
...
var pt = (IntPtr)MAKELONG(pt.X, pt.Y);
SendMessage(handle, EM_CHARFROMPOS, 0, pt);
...
public static int MAKELONG(int low, int high) {
  return (high << 16) | (low & 0xffff);
}

[DllImport("user32", CharSet=CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

对于富文本框:https://referencesource.microsoft.com/#system.windows.forms/winforms/Managed/System/WinForms/RichTextBox.cs,2323

代码语言:javascript
运行
复制
...
var pt = new POINT(pt.X, pt.Y);
SendMessage(handle, EM_CHARFROMPOS, 0, pt);
...

[StructLayout(LayoutKind.Sequential)]
public class POINT
{
  public int x;
  public int y;
}

[DllImport("user32", CharSet=CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, POINT lParam);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61483799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档