精华内容
下载资源
问答
  • Windows 使用键盘移动窗口

    万次阅读 2019-03-05 21:22:35
    Windows 使用键盘移动窗口 有时博主手一抖,就把应用程序的窗口拖到桌面外面了……只能关了再开。 所以本文介绍,如何使用键盘控制窗口移动。 Step1. 快捷键 Alt + Space 点击任务栏中要操作的应用程序,按下...

    Windows 使用键盘移动窗口


    有时手一抖,一不小心就把应用程序的窗口拖到桌面外面了……只能关了再开。

    所以本文介绍,如何使用键盘控制窗口移动,将应用移回桌面。


    Step1. 快捷键 Alt + Space

    点击任务栏中要操作的应用程序,按下快捷键 Alt + Space,便可以开启一个菜单(下图仅供演示):
    menu

    Step2. 键盘控制

    使用键盘方向键加回车,或直接按对应字母,便可使用对应功能。

    我们使用 “移动” 功能,便可以用方向键控制窗口移动了(若窗口已经最大化,则需先使用 “还原” 功能)。

    Others

    也有一些应用屏蔽了 Alt + Space 快捷菜单(例如网易云音乐 Win32 版)。对于这些应用,可以使用 Win + 方向键 将其拖回桌面(仅限 Windows 10)。

    展开全文
  • PostMessage 向Windows窗口发送Alt组合

    千次阅读 2016-05-17 16:19:41
    PostMessage 向Windows窗口发送Alt组合 出处:http://blog.sina.com.cn/s/blog_4ba5666e0101c2as.html 关于向Windows窗口发送Alt组合的问题,这个真是经典问题啊,在网上找了一下,问的人N多,方法差不多, 但...

    PostMessage 向Windows窗口发送Alt组合键


    出处:http://blog.sina.com.cn/s/blog_4ba5666e0101c2as.html


    关于向Windows窗口发送Alt组合键的问题,这个真是经典问题啊,在网上找了一下,问的人N多,方法差不多,
    但就是没有很好解决问题。
    之前找到一个能正确发送的code:(Alt+A)
    PostMessage(hWnd,WM_SYSKEYDOWN,VK_MENU,0);
    PostMessage(hWnd,WM_SYSKEYDOWN,0x41,0);
    Sleep(50);
    PostMessage(hWnd,WM_SYSKEYUP,0x41,0);
    PostMessage(hWnd,WM_SYSKEYUP,VK_MENU,0);
    有人解释说,按下组合键的时候系统是发两条消息的
    但是看到Win32 SDK,感觉上就发一次就可以了……
    偶然间又看到最后一个参数的说明,有所发现!先看WM_SYSKEYDOWN的help
    The WM_SYSKEYDOWN message is posted to the window with the keyboard focus when the user holds down the ALT key and then presses another key. It also occurs when no window currently has the keyboard focus; in this case, the WM_SYSKEYDOWN message is sent to the active window. The window that receives the message can distinguish between these two contexts by checking the context code in the lKeyData parameter.
    WM_SYSKEYDOWN
    nVirtKey = (int) wParam; // virtual-key code
    lKeyData = lParam;       // key data
    Parameters
    nVirtKey
    Value of wParam. Specifies the virtual-key code of the key being pressed.
    lKeyData
    Value of lParam. Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in the following table:
    Value Description
    0-15 Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user holding down the key.
    16-23 Specifies the scan code. The value depends on the original equipment manufacturer (OEM).
    24 Specifies whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
    25-28 Reserved; do not use.
    29 Specifies the context code. The value is 1 if the ALT key is down while the key is pressed; it is 0 if the WM_SYSKEYDOWN message is posted to the active window because no window has the keyboard focus.
    30 Specifies the previous key state. The value is 1 if the key is down before the message is sent, or it is 0 if the key is up.
    31 Specifies the transition state. The value is always 0 for a WM_SYSKEYDOWN message.
    之前曾经修改过keyData的16-23位为VK_MENU,第30位参数为1,但没效果
    请看位29的说明!!
    The value is 1 if the ALT key is down while the key is pressed;
    当值为1时表示ALT键被按下!这不正是我需要的吗?于是把29位设置为1,函数调用变成
    PostMessage(hWnd,WM_SYSKEYDOWN,0x41,1<<29);
    经过测试,发现这个就是Alt+A的效果!!原来这么简单,但为什么很多人弄得那么复杂,我当时查找的时候也是迷惘啊,浪费了N多小时。
    类似有个WM_SYSKEYUP,WM_SYSCHAR(这个不知道干什么用)
    记录一下免得 又便成了 找不到资料的傻子了
    postmessage(handle,wm_keydown,vk_down,$20000000)
    Ctrl : $10000000;
    Shift: $08000000;
    Alt:20000000



    键盘按键伪码
    if key = chr(VK_RETURN) then...
    常数名称 十六进制值 十进制值 对应按键
    VK_LBUTTON 01 1 鼠标的左键
    VK_RBUTTON 02 2 鼠标的右键
    VK-CANCEL 03 3 Contol-break 执行
    VK_MBUTTON 04 4 鼠标的中键(三按键鼠标)
    VK_BACK 08 8 Backspace键
    VK_TAB 09 9 Tab键
    VK_CLEAR 0C 12 Clear键
    VK_RETURN 0D 13 Enter键
    VK_SHIFT 10 16 Shift键
    VK_CONTROL 11 17 Ctrl键
    VK_MENU 12 18 Alt键
    VK_PAUSE 13 19 Pause键
    VK_CAPITAL 14 20 Caps Lock键
    VK_ESCAPE 1B 27 Ese键
    VK_SPACE 20 32 Spacebar键
    VK_PRIOR 21 33 Page Up键
    VK_NEXT 22 34 Page Domw键
    VK_END 23 35 End键
    VK_HOME 24 36 Home键
    VK_LEFT 25 37 LEFT ARROW 键(←)
    VK_UP 26 38 UP ARROW键(↑)
    VK_RIGHT 27 39 RIGHT ARROW键(→)
    VK_DOWN 28 40 DOWN ARROW键(↓)
    VK_SELECT 29 41 SELECT键
    VK_EXECUTE 2B 43 EXECUTE键
    VK_SNAPSHOT 2C 44 Print Screen键
    VK_INSERT 2D 45 Ins键
    VK_DELETE 2E 46 Del键
    VK_HELP 2F 47 Help键
    VK_0 30 48 0键
    VK_1 31 49 1键
    VK_2 32 50 2键
    VK_3 33 51 3键
    VK_4 34 52 4键
    VK_5 35 53 5键
    VK_6 36 54 6键
    VK_7 37 55 7键
    VK_8 38 56 8键
    VK_9 39 57 9键
    VK_A 41 65 A键
    VK_B 42 66 B键
    VK_C 43 67 C键
    VK_D 44 68 D键
    VK_E 45 69 E键
    VK_F 46 70 F键
    VK_G 47 71 G键
    VK_H 48 72 H键
    VK_I 49 73 I键
    VK_J 4A 74 J键
    VK_K 4B 75 K键
    VK_L 4C 76 L键
    VK_M 4D 77 M键
    VK_N 4E 78 N键
    VK_O 4F 79 O键
    VK_P 50 80 P键
    VK_Q 51 81 Q键
    VK_R 52 82 R键
    VK_S 53 83 S键
    VK_T 54 84 T键
    VK_U 55 85 U键
    VK_V 56 86 V键
    VK_W 57 87 W键
    VK_X 58 88 X键
    VK_Y 59 89 Y键
    VK_BZ 5A 90 Z键
    VK_NUMPAD0 60 96 数字键0键
    VK_NUMPAD1 61 97 数字键1键
    VK_NUMPAD2 62 98 数字键2键
    VK_NUMPAD3 63 99 数字键3键
    VK_NUMPAD4 64 100 数字键4键
    VK_NUMPAD5 65 101 数字键5键
    VK_NUMPAD6 66 102 数字键6键
    VK_NUMPAD7 67 103 数字键7键
    VK_NUMPAD8 68 104 数字键8键
    VK_NUMPAD9 69 105 数字键9键
    VK_MULTIPLY 6A 106 *键
    VK_ADD 6B 107 +键
    VK_SEPARATOR 6C 108 Separator键
    VK_SUBTRACT 6D 109 -键
    VK_DECIMAL 6E 110 .键
    VK_DIVIDE 6F 111 键
    VK_F1 70 112 F1键
    VK_F2 71 113 F2键
    VK_F3 72 114 F3键
    VK_F4 73 115 F4键
    VK_F5 74 116 F5键
    VK_F6 75 117 F6键
    VK_F7 76 118 F7键
    VK_F8 77 119 F8键
    VK_F9 78 120 F9键
    VK_F10 79 121 F10键
    VK_F11 7A 122 F11键
    VK_F12 7B 123 F12键
    VK_NUMLOCK 90 144 Num Lock 键
    VK_SCROLL 91 145 Scroll Lock键


    个人注:经测试可行,但是有的时候目标窗口的句柄并不能准确的获得。

    展开全文
  •   之前做过类似于远程桌面的功能,当时也用到了Windows API,只不过当时是针对全局的,适用于整个系统,用的是mouse_event。最近要做一个控制某个特定窗口的功能,需要将一些鼠标和键盘控制消息映射到对应的窗口上...

      之前做过类似于远程桌面的功能,当时也用到了Windows API,只不过当时是针对全局的,适用于整个系统,用的是mouse_event。最近要做一个控制某个特定窗口的功能,需要将一些鼠标和键盘控制消息映射到对应的窗口上,再用这个就不行了。之后查了下,应该是可以用SendMessage或者PostMessage来做的,但使用的过程中遇到了一些问题,解决之后记录下来给有需要的同学参考。
      其实使用这两个函数并不复杂,具体用法可参考MSDN上的说明,但使用过程中还是碰到了一些问题,首先是虽然消息发送了,但目标窗口没有响应,刚开始是以为自己发送的消息有问题,所以一直在修改,但目标窗口仍然无法收到消息。之后查了网上的资料,说是管理员权限的问题,于是用Spy++监测了这个窗口的消息日志,发现发送的时候确实什么也没收到,试了下用管理员权限启动程序,再发送消息就有响应了。这个针对不同的目标窗口可能不太一样,所以使用的时候还是要看实际的情况。
      然后就是参数的问题,由于之前对Windows API了解的不多,所以走了些弯路。函数的语法是这样的:

    LRESULT SendMessage(
      HWND   hWnd,
      UINT   Msg,
      WPARAM wParam,
      LPARAM lParam
    );
    

      hWnd就不多说了,网上有很多如何查找的方法,Msg也容易,但是wParam和lParam这两个参数在网上看到大家都不怎么提,可能觉得太简单了。后来也是查了MSDN才了解一些,这个参数其实可以包含高位和低位两个参数,所以使用的时候要注意,要用MAKEWPARAM和MAKELPARAM将信息转换一下,所以确实很简单。但因为不知道这个,我刚开始传的参数都不正确,消息映射的也不准。下面贴一下相关的消息处理代码,供大家参考:

    //处理鼠标按键消息
    switch(oper)
        {
        case 0://处理鼠标悬浮事件,这里的MAKELPARAM(width*x/oriWidth,height*y/oriHeight)表示鼠标位置
            ::PostMessage(temp_hWnd,WM_MOUSEMOVE,0,MAKELPARAM(width*x/oriWidth,height*y/oriHeight));
            break;
    
        case 1://处理鼠标左键按下事件
            ::PostMessage(temp_hWnd,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(width*x/oriWidth,height*y/oriHeight));
            break;
        case 2://处理鼠标左键抬起事件
            ::PostMessage(temp_hWnd,WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(width*x/oriWidth,height*y/oriHeight));
            break;
        case 3://处理鼠标左键双击事件
            ::PostMessage(temp_hWnd,WM_LBUTTONDBLCLK,0,MAKELPARAM(width*x/oriWidth,height*y/oriHeight));
            break;
    
        case 4://处理鼠标右键按下事件
            ::PostMessage(temp_hWnd,WM_RBUTTONDOWN,MK_RBUTTON,MAKELPARAM(width*x/oriWidth,height*y/oriHeight));
            break;
        case 5://处理鼠标右键抬起事件
            ::PostMessage(temp_hWnd,WM_RBUTTONUP, MK_RBUTTON, MAKELPARAM(width*x/oriWidth,height*y/oriHeight));
            break;
        case 6://处理鼠标右键双击事件
            ::PostMessage(temp_hWnd,WM_RBUTTONDBLCLK,0,MAKELPARAM(width*x/oriWidth,height*y/oriHeight));
            break;
    
        case 7://处理鼠标中键按下事件
            ::PostMessage(temp_hWnd,WM_MBUTTONDOWN,MK_MBUTTON,MAKELPARAM(width*x/oriWidth,height*y/oriHeight));
            break;
        case 8://处理鼠标中键抬起事件
            ::PostMessage(temp_hWnd,WM_MBUTTONUP, MK_MBUTTON, MAKELPARAM(width*x/oriWidth,height*y/oriHeight));
            break;
        case 9://处理鼠标中键双击事件
            ::PostMessage(temp_hWnd,WM_MBUTTONDBLCLK,0,MAKELPARAM(width*x/oriWidth,height*y/oriHeight));
            break;
    
        case 10://处理滚轮向前滚动事件,这里的MAKEWPARAM(0,120),0表示没有任何附加按键按住,120表示滚轮滚动方向
            ::PostMessage(temp_hWnd,WM_MOUSEWHEEL,MAKEWPARAM(0,120),MAKELPARAM(width*x/oriWidth,height*y/oriHeight));
            break;
        case 11://处理滚轮向后滚动事件
            ::PostMessage(temp_hWnd,WM_MOUSEWHEEL,MAKEWPARAM(0,-120),MAKELPARAM(width*x/oriWidth,height*y/oriHeight));
            break;
    
        case 12://处理按住鼠标左键移动事件
            ::PostMessage(temp_hWnd,WM_MOUSEMOVE,MK_LBUTTON,MAKELPARAM(width*x/oriWidth,height*y/oriHeight));
            break;
        case 13://处理按住鼠标右键移动事件
            ::PostMessage(temp_hWnd,WM_MOUSEMOVE,MK_RBUTTON,MAKELPARAM(width*x/oriWidth,height*y/oriHeight));
            break;
        case 14://处理按住鼠标中键移动事件
            ::PostMessage(temp_hWnd,WM_MOUSEMOVE,MK_MBUTTON,MAKELPARAM(width*x/oriWidth,height*y/oriHeight));
            break;
        default:
            break;
        }
    
    //处理键盘按键消息,上下左右方位键
    if(oper == 0)
        {
            switch(key)
            {
            case 0:
                ::PostMessage(temp_hWnd,WM_KEYDOWN,VK_UP,1);
                break;
            case 1:
                ::PostMessage(temp_hWnd,WM_KEYDOWN,VK_DOWN,1);
                break;
            case 2:
                ::PostMessage(temp_hWnd,WM_KEYDOWN,VK_LEFT,1);
                break;
            case 3:
                ::PostMessage(temp_hWnd,WM_KEYDOWN,VK_RIGHT,1);
                break;
            }
        }
    
        else if(oper == 1)
        {
            switch(key)
            {
            case 0:
                ::PostMessage(temp_hWnd,WM_KEYUP,VK_UP,1);
                break;
            case 1:
                ::PostMessage(temp_hWnd,WM_KEYUP,VK_DOWN,1);
                break;
            case 2:
                ::PostMessage(temp_hWnd,WM_KEYUP,VK_LEFT,1);
                break;
            case 3:
                ::PostMessage(temp_hWnd,WM_KEYUP,VK_RIGHT,1);
                break;
            }
        }
    

    最后总结一下,MSDN还是要多看,哈哈。

    展开全文
  • Windows 窗口层次关系

    千次阅读 2014-05-14 11:08:32
    相信在Windows 下面编程的很多兄弟们都不是很清楚Windows窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所以便整理一下。下面就说说Windows 中桌面(Desktop...
    相信在Windows 下面编程的很多兄弟们都不是很清楚Windows 中窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所以便整理一下。下面就说说Windows 中桌面(Desktop)以及顶层窗口,以及子窗口之间的关系。
    

        在Windows 的图形界面下,最基本显示信息的元素就是窗口,每一个Windows 窗口都管理着自己与其他窗口之间的关系和自身的一些信息,如:是否可见,窗口的所有者,窗口的父/子关系等等信息,当窗口创建、销毁、显示的时候,就会用到这些信息。

           在每一个窗口实例中,有四个元素被窗口管理器用来建立窗口管理链表。

          

    • Child  指向窗口子窗口的句柄
    • Parent:指向窗口父窗口的句柄
    • Owner:指向窗口所有者的句柄
    • Next   指向下一个同属窗口的句柄

        众所周知当Windows初始化的时候,它创建桌面这个窗口,桌面覆盖着整个窗口,窗口管理器用这个窗口作为窗口链表中第一个元素。因此桌面在窗口的层次关系中在最上层。

       在窗口层次关系中,桌面窗口下一层窗口叫做顶层窗口,顶层窗口就是那些不是子窗口的窗口,顶层窗口不能够有WS_CHILD属性。窗口管理器是如何把桌面窗口和顶层窗口联系起来的呢?窗口管理器把顶层窗口都组织到一个链表中,而这个链表的头存储的就是桌面窗口的子窗口句柄,每一个子窗口通过Next就可以找到链表中下一个窗口了。这个链表被称为子窗口链表,在同一个子窗口链表中的窗口是互为同属窗口,所有顶层窗口都是同属窗口窗口在子窗口链表中的次序也表明了窗口距离距离桌面窗口的距离[依次减小,第一个最上面,第二个在第一个下面,最后一个离桌面最近,也就是Z次序依次减小,第一个Z次序最大最能被看见]。顶层窗口所形成的子窗口链表构成了一个轴,窗口管理器就是根据Z序列来觉得窗口的哪一部分是显示的,哪一部分是被遮盖的。

       所有顶层窗口的父窗口都是指向桌面窗口的这样一来顶层窗口是桌面窗口的子窗口,所有顶层窗口构成的链表是桌面窗口的子窗口链表。当顶层窗口创建的时候,窗口管理器顶层窗口放在Z轴的顶上,这样使得整个窗口可见,窗口管理器把窗口插入到桌面窗口子窗口链表的前面。WS_EX_TOPMOST这个属性控制着窗口管理器创建顶层窗口,窗口管理器把没有WS_EX_TOPMOST属性的窗口放在具有WS_EX_TOPMOST属性的窗口的后面,这样就使得具有WS_EX_TOPMOST属性的窗口一直显示在前面

       

       在顶层窗口之间还有另外一直关系,拥有或者属于其他的顶层窗口,属于其他窗口的窗口叫做归属窗口,拥有其他窗口叫做宿主窗口,在Z轴中,归属窗口一定在他的宿主窗口的前面,如果一个宿主窗口最小化,那么归属他的窗口会隐藏掉,如果宿主窗口隐藏起来,归属他的窗口不会被隐藏掉。如果有三个窗口ABCA拥有 BB拥有 C,如果A最小化,那么B会隐藏,但是 C还是可见的。怎么才能够在窗口之间建立所有关系呢?方法是在调用CreateWindow或者CreateWindowEx创建窗口的时候,指定hwndParent 参数。

       

       桌面窗口是在窗口层次中的第一层顶层窗口在窗口层次中的第二层子窗口也就是那些创建的时候指定了WS_CHILD 属性的窗口占据了窗口层次的其他层。窗口和子窗口之间的联系,就像桌面窗口和顶层窗口之间的关系一样。

       

       子窗口显示在其父窗口的客户区域,所有同一个窗口子窗口同样建立一个Z轴【次序越大在越最上方】,这个和顶层窗口是类似的,顶层窗口也是显示在其父窗口――桌面窗口的客户区域。

       

    16 位和32 位窗口系统的区别

        窗口之间的父子关系、归属所有关系、以及根据 Z轴来显示的这些规则在16位和32位窗口系统中都是相同的。这样可以是在两种窗口系统中高度的兼容。两种窗口系统的区别在于安全和多线程。

       Windows NT 在原有的窗口层次关系中多增加了一层,每一个运行着Windows NT的系统中都有一个Windows 工作站对象,这个对象是安全对象的第一层,是所有用户安全对象的继承之源,每一个Windows工作站对象可以拥有一些桌面对象,每一个桌面都拥有上面描述的那样的窗口关系。Windows Nt用了两个桌面窗口对象,一个是用来处理登陆界面、屏蔽、锁住工作站等,一个是我们登陆之后进来操作的窗口了。J通常用户是不能够创建和删除桌面的,不过那是通常,实际上在Windows下面也可以实现类似 Linux 中的多个桌面的效果,每一个桌面都是一个独立的世界。

       两种窗口系统还有两位一个区别,在16 位窗口系统中不支持多线程,所以应用程序开发者在创建窗口的时候不必考虑线程的问题了。而在32位窗口系统中由于又支持了窗口的父子关系,归属与拥有关系,同一个窗口下面的所有线程都拥有相同的一个输入队列,应用程序开发者应该明白输入队列是共享的,在同一个时刻只能有一个线程处理消息,其他的线程都在等待输入队列一直到GetMessage或者PeekMessage返回,而且必须注意的是父窗口和子窗口或者是归属与拥有窗口共用同一个线程。

       在32 窗口系统中定义两种新的窗口类型,前台窗口和背景窗口,这两种窗口没有列到窗口的层次关系中,前台窗口就是用户当前操作的窗口,其他的所有窗口都是背景窗口。 32位窗口系统中支持两个函数来处理前台窗口SetForegroundWindowGetForegroundWindow

     

    操作窗口列表

       下面是窗口列表操作的一些函数:

    Ø      EnumChildWindows

    使用这个函数得到一个窗口的所有子窗口,包括子窗口的子窗口。不过在列举的过程中这个函数不能够列出正在创建的或者销毁的窗口。

    Ø      EnumThreadWindows

    使用这个函数可以列出所有属于这个线程的窗口。在这个函数调用之后创建的窗口是不能够被列举出来的。

    Ø      EnumWindows

    使用这个函数列举出所有顶层窗口,不能够列举出子窗口,要列出所有的顶层窗口,使用这个函数比GetWindow安全。使用GetWindow来列出所有的窗口,可能会导致程序无限循环,因为在调用GetWindow的过程中,可能一些窗口已经销毁了。EnumWindows不能够列举出调用这个函数之后创建的顶层窗口。

    Ø      FindWindow

    可以使用这个函数通过类名或者使用窗口的标题来找到顶层窗口,这个函数不能够用来找子窗口,这个函数不区分参数的大小写。这个函数在Z轴中寻找窗口,找到了之后,就会返回。

    Ø      GetDesktopWindow

    得到桌面窗口句柄

    Ø      GetNextWindow

    使用这个函数得到这个窗口的同属窗口,在16 位窗口系统中GetNextWindow GetWindow是两个不同的函数,在32位系统中这个函数是通过GetWindow来实现的。

    Ø      GetParent

    如果一个窗口存在父窗口,那么可以通过这个函数得到窗口的父窗口,如果窗口是顶层窗口,则返回其所有者窗口句柄。

    Ø      GetThreadDesktop

    这个函数用来得到指定线程的所属的桌面窗口句柄,在win95 win98下面由于不支持多桌面,每次调用该函数都返回同一个值。

    Ø      GetTopWindow

    可以用这个函数来得到给定窗口的第一个子窗口的句柄,如果传递给函数的参数是NULL的话,那么这个函数将会返回最上面的顶层窗口。

    Ø      GetWindow

    应用程序可以调用这个函数来在窗口列表中导航,这个函数有两个参数,一个是窗口的句柄,另外是要得到的窗口句柄和这个窗口之间的关系。

    ·        GW_HWNDNEXT:这个函数返回给定窗口的下一个同属窗口

    ·        GW_HWNDPREV:返回给定窗口的前一个同属窗口  

    ·        GW_HWNDFIRST:返回给定窗口的第一个同属窗口

    ·        GW_HWNDLAST:返回给定窗口的最后一个同属窗口

    ·        GW_OWNER:返回给定窗口的所有者窗口句柄

    ·        GW_CHILD:返回给定窗口的第一个子窗口句柄  

    Ø     IsChild

    这个函数有两个参数,两个窗口句柄,判断两个窗口是否存在父子关系  

    窗口的属性

        当应用程序调用CreateWindow创建窗口的时候,我们必须为窗口指定属性,下面简要的介绍一下窗口的属性。

    WS_OVERLAPPED

       交迭属性是顶层窗口的一种属性,使用这种属性创建的窗口,会被链接到桌面窗口的子窗口链表中,应用程序通常使用这种属性的窗口作为应用程序的主窗口,具有交迭属性的窗口通常具有有标题栏,即使是WS_CAPTION 这个属性没有指定。具有交迭属性的窗口通常都是有边框的,具有交迭属性的窗口可以拥有自己的顶层窗口,也可以所属其他的顶层窗口,所有的这类窗口都具有WS_CLIPSIBLINGS 属性,即使是没有给窗口指定这个属性。

    WS_POPUP

       弹出属性也是应用到顶层窗口的一种属性,使用这种属性创建的窗口会被链接到桌面窗口的子窗口链表中,应用程序通常为对话框窗口设置这个属性,弹出属性和交迭属性的主要区别在于具有弹出属性的窗口不是一定要有标题栏的,而具有交迭属性的窗口则是一定要具有标题栏,具有弹出属性的窗口可以没有边框。和具有交迭属性的窗口一样,具有弹出属性的窗口可以有自己的顶层所属窗口,也可以所属其他的顶层窗口。所有具有弹出属性的窗口必须具有WS_CLIPSIBINGS 属性,即使是用户没有指定这个属性。具有弹出属性的窗口在创建的时候,它的大小和位置不能够使用CW_USEDEFAULT 值。

    WS_CHILD

       子窗口必须具有这个属性,子窗口只能够出现在父窗口的客户区域,这是子窗口和具有交迭属性的窗口以及弹出属性的窗口的主要区别,创建子窗口的时候,位置和大小不能够使用CW_USEDEFAULT 这个值,否则是不能够创建窗口的。

    WS_CAPTION

        当窗口被设置这个属性的时候,窗口的最上头会有标题栏,应用程序可以通过SetWindowText 这个函数来改变标题栏的标题,通常具有标题栏的窗口还具有最大、最小、关闭按钮,和系统菜单。如果一个窗口没有标题栏,那么Windows 是不会创建这些东西的,即使是用户指定了这些属性,系统菜单是依赖标题栏窗口的存在而存在的,如果没有标题栏那么是一定不会有系统菜单的存在的。具有标题栏的窗口通常具有单线的边界具有可以改变窗口大小的属性,通常具有标题栏的窗口是不能具有对话框的边界属性的,除非为窗口设置WS_EX_DLGMODALFRAME 属性。 

    WS_MINIMIZEBOX

       当为窗口设置这个属性的时候,窗口的标题栏上会有一个最小化的按钮,其实对于Windows 来实现这个属性的时候,只是在标题栏上面放置了一个最小化的位图,当用户点击这个最小化位图的时候,窗口最小化,如果最大化位图最在,那么最小化位图被放置在最大化位图的左边。没有这个属性的窗口是不能够最小化的。

    WS_MAXIMIZEBOX

       当为窗口设置这个属性的时候,窗口的标题栏的右上会被放置一个最大化的位图,如果窗口设置了这个属性,用户可以点击最大化的位图或者是通过系统菜单来实现窗口的最大化,没有这个属性的窗口是不能够被最大化的。

    WS_SYSMENU

       如果为窗口指定这个属性,那么就会在窗口的左上角上放置系统菜单位图,系统菜单为用户提供了操作窗口的接口,通常系统菜单会有下面这些系统命令:

    • 恢复最小化的窗口
    • 使用键盘移动窗口
    • 使用键盘改变窗口的大小
    • 最小化窗口
    • 最大化窗口
    • 关闭窗口
    • 切换到其他的任务

    如果一个窗口有系统菜单,用户可以通过点击系统菜单图标来调用系统菜单,或者通过Alt+ 空格的快捷键调出系统菜单,或者通过点击任务栏上窗口的图标来调出系统菜单,如果一个窗口没有系统菜单,那么用户不能够通过键盘来实现系统命令,除非应用程序自身提供了这样的接口。系统菜单对于最大化的窗口也是很有用处的,最大化的窗口覆盖了整个屏幕,这样的窗口不能够被移动,除非恢复到不是最大化的状态,如果这个最大化的窗口有了系统菜单,则就不必一定恢复到非最大化的状态才能够移动。

    WS_HSCROLL

    如果窗口被指定了这个属性,那么窗口会有一个水平的滚动条,窗口是不会自动的滚动滚动条的,如果应用程序要支持滚动条,那么必须自己处理WM_HSCROLL 消息,这个属性通常是在窗口创建的时候,被指定的。 

    WS_VSCROLL

    如果窗口被指定了这个属性,那么窗口会有一个竖直的滚动条,窗口不会自动的滚动滚动条,应用程序必须自己处理WM_VSCROOL 消息来处理滚动条滚动的消息,这个属性通常是在窗口被创建的时候指定的。

    WS_BORDER

    如果窗口被指定了这个属性,那么窗口会有一个单线的边在窗口的周围,如果没有指定这个属性,但是窗口具有标题栏,那么窗口会自动的拥有这个属性,如果窗口没有这个属性,拥有这个属性的窗口不能够通过键盘或者是鼠标改变窗口的大小。

    WS_DLGFRAME

    如果窗口被指定了这个属性,那么窗口具有对话框的边框,这个属性通常是用在对话框窗口的,只能够用在窗口没有标题栏的情况下,如果一个不是对话框的窗口使用了这个窗口,那么窗口必须被指定WS_EX_DLGMODALFRAME 属性。使用这个属性创建的窗口,不能够通过键盘和鼠标改变窗口的大小。

    WS_THICKFRAME

    当窗口被指定了这个属性,那么窗口会有一个可以改变大小的边框,这种属性通常用在程序的主窗口,具有这种属性的窗口的大小可以通过键盘或者鼠标来改变。

    WS_CLIPCHILDREN

    这个属性用在具有子窗口的窗口,使用这个属性,可以使Windows 把子窗口所占的区域拷贝到父窗口,而不是甴父窗口直接的画子窗口所属的区域,如果窗口没有指定这个属性,那么那么父窗口会覆盖子窗口的区域。在一些图片显示或者OpenGL 显示的窗口中,指定这个属性是很重要的。

    WS_CLIPSIBLINGS

    当窗口赋予这个属性,窗口在自绘的时候,不会绘制到同属的子窗口,所有具有交迭属性和弹出属性的窗口都具有这个属性,所有的顶层窗口都具有这个属性,这样一来顶层窗口在自绘的时候,不会绘制在到其他的顶层窗口。 

    WS_VISIBLE

    当窗口被设置这个属性的时候,窗口是可见的,默认的情况下,应用程序必须自己调用ShowWindow 来显示窗口。

    WS_DISABLED

    当窗口被设置这个属性的时候,创建的窗口不能够接受用户的输入,除非应用程序自身提供方法来输入。这个属性通常用在Windows 控件上面。

    WS_CHILDWINDOWS

    这个属性同WS_CHILD。

    WS_OVERLAPPEDWINDOWS

    这个属性同WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,这个属性通常用在应用程序的主窗口。

    WS_POPUPWINDOWS

    这个属性同WS_POPUP | WS_BORDER | WS_SYSMENU,尽管这个属性中包含了WS_SYSMENU 属性,如果窗口没有 WS_CAPTION 属性,那么窗口也不会有系统菜单。

    WS_EX_DLGMODALFRAME

    当窗口设置了这个属性的时候,窗口具有对话框的边框,这个属性通常用在对话框窗口,不过任何窗口都可以使用这个属性来获得对话框的边框。

    WS_EX_NOPARENTNOTIFY

    这个属性是用在子窗口上的,当子窗口设置了这个属性,Windows 不发送WM_NOTIFY 消息给子窗口的父窗口,默认情况下,Windows 会在子窗口创建或者销毁的时候发送WM_NOTIFY 消息给子窗口的父窗口。

    WS_EX_TOPMOST

    这个属性仅用在顶层窗口,对于子窗口设置这个属性是被忽略的,如果窗口设置了这个属性,那么窗口会一直在其他窗口的上面。

    WS_EX_ACCEPTFILES

    窗口设置了这个属性,那么窗口可以接受拖放的对象。

    WS_EX_TRANSPARENT

    这个属性能够使窗口透明,设置了这个属性的窗口的背景使可以被看到的,透明窗口对于鼠标和键盘的消息事件并不是透明的

    展开全文
  • Windows API 编程之创建一个windows窗口

    千次阅读 2016-10-08 21:04:06
    windows API函数 创建一个windows窗口
  • Windows 窗口类型

    千次阅读 2016-06-07 11:32:41
    windows编程中,最基本的就是窗口了,调用函数CreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth,int nHeight,HWND hWndParent, HMENU hMenu,...
  • 在操作系统中,鼠标和键盘的操作会被转换为相应的系统消息,窗口过程在接收到消息后会进行对应的处理。发送消息,我们可以使用SendMessage()和PostMessage(),所以,只要使用这两个函数来发送鼠标和键盘的相关消息就...
  • Windows 窗口层次关系及窗口层次说明

    千次阅读 2016-11-26 14:15:17
    Windows 窗口层次关系及窗口层次说明
  • 文章目录一、前言二、使用Spy++工具分析窗口三、C#通过Windows API捕获窗口,获取窗口文本四、附录:Windows窗口消息 一、前言 项目是Unity开发的,上架了QQ游戏大厅,需要兼容XP系统。 QQ游戏大厅启动游戏的流程是...
  • Windows 10 Build 20161 中,微软已经更新了 Alt+Tab 的默认行为,切换界面中包括了 Microsoft Edge 的标签页面(Chromium版本)。 虽然,将 Alt+Tab 快捷方式和 Edge 浏览器标签页组合能够提高工作效率,但是当...
  • 用C#调用Windows API向指定窗口发送按键消息 z 用C#调用Windows API向指定窗口发送 一、调用Windows API。 C#下调用Windows API方法如下: 1、引入命名空间:using System.Runtime.InteropServices;  2、...
  • Windows窗口程序设计中,按钮、文本编辑框等控件都作为一个子窗口在WM_CREATE事件中创建的。其中按钮类button有多种类型和风格,常见的单选钮、复选钮、分组框也在此类中,见下表: 子窗口控件:按钮类button ...
  • (本文尝试通过一些简单的实验,来分析Windows窗口机制,并对微软的设计理由进行一定的猜测,需要读者具备C++、Windows编程及MFC经验,还得有一定动手能力。文中可能出现一些术语不统一的现象,比如“子窗口”,有...
  • Windows窗口机制

    千次阅读 2014-04-04 22:02:15
    本文是在学习Windows Feature时的笔记:
  • windows程序窗口

    千次阅读 2010-09-29 11:43:00
    Windows系统管理三个独立的Z次序----一个用于顶层窗口、一个用于兄弟窗口、还有一个用于最顶层窗口,最顶层窗口覆盖其他非最顶层窗口,而不管它是不是活动窗口或是前台窗口。应用程序通过设置WS_EX_TOPMOST...
  • Windows打开运行窗口

    千次阅读 2018-12-22 10:10:38
    Windows 8/10直接按Windows键+R即可打开运行窗口Windows 7/8.1点击桌面下边任务栏最左边的Windows图标,即开始,这时已经可以看到运行。若Windows 7系统未在自定义「开始」菜单中勾选运行命令,则在开始菜单中...
  • windows窗口移动到窗外解决办法

    千次阅读 2019-01-01 11:02:21
    平时在扩展屏使用IDEA, 拔掉扩展屏总是出现IDEA跑...1. 首先按alt+tab,确保该窗口处于激活位置。   2. 然后再按alt+space,激活控制菜单如图所示。   3. 之后按m,上下左右操作,将窗口移到中央位置。...
  • Windows程序设计--窗口与消息

    千次阅读 2015-09-09 14:43:04
    进行Windows程序设计时,其实就是在进行一种面向对象的编程。在面向对象中,对象是代码和数据的组合,一个窗口也是一个对象。在用户眼中,窗口是屏幕上的对象,并可借助键盘或鼠标直接与之进行交互。用户对窗口的...
  • 如何用键盘控制windows窗口移动

    千次阅读 2019-08-27 11:04:01
    有时候某个窗口的可拖动边框被移动到桌面外了,怎么把它给整回来? 1、底部任务栏选中该窗口,或者alt+tab选中该窗口 2、alt+space后按m 3、通过上下左右移动窗口 ...
  • windows切换窗口到不同屏幕的快捷键

    千次阅读 2020-12-19 22:33:22
    偶然按错了,发现当前窗口漂移到另外一个屏幕上了~~~ 由此引发按键探索~ shift+windows+左/右键:将当前活动窗口漂移(闪现)到左/右边屏幕; 场景: 想快速的移动屏幕; 远程连接电脑时快速的将另外一个...
  • Qt 调用 Windows 接口实现窗口置顶

    千次阅读 2017-07-23 11:14:11
    前言用 Qt 做 Windows 软件开发,有时候会用到窗口置顶功能,其实 Qt 有自带的接口来实现窗口置顶,但是效果并不太理想,比如说没办法置顶于系统标题栏,或者在全屏状态下如果有键盘事件的时候窗口置顶就不管用了,总的来...
  • Windows系统管理三个独立的Z次序----一个用于顶层窗口、一个用于兄弟窗口、还有一个用于最顶层窗口,最顶层窗口覆盖其他非最顶层窗口,而不管它是不是活动窗口或是前台窗口。应用程序通过设置WS_EX_TOPMOST风格创建...
  • Windows系统管理三个独立的Z次序----一个用于顶层窗口、一个用于兄弟窗口、还有一个用于最顶层窗口,最顶层窗口覆盖其他非最顶层窗口,而不管它是不是活动窗口或是前台窗口。应用程序通过设置WS_EX_TOPMOST风格创建...
  • 在一些情况下(比如屏幕软键盘或者输入法程序),自己的窗口没有输入焦点但是想要当前焦点窗口的键盘输入消息,可以使用Win32 API函数AttachThreadInput()来解决这个问题。AttachThreadInput把一个线程(idAttach)的...
  • Win10下Windows徽标键盘快捷键大全

    千次阅读 2019-03-10 18:06:40
    本文列举Win10下可用的Windows徽标快捷键,供大家参考: • Win + A:打开操作中心; • Win + B:将焦点转移到任务栏通知区域,之后你可以通过左右方向选择项目,按回车打开; • Win + Shift + C:打开...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 225,423
精华内容 90,169
关键字:

windows窗口键是哪个