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
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