Caut un mic program pentru mutarea aplicatiei in coltu stanga sus a desktopului, la pornirea ei.
Last Updated: Jun 06 2008 08:53, Started by
Berti
, May 29 2008 23:15
·
0

#1
Posted 29 May 2008 - 23:15

Salutare forumisti.
Am nevoie de ajutorul vostru intr-o problema oarecum simpla (cred). Doresc sa rulez Igo8 PC pe un Asus eee, cu rezolutia 800x480, sistem de operar WinXP SP3. Datorita rezolutiei mici, aplicatia porneste undeva in afara desktopului, mutarea ei nu este posibila fiindca fereastra nu are WindowBorder si nici la click dreapta pe butonul aferent din TaskBar nu apare meniul cu Maximize, Minimize, Move, etc... Am gasit doua solutii manuale pentru aducerea ei pe desktop, dar ambele necesita cel putin patru operatii, care sunt oarecum anevoioase. Operatiile le-am descris in topicu asta, nu le mai scriu si aici, fiinca rezulta un post prea lung. Nu ma prea pricep la programare, dar asa in linii mari va descriu cam la ce m-am gandit: - o aplicatie cat mai simpla si mica care la incarcarea ferestrei sa o mute in stanga sus (0,0 sau ce coordonate are coltu ala) - nu necesita vreo interfata grafica, sa functioneze la nivel de linie de comanda, ceva de genu x:/program_mutare. exe igo.exe - sau daca doriti s-o faceti universala, sa-i fie utila si altcuiva, eventual mai adaugati un parametru de pozitionare, de exemplu d:/program_mutare. exe igo.exe /top left sau /middle right etc... Pentru orice alte detalii va stau la dispozitie. Multumesc anticipat! |
#2
Posted 31 May 2008 - 00:47

