kk_lee69 发表于 2017-8-27 17:53:57

回复 12# yamakawa


    官方網站 舊版下載
https://www.autoitscript.com/autoit3/files/archive/autoit/

上面有
autoit-v3.3.8.1-setup.exe 2016-06-12 19:427.0M

chzj589 发表于 2017-8-27 18:10:55

回复 15# yamakawa
6楼的代码我要改为事件模式,结果不行,要怎样改呢?
不知LZ这个要用在哪方面?
我想要用在点击条目,显示在另外一个列表或显示在编辑框。
因我大部份用事件模式,所以改为事件模式要套进去比较顺手。
先谢谢了!

yamakawa 发表于 2017-8-27 18:55:16

回复 16# kk_lee69


    {:face (394):}不要安装版的,有绿色版的么,直接点开就能用的。因为我已经装了新版的,再装旧的。。以后还得删除。装新的。。麻烦

yamakawa 发表于 2017-8-27 19:00:29

回复 17# chzj589


    6楼的代码?这个,,,,,基本上是高级模式,不是事件也不是消息循环,,怎么说呢。。windows消息队列?
   楼主主要是想实现 点击鼠标的效果 等同于 按住ctrl的时候点击鼠标。好别扭,,,就是说触发鼠标事件的同时,设置ctrl为按下状态。。
你想要的那个效果。。点击条目,捕捉信息好像在源码区有。。

SQLite - 增、删、改、查,操作示例。 - 『 源码作品 』 - AUTOIT CN AutoIt中文论坛|acn|au3|软件汉化 - 分享您的技术!
http://www.autoitx.com/forum.php?mod=viewthread&tid=55690&highlight=sqlite

这个是你要的么

chzj589 发表于 2017-8-27 19:06:40

回复 19# yamakawa
不是。我要的只是:
左键单点击达成LISTVIEW连续选中状态

chzj589 发表于 2017-8-27 19:17:36

回复 19# yamakawa
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPIShellEx.au3>
#include <GuiListView.au3>
Opt("GUIOnEventMode", 1);事件模式
Opt( "MustDeclareVars", 1 )
Global $idListView, $idAddSingleSel, $idDelSingleSel
Example()
Func Example()
GUICreate( "ctrl+single-click --> single-click", 420, 200 )
$idListView = GUICtrlCreateListView( "", 10, 10, 400, 180, $GUI_SS_DEFAULT_LISTVIEW-$LVS_SINGLESEL, $WS_EX_CLIENTEDGE )
_GUICtrlListView_SetExtendedListViewStyle( $idListView, $LVS_EX_DOUBLEBUFFER+$LVS_EX_FULLROWSELECT )
Local $hListView = GUICtrlGetHandle( $idListView )
_GUICtrlListView_InsertColumn( $idListView, 0, "Column 1", 94 )
_GUICtrlListView_InsertColumn( $idListView, 1, "Column 2", 94 )
_GUICtrlListView_InsertColumn( $idListView, 2, "Column 3", 94 )
_GUICtrlListView_InsertColumn( $idListView, 3, "Column 4", 94 )
Local $iItems = 100
For $i = 0 To $iItems - 1
    GUICtrlCreateListViewItem( $i & "/Column 1|" & $i & "/Column 2|" & $i & "/Column 3|" & $i & "/Column 4", $idListView )
Next
Local $pListViewFunc = DllCallbackGetPtr( DllCallbackRegister( "ListViewFunc", "lresult", "hwnd;uint;wparam;lparam;uint_ptr;dword_ptr" ) )
_WinAPI_SetWindowSubclass( $hListView, $pListViewFunc, 0, 0 ) ; $iSubclassId = 0, $pData = 0
$idAddSingleSel = GUICtrlCreateDummy()
$idDelSingleSel = GUICtrlCreateDummy()
Local $iItem
GUISetState( @SW_SHOW )
;--------------------------以下如何改----------------------------------
While 1
    Switch GUIGetMsg()
      Case $idAddSingleSel
      $iItem = GUICtrlRead( $idAddSingleSel )
      _GUICtrlListView_SetItemSelected( $idListView, $iItem, True )
      _GUICtrlListView_SetItemFocused( $idListView, $iItem )
      Case $idDelSingleSel
      $iItem = GUICtrlRead( $idDelSingleSel )
      _GUICtrlListView_SetItemSelected( $idListView, $iItem, False )
      _GUICtrlListView_SetItemFocused( $idListView, $iItem )
      Case $GUI_EVENT_CLOSE
      ExitLoop
    EndSwitch
WEnd
_WinAPI_RemoveWindowSubclass( $hListView, $pListViewFunc, 0 )
GUIDelete()
;----------------------------------修改结束-------------------------------------

EndFunc

Func ListViewFunc( $hWnd, $iMsg, $wParam, $lParam, $iSubclassId, $pData )
If $iMsg <> $WM_LBUTTONDOWN Then Return DllCall( "comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam )

Switch $wParam
    Case 0x0001; 0x0001 = MK_LBUTTON (LButton down)
      If _GUICtrlListView_GetSelectedCount( $idListView ) Then
      Local $aHit = _GUICtrlListView_HitTest( GUICtrlGetHandle( $idListView ), BitAND( $lParam, 0xFFFF ), BitShift( $lParam, 16 ) )
      If Not ( @error Or $aHit = -1 ) Then
          If _GUICtrlListView_GetItemSelected( $idListView, $aHit ) Then
            GUICtrlSendToDummy( $idDelSingleSel, $aHit )
          Else
            GUICtrlSendToDummy( $idAddSingleSel, $aHit )
          EndIf
      EndIf
      Return 0 ; Disable single-click in ListView to prevent resetting selections
      EndIf
    Case 0x0009; 0x0009 = MK_LBUTTON (LButton down) + MK_CONTROL (Ctrl down)
      Return 0   ; Disable single selections in ListView with ctrl+single-click
EndSwitch
Return DllCall( "comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam )
; Call next function in subclass chain (this forwards messages to main GUI)
#forceref $iSubclassId, $pData
EndFunc

afan 发表于 2017-8-27 19:45:00

回复 21# chzj589



#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GuiListView.au3>

Opt('GUIOnEventMode', 1)

Global $idListView, $hListView, $pListViewFunc, $idAddSingleSel, $idDelSingleSel

Example()
While 1
        Sleep(1000)
WEnd

Func Example()
        ; Create GUI
        GUICreate("ctrl+single-click --> single-click", 420, 200)
        GUISetOnEvent(-3, '_Exit')
        ; Create ListView
        $idListView = GUICtrlCreateListView("", 10, 10, 400, 180, $GUI_SS_DEFAULT_LISTVIEW - $LVS_SINGLESEL, $WS_EX_CLIENTEDGE)
        _GUICtrlListView_SetExtendedListViewStyle($idListView, $LVS_EX_DOUBLEBUFFER + $LVS_EX_FULLROWSELECT)
        $hListView = GUICtrlGetHandle($idListView)

        ; Add columns to ListView
        _GUICtrlListView_InsertColumn($idListView, 0, "Column 1", 94)
        _GUICtrlListView_InsertColumn($idListView, 1, "Column 2", 94)
        _GUICtrlListView_InsertColumn($idListView, 2, "Column 3", 94)
        _GUICtrlListView_InsertColumn($idListView, 3, "Column 4", 94)

        ; Fill ListView
        Local $iItems = 100
        For $i = 0 To $iItems - 1
                GUICtrlCreateListViewItem($i & "/Column 1|" & $i & "/Column 2|" & $i & "/Column 3|" & $i & "/Column 4", $idListView)
        Next

        ; Subclass ListView to receive keyboard/mouse messages
        $pListViewFunc = DllCallbackGetPtr(DllCallbackRegister("ListViewFunc", "lresult", "hwnd;uint;wparam;lparam;uint_ptr;dword_ptr"))
        _WinAPI_SetWindowSubclass($hListView, $pListViewFunc, 0, 0) ; $iSubclassId = 0, $pData = 0

        ; Add/del single selection
        $idAddSingleSel = GUICtrlCreateDummy()
        GUICtrlSetOnEvent(-1, '_AddSingleSel')
        $idDelSingleSel = GUICtrlCreateDummy()
        GUICtrlSetOnEvent(-1, '_DelSingleSel')

        ; Show GUI
        GUISetState(@SW_SHOW)
EndFunc   ;==>Example

Func ListViewFunc($hWnd, $iMsg, $wParam, $lParam, $iSubclassId, $pData)
        If $iMsg <> $WM_LBUTTONDOWN Then
                Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam)
                If Not @error Then
                        Return $result
                Else
                        Return
                EndIf
        EndIf
        Switch $wParam
                Case 0x0001
                        If _GUICtrlListView_GetSelectedCount($idListView) Then
                                Local $aHit = _GUICtrlListView_HitTest(GUICtrlGetHandle($idListView), BitAND($lParam, 0xFFFF), BitShift($lParam, 16))
                                If Not (@error Or $aHit = -1) Then
                                        If _GUICtrlListView_GetItemSelected($idListView, $aHit) Then
                                                GUICtrlSendToDummy($idDelSingleSel, $aHit)
                                        Else
                                                GUICtrlSendToDummy($idAddSingleSel, $aHit)
                                        EndIf
                                EndIf
                                Return 0
                        EndIf
                Case 0x0009
                        Return 0
        EndSwitch
        Local $result = DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam)
        If Not @error Then
                Return $result
        Else
                Return
        EndIf
        #forceref $iSubclassId, $pData
