C# PostMessage 里的 MAKELPARAM 的问题

djjliufong 2008-04-28 01:58:26
API.PostMessage(new IntPtr(b), 0x0204, 0, 0);
API.PostMessage(new IntPtr(b), 0x0205, 0, 0);

以上的方法能在我指定的窗口中弹出右键菜单 ,说明右键发送成功了
但是这个右键菜单始终在左上角的位置。我想在指定位置弹出, 网上都是把最后一个参数 改为MAKELPARAM(x坐标,y坐标)

我不知道在C#中怎么用MAKELPARAM(x坐标,y坐标)这个函数

这是一个API函数?还是一个宏?如何在C#中正确使用MAKELPARAM?

感觉大家帮帮我啦~~~ 急
...全文
4338 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
heibaoliangjiecan 2010-11-09
  • 打赏
  • 举报
回复
新手,学习学习。
pangdecai 2010-11-09
  • 打赏
  • 举报
回复
楼主,为什么我连右键菜单都弹不出来?如果方便请帮帮我
mcdjxiao 2010-02-20
  • 打赏
  • 举报
回复
我是过来接分的 gag
cnzdgs 2010-02-20
  • 打赏
  • 举报
回复
又遇到挖坟的啦~~~~~~~~~~~~~~~~
cnzdgs 2010-02-20
  • 打赏
  • 举报
回复
API.PostMessage(new IntPtr(hWndDefView), 0x0204, 0x0002, 400+200*0x10000);
API.PostMessage(new IntPtr(hWndDefView), 0x0205, 0x0000, 400+200*0x10000);
knowledge_Is_Life 2008-05-01
  • 打赏
  • 举报
回复
关注 接分
djjliufong 2008-04-30
  • 打赏
  • 举报
回复
也是不行的.你可以用我上面的代码测试一下
  • 打赏
  • 举报
回复
uint MAKELPARAM(ushort wLow, ushort wHigh)
{
return wHigh * 0x10000 + wLow ;
};

djjliufong 2008-04-29
  • 打赏
  • 举报
回复
感谢genlinux 的回贴
用了你的方法后,右键弹出的菜单还是在左上角。没有改变 。下面我把源码在发一次


IntPtr hWnd=API.GetWindow(API.GetDesktopWindow(),(long)API.WindowFlag.GW_CHILD);
int b= API.FindWindowEx(a, 0, "Edit", null);
long hWndProgram = API.FindWindow("Progman",null);
long hWndDefView = API.FindWindowEx((int)hWndProgram, 0, "SHELLDLL_DefView", null);


API.PostMessage(new IntPtr(hWndDefView), 0x0204, 0x0001, MAKELONG(400,200));
API.PostMessage(new IntPtr(hWndDefView), 0x0205, 0x0001, MAKELONG(400, 200));

uint MAKELONG(ushort x, ushort y)
{
return ((((uint)x) < < 16) | y);
}

以上代码能在桌面弹出右键菜单
但是还是在左上角。不是在MAKELONG方法里的坐标弹出的右键菜单。请指点。有没有成功的? 在次感谢大家帮帮忙
心情解码 2008-04-29
  • 打赏
  • 举报
回复
帮up




--
djjliufong 2008-04-29
  • 打赏
  • 举报
回复
感谢ericzhangbo1982111的回贴
不过我要的是单击鼠标,你这个没有设计到坐标问题
  • 打赏
  • 举报
回复
通常右键菜单是根据鼠标位置来确定弹出的位置的.

你将鼠标移动到相应的位置再弹出菜单看看.
djjliufong 2008-04-29
  • 打赏
  • 举报
回复
感谢 akirya的回贴,用了你的方法,还是老样子 右键菜单在左上角 ,没办法到我指定的位置
genlinux 2008-04-28
  • 打赏
  • 举报
回复
[DllImport("user32.dll",EntryPoint="PostMessage",CallingConvertion=CallingConvention.Winapi)]
static extern bool PostMessage(IntPtr hwnd,int msg, uint wParam, uint lParam);

