Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Rezultat RMN

Numar circuite IPAT si prindere t...

Pareri brgimportchina.ro - teapa ...

Lucruri inaintea vremurilor lor
 Discuții despre TVR Sport HD

Cost abonament clinica privata

Tremura toata, dar nu de la ro...

Renault Android
 Recomandare bicicleta e-bike 20&#...

Bing-Content removal tool

Nu pot accesa monitorulsv.ro de l...

Cum sa elimini urmele de acnee?
 Wc Geberit

Routere detinute in trecut si in ...

Teii din fața casei

E-Mail in serie prin Excel si Out...
 

Caut un mic program pentru mutarea aplicatiei in coltu stanga sus a desktopului, la pornirea ei.

- - - - -
  • Please log in to reply
8 replies to this topic

#1
Berti

Berti

    233SP09

  • Grup: Senior Members
  • Posts: 3,068
  • Înscris: 02.03.2006
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
Berti

Berti

    233SP09

  • Grup: Senior Members
  • Posts: 3,068
  • Înscris: 02.03.2006
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


Attached File  2008_05_31_012721.jpg   85.99K   27 downloads Attached File  2008_05_31_012836.jpg   80.99K   28 downloads

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
Berti

Berti

    233SP09

  • Grup: Senior Members
  • Posts: 3,068
  • Înscris: 02.03.2006
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
stupidcow

stupidcow

    Active Member

  • Grup: Members
  • Posts: 1,437
  • Înscris: 24.12.2004
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
Berti

Berti

    233SP09

  • Grup: Senior Members
  • Posts: 3,068
  • Înscris: 02.03.2006
Stimabile nickhaios  :lol: , multam de raspuns. Intr-adevar asta era problema, da' am rezolvat-o altfel.

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
queensoft

queensoft

    Trust no one

  • Grup: Banned
  • Posts: 16,079
  • Înscris: 26.11.2005
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
Berti

Berti

    233SP09

  • Grup: Senior Members
  • Posts: 3,068
  • Înscris: 02.03.2006
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.  :lol:


p.s. Cum ai gasit cele doua comenzi? exista vreun help pentru sys_pc.txt ?

Edited by Berti, 06 June 2008 - 00:39.


#8
queensoft

queensoft

    Trust no one

  • Grup: Banned
  • Posts: 16,079
  • Înscris: 26.11.2005
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
Berti

Berti

    233SP09

  • Grup: Senior Members
  • Posts: 3,068
  • Înscris: 02.03.2006

View Postqueensoft, on Jun 6 2008, 09:22, said:

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!  :worthy:
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!  :w00t:

Anunturi

Chirurgia spinală minim invazivă Chirurgia spinală minim invazivă

Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical.

Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate