PostMessage 无效问题

harboursong 2009-05-07 02:47:13
在获得下载弹出对话框句柄后,想点击保存按钮弹出保存路径窗口

lpszName_Submit = "保存(&S)";
EdithWnd = FindWindowEx(ParenthWnd,EdithWnd,lpszClass_Submit,lpszName_Submit);
PostMessage(EdithWnd ,WM_CLICK ,(IntPtr)0,"0");
没有响应,大家遇到过这样问题吗?如何解决的。

...全文
1003 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
harboursong 2009-05-11
  • 打赏
  • 举报
回复
结贴了结贴了,搞了这么久NND终于有结果了,看起来很弱智。因为没有SetFocus()
谢谢大家关注,结贴了。
harboursong 2009-05-11
  • 打赏
  • 举报
回复
是不是我的问题没有说明白,怎么没人回复!
huangheping520hhp 2009-05-11
  • 打赏
  • 举报
回复
顶哈!
harboursong 2009-05-11
  • 打赏
  • 举报
回复
看来高手喜欢沉默!
yanlongwuhui 2009-05-11
  • 打赏
  • 举报
回复
参数lParam定义成int试试
光宇广贞 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 harboursong 的回复:]
引用 18 楼 hikaliv 的回复:

如果取消管用,保存不管用的话,那可能的问题就在于创建新窗体的消息没有执行的地方了,因为你的操作是要弹出新窗体的,是吧。

每一个窗体都有自己的消息循环,你的问题觉得还是没有描述清楚。点取消是向哪个线程发送消息,点保存呢?二者是向同一个线程发送的消息吗?对于新窗体,很可能你发送的消息是无效的。


下载对话框是windows默认的下载对话框,不是我的程序。
保存和取消都是windows下…
[/Quote]

明白了,那么接下来的问题是,你想向保存键发消息,然后想让系统自己按照“习惯”弹出它的对话框是吧……我明白你的意思了。
可能参数lparam 和wparam不应该为零吧……
或者测试一下EdithWnd = FindWindowEx(ParenthWnd,EdithWnd,lpszClass_Submit,lpszName_Submit); 是否返回了你期望的控件
harboursong 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 hikaliv 的回复:]
如果取消管用,保存不管用的话,那可能的问题就在于创建新窗体的消息没有执行的地方了,因为你的操作是要弹出新窗体的,是吧。

每一个窗体都有自己的消息循环,你的问题觉得还是没有描述清楚。点取消是向哪个线程发送消息,点保存呢?二者是向同一个线程发送的消息吗?对于新窗体,很可能你发送的消息是无效的。
[/Quote]

下载对话框是windows默认的下载对话框,不是我的程序。
保存和取消都是windows下载对话框的按钮。
光宇广贞 2009-05-08
  • 打赏
  • 举报
回复
如果取消管用,保存不管用的话,那可能的问题就在于创建新窗体的消息没有执行的地方了,因为你的操作是要弹出新窗体的,是吧。

每一个窗体都有自己的消息循环,你的问题觉得还是没有描述清楚。点取消是向哪个线程发送消息,点保存呢?二者是向同一个线程发送的消息吗?对于新窗体,很可能你发送的消息是无效的。
harboursong 2009-05-08
  • 打赏
  • 举报
回复
高手们,出面帮个忙吧!!
qgylovelj 2009-05-08
  • 打赏
  • 举报
回复
ding
harboursong 2009-05-08
  • 打赏
  • 举报
回复
大家可以试一下看看,在
文件夹-》工具-》文件夹选项-》文件类型-》MP3-》高级 中勾选“下载后确认打开”选项
然后到百度随便找个MP3,不用任何工具下载,就会出来一个下载对话框,然后给这个对话框的
“保存(&S)”按钮发消息试试看。
harboursong 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hikaliv 的回复:]
什么叫做没有响应?

PostMessage是异步通信吧,发送端发过消息后就不管了,函数退出了。接收端的消息循环不知道要什么时候才会处理到该消息……
你想同步的话用SendMessage。

而且我觉得吧,关键的问题是,你的接收端的消息循环是如何处理的,这才是问题的关键,而应该不仅仅是发送端的问题吧。
[/Quote]

应该不是发送端的问题,
因为如果给“取消”按钮发生的话,那么下载就会取消,
如果给“保存(&S)”按钮发生,不会弹出保存文件的openFileDialog对话框。
harboursong 2009-05-08
  • 打赏
  • 举报
回复
楼上的B_Click写法用的下载页面弹出框的“保存(&S)”按钮就无效了,
用在“取消”按钮上是可以的。

高手们不妨试试
光宇广贞 2009-05-08
  • 打赏
  • 举报
回复
什么叫做没有响应?

PostMessage是异步通信吧,发送端发过消息后就不管了,函数退出了。接收端的消息循环不知道要什么时候才会处理到该消息……
你想同步的话用SendMessage。

而且我觉得吧,关键的问题是,你的接收端的消息循环是如何处理的,这才是问题的关键,而应该不仅仅是发送端的问题吧。
wartim 2009-05-08
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsApplication48
{
public partial class Form1 : Form
{
[DllImport("User32.dll", EntryPoint = "PostMessage")]
static extern int PostMessage(IntPtr hwnd, int Msg, IntPtr wParam, string lParam);

[DllImport("User32.dll ")]
static extern IntPtr FindWindowEx(IntPtr parent, IntPtr childe, string strclass, string strname);

const int WM_CLICK = 0x00F5;
String lpszName_Submit = "保存(&S)";

public Form1()
{
InitializeComponent();

Button AcceptButton = new Button();
AcceptButton.Text = lpszName_Submit;
AcceptButton.Parent = this;
AcceptButton.Click += new EventHandler(B_Click);

Button PostMessageButton = new Button();
PostMessageButton.Text = "发送消息";
PostMessageButton.Parent = this;
PostMessageButton.Click += new EventHandler(PostMessageButton_Click);
PostMessageButton.Location = Point.Add(AcceptButton.Location, new Size(100, 0));
}

void B_Click(object sender, EventArgs e)
{
MessageBox.Show("AcceptButton按钮收到消息");
}

void PostMessageButton_Click(object sender, EventArgs e)
{
// 我这里就直接把这个窗口的句柄当父句柄了
IntPtr EdithWnd = FindWindowEx(this.Handle, IntPtr.Zero, null, lpszName_Submit);
PostMessage(EdithWnd, WM_CLICK, IntPtr.Zero, null);
}
}
}
wartim 2009-05-08
  • 打赏
  • 举报
回复
FindWindowEx 根本没找到按钮吧,返回句柄是0吧
harboursong 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yanlongwuhui 的回复:]
附上PostMessage的声明的代码看看
[/Quote]

[DllImport("User32.dll", EntryPoint = "PostMessage")] private static extern int PostMessage(IntPtr hwnd,int Msg,IntPtr wParam,string lParam);
gengxin_914 2009-05-08
  • 打赏
  • 举报
回复
UP
yanlongwuhui 2009-05-08
  • 打赏
  • 举报
回复
附上PostMessage的声明的代码看看
gyouyang 2009-05-08
  • 打赏
  • 举报
回复
板凳
加载更多回复(11)

110,536

社区成员

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

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

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