Что нового

WM_NOTIFY и HotKeySet

qqww22

Новичок
Сообщения
115
Репутация
4
В определённой периодичности приводит к зависанию программы, где мои грабли?
 
Автор
Q

qqww22

Новичок
Сообщения
115
Репутация
4
Тыкни правой кнопкой на listview и нажми f1


Код:
#include <GUIConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <File.au3>
#include <Date.au3>
#include <String.au3>
#include <GuiMenu.au3>
#include <WindowsConstants.au3>
#include <GuiImageList.au3>
#include <GuiScrollBars.au3>




HotKeySet("{f1}", "hide")



Opt('GUICloseOnESC', 0)


$iLVStyle = BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS)
$iLVExtStyle = BitOR($WS_EX_CLIENTEDGE, $LVS_EX_GRIDLINES, $LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT)





$hGUI=GUICreate('', 500, 500, 500,0,-1,$WS_EX_TOPMOST)





$listview = GUICtrlCreateListView ("TEST",16, 162, 373, @DesktopHeight+350-740,$iLVStyle, $iLVExtStyle)
$hwndlist = ControlGetHandle($hGUI, "", $listview)

$Button__EXIT = GUICtrlCreateButton("^", 390,141, 20,20,$WS_EX_TOPMOST)


global $nMsg



local  enum $idDelete = 1000, $idDetail	,$iadd

local $gui010= $hgui
local $gui0102= $hgui
local $LV010 = $listview
local $dummyDet = guictrlcreatedummy()
local $dummyDel = guictrlcreatedummy()
local $dummyAdd = guictrlcreatedummy()
$hMenu = _GUICtrlMenu_CreatePopup()
_GUICtrlMenu_InsertMenuItem($hMenu, 0, "Редактировать", $idDetail)
_GUICtrlMenu_InsertMenuItem($hMenu, 1, "Удалить", $idDelete)

$hMenu2 = _GUICtrlMenu_CreatePopup()
_GUICtrlMenu_InsertMenuItem($hMenu2, 1, "test", $iadd)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

GUISetState()



While 1
  $nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
  exit
EndSwitch

WEnd

func hide()
  
  
   Local $aWinList = WinList("[REGEXPTITLE:(?i)(.*SciTE.*|.*Internet Explorer.*)]")
    _ArrayDisplay($aWinList)

endfunc




Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $iIDFrom, $iCode, $tNMHDR, $tInfo

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $iIDFrom
        Case $lv010
            Switch $iCode
                Case $NM_RCLICK
                    $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
;~                     ConsoleWrite(@CR&"ZASHEL")
                    If DllStructGetData($tInfo, "Item") > -1 Then
                        _GUICtrlMenu_TrackPopupMenu($hMenu, $gui010)
                    else
                      _GUICtrlMenu_TrackPopupMenu($hMenu2, $gui0102)
                    EndIf
			endswitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)

    Switch $iwParam
        Case $iddetail
			guictrlsendtodummy($dummyDET)
        Case $iddelete
      guictrlsendtodummy($dummyDEL)
      Case $iadd
      guictrlsendtodummy($dummyAdd)



    EndSwitch
  EndFunc
 
A

Alofa

Гость
_GUICtrlMenu_TrackPopupMenu() является блокирующей функцией.
А что у нас сказано на счет этого в описанииGUIRegisterMsg()?
Код:
#include <GUIConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <File.au3>
#include <Date.au3>
#include <String.au3>
#include <GuiMenu.au3>
#include <WindowsConstants.au3>
#include <GuiImageList.au3>
#include <GuiScrollBars.au3>


Global $nMsg, $hPopupMenu

HotKeySet("{f1}", "hide")

Opt('GUICloseOnESC', 0)


$iLVStyle = BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS)
$iLVExtStyle = BitOR($WS_EX_CLIENTEDGE, $LVS_EX_GRIDLINES, $LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT)
Local $hGUI = GUICreate('', 500, 500, 500, -1, -1, $WS_EX_TOPMOST)
$listview = GUICtrlCreateListView("TEST", 16, 162, 373, @DesktopHeight + 350 - 740, $iLVStyle, $iLVExtStyle)
$hwndlist = ControlGetHandle($hGUI, "", $listview)
$Button__EXIT = GUICtrlCreateButton("^", 390, 141, 20, 20, $WS_EX_TOPMOST)

Local Enum $idDelete = 1000, $idDetail, $iadd

Local $gui010 = $hGUI
Local $gui0102 = $hGUI
Local $LV010 = $listview
Local $dummyDet = GUICtrlCreateDummy()
Local $dummyDel = GUICtrlCreateDummy()
Local $dummyAdd = GUICtrlCreateDummy()
$hMenu = _GUICtrlMenu_CreatePopup()
_GUICtrlMenu_InsertMenuItem($hMenu, 0, "Редактировать", $idDetail)
_GUICtrlMenu_InsertMenuItem($hMenu, 1, "Удалить", $idDelete)
$hMenu2 = _GUICtrlMenu_CreatePopup()
_GUICtrlMenu_InsertMenuItem($hMenu2, 1, "test", $iadd)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
	If $hPopupMenu Then
		_GUICtrlMenu_TrackPopupMenu($hPopupMenu, $gui010)
		$hPopupMenu = False
	EndIf
WEnd


Func hide()
	Local $aWinList = WinList("[REGEXPTITLE:(?i)(.*SciTE.*|.*Internet Explorer.*)]")
    _ArrayDisplay($aWinList)
EndFunc   ;==>hide


Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	Local $iIDFrom, $iCode, $tNMHDR, $tInfo

	$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")

	Switch $iIDFrom
		Case $LV010
			Switch $iCode
				Case $NM_RCLICK
					$tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
					$hPopupMenu = (DllStructGetData($tInfo, "Item") > -1) ? $hMenu : $hMenu2
			EndSwitch
	EndSwitch

	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
	Switch $iwParam
		Case $idDetail
			GUICtrlSendToDummy($dummyDet)
		Case $idDelete
			GUICtrlSendToDummy($dummyDel)
		Case $iadd
			GUICtrlSendToDummy($dummyAdd)
	EndSwitch
	If $iwParam Then
	EndIf
EndFunc   ;==>WM_COMMAND
 
Автор
Q

qqww22

Новичок
Сообщения
115
Репутация
4
Решение.

thx to yashed.


Код:
#include <GUIConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <File.au3>
#include <Date.au3>
#include <String.au3>
#include <GuiMenu.au3>
#include <WindowsConstants.au3>
#include <GuiImageList.au3>
#include <GuiScrollBars.au3>




HotKeySet("{f1}", "hide")



Opt('GUICloseOnESC', 0)


$iLVStyle = BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS)
$iLVExtStyle = BitOR($WS_EX_CLIENTEDGE, $LVS_EX_GRIDLINES, $LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT)





$hGUI=GUICreate('', 500, 500, 500,0,-1,$WS_EX_TOPMOST)





$listview = GUICtrlCreateListView ("TEST",16, 162, 373, @DesktopHeight+350-740,$iLVStyle, $iLVExtStyle)
$hwndlist = ControlGetHandle($hGUI, "", $listview)

$Button__EXIT = GUICtrlCreateButton("^", 390,141, 20,20,$WS_EX_TOPMOST)


global $nMsg



local  enum $idDelete = 1000, $idDetail	,$iadd

local $gui010= $hgui
local $gui0102= $hgui
local $LV010 = $listview
local $dummyDet = guictrlcreatedummy()
local $dummyDel = guictrlcreatedummy()
local $dummyAdd = guictrlcreatedummy()
$hMenu = _GUICtrlMenu_CreatePopup()
_GUICtrlMenu_InsertMenuItem($hMenu, 0, "Редактировать", $idDetail)
_GUICtrlMenu_InsertMenuItem($hMenu, 1, "Удалить", $idDelete)

$hMenu2 = _GUICtrlMenu_CreatePopup()
_GUICtrlMenu_InsertMenuItem($hMenu2, 1, "test", $iadd)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUIRegisterMsg($WM_ACTIVATE, "WM_ACTIVATE")


Func WM_ACTIVATE($hWnd, $iMsg, $wParam, $lParam)
    Return $GUI_RUNDEFMSG
  EndFu
GUISetState()



While 1
  $nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
  exit
EndSwitch

WEnd

func hide()
  
  
   Local $aWinList = WinList("[REGEXPTITLE:(?i)(.*SciTE.*|.*Internet Explorer.*)]")
    _ArrayDisplay($aWinList)

endfunc




Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $iIDFrom, $iCode, $tNMHDR, $tInfo

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $iIDFrom
        Case $lv010
            Switch $iCode
                Case $NM_RCLICK
                    $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
;~                     ConsoleWrite(@CR&"ZASHEL")
                    If DllStructGetData($tInfo, "Item") > -1 Then
                        _GUICtrlMenu_TrackPopupMenu($hMenu, $gui010)
                    else
                      _GUICtrlMenu_TrackPopupMenu($hMenu2, $gui0102)
                    EndIf
			endswitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)

    Switch $iwParam
        Case $iddetail
			guictrlsendtodummy($dummyDET)
        Case $iddelete
      guictrlsendtodummy($dummyDEL)
      Case $iadd
      guictrlsendtodummy($dummyAdd)



    EndSwitch
  EndFunc
 
A

Alofa

Гость
Yashied сказал(а):
А зачем вообще вызывать прерывающую функцию из обработчика? Это противоречит логике.
ИМХО, кроме того это плохой тон и вредная привычка.
 
Автор
Q

qqww22

Новичок
Сообщения
115
Репутация
4
Alofa сказал(а):
Yashied сказал(а):
А зачем вообще вызывать прерывающую функцию из обработчика? Это противоречит логике.
ИМХО, кроме того это плохой тон и вредная привычка.
Аррей я поставил как пример, виснет также на переборе winlist(), etc

И если прервать выполнение одного хоткея другим при wm_notify, тоже можно получить зависание.
 
Верх