找回密码  加入

AUTOIT CN

搜索
查看: 179|回复: 2

[GUI管理] 【未解决】WINAPI创建的自定义热键框,文本如何居中显示?

[复制链接]
发表于 2018-12-26 17:00:21 | 显示全部楼层 |阅读模式

WINAPI创建的自定义热键框,文本如何居中显示?

  1. #include <WinAPI.au3>
  2. #include <WindowsConstants.au3>

  3. $GUI = GUICreate('_GUIInputSetOnlyNumbers() Demo', 270, 50)
  4. $Input_1 = _GuiCtrlHotKey_Create(10, 10, 250, 20)
  5. GUISetState()

  6. Do

  7. Until GUIGetMsg()=-3

  8. Func _GuiCtrlHotKey_Create($sX, $sY, $sWidth = 100, $sHeight = 20, $sStyle = 0)
  9.         $sStyle = BitOR($sStyle, $WS_CHILD, $WS_VISIBLE, $WS_TABSTOP)
  10.         Local $hHotkey = _WinAPI_CreateWindowEx(0, 'msctls_hotkey32', '', $sStyle, $sX, $sY, $sWidth, $sHeight, $GUI)
  11.         _SendMessage($hHotkey, $WM_SETFONT, _WinAPI_GetStockObject($DEFAULT_GUI_FONT), True)
  12. EndFunc   ;==>_GuiCtrlHotKey_Create
复制代码


发表于 2018-12-26 20:18:58 | 显示全部楼层
其它的一种方法.原创
  1. #AutoIt3Wrapper_UseX64=n

  2. #include <WindowsConstants.au3>
  3. #include <GUIConstantsEx.au3>
  4. #include <WinAPIConstants.au3>
  5. #include <WinAPI.au3>
  6. #include <EditConstants.au3>
  7. #include <StaticConstants.au3>
  8. Global $oDictKey = ObjCreate('Scripting.Dictionary')
  9. $oDictKey.CompareMode = 1
  10. Global $oDictIgnoreKey = ObjCreate('Scripting.Dictionary')
  11. $oDictIgnoreKey.CompareMode = 1

  12. $GUI = GUICreate('_GUIInputSetOnlyNumbers() Demo', 270, 50)
  13. $Input_1 = GUICtrlCreateInput('', 10, 10, 250, 20, BitOR($ES_CENTER, $ES_AUTOHSCROLL, $SS_CENTERIMAGE))
  14. ;~ GUICtrlSendMsg($Input_1, $EM_SETCUEBANNER, False, '请按键')
  15. Global $hInput_1 = GUICtrlGetHandle($Input_1)
  16. Global $hInput_1_CallBack = DllCallbackRegister('_Input_CallBackFunc', 'int', 'hWnd;uint;wparam;lparam')
  17. Global $hOInput_1_CallBack = _WinAPI_SetWindowLong($hInput_1, $GWL_WNDPROC, DllCallbackGetPtr($hInput_1_CallBack))
  18. _SetKeyDictionary()
  19. _SetKeyCodeDictionary()
  20. _SetIgnoreKeyDictionary()

  21. GUISetState()

  22. Do

  23. Until GUIGetMsg() = -3

  24. Func _Input_CallBackFunc($hWnd, $iMsg, $iwParam, $ilParam)
  25.         Local $bSHIFT = _GetKeyState(0x10)
  26.         Local $bCTRL = _GetKeyState(0x11)
  27.         Local $bALT = _GetKeyState(0x12)
  28. ;~         Local $bF10 = _GetKeyState(0x79)
  29.         Switch $hWnd
  30.                 Case $hInput_1
  31.                         Switch $iMsg

  32.                                 Case $WM_PASTE ; 粘贴时发送的消息。
  33.                                         Return 0 ; 返回任意值,以切断消息的继续传递。
  34.                                 Case $WM_CUT ; 剪切时发送的消息。
  35.                                         Return 0 ; 返回任意值,以切断消息的继续传递。
  36. ;~                 Case $WM_SETTEXT ; ControlSetText、GUICtrlSetData发送的消息。
  37. ;~                         ; 判断是否是GUICtrlSetData发送,否则切断消息传递。
  38. ;~                         Return 0
  39.                                 Case $WM_CHAR ; ControlSend、Send、以及由人手物理输入时发送的消息。
  40.                                         Return 0
  41. ;~                         ; WM_CHAR消息中, $iwParam 参数设为按下的键的ASCII码。
  42. ;~                         ; 用Chr($iwParam) 可以将ASCII转换为实际输入的字符。
  43.                                 Case $WM_SYSKEYUP, $WM_KEYUP
  44.                                         Local $Key = BitAND($iwParam, 0xFF)
  45.                                         If $iMsg = $WM_SYSKEYUP Then _SendMessage($hWnd, $WM_SYSKEYUP, $Key, 0)
  46. ;~                         If $Key = 0x10 Or $Key = 0x11 Or $Key = 0x12 Or $Key = 0x79 Then
  47.                                         If $Key = 0x10 Or $Key = 0x11 Or $Key = 0x12 Then
  48.                                                 If $oDictIgnoreKey.Exists(GUICtrlRead($Input_1)) Then GUICtrlSetData($Input_1, '')
  49.                                                 Return _WinAPI_CallWindowProc($hOInput_1_CallBack, $hWnd, $iMsg, $iwParam, $ilParam)
  50.                                         EndIf
  51.                                         If $oDictKey.Exists(BitAND($iwParam, 0xFF)) Then
  52.                                                 $Key = $oDictKey.item(BitAND($iwParam, 0xFF))
  53.                                         Else
  54.                                                 Return _WinAPI_CallWindowProc($hOInput_1_CallBack, $hWnd, $iMsg, $iwParam, $ilParam)
  55.                                         EndIf
  56.                                         Local $sData = ''
  57.                                         If $bCTRL Then $sData &= 'Ctrl + '
  58.                                         If $bSHIFT Then $sData &= 'Shift + '
  59.                                         If $bALT Then $sData &= 'Alt + '
  60.                                         $sData &= $Key
  61.                                         ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sData = ' & $sData & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
  62.                                         GUICtrlSetData($Input_1, $sData)
  63.                                 Case $WM_SYSKEYDOWN, $WM_KEYDOWN
  64.                                         Local $sData = ''
  65.                                         If $bCTRL Then $sData &= 'Ctrl + '
  66.                                         If $bSHIFT Then $sData &= 'Shift + '
  67.                                         If $bALT Then $sData &= 'Alt + '
  68.                                         GUICtrlSetData($Input_1, $sData)
  69.                         EndSwitch
  70.                         Return _WinAPI_CallWindowProc($hOInput_1_CallBack, $hWnd, $iMsg, $iwParam, $ilParam)
  71.         EndSwitch
  72. EndFunc   ;==>_Input_CallBackFunc

  73. Func _GetKeyState($sKey, $vDLL = 'user32.dll')
  74.         Local $a_R = DllCall($vDLL, 'short', 'GetAsyncKeyState', 'int', $sKey)
  75.         If @error Then Return SetError(@error, @extended, False)
  76.         Return BitAND($a_R[0], 0x8000) <> 0
  77. EndFunc   ;==>_GetKeyState

  78. Func _SetKeyDictionary()
  79.         $oDictKey.Add(33, 'PageUp')
  80.         $oDictKey.Add(34, 'PageDown')
  81.         $oDictKey.Add(35, 'End')
  82.         $oDictKey.Add(36, 'Home')
  83.         $oDictKey.Add(45, 'Insert')
  84.         $oDictKey.Add(46, 'Delete')
  85.         $oDictKey.Add(38, 'Up')
  86.         $oDictKey.Add(40, 'Down')
  87.         $oDictKey.Add(37, 'Left')
  88.         $oDictKey.Add(39, 'Right')
  89.         $oDictKey.Add(103, 'NUMPAD7')
  90.         $oDictKey.Add(104, 'NUMPAD8')
  91.         $oDictKey.Add(105, 'NUMPAD9')
  92.         $oDictKey.Add(100, 'NUMPAD4')
  93.         $oDictKey.Add(101, 'NUMPAD5')
  94.         $oDictKey.Add(102, 'NUMPAD6')
  95.         $oDictKey.Add(97, 'NUMPAD1')
  96.         $oDictKey.Add(98, 'NUMPAD2')
  97.         $oDictKey.Add(99, 'NUMPAD3')
  98.         $oDictKey.Add(96, 'NUMPAD0')
  99.         $oDictKey.Add(110, 'NUMPADDOT')
  100.         $oDictKey.Add(106, 'NUMPADMULT')
  101.         $oDictKey.Add(107, 'NUMPADADD')
  102.         $oDictKey.Add(109, 'NUMPADSUB')
  103.         $oDictKey.Add(111, 'NUMPADDIV')
  104.         $oDictKey.Add(112, 'F1')
  105.         $oDictKey.Add(113, 'F2')
  106.         $oDictKey.Add(114, 'F3')
  107.         $oDictKey.Add(115, 'F4')
  108.         $oDictKey.Add(116, 'F5')
  109.         $oDictKey.Add(117, 'F6')
  110.         $oDictKey.Add(118, 'F7')
  111.         $oDictKey.Add(119, 'F8')
  112.         $oDictKey.Add(120, 'F9')
  113.         $oDictKey.Add(121, 'F10')
  114.         $oDictKey.Add(122, 'F11')
  115.         $oDictKey.Add(123, 'F12')
  116.         $oDictKey.Add(192, '`')
  117.         $oDictKey.Add(49, '1')
  118.         $oDictKey.Add(50, '2')
  119.         $oDictKey.Add(51, '3')
  120.         $oDictKey.Add(52, '4')
  121.         $oDictKey.Add(53, '5')
  122.         $oDictKey.Add(54, '6')
  123.         $oDictKey.Add(55, '7')
  124.         $oDictKey.Add(56, '8')
  125.         $oDictKey.Add(57, '9')
  126.         $oDictKey.Add(48, '0')
  127.         $oDictKey.Add(189, '-')
  128.         $oDictKey.Add(187, '=')
  129.         $oDictKey.Add(81, 'Q')
  130.         $oDictKey.Add(87, 'W')
  131.         $oDictKey.Add(69, 'E')
  132.         $oDictKey.Add(82, 'R')
  133.         $oDictKey.Add(84, 'T')
  134.         $oDictKey.Add(89, 'Y')
  135.         $oDictKey.Add(85, 'U')
  136.         $oDictKey.Add(73, 'I')
  137.         $oDictKey.Add(79, 'O')
  138.         $oDictKey.Add(80, 'P')
  139.         $oDictKey.Add(219, '[')
  140.         $oDictKey.Add(221, ']')
  141.         $oDictKey.Add(220, '\')
  142.         $oDictKey.Add(65, 'A')
  143.         $oDictKey.Add(83, 'S')
  144.         $oDictKey.Add(68, 'D')
  145.         $oDictKey.Add(70, 'F')
  146.         $oDictKey.Add(71, 'G')
  147.         $oDictKey.Add(72, 'H')
  148.         $oDictKey.Add(74, 'J')
  149.         $oDictKey.Add(75, 'K')
  150.         $oDictKey.Add(76, 'L')
  151.         $oDictKey.Add(186, ';')
  152.         $oDictKey.Add(222, "'")
  153.         $oDictKey.Add(90, 'Z')
  154.         $oDictKey.Add(88, 'X')
  155.         $oDictKey.Add(67, 'C')
  156.         $oDictKey.Add(86, 'V')
  157.         $oDictKey.Add(66, 'B')
  158.         $oDictKey.Add(78, 'N')
  159.         $oDictKey.Add(77, 'M')
  160.         $oDictKey.Add(188, ',')
  161.         $oDictKey.Add(190, '.')
  162.         $oDictKey.Add(191, '/')
  163. EndFunc   ;==>_SetKeyDictionary

  164. Func _SetKeyCodeDictionary()
  165.         $oDictKey.Add('PageUp', '{PGUP}')
  166.         $oDictKey.Add('PageDown', '{PGDN}')
  167.         $oDictKey.Add('End', '{END}')
  168.         $oDictKey.Add('Home', '{HOME}')
  169.         $oDictKey.Add('Insert', '{INS}')
  170.         $oDictKey.Add('Delete', '{DEL}')
  171.         $oDictKey.Add('Up', '{UP}')
  172.         $oDictKey.Add('Down', '{DOWN}')
  173.         $oDictKey.Add('Left', '{LEFT}')
  174.         $oDictKey.Add('Right', '{RIGHT}')
  175.         $oDictKey.Add('NUMPAD7', '{NUMPAD7}')
  176.         $oDictKey.Add('NUMPAD8', '{NUMPAD8}')
  177.         $oDictKey.Add('NUMPAD9', '{NUMPAD9}')
  178.         $oDictKey.Add('NUMPAD4', '{NUMPAD4}')
  179.         $oDictKey.Add('NUMPAD5', '{NUMPAD5}')
  180.         $oDictKey.Add('NUMPAD6', '{NUMPAD6}')
  181.         $oDictKey.Add('NUMPAD1', '{NUMPAD1}')
  182.         $oDictKey.Add('NUMPAD2', '{NUMPAD2}')
  183.         $oDictKey.Add('NUMPAD3', '{NUMPAD3}')
  184.         $oDictKey.Add('NUMPAD0', '{NUMPAD0}')
  185.         $oDictKey.Add('NUMPADDOT', '{NUMPADDOT}')
  186.         $oDictKey.Add('NUMPADMULT', '{NUMPADMULT}')
  187.         $oDictKey.Add('NUMPADADD', '{NUMPADADD}')
  188.         $oDictKey.Add('NUMPADSUB', '{NUMPADSUB}')
  189.         $oDictKey.Add('NUMPADDIV', '{NUMPADDIV}')
  190.         $oDictKey.Add('F1', '{F1}')
  191.         $oDictKey.Add('F2', '{F2}')
  192.         $oDictKey.Add('F3', '{F3}')
  193.         $oDictKey.Add('F4', '{F4}')
  194.         $oDictKey.Add('F5', '{F5}')
  195.         $oDictKey.Add('F6', '{F6}')
  196.         $oDictKey.Add('F7', '{F7}')
  197.         $oDictKey.Add('F8', '{F8}')
  198.         $oDictKey.Add('F9', '{F9}')
  199.         $oDictKey.Add('F10', '{F10}')
  200.         $oDictKey.Add('F11', '{F11}')
  201.         $oDictKey.Add('F12', '{F12}')
  202.         $oDictKey.Add('`', '`')
  203.         $oDictKey.Add('1', '1')
  204.         $oDictKey.Add('2', '2')
  205.         $oDictKey.Add('3', '3')
  206.         $oDictKey.Add('4', '4')
  207.         $oDictKey.Add('5', '5')
  208.         $oDictKey.Add('6', '6')
  209.         $oDictKey.Add('7', '7')
  210.         $oDictKey.Add('8', '8')
  211.         $oDictKey.Add('9', '9')
  212.         $oDictKey.Add('0', '0')
  213.         $oDictKey.Add('-', '-')
  214.         $oDictKey.Add('=', '=')
  215.         $oDictKey.Add('Q', 'q')
  216.         $oDictKey.Add('W', 'w')
  217.         $oDictKey.Add('E', 'e')
  218.         $oDictKey.Add('R', 'r')
  219.         $oDictKey.Add('T', 't')
  220.         $oDictKey.Add('Y', 'y')
  221.         $oDictKey.Add('U', 'u')
  222.         $oDictKey.Add('I', 'i')
  223.         $oDictKey.Add('O', 'o')
  224.         $oDictKey.Add('P', 'p')
  225.         $oDictKey.Add('[', '[')
  226.         $oDictKey.Add(']', ']')
  227.         $oDictKey.Add('\', '\')
  228.         $oDictKey.Add('A', 'a')
  229.         $oDictKey.Add('S', 's')
  230.         $oDictKey.Add('D', 'd')
  231.         $oDictKey.Add('F', 'f')
  232.         $oDictKey.Add('G', 'g')
  233.         $oDictKey.Add('H', 'h')
  234.         $oDictKey.Add('J', 'j')
  235.         $oDictKey.Add('K', 'k')
  236.         $oDictKey.Add('L', 'l')
  237.         $oDictKey.Add(';', ';')
  238.         $oDictKey.Add("'", "'")
  239.         $oDictKey.Add('Z', 'z')
  240.         $oDictKey.Add('X', 'x')
  241.         $oDictKey.Add('C', 'c')
  242.         $oDictKey.Add('V', 'v')
  243.         $oDictKey.Add('B', 'b')
  244.         $oDictKey.Add('N', 'n')
  245.         $oDictKey.Add('M', 'm')
  246.         $oDictKey.Add(',', ',')
  247.         $oDictKey.Add('.', '.')
  248.         $oDictKey.Add('/', '/')
  249. EndFunc   ;==>_SetKeyCodeDictionary

  250. Func _SetIgnoreKeyDictionary()
  251.         $oDictIgnoreKey.Add('Ctrl + ', 'Ctrl + ')
  252.         $oDictIgnoreKey.Add('Shift + ', 'Shift + ')
  253.         $oDictIgnoreKey.Add('Alt + ', 'Alt + ')
  254.         $oDictIgnoreKey.Add('Ctrl + Shift + ', 'Ctrl + Shift + ')
  255.         $oDictIgnoreKey.Add('Ctrl + Alt + ', 'Ctrl + Alt + ')
  256.         $oDictIgnoreKey.Add('Shift + Alt + ', 'Shift + Alt + ')
  257.         $oDictIgnoreKey.Add('Ctrl + Shift + Alt + ', 'Ctrl + Shift + Alt + ')
  258.         $oDictIgnoreKey.Add('Ctrl + Alt + Delete', 'Ctrl + Alt + Delete')
  259.         $oDictIgnoreKey.Add('Ctrl + c', 'Ctrl + c')
  260.         $oDictIgnoreKey.Add('Ctrl + x', 'Ctrl + x')
  261.         $oDictIgnoreKey.Add('Ctrl + v', 'Ctrl + v')
  262. EndFunc   ;==>_SetIgnoreKeyDictionary
复制代码


 楼主| 发表于 2018-12-26 21:40:01 | 显示全部楼层
tubaba 发表于 2018-12-26 20:18
其它的一种方法.原创

老哥 这代码老是崩溃
而且尤其是alt
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|小黑屋|手机版|AUTOIT CN ( 鲁ICP备15028933号-3 )谷歌 百度

GMT+8, 2019-1-19 17:32 , Processed in 0.095269 second(s), 14 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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