FancyMenu - der kleine Helfer

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
Darie
Beiträge: 204
Registriert: 14.09.2004 21:51

FancyMenu - der kleine Helfer

Beitrag von Darie »

So, hab jetzt mein kleines Popupmenü Tool fertiggestellt. In erster Linie soll es mir die Arbeit mit meinem Grafiktablett erleichtern, da der
Treiber des Tabletts leider keine Profile unterstützt. Daher hab ich mir ein eigenes Popupmenü geschrieben, dass man durch Textdateien einfach
erweitern kann. Man kann Shortcuts damit aufrufen oder auch einfach nur einen String an das Fenster senden, eine Anwendung samt Parameter aufrufen.
Ihr könnt für eure bevorzugten Anwendungen explizit Menüs erstellen, da FancyMenü die gerade laufenden Anwendung erkennt. Wenn man in einer der Textdateien mit der lustigen Endung .pop den Befehl pop-edit einfügt, öffnet mein Tool die Datei mit dem Editor. Dann kann man schnell und komfortabel neue
Shortcuts hinzufügen. Submenüs und die Separationsbars kann man natürlich auch einfügen. Gibt's keine passende Pop-Datei öffnet Fancy die Defaultdatei.

Ich hoffe, ihr könnt was mit dem Programm anfangen, ich kanns aufjedenfall gebrauchen. Wenn ihr wollt, poste ich auch noch den Quellcode.

Hier ist erstmal der Downloadlink dazu: http://www.file-upload.net/download-287 ... 1.zip.html

(Fragt nicht, wie lange ich gebraucht hab, um das blöde PopUp wieder zu schliessen, Grüsse an Hexor und den Rest...)

Grüsse
Alexander

Hier ist noch der Quelltext, falls ihr noch Ungereimtheiten findet, sagt bitte bescheid :D

Code: Alles auswählen


;/////////////////////////////////////////////////////////
;FANCY MENU written by Alexander Diaconu 2010 Version 1.01
;/////////////////////////////////////////////////////////

#TPM_RETURNCMD = $100

Global Quit=0, Path$
Global Target.l, TargetName.s
Global NewList Commands.s()

Declare TransmitMessage(num)
Declare SendKeys(handle,window$,keys$)
Declare.s GetExeFromHandle(nhWnd.l = 0)
Declare.b ProgramExists(ProgrammName.s)
Declare.s GetWindowText(hwnd)
Declare.s GetProcessNameFromHandle(nHWnd.l = 0)

Prototype.l GetModuleFileNameEx(hProcess.l, hModule.l, *lpFilename, nSize)
Prototype.l EnumProcessModules(hProcess, *lphModule, cb, lpchNeeded)
Prototype.l GetProcessImageFileName(hProcess.l,*lpImageFileName,nSize)

Global GetModuleFileNameEx.GetModuleFileNameEx
Global EnumProcessModules.EnumProcessModules
Global GetProcessImageFileName.GetProcessImageFileName

If OpenLibrary(0, "psapi.dll")
 GetModuleFileNameEx = GetFunction(0, "GetModuleFileNameExA")
 EnumProcessModules = GetFunction(0, "EnumProcessModules")
 GetProcessImageFileName = GetFunction(0,"GetProcessImageFileNameA")
EndIf


If ProgramExists("FancyMenu") : End : EndIf


GetCursorPos_(@p.point)
Target = GetForegroundWindow_()

