Compile program and hover over a folder on your desktop, and it
should display files in that folder in a popup menu but the
problem is that sometimes when you click it, it doesn't register
that you click it. Is this a glitch or is it with my code?
3 files
------------------
-Greg
should display files in that folder in a popup menu but the
problem is that sometimes when you click it, it doesn't register
that you click it. Is this a glitch or is it with my code?
3 files
Code:
---------------------------- CLIP #COMPILE EXE #REGISTER NONE #DIM ALL #INCLUDE "Win32Api.Inc" #INCLUDE "reg.inc" TYPE COPYDATASTRUCT dwData AS DWORD PTR cbData AS DWORD lpData AS ASCIIZ PTR END TYPE DECLARE FUNCTION SetHookMouseWindow LIB "HookMs.Dll" _ ALIAS "SetHookMouseWindow" (hWnd AS LONG) AS LONG DECLARE FUNCTION UnHookMouseWindow LIB "HookMs.Dll" _ ALIAS "UnHookMouseWindow" AS LONG DECLARE FUNCTION GetSetting(BYVAL AppName AS STRING, BYVAL Section AS STRING, BYVAL Key AS STRING, BYVAL DEFAULT AS STRING) AS STRING %IDT_TIMER1 = 100 GLOBAL glDesktopPath$ GLOBAL gloldmenu$ GLOBAL gldisappear& FUNCTION Exist(InString$) AS LONG STATIC b$ IF B$ = InString$ THEN FUNCTION = 0 ELSE b$ = Instring$ FUNCTION = 1 END IF END FUNCTION CALLBACK FUNCTION DlgProc LOCAL g& LOCAL hPopup& STATIC pt AS PointApi, Msg AS STRING SELECT CASE CBMSG CASE %WM_INITDIALOG: SetHookMouseWindow CBHNDL CASE %WM_ERASEBKGND: ShowWindow CBHNDL, 0 CASE %WM_DESTROY : UnHookMouseWindow CASE %WM_USER + 1 : Msg = "": PostMessage CBHNDL, %WM_CANCELMODE, 0, 0 KillTimer CBHNDL, %IDT_TIMER1 gldisappear& = 1 CASE %WM_COPYDATA : LOCAL cdt AS COPYDATASTRUCT PTR cdt = CBLPARAM Msg = MID$(@[email protected], 9): GetCursorPos pt PostMessage CBHNDL, %WM_CANCELMODE, 0, 0 FUNCTION = 1: EXIT FUNCTION CASE %WM_CANCELMODE: PostMessage CBHNDL, %WM_USER + 2, 0, 0 CASE %WM_TIMER : SELECT CASE CBWPARAM CASE %IDT_TIMER1 : Msg = "": PostMessage CBHNDL, %WM_CANCELMODE, 0, 0 gldisappear& = 1 END SELECT CASE %WM_USER + 2 : IF Msg <> "" THEN IF Exist(Msg) = 1 THEN IF CBMSG = 28 THEN EXIT FUNCTION IF CBMSG = 70 THEN EXIT FUNCTION IF CBMSG = %WM_USER + 1 THEN EXIT FUNCTION LOCAL rz& LOCAL gPopup& LOCAL attribute& SELECT CASE LEN(msg) CASE > 0 attribute& = GETATTR(gldesktoppath$ & "\" & Msg) SELECT CASE attribute& CASE 16 DIM sfilename$ DIM popupindex& DIM sfiles(0 TO 2000) AS STRING MENU NEW POPUP TO hPopup sfiles(0) = "-" sfiles(1) = DIR$(gldesktoppath$ & "\" & Msg & "\*.*") popupindex& = 1 sfilename$ = "1" DO UNTIL sfilename$ = "" popupindex& = popupindex& + 1 sfilename$ = DIR$ sfiles(popupindex&) = sfilename$ LOOP sfiles(popupindex&) = "-" sfiles(popupindex&+1) = "Options" sfiles(popupindex&+2) = "Unload" sfiles(popupindex&+3) = "Visit Website" sfiles(popupindex&+4) = "Purchase" popupindex& = popupindex& + 4 REDIM PRESERVE sfiles(0 TO popupindex&) DIM icounter& FOR icounter& = 0 TO popupindex& - 1 MENU ADD STRING, hPopup, sfiles(icounter&), icounter&, %MF_ENABLED NEXT SetTimer CBHNDL, %IDT_TIMER1, 6000, BYVAL %NULL rz = TrackPopupMenuEx (hPopup, %TPM_RETURNCMD OR %TPM_LEFTALIGN OR %TPM_RIGHTBUTTON, pt.x, pt.y, CBHNDL, BYVAL 0) KillTimer CBHNDL, %IDT_TIMER1 IF gldisappear& = 1 THEN gldisappear& = 0 ELSE IF sfiles(rz) = "-" THEN EXIT FUNCTION IF sfiles(rz) = "Unload" THEN PostMessage CBHNDL, %WM_SYSCOMMAND, %SC_CLOSE, 0 DIM NewFile AS ASCIIZ * 255 NewFile = gldesktoppath$ & "\" & Msg & "\" & sfiles(rz) ShellExecute %HWND_DESKTOP, "Open", NewFile, BYVAL 0, BYVAL 0, %SW_SHOWNORMAL END IF END SELECT END SELECT END IF END IF CASE ELSE END SELECT END FUNCTION FUNCTION PBMAIN glDesktopPath$ = GetSetting("Microsoft", "Windows\CurrentVersion\Explorer\Shell Folders", "Desktop", "") LOCAL hDlg AS LONG DIALOG NEW 0, "Icons", , , 150, 70, %WS_POPUP OR %WS_BORDER, %WS_EX_TOPMOST OR %WS_EX_TOOLWINDOW TO hDlg DIALOG SHOW MODAL hDlg CALL DlgProc END FUNCTION --------------------------- CLIP 'reg.inc '------------------------------------------------------------------------------ ' ' GetSetting - Retrieves application entry in the Windows registry. ' ' Syntax: ' Value = GetSetting(AppName, Section, Key) ' ' Where: ' ' AppName = String expression containing the name of the application. ' Section = String expression containing the name of the section where the ' key setting is being saved. ' Key = String expression containing the name of the key setting being ' saved. ' Default = Default value if no registry value is found. ' ' Returns: ' ' Value = Value from the registry. If the value is DWORD, use the CVL() ' or CVDWD() functions to convert from string to numeric. ' FUNCTION GetSetting(BYVAL AppName AS STRING, BYVAL Section AS STRING, _ BYVAL Key AS STRING, BYVAL DEFAULT AS STRING) AS STRING LOCAL hKey AS LONG LOCAL Result AS LONG LOCAL KeyType AS LONG LOCAL Buffer AS STRING * 2048 LOCAL SIZE AS LONG ' ** Exit is AppName, Section or Key are null IF (LEN(AppName) * LEN(Section) * LEN(Key)) = 0 THEN FUNCTION = DEFAULT EXIT FUNCTION END IF ' ** Open the section IF RegOpenKeyEx(%HK, "SOFTWARE\"+AppName+"\"+Section, 0, %KEY_ALL_ACCESS, _ hKey) <> %ERROR_SUCCESS THEN FUNCTION = DEFAULT EXIT FUNCTION END IF ' ** Get the key value SIZE = SIZEOF(Buffer) Result = RegQueryValueEx(hKey, Key+CHR$(0), 0, KeyType, Buffer, SIZE) ' ** Close the registry RegCloseKey hKey ' ** Exit if not successful or nothing there IF (Result <> %ERROR_SUCCESS) OR (SIZE = 0) THEN FUNCTION = DEFAULT EXIT FUNCTION END IF ' ** Return the data IF KeyType = %REG_SZ THEN FUNCTION = LEFT$(Buffer, SIZE - 1) ELSE FUNCTION = LEFT$(Buffer, SIZE) END IF END FUNCTION -------------------------------- CLIP 'HookMs.DLL #COMPILE DLL "HookMs.Dll" #REGISTER NONE #DIM ALL #INCLUDE "Win32Api.Inc" #INCLUDE "COMMCTRL.INC" TYPE COPYDATASTRUCT dwData AS DWORD PTR cbData AS DWORD lpData AS DWORD END TYPE GLOBAL LastInfo AS LONG $HookFile = "C:\HookMs.Id" GLOBAL hInstDll AS LONG, TmpAsciiz AS ASCIIZ * %MAX_PATH GLOBAL tRectExp AS RECT, hWndLV AS LONG, hDlg AS LONG, hHook AS LONG FUNCTION LibMain(BYVAL hInstance AS LONG, BYVAL fwdReason AS LONG, _ BYVAL lpvReserved AS LONG) EXPORT AS LONG STATIC hWnd AS LONG SELECT CASE fwdReason CASE %DLL_PROCESS_ATTACH: hInstDll = hInstance: LibMain = 1 CASE %DLL_PROCESS_DETACH: LibMain = 1 END SELECT END FUNCTION FUNCTION HookProc(BYVAL nCode AS LONG, BYVAL wParam AS LONG, BYVAL lParam AS LONG) EXPORT AS LONG STATIC id AS LONG, i AS LONG, hWnd AS LONG STATIC TmpAsciizC AS ASCIIZ * %MAX_PATH STATIC pt AS PointApi, ptc AS pointApi, Cdt AS COPYDATASTRUCT FUNCTION = CallNextHookEx(hHook, nCode, wParam, BYVAL lParam) IF nCode < 0 THEN EXIT FUNCTION IF hDlg = 0 THEN OPEN $HookFile FOR INPUT SHARED AS #1: _ INPUT #1, hDlg, hWndLv: CLOSE #1: ptc.x = -1000 IF IsWindow(hDlg) = %False THEN FreeLibrary hInstDLL: EXIT FUNCTION GetCursorPos pt: IF pt.x = ptc.x AND pt.y = ptc.y THEN EXIT FUNCTION ptc.x = pt.x: ptc.y = pt.y: hWnd = WindowFromPoint (pt.x,pt.y) IF hWndLV = 0 THEN EXIT FUNCTION IF hWnd <> hWndLV THEN IF LastInfo <> 1 THEN PostMessage hDlg, %WM_USER + 1, 0, 0: LastInfo = 1 EXIT FUNCTION END IF IF GetWindowThreadProcessId(hWndLv, BYVAL 0) <> GetCurrentThreadId THEN EXIT FUNCTION ScreenToClient hWndLv, pt id = -1 FOR i = 0 TO ListView_GetItemCount(hWndLv) - 1 tRectExp.nLeft = %LVIR_BOUNDS ListView_GetItemRect hwndLv, i, tRectExp, %LVIR_BOUNDS IF pt.x >= tRectExp.nLeft AND pt.x < tRectExp.nRight AND _ pt.y >= tRectExp.nTop AND pt.y < tRectExp.nBottom THEN id = i NEXT ListView_GetItemText hwndLv, id, 0, TmpAsciiz, SIZEOF(TmpAsciiz) IF LastInfo <> 2 OR TmpAsciiz <> TmpAsciizC THEN TmpAsciizC = TmpAsciiz LOCAL Msg AS STRING Msg = HEX$(id, 8) + TmpAsciiz Cdt.cbdata = LEN(Msg) + 1 Cdt.lpData = STRPTR(Msg) SendMessage hDlg, %WM_COPYDATA, 0, VARPTR(Cdt) LastInfo = 2 END IF END FUNCTION FUNCTION ENCW(BYVAL hWnd AS LONG, BYVAL lParam AS LONG) AS LONG STATIC tRect AS RECT GetClassName hWnd, TmpAsciiz, SIZEOF(TmpAsciiz): FUNCTION = 1 IF UCASE$(TmpAsciiz) <> "SYSLISTVIEW32" THEN ELSE GetClientRect hWnd, tRect IF (tRect.nRight - tRect.nLeft) = (tRectExp.nRight - tRectExp.nLeft) AND _ (tRect.nBottom - tRect.nTop) = (tRectExp.nBottom - tRectExp.nTop) THEN _ hWndLV = hWnd: FUNCTION = 0 END IF END FUNCTION FUNCTION SetHookMouseWindow ALIAS "SetHookMouseWindow" (hWnd AS LONG) EXPORT AS LONG InitCommonControls SystemParametersInfo %SPI_GETWORKAREA, 0, BYVAL VARPTR(tRectExp), 0 EnumChildWindows FindWindow ("Progman", ""), CODEPTR(ENCW), 0 hHook = SetWindowsHookEx (%WH_MOUSE, CODEPTR(HookProc), BYVAL hInstDLL, BYVAL 0) OPEN $HookFile FOR OUTPUT AS #1: PRINT #1, hWnd, hWndLv;: CLOSE END FUNCTION FUNCTION UnHookMouseWindow ALIAS "UnHookMouseWindow" EXPORT AS LONG UnhookWindowsHookEx hHook: KILL $HookFile END FUNCTION
------------------
-Greg
Comment