Eine laufende App soll ausgewählt werden die dann immer nach Start des Programms in den Vordergrund kommen soll.
Bei der compilierten exe funktioniert das Auswählen und anschließende in den Vordergrund bringen ja recht gut, aber nach dem die .ini Datei geschrieben wurde funktioniert das Programm beim neuerlichen Start dann nicht mehr.
Im Purebasic Editor funktioniert alles wunderbar!
Wo liegt da der Hund begraben?
Code: Alles auswählen
EnableExplicit
Define Title$, hWndnr, App$
Global PID
Global MODULEENTRY32.MODULEENTRY32
Global Snapshot
Procedure ListWindows(hwnd,lParam)
Protected.s title = Space(1000),class = Space(1000)
If GetWindowLong_(hwnd,#GWL_EXSTYLE) ! #WS_EX_TOOLWINDOW And GetWindowLong_(hwnd,#GWL_STYLE) & #WS_VISIBLE
GetClassName_(hwnd,class,1000)
GetWindowText_(hwnd,title,1000)
If title <> ""
MODULEENTRY32\dwSize = SizeOf(MODULEENTRY32)
GetWindowThreadProcessId_(FindWindow_(0,title), @PID)
Snapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE, PID)
If Module32First_(Snapshot, MODULEENTRY32)
;Debug PeekS(@MODULEENTRY32\szExePath)
;Debug "Title: "+title+" | Class: "+class+" | Handle: "+Str(hwnd)+" | App: "+GetFilePart(PeekS(@MODULEENTRY32\szExePath))+" | Path: "+PeekS(@MODULEENTRY32\szExePath)
;AddGadgetItem (0, -1, title+Chr(10)+class+Chr(10)+Str(hwnd)+Chr(10)+GetFilePart(PeekS(@MODULEENTRY32\szExePath))+Chr(10)+PeekS(@MODULEENTRY32\szExePath))
AddGadgetItem (0, -1, title+Chr(10)+GetFilePart(PeekS(@MODULEENTRY32\szExePath))+Chr(10)+PeekS(@MODULEENTRY32\szExePath))
EndIf
CloseHandle_(Snapshot)
EndIf
EndIf
ProcedureReturn #True
EndProcedure
Procedure.I GetSelectedColumn(ListIconID.I)
Protected CursorLocation.POINT
Protected HitInfo.LVHITTESTINFO
GetCursorPos_(CursorLocation)
MapWindowPoints_(0, GadgetID(ListIconID), CursorLocation, 1)
Hitinfo\pt\x = CursorLocation\x
HitInfo\pt\y = CursorLocation\y
SendMessage_(GadgetID(ListIconID), #LVM_SUBITEMHITTEST, 0, HitInfo)
ProcedureReturn HitInfo\iSubItem
EndProcedure
Procedure.s GetProcessWindowText(Process.s)
Protected handle.i
Protected pid.i
Protected proc.PROCESSENTRY32
Protected buffer.s
Protected check.i
handle = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,#Null);<- snapshot handle holen
If Not handle = #INVALID_HANDLE_VALUE ;<- wenn das handle ok ist weitermachen
proc\dwSize = SizeOf(PROCESSENTRY32) ;<- um die struktur benutzen zu können muss die größe übergeben werden
If Process32First_(handle,@proc) ;<- den ersten eintrag in der prozess liste holen
Repeat
If PeekS(@proc\szExeFile) = Process;<- schauen ob der eintrag der gesuchte ist (string vergleich)
pid = proc\th32ProcessID ;<- wenn der eintrag der gesuchte ist die process id auslesen
Break ;<- die suche abbrechen da die process id gefunden wurde
EndIf
Until Process32Next_(handle,@proc) = #False;<- falscher eintrag? dann weitersuchen
EndIf
CloseHandle_(handle);<- handle wieder freigeben
If pid ;<- wurde die process id gefunden?
handle = GetWindow_(GetDesktopWindow_(),#GW_CHILD);<- das erste fenster handle holen (erstes fenster is immer das 'child' des desktops)
If handle ;<- gibt es ein fenster weitermachen
Repeat
GetWindowThreadProcessId_(handle,@check);<- process id des fensters ermitteln
If check = pid And IsWindowVisible_(handle);<- wenn das fenster sichtbar (reicht meist um das richtige fenster zu bekommen *) ist und die process id die gesuchte ist weitermachen
check = GetWindowTextLength_(handle) ;<- die länge des fenster titels ermitteln (in chars)
If check ;<- gibt es eine länge weitermachen
buffer = Space(check) ;<- speicher für den titel reservieren
If GetWindowText_(handle,@buffer,check + 1) = check;<- den titel auslesen (wichtig die api will einen char mehr! - siehe msdn)
ProcedureReturn buffer ;<- den titel zurückgeben
EndIf
EndIf
EndIf
handle = GetWindow_(handle,#GW_HWNDNEXT);<- falsches fenster - weitersuchen
Until handle = #Null
EndIf
EndIf
EndIf
ProcedureReturn #Null$;<- nichts wurde gefunden
EndProcedure
If FileSize("AppForFocus.ini") => 0
;Debug "Datei existiert!"
ReadFile(0, "AppForFocus.ini")
App$ = ReadString(0)
CloseFile(0)
Title$ = GetProcessWindowText(App$)
;Debug Title$
hWndnr = FindWindow_(0, Title$)
;Debug hWndnr
SendMessage_(GetForegroundWindow_(), #WM_SYSCOMMAND, #SC_HOTKEY, hWndnr)
Else
;Debug "Datei existiert nicht!"
If OpenWindow(0, 0, 0, 1010, 250, "App Info:", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
TextGadget(1, 5, 5, 1000, 20, "RightClick to select app to be focused", #PB_Text_Center)
ListIconGadget(0, 5, 30, 1000, 190, "Title", 235, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_GridLines)
;AddGadgetColumn(0, 1, "Class", 200)
;AddGadgetColumn(0, 2, "Handle", 60)
AddGadgetColumn(0, 3, "App", 235)
AddGadgetColumn(0, 4, "Path", 500)
ButtonGadget(2, 455, 225, 100, 20, "Refresh")
EnumChildWindows_(FindWindow_("ToolbarWindow32",0),@ListWindows(),0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget() = 0 And EventType() = #PB_EventType_RightClick
;Debug GetGadgetItemText(0, GetGadgetState(0), 2)
If MessageRequester("Selected App", GetGadgetItemText(0, GetGadgetState(0), 1) + Chr(13) + Chr(13) + "will be focused and setting will be saved to:" + Chr(13) + Chr(13) + "AppForFocus.ini" + Chr(13) + Chr(13) + "To reset the setting - just delete " + Chr(34) + "AppForFocus.ini" + Chr(34), #PB_MessageRequester_YesNo | #PB_MessageRequester_Info) = #PB_MessageRequester_Yes
If CreateFile(0, "AppForFocus.ini")
WriteString(0, GetGadgetItemText(0, GetGadgetState(0), 1))
CloseFile(0)
Else
MessageRequester("Information","Couldn't write .ini file!")
EndIf
SendMessage_(GetForegroundWindow_(), #WM_SYSCOMMAND, #SC_HOTKEY, FindWindow_(0, GetProcessWindowText(GetGadgetItemText(0, GetGadgetState(0), 1))))
End
Else
EndIf
EndIf
If EventGadget() = 2 And EventType() = #PB_EventType_LeftClick
RunProgram(ProgramFilename())
End
EndIf
EndSelect
ForEver
EndIf
EndIf