SendMessage 怎么将最小化的窗口还原?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SendMessage 怎么将最小化的窗口还原?相关的知识,希望对你有一定的参考价值。

我现在会最大化和最小化,要把窗口还原到原来的大小的话后面那三个参数填什么?

只要知道该窗口的句柄,可以对任何窗口进行这些操作、、、
句柄的获取方法很多、、、、、、、、、、、、、、、、、、、

.版本 2

.DLL命令 SendMessage, 整数型, , "SendMessageA"
.参数 hwnd, 整数型
.参数 wMsg, 整数型
.参数 wParam, 整数型
.参数 lParam, 整数型

.版本 2
.支持库 eAPI

.子程序 __启动窗口_创建完毕

载入 (窗口1, _启动窗口, 假)
窗口1.位置 = 2

.子程序 _按钮1_被单击

SendMessage (取窗口句柄 (), 274, 61488, 0) ' 最大化

.子程序 _按钮2_被单击

SendMessage (取窗口句柄 (), 274, 61728, 0) ' 还原

.子程序 _按钮3_被单击

SendMessage (取窗口句柄 (), 274, 61472, 0) ' 最小化

.子程序 _按钮4_被单击

SendMessage (窗口1.取窗口句柄 (), 274, 61728, 0) ' 还原最小化窗口

.子程序 _按钮5_被单击

SendMessage (窗口1.取窗口句柄 (), 274, 61536, 0) ' 关闭窗口

.子程序 _按钮6_被单击

编辑框1.内容 = 到文本 (取鼠标所在窗口句柄 ())
参考技术A SendMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0);

其中WM_SYSCOMMAND=274 ,SC_RESTORE=61728,都是Windows.h中的宏定义。

向窗口句柄发送 SC_RESTORE 消息能够重新恢复窗口的显示状态,从最大或最小化中切换成正常显示,虽然叫RESTORE,但窗口原来的大小和位置仍会被保留。

一般来讲,我们在编程时使用data_seg共享全局命名的数据节来存储窗口句柄,以达到互斥和单例程的期望。

当一个例程存在时再度执行程序我们希望能够聚焦到之前的窗口上而非打开新的窗口,可以通过API函数将它提到前台。

SetForegroundWindow(hwnd);

但在WinNT 5.0之后,最小化的窗口即便被提到前台,它也不会覆盖用户当前处于输入状态的窗口,只会调用FlashWindowEx通知用户,视觉上就是位于状态栏的图标闪烁几次,如果想把窗口激活,需要我们手动发送重设窗口消息。

SendMessage(hwnd,WM_SYSCOMMAND, SC_RESTORE,0);

使用啥 SendMessage 将密钥直接发送到另一个窗口?

【中文标题】使用啥 SendMessage 将密钥直接发送到另一个窗口?【英文标题】:what SendMessage to use to send keys directly to another window?使用什么 SendMessage 将密钥直接发送到另一个窗口? 【发布时间】:2011-07-02 03:12:51 【问题描述】:

我正在尝试使用SendMessage 将键盘输入发送到另一个窗口。我知道缺点,但我必须这样做,因为我必须发送几个键并且我不能保证窗口会有焦点 - 所以当窗口没有焦点时这必须工作。

我正在通过尝试将密钥发送到记事本窗口来测试它。我尝试了以下变体,但都没有奏效:

def post_keys1(hwnd):
    win32api.SendMessage(
        hwnd, win32con.WM_KEYDOWN, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
    win32api.SendMessage(
        hwnd, win32con.WM_CHAR, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
    win32api.SendMessage(
        hwnd, win32con.WM_KEYUP, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0xC0 << 24))

def post_keys2(hwnd):
    win32api.PostMessage(
        hwnd, win32con.WM_KEYDOWN, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
    win32api.PostMessage(
        hwnd, win32con.WM_CHAR, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
    win32api.PostMessage(
        hwnd, win32con.WM_KEYUP, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0xC0 << 24))

def post_keys3(hwnd):        
    win32api.SendMessage(hwnd, win32con.WM_CHAR,
                         ord('A'), 0)

def post_keys4(hwnd):        
    win32api.PostMessage(hwnd, win32con.WM_CHAR,
                         ord('A'), 0)

def post_keys5(hwnd):        
    win32api.PostMessage(hwnd, win32con.WM_KEYDOWN, ord('A'), 0)
    win32api.PostMessage(hwnd, win32con.WM_CHAR, ord('A'), 0)
    win32api.PostMessage(hwnd, win32con.WM_KEYUP, ord('A'), 0)

def post_keys6(hwnd):
    win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, ord('A'), 0)
    win32api.SendMessage(hwnd, win32con.WM_CHAR, ord('A'), 0)
    win32api.SendMessage(hwnd, win32con.WM_KEYUP, ord('A'), 0)

【问题讨论】:

【参考方案1】:

当我写下这个问题时,我了解到SendKeys 是生成键盘输入的正确方法,并且这是唯一适用于所有情况的方法。但是,我不能使用SendKeys,因为我的程序正在运行的计算机将在我的程序运行时被积极使用,这意味着鼠标点击可以随时发生,这将改变窗口的焦点并让@ 987654323@开始将输入发送到错误的窗口。

我想知道的是为什么我的代码无法正常工作——我发送的消息类型是否有问题? PostSendWPARAM 应该是什么?等等......答案可能是因为我将消息发送到记事本窗口,而不是在记事本中找到的编辑控件 - 我怀疑这会起作用。

无论如何,我尝试将输入发送到我希望它实际运行的应用程序,这最终成功了:

def send_input_hax(hwnd, msg):
    for c in msg:
        if c == "\n":
            win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
            win32api.SendMessage(hwnd, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
        else:
            win32api.SendMessage(hwnd, win32con.WM_CHAR, ord(c), 0)

所以答案是我在消息类型或消息内容方面没有做错任何事情,只是发送到了错误的目的地。

【讨论】:

+1 但请注意,以防其他人发生这种情况:在某些应用程序中,您必须使用PostMessage 而不是SendMessage 才能模拟VK_RETURN 才能工作。

以上是关于SendMessage 怎么将最小化的窗口还原?的主要内容,如果未能解决你的问题,请参考以下文章

c语言能不能将dos窗口隐藏,不是最小化

vc++的mfc怎么控制窗口的最大小最小化还原

c# 通过窗口名字关闭窗口

MFC 对话框最小化与还原

怎么用键盘直接关闭窗口

PyQt5编程(10):窗口的最小化与最大化