VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 982|回复: 7

如何给打印对话框的“确定”按钮发送消息?

[复制链接]

2

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-1-28 12:20:01 | 显示全部楼层 |阅读模式
我现在使用水晶报表打印,.NET C#中的crystalReportViewer控件有一个PrintReport()函数,但它不是直接打印,而是弹出打印对话框,当你点击打印对话框的“确定”按钮后才执行打印。但我现在有几百条记录,不可能这样点一次按钮打印一张,想用循环做,但怎么给那个打印对话框的“确定”按钮发送消息?谁能告诉我,谢谢了!
回复

使用道具 举报

2

主题

29

帖子

16.00

积分

新手上路

Rank: 1

积分
16.00
发表于 2020-3-11 13:15:02 | 显示全部楼层
做法:
Findwindow抓到dlg
FindwindowEx抓到Button
SendMessage发消息

以上都是win32函数,你查一下便知道了.C#本身作不了,要用这些函数
回复

使用道具 举报

2

主题

29

帖子

16.00

积分

新手上路

Rank: 1

积分
16.00
发表于 2020-4-16 18:30:02 | 显示全部楼层
可以啊,首先这三个是api函数,所以你要DLLImport
第二
我来介绍一下几个函数把
HWND FindWindow(
  LPCTSTR lpClassName,  // pointer to class name
  LPCTSTR lpWindowName  // pointer to window name
);
lpClassName是窗体类,你不知道可以不写,null就可以了
lpWindowName是你的窗体title这个你可以找到了把

HWND FindWindowEx(
  HWND hwndParent,      // handle to parent window
  HWND hwndChildAfter,  // handle to a child window
  LPCTSTR lpszClass,    // pointer to class name
  LPCTSTR lpszWindow    // pointer to window name
);

hwndParent:前面一个返回值给它
LPCTSTR lpszClass,    // pointer to class name
LPCTSTR lpszWindow    // pointer to window name
对于你要的button,lpszClass = “button”
lpszWindow则是“确定”

SendMessage第一个用上面的hwnd返回,第二个消息可能要查查了
回复

使用道具 举报

2

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-4-20 00:00:01 | 显示全部楼层
我现在知道你的意思了,但我是在.NET C#中编程的,按照你说的,我写了下面几行代码:
using System.Runtime.InteropServices;

[DllImport("user32.dll")]
public static extern void Findwindow (String strClassName, String strWindowsName);

[DllImport("user32.dll")]
public static extern int SendMessage (IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);

但编译时有这样的错误:应输入 class、delegate、enum、interface 或 struct
这是怎么回事呀?应该怎么改?
另外,不知你会不会在C#中使用水晶报表,你知道怎么动态创建水晶报表吗?谢谢了!

回复

使用道具 举报

2

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-4-24 12:15:01 | 显示全部楼层
还有,标准打印对话框是以 ShowDialog() 形式出现的,不同于其它以 Show() 形式弹出的窗口,向它发送消息它能收到吗?
回复

使用道具 举报

2

主题

29

帖子

16.00

积分

新手上路

Rank: 1

积分
16.00
发表于 2020-4-29 09:45:01 | 显示全部楼层
1)我看你的写法没有错误,估计是其他地方的错,建议:把上面这几个函数放在一个类里面,叫API_Func以后调用就API_Func.FindWindow.你FindWindow写错了,w要大写.
Findwindow 返回值你也写错了

2)没有做过

3)这个你不用担心.模态的一样能受到,而且肯定能受到.
以前看过一片文章:是这样描述的,模态对话框有自己的消息处理线程,而非模态是用以前的.一开始不明白,现在想想可能会领悟,不过这个你不用管.你sendmessage与postmessage的主要区别是,你强制发过去,它要优先回应,消息是不入栈的.
回复

使用道具 举报

2

主题

29

帖子

16.00

积分

新手上路

Rank: 1

积分
16.00
发表于 2020-5-10 21:45:01 | 显示全部楼层
我模拟了下,你可以参照:
class API_Func
    {
        [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")]
        public static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
    }
private void button2_Click(object sender, EventArgs e)
        {
            IntPtr hwnd = API_Func.FindWindow(null, "Form1");
            if (hwnd != null)
            {
                IntPtr hbutton = API_Func.FindWindowEx(hwnd, (IntPtr)null, null, "yes");
                if (hbutton == null)
                    return;

                API_Func.PostMessage(hbutton, WM_LBUTTONDOWN, MK_LBUTTON, 0x000B0024);
                API_Func.PostMessage(hbutton, WM_LBUTTONUP, MK_LBUTTON, 0x000B0024);
            }
        }
回复

使用道具 举报

2

主题

29

帖子

16.00

积分

新手上路

Rank: 1

积分
16.00
发表于 2020-5-10 22:30:02 | 显示全部楼层
private const uint WM_LBUTTONDOWN = 0x0201;
        private const uint WM_LBUTTONUP = 0x0202;
        private const int MK_LBUTTON = 0x0001;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表