EndFunc   ;==>ListViewFunc

Func _AddSingleSel()
        Local $iItem = GUICtrlRead($idAddSingleSel)
        _GUICtrlListView_SetItemSelected($idListView, $iItem, True)
        _GUICtrlListView_SetItemFocused($idListView, $iItem)
EndFunc   ;==>_AddSingleSel
Func _DelSingleSel()
        Local $iItem = GUICtrlRead($idDelSingleSel)
        _GUICtrlListView_SetItemSelected($idListView, $iItem, False)
        _GUICtrlListView_SetItemFocused($idListView, $iItem)
EndFunc   ;==>_DelSingleSel
Func _Exit()
        _WinAPI_RemoveWindowSubclass($hListView, $pListViewFunc, 0)
        GUIDelete()
        Exit
EndFunc   ;==>_Exit

Func _WinAPI_SetWindowSubclass($hWnd, $pSubclassProc, $idSubClass, $pData = 0)
        Local $aRet = DllCall('comctl32.dll', 'bool', 'SetWindowSubclass', 'hwnd', $hWnd, 'ptr', $pSubclassProc, 'uint_ptr', $idSubClass, _
                        'dword_ptr', $pData)
        If @error Then Return SetError(@error, @extended, 0)
        ; If Not $aRet Then Return SetError(1000, 0, 0)

        Return $aRet
EndFunc   ;==>_WinAPI_SetWindowSubclass
Func _WinAPI_RemoveWindowSubclass($hWnd, $pSubclassProc, $idSubClass)
        Local $aRet = DllCall('comctl32.dll', 'bool', 'RemoveWindowSubclass', 'hwnd', $hWnd, 'ptr', $pSubclassProc, 'uint_ptr', $idSubClass)
        If @error Then Return SetError(@error, @extended, False)
        Return $aRet
EndFunc   ;==>_WinAPI_RemoveWindowSubclass


To LZ: au338 缺少的两个api函数给加上了,引用数组的语法也改了,应该可以各版通用