If Not OpenWindow(0,0,0,0,0, "FancyMenu",#PB_Window_Tool | #PB_Window_Invisible) : End : EndIf

TargetName = StringField(GetFilePart(GetProcessNameFromHandle(Target)),1,".")
Path$ = GetPathPart(GetExeFromHandle(WindowID(0)))
If FileSize(Path$+TargetName+".pop")= -1 : TargetName = "default" : EndIf
File = ReadFile(#PB_Any, Path$+TargetName+".pop")

If File
 Repeat         
   s.s = Trim(ReadString(File))
   If Not s = ""
   AddElement(Commands())
   Commands() = s
   EndIf
  Until Eof(File) = 1
  CloseFile(File)               
Else
 MessageRequester("Information","File Not Found Error") : End 
EndIf

;LastElement(Commands())
;DeleteElement(Commands())

CreatePopupMenu(0)
ForEach Commands()
 If Commands() = "---"
   MenuBar() 
 ElseIf Mid(Commands(),1,1) = ">"
   OpenSubMenu(Mid(Commands(),2,Len(Commands())-1))
 ElseIf Mid(Commands(),1,1) = "<"
   CloseSubMenu()
 Else 
   MenuItem(ListIndex(Commands())+1, StringField(Commands(),1,"="))
  EndIf 
Next Commands()


thread1=GetWindowThreadProcessId_(Target,0)
thread2=GetWindowThreadProcessId_(WindowID(0),0)
If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#True) : EndIf
SetForegroundWindow_(WindowID(0))  : Delay(125) 
If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#False) : EndIf

Repeat
  
  Event = WaitWindowEvent()
  
  Command = TrackPopupMenu_(MenuID(0), #TPM_RETURNCMD, p\x, p\y, 0, WindowID(0), 0)
  If Command = 0
   Quit = 1
  Else  
   TransmitMessage(Command)  
   Quit = 1
  EndIf
   
Until Quit = 1 Or Event = #PB_Event_CloseWindow

CloseLibrary(0)

Procedure.s GetProcessNameFromHandle(nHWnd.l = 0)
 
  Protected nProcID, nResult, nTemp, hProcess
  Protected sFile.s
  Dim lModules.l(200)
 
  ;ProcessID ermitteln, Prozess-Handle ermitteln

  If GetWindowThreadProcessId_(nHWnd, @nProcID) <> 0
   hProcess = OpenProcess_(#PROCESS_QUERY_INFORMATION, 0, nProcID)
    If hProcess <> 0
     sFile = Space(260)
     nResult = GetProcessImageFileName(hProcess,@sFile, Len(sFile))
     sFile = LCase(Left(sFile, nResult))
    EndIf
     
   ;Handle schließen
    CloseHandle_(hProcess)
  EndIf
  
 ProcedureReturn sFile

EndProcedure

Procedure.s GetExeFromHandle(nHWnd.l = 0)
 
  Protected nProcID, nResult, nTemp, hProcess
  Protected sFile.s
  Dim lModules.l(200)
 
  If GetWindowThreadProcessId_(nHWnd, @nProcID) <> 0
   hProcess = OpenProcess_(#PROCESS_QUERY_INFORMATION | #PROCESS_VM_READ, 0, nProcID)
    If hProcess <> 0
     nResult = EnumProcessModules(hProcess, @lModules(0), 200, @nTemp)
      If nResult <> 0
       sFile = Space(260)
       nResult = GetModuleFileNameEx(hProcess, 0, @sFile, Len(sFile))
       sFile = LCase(Left(sFile, nResult))    
      EndIf
    ;Handle schließen
    CloseHandle_(hProcess)
    EndIf
  EndIf

  ProcedureReturn sFile

EndProcedure

Procedure TransmitMessage(num)
  
  SelectElement(Commands(), num-1)
  
  If Mid(Commands(),1,8) = "pop-edit"
   RunProgram("notepad.exe", Path$+TargetName+".pop","")
   ProcedureReturn
  EndIf 
 
  pos = FindString(Commands(), "=", 1)
  If pos <> 0
   Commands() = Mid(Commands(), pos + 1, Len(Commands()))
  EndIf
  
  If Mid(Commands(),1,1) = Chr(34)
   Commands() = Mid(Commands(),2,Len(Commands())-2)
   Param$=Mid(Commands(),FindString(Commands(),".",1)+4)
   Commands()=RemoveString(Commands(),Param$)
   If Trim(Param$) = ""
    RunProgram(Commands())
    Else
    RunProgram(Commands(),Param$,"")
   EndIf
   ProcedureReturn 
 EndIf

  If Not SendKeys(Target,"",Commands()) : MessageRequester("Error","No Keystroke Sent!!!") : EndIf
 
EndProcedure

Procedure SendKeys(handle,window$,keys$)
  
If window$<>"" : handle=FindWindow_(0,window$) : EndIf ; Use window$ instead of handle.
   
If IsWindow_(handle)=0 ; Does the target window actually exist?
  ProcedureReturn 0 ; Nope, so report 0 for failure to type.
 Else

   ; This block gives the target window the focus before typing.
   thread1=GetWindowThreadProcessId_(GetForegroundWindow_(),0)
   thread2=GetWindowThreadProcessId_(handle,0)
   If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#True) : EndIf
      SetForegroundWindow_(handle) ; Target window now has the focus for typing.
      Delay(125) ; 1/8 second pause before typing, to prevent fast CPU problems.

      ; Now the actual typing starts.
      For r=1 To Len(keys$)
          vk$=Mid(keys$,r,1)
          If vk$="{" ; Special key found.
             s=FindString(keys$,"}",r+1)-(r+1) ; Get length of special key.
             s$=Mid(keys$,r+1,s) ; Get special key name.
             Select s$ ; Get virtual key code of special key.
                Case "ALTDOWN" : keybd_event_(#VK_MENU,0,0,0) ; Hold ALT down.
                Case "Alt" : keybd_event_(#VK_MENU,0,0,0) ; Hold ALT down. 
                Case "ALTUP" : keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT.
                Case "BACKSPACE" : vk=#VK_BACK
                Case "CONTROLDOWN" : keybd_event_(#VK_CONTROL,0,0,0) ; Hold CONTROL down.
                Case "Ctrl" : keybd_event_(#VK_CONTROL,0,0,0) ; Hold CONTROL down
                Case "CONTROLUP" : keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL.
                Case "DELETE" : vk=#VK_DELETE
                Case "DOWN" : vk=#VK_DOWN
                Case "END" : vk=#VK_END
                Case "ENTER" : vk=#VK_RETURN
                Case "T" : vk=#VK_T
                Case "A" : vk=#VK_A
                Case "D" : vk=#VK_D
                Case "X" : vk=#VK_X
                Case "V" : vk=#VK_V
                Case "F1" : vk=#VK_F1
                Case "F2" : vk=#VK_F2
                Case "F3" : vk=#VK_F3
                Case "F4" : vk=#VK_F4
                Case "F5" : vk=#VK_F5
                Case "F6" : vk=#VK_F6
                Case "F7" : vk=#VK_F7
                Case "F8" : vk=#VK_F8
                Case "F9" : vk=#VK_F9
                Case "F10" : vk=#VK_F10
                Case "F11" : vk=#VK_F11
                Case "F12" : vk=#VK_F12
                Case "ESCAPE" : vk=#VK_ESCAPE
                Case "HOME" : vk=#VK_HOME
                Case "INSERT" : vk=#VK_INSERT
                Case "LEFT" : vk=#VK_LEFT
                Case "PAGEDOWN" : vk=#VK_NEXT
                Case "PAGEUP" : vk=#VK_PRIOR
                Case "PRINTSCREEN" : vk=#VK_SNAPSHOT
                Case "RETURN" : vk=#VK_RETURN
                Case "RIGHT" : vk=#VK_RIGHT
                Case "SHIFTDOWN" : shifted=1 : keybd_event_(#VK_SHIFT,0,0,0) ; Hold SHIFT down.
                Case "Shift" : shifted=1 : keybd_event_(#VK_SHIFT,0,0,0) ; Hold SHIFT down.  
                Case "SHIFTUP" : shifted=0 : keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT.
                Case "TAB" : vk=#VK_TAB
                Case "UP" : vk=#VK_UP
             EndSelect
             If Left(s$,3)<>"Alt" And Left(s$,4)<>"Ctrl" And Left(s$,5)<>"Shift"
                keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0) ; Press the special key.
             EndIf
             r=r+s+1 ; Continue getting the keystrokes that follow the special key.
          Else
             vk=VkKeyScanEx_(Asc(vk$),GetKeyboardLayout_(0)) ; Normal key found.
             If vk>304 And shifted=0 : keybd_event_(#VK_SHIFT,0,0,0) : EndIf ; Due to shifted character.
             keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0) ; Press the normal key.
             If vk>304 And shifted=0 : keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) : EndIf ; Due to shifted character.
          EndIf
      Next
      If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#False) : EndIf ; Finished typing to target window!
      keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT key if user forgot.
      keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL key if user forgot.
      keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT key if user forgot.
      ProcedureReturn 1 ; Report successful typing! :)
   EndIf
 EndProcedure
 
Procedure.b ProgramExists(ProgrammName.s)
  
 CreateMutex_(0, 1, ProgrammName)
  If (GetLastError_() = #ERROR_ALREADY_EXISTS)
    ProcedureReturn #True
   Else
    ProcedureReturn #False     
   EndIf

 EndProcedure
Repeat
PureBasic
ForEver
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: FancyMenu - der kleine Helfer

Beitrag von uweb »

Lost connection to MySQL server at 'reading authorization packet', system error: 0
Benutzeravatar
Darie
Beiträge: 204
Registriert: 14.09.2004 21:51

Re: FancyMenu - der kleine Helfer

Beitrag von Darie »

Hallo UweB, bei mir funktioniert der Link, versuchs einfach nochmal...
Repeat
PureBasic
ForEver
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: FancyMenu - der kleine Helfer

Beitrag von uweb »

Diesmal hat es geklappt.
Ich habe zwar kein Grafik-Tablett, werde mich aber demnächst auch mit Pop-Up beschäftigen.
Danke fürs Teilen.
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Re: FancyMenu - der kleine Helfer

Beitrag von Batze »

Wie praktisch. :)
Könnte man denn auch funktionen je nach Anwendung umdefinieren?
Also dass man z.B. im firefox mit dem Rad nicht zoomt sondern scrollt, oder durch die Tabs blättert oder so?
Aber du greifst ja scheinbar nicht wirklich auf die Tablettdaten zu, sondern bietest nur ein Menü an (auch schon praktisch).
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
Darie
Beiträge: 204
Registriert: 14.09.2004 21:51

Re: FancyMenu - der kleine Helfer

Beitrag von Darie »

Genau, es ist einfach nur ein kleines Menü, mehr nicht. Hab das auchmal im Forum des Tablets gepostet, da sich immer wieder Leute darüber beklagen, dass das Menü eingeschränkt ist. Jeder der ein BambooFun besitzt, kennt das Problem.
Repeat
PureBasic
ForEver
Antworten