Dupa cum vorba spune: Pana nu faci un lucru cu mana ta, nu se numeste lucru manual... m-am apucat de lucru.
Avand o foarte mica (nesemnificativa) experienta in VB, am cautat niste exemple de manipulare a ferestrelor. Am gasit acest exemplu, care reuseste sa manevreze feresastra de IGO. Am tot sters din linii, verificand continu da mai merge mutarea ferestrei pana am ramas doar cu liniile necesare, adica: In Form Private Sub Area_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) Dim HwndCurrentWindow As Long Dim ptLocation As POINTAPI ptLocation.x = CLng(x) ptLocation.y = CLng(y) HwndCurrentWindow = WindowFromPoint(ptLocation.x, ptLocation.y) SetWindowPos CLng(HwndCurrentWindow), 0, 0, 0, 800, 480, 0 Beep a.Text = HwndCurrentWindow End Sub Private Sub Form_Load() mainfrm.Visible = True Area.ScaleMode = vbPixels End Sub In Module Public Type POINTAPI x As Long y As Long End Type Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long Public Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long ![]() ![]() Aplicatia asta functioneaza in felu urmator, oarecum ciudat, drag&drop cu mouse-u din "area" peste fereastra care o vrei mutata. Bineinteles nu asta-i scopu meu, dar nu stiu cum s-o modific... Asa ca am cautat pe net un exemplu de rulare din shell si indetificare handlerului unui proces si am gasit asta l-am modificat in felu urmator, imi porneste aplicatia, dar nu vrea s-o mute la 0,0, oare unde am gresit? Ma poate indruma cineva pe calea cea buna? Public Const GW_HWNDNEXT = 2 [b]Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long[/b] Public Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long Public Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, _ ByVal wCmd As Long) As Long Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _ (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Public Declare Function GetWindowThreadProcessId Lib "user32" _ (ByVal hwnd As Long, lpdwprocessid As Long) As Long Function ProcIDFromWnd(ByVal hwnd As Long) As Long Dim idProc As Long ' Get PID for this HWnd GetWindowThreadProcessId hwnd, idProc ' Return PID ProcIDFromWnd = idProc End Function Function GetWinHandle(hInstance As Long) As Long Dim tempHwnd As Long ' Grab the first window handle that Windows finds: tempHwnd = FindWindow(vbNullString, vbNullString) ' Loop until you find a match or there are no more window handles: Do Until tempHwnd = 0 ' Check if no parent for this window If GetParent(tempHwnd) = 0 Then ' Check for PID match If hInstance = ProcIDFromWnd(tempHwnd) Then ' Return found handle GetWinHandle = tempHwnd ' Exit search loop Exit Do End If End If ' Get the next window handle tempHwnd = GetWindow(tempHwnd, GW_HWNDNEXT) Loop End Function Private Sub Main() Dim hInst As Long ' Instance handle from Shell function. Dim hWndApp As Long ' Window handle from GetWinHandle. ' Shell to an application hInst = Shell("igo.exe") ' Begin search for handle hWndApp = GetWinHandle(hInst) If hWndApp <> 0 Then [b]SetWindowPos CLng(hWndApp), 0, 0, 0, 800, 480, 0[/b] End If End Sub |
#3
Posted 01 June 2008 - 00:49

Fiindca m-am apucat de lucru, nu prea se mai potrivea topicu in Programe la cerere, asa ca am rugat un moderator sa-l mute la VB.
N-am mai insistat pe codurile de mai sus, am incercat un exemplu care returneaza Handle-u' ferestrei dupa o cautare a catorva litere din Title-u ei. Se pare ca in situatia asta aplicatia merge bine, insa am o mare nelamurire. Exemplu era facut cu mesaje de error handling, cu MsgBox si la gasirea ferestrei cat si la lipsa ei. Problema ii ca trebuie sa dau un OK, pentru ca programul sa mearga mai departe. Culmea daca sterg linia cu MsgBox, aplicatia nu-si mai face treaba si nu muta fereastra de IGO in pozitia 0,0. Poate are cineva timp sa arunce un ochi peste cod si sa-mi ofere o explicatie sau o solutie. Multumesc! Option Explicit Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, _ ByVal cch As Long) As Long Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long Private Const GW_HWNDNEXT = 2 Private Function GetHandleFromPartialCaption(ByRef lWnd As Long, ByVal sCaption As String) As Boolean Dim lhWndP As Long Dim sStr As String GetHandleFromPartialCaption = False lhWndP = FindWindow(vbNullString, vbNullString) 'PARENT WINDOW Do While lhWndP <> 0 sStr = String(GetWindowTextLength(lhWndP) + 1, Chr$(0)) GetWindowText lhWndP, sStr, Len(sStr) sStr = Left$(sStr, Len(sStr) - 1) If InStr(1, sStr, sCaption) > 0 Then GetHandleFromPartialCaption = True lWnd = lhWndP Exit Do End If lhWndP = GetWindow(lhWndP, GW_HWNDNEXT) Loop End Function Sub Main() Dim lhWndP As Long Shell "iGO.exe", vbMaximizedFocus If GetHandleFromPartialCaption(lhWndP, "iGO8") = True Then 'linia asta daca o sterg, aplicatia nu-si mai face treaba, oare care-i baiu? cu ce pot s-o inlocuiesc, sa nu fie nevoit utilizatoru sa intervina? [b]MsgBox "Center iGO8 ?", vbOKOnly, "iGOcenter"[/b] SetWindowPos CLng(lhWndP), 0, 0, 0, 800, 480, 0 Else MsgBox "Window iGO8 not found!", vbOKOnly, "iGOcenter" End If End Sub |
#4
Posted 02 June 2008 - 20:51

Probabil ca msgbox-ul este pus acolo pentru a face o pauza, timp in care programul sa poata depista fereastra. Am facut si eu o mica aplicatie de genul acesta care foloseste Acrobat Readerul ca si client pentru a incarca niste pdf-uri si a printa apoi un numar variabil de copii. Incearca sa pui o pauza in loc de msgbox
Pune asta la inceputul programului Private Declare Function GetTickCount Lib "kernel32" () As Long private sub pause(Seconds as Long) dim PreTick as long PreTick = GetTickCount() while (GetTickCount() < PreTick + Seconds * 1000) DoEvents() wend end sub si apeleaza subrutina Pause in locul msgbox |
#5
Posted 02 June 2008 - 22:40

Stimabile nickhaios
![]() Am adaugat un msgbox temporizat, care se inchide automat dupa 3 secunde, in felu asta useru stie exact la ce sa se astepte. Daca lasam doar o temporizare simpla... useru era nedumerit, oare s-o intepenit? oare o pornit? sa mai dau un click? sa mai astept? Se poate inchide... problema-i rezolvata. |
#6
Posted 05 June 2008 - 13:21

Si mai simplu si mai elegant!!!! Am descoperit cind faceam ceva asemanator pentru un prieten (lansare o singura instanta aplicatia IGO si aducerea ferestrei peste toate celelalte - facut cu un mic programel VB6)!!
Valabil pentru IGO 2008, probabil pentru 2006 e ceva asemanator! Intri in fisierul sys_pc.txt, la sectiunea [rawdisplay] si adaugi 2 rinduri: posx=10 posy=10 (sau pui valoarea 0... cum ai nevoie !!) |
#7
Posted 06 June 2008 - 00:33

Asta da! Chiar merge... multam de pont! Pacat ca nu ti-ai amintit mai repede.
Teoretic am lucrat degeaba, practic, am mai invatat cate ceva nefolositor. ![]() p.s. Cum ai gasit cele doua comenzi? exista vreun help pentru sys_pc.txt ? Edited by Berti, 06 June 2008 - 00:39. |
#8
Posted 06 June 2008 - 08:22

Stiam de topicul tau de citeva zile, dar mi-era si mie lene sa fac un programel in VB. Si oricum, atunci nu aveam si eu IGO, ca sa vad exact numele ferestrei si class.
Dar zilele trecute m-a rugat prietenul asta sa-i fac jmecheriile alea. Cum am gasit alea?! Hmmm.... chestie țiomplicată!!! M-am uitat in TXT ala (cu Total Commander), avea numele suspect, de configurare !! Am gasit categoriile [interface] si [rawdisplay], cu parametrii respectivi, dar nici unul nu muta fereastra. Apoi, ce mi-a traznit prin cap !! F3 (view) pe fisierul EXE, search [interface] !! Nitel mai jos apareau parametrii! interface hide_mouse rawdisplay posx b o r d e r r a w d i s p l a y posy Prima data am pus chiar la [interface] si nu a mers, am pus si la [rawdisplay] si a mers !!! |
#9
Posted 06 June 2008 - 08:53

interface hide_mouse rawdisplay posx b o r d e r r a w d i s p l a y posy Pfoaiii... omule esti de milioane! ![]() Ce bine ca te-am intrebat, chiar gasisem o alta versiune care ruleza cu border si ma enerva la culme. Vanzand lista ta de parametrii, am incercat un border="0".... PERFECT! ![]() |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users