uint MAKELONG(ushort x, ushort y)
{
return ((((uint)x)<< 16) | y); //low order WORD 是指标的x位置; high order WORD是y位置.
}
void SomeCall()
{
API.PostMessage(new IntPtr(b), 0x0204, (uint)0, MAKELONG(12,342));
}
ericzhangbo1982111 2008-04-28
  • 打赏
  • 举报
回复
首先运行第一个程序,显示Form1窗体,然后运行第二个程序,显示TestForm1窗体。

在TestForm1窗体上点击button1按钮(向Form1窗体上的button1发送消息)此时显示对话框提示“This is button1 click!”。

在TestForm1窗体上点击button2按钮(向Form1窗体上的textBox1发送消息)此时在Form1上的textBox1上显示“测试aaa”。
ericzhangbo1982111 2008-04-28
  • 打赏
  • 举报
回复
using System;
using System.Text;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;

public class TestForm1 : System.Windows.Forms.Form {
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;

private System.ComponentModel.Container components = null;

[STAThread]
static void Main() {
Application.Run(new TestForm1());
}

public TestForm1()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows 窗体设计器生成的代码
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(32, 24);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button2.Location = new System.Drawing.Point(32, 64);
this.button2.Name = "button2";
this.button2.TabIndex = 0;
this.button2.Text = "button2";
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// TestForm1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 266);
this.Controls.Add(this.button1);
this.Controls.Add(this.button2);
this.Name = "TestForm1";
this.Text = "TestForm1";
this.ResumeLayout(false);

}
#endregion

private void button1_Click(object sender, System.EventArgs e) {
IntPtr hwnd_win ;
IntPtr hwnd_button ;

hwnd_win = FindWindow("WindowsForms10.Window.8.app3","Form1");
hwnd_button = FindWindowEx(hwnd_win ,new IntPtr(0) ,"WindowsForms10.BUTTON.app3","button1");

const int BM_CLICK = 0x00F5;
Message msg = Message.Create(hwnd_button ,BM_CLICK ,new IntPtr(0),new IntPtr(0));
PostMessage(msg.HWnd ,msg.Msg ,msg.WParam ,msg.LParam);
}
private void button2_Click(object sender, System.EventArgs e) {
const int WM_CHAR = 0x0102;
IntPtr hwnd_win ;
IntPtr hwnd_textbox ;

hwnd_win = FindWindow("WindowsForms10.Window.8.app3","Form1");
hwnd_textbox = FindWindowEx(hwnd_win ,new IntPtr(0) ,"WindowsForms10.EDIT.app3","textBox1");

string strtext = "测试aaa";
UnicodeEncoding encode = new UnicodeEncoding();
char[] chars = encode.GetChars(encode.GetBytes(strtext));
Message msg ;
foreach (char c in chars ) {
msg = Message.Create(hwnd_textbox ,WM_CHAR ,new IntPtr(c),new IntPtr(0));
PostMessage(msg.HWnd ,msg.Msg ,msg.WParam ,msg.LParam);
}
}

[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent,IntPtr hwndChildAfter,string lpszClass,string lpszWindow);

[DllImport("user32.dll",CharSet=CharSet.Unicode)]
public static extern IntPtr PostMessage(IntPtr hwnd,int wMsg,IntPtr wParam,IntPtr lParam);
}
ericzhangbo1982111 2008-04-28
  • 打赏
  • 举报
回复
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

public class Form1 : System.Windows.Forms.Form {
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox textBox1;

private System.ComponentModel.Container components = null;

[STAThread]
static void Main() {
Application.Run(new Form1());
}

public Form1()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows 窗体设计器生成的代码
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.textBox1 = new System.Windows.Forms.TextBox();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(32, 24);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(32, 64);
this.textBox1.Name = "textBox1";
this.textBox1.TabIndex = 1;
this.textBox1.Text = "textBox1";
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 266);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);

}
#endregion

private void button1_Click(object sender, System.EventArgs e) {
MessageBox.Show("This is button1 click!");
}
}

110,536

社区成员

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

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

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