yamakawa 发表于 2017-8-27 21:00:44

{:face (396):}哦哦。原来338没有那俩函数啊。。。。原谅我没有用过旧版的。不了解

yamakawa 发表于 2017-8-27 21:03:53

回复 22# afan


    也不对啊。。如果是没有那函数,不是应该有提示 未定义函数么?
   为嘛楼主会直接没掉?scite旧版的没有这功能?

kk_lee69 发表于 2017-8-27 21:32:56

回复 22# afan

果然 3.3.8版 可以用了 感謝 修改

我研究看看怎麼合併到我的程式裡

chzj589 发表于 2017-8-27 21:54:41

回复 22# afan
太棒了,学习学习
{:face (361):}

Func ListViewFunc( $hWnd, $iMsg, $wParam, $lParam, $iSubclassId, $pData )
If $iMsg <> $WM_LBUTTONDOWN Then Return DllCall( "comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam )

Switch $wParam
    Case 0x0001; 0x0001 = MK_LBUTTON (LButton down)
      If _GUICtrlListView_GetSelectedCount( $idListView ) Then
      Local $aHit = _GUICtrlListView_HitTest( GUICtrlGetHandle( $idListView ), BitAND( $lParam, 0xFFFF ), BitShift( $lParam, 16 ) )
      If Not ( @error Or $aHit = -1 ) Then
          If _GUICtrlListView_GetItemSelected( $idListView, $aHit ) Then
            GUICtrlSendToDummy( $idDelSingleSel, $aHit )
          Else
            GUICtrlSendToDummy( $idAddSingleSel, $aHit )
          EndIf
      EndIf
      Return 0 ; Disable single-click in ListView to prevent resetting selections
      EndIf
    Case 0x0009; 0x0009 = MK_LBUTTON (LButton down) + MK_CONTROL (Ctrl down)
      Return 0   ; Disable single selections in ListView with ctrl+single-click
EndSwitch
Return DllCall( "comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam )
; Call next function in subclass chain (this forwards messages to main GUI)
#forceref $iSubclassId, $pData
EndFunc

kk_lee69 发表于 2017-8-27 23:02:34

回复 22# afan


afan可問個很笨的問題嗎??

我能了解
      $pListViewFunc = DllCallbackGetPtr(DllCallbackRegister("ListViewFunc", "lresult", "hwnd;uint;wparam;lparam;uint_ptr;dword_ptr"))

這句話是建立 取得我們所建立的 函數指標
      
_WinAPI_SetWindowSubclass($hListView, $pListViewFunc, 0, 0) ; $iSubclassId = 0, $pData = 0   

但是 這句話看到的意思是把 $pListViewFunc 跟 $hListView 關聯

但是 想詢問的是 為何 這樣就可以接收 鍵盤與MOUSE 消息呢???

我沒看到任何跟 鍵盤或者滑鼠的字眼阿

我之前嘗試過 GUIRegisterMsg(0x0201, "WM_LBUTTONDOWN")

但是這樣 反而只在 非 LISTVIEW區 才有反應在 LISTVIEW 不會有反應

但是我就是無法理解怎麼知道 滑鼠的消息可以用上面的兩個語法就可以建立關連呢??

afan 发表于 2017-8-27 23:41:53

回复 27# kk_lee69


    大致上 这就是使用回调函数先行处理windows窗口的控件消息。在$wParam中应该就包含你所说的键鼠消息

kk_lee69 发表于 2017-8-28 01:06:13

回复 28# afan

對我的主要意思是 他怎麼會知道要這樣處理那這些知識我要去哪邊學習 或者 找資料??

kk_lee69 发表于 2017-8-28 01:46:02

回复 22# afan

不過好像 使用這個方法後就不能 同時 註冊 WM_NOTIFY

我嘗試 不出來
页: 1 [2] 3 4 5 6
查看完整版本: 如何使用左键单点击达成LISTVIEW连续选中状态??