Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

SendMesage problem

[es] :: .NET :: SendMesage problem

[ Pregleda: 1753 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-1.sezampro.yu.



+322 Profil

icon SendMesage problem05.09.2010. u 09:48 - pre 166 meseci
Code:

Public Class Form1

    Private Declare Ansi Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Integer
    Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer


   Private Const WM_COMMAND = &H111
    Private Const BM_CLICK = &HF5
    Const WM_SETTEXT As Int32 = 12

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim ParentWndHandle As IntPtr
        ParentWndHandle = FindWindow(vbNullString, "Calculator")
        If ParentWndHandle <> IntPtr.Zero Then
            'get the handle of button 1
            Dim ChildWndHandle As IntPtr
            ChildWndHandle = FindWindowEx(ParentWndHandle, IntPtr.Zero, "Button", "1")


            SendMessage( ?????????????? )
        End If
    End Sub


End Class


Imam problem sa ovim kodom. Hocu da u kalkulatoru kliknem na dugme 1. Pronasao sam njegov Handle ali ne znam kako da uz pomoc SendMessage posaljem taj cuveni klik?


I drugo pitanje, znam kako da pristupim menijima i submenijima ali ne znam kako da pronadjem Handle od odredjenog TextBoxa (ako ih ima vise), kako to da uradim?
 
Odgovor na temu

lonelyrider_44
Zrenjanin

Član broj: 42310
Poruke: 445
*.com
Via: [es] mailing liste



+20 Profil

icon Re: SendMesage problem05.09.2010. u 09:59 - pre 166 meseci
2. Ako si preko FindWindowEx nashao handle dugmeta, onda bi trebalo da
mozesh preko te f-je da nadjesh i handle-ove ostalih kontrola.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-1.sezampro.yu.



+322 Profil

icon Re: SendMesage problem05.09.2010. u 10:09 - pre 166 meseci
Pronasao sam ali znam sta trazim, tj trazim dugme sa odredjenim nazivom. Ali ne znam kako da nadjem prazan TextBox kada u njemu ne pise nista. I znas li kako da kliknem na ono dugme kad sam ga vec pronasao? :)

EDIT:

Pronasao sam klik, mada ne znam sta su one 2 nule na kraju ali radi.
SendMessage(ChildWndHandle, BM_CLICK, 0, 0)

E sad, kao i za textbox, kako pronaci handle nekog Button-a koji u sebi ne sadrzi tekst nego mozda samo sliku? Npr u Operi ono dugme Back?

To je pretpostavljam isti problem kao i za prazan TextBox.

[Ovu poruku je menjao Blue82 dana 05.09.2010. u 11:20 GMT+1]
 
Odgovor na temu

lonelyrider_44
Zrenjanin

Član broj: 42310
Poruke: 445
*.com
Via: [es] mailing liste



+20 Profil

icon Re: SendMesage problem05.09.2010. u 10:21 - pre 166 meseci
Treba da ga trazish po imenu kontrole (objekta) a ne po onome shto u njemu
pishe. Da ti na dugmetu pishe "pera 2", i da to prosledish f-ji
FindWindowEx, mislim da ti ne bi vratila handle od tog dugmeta.
Pogledaj ovaj link, trebalo bi da ti pomogne. Imash tu primere za f-ju
SendMessage, verovatno bi pisao neshto ovako:
http://en.wikibooks.org/wiki/W...amming/User_Interface_Controls

Code:

    SendMessage(chiledWndHandle,IntPtr.Zero,IntPtr.Zero,BM_CLICK);
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-1.sezampro.yu.



+322 Profil

icon Re: SendMesage problem05.09.2010. u 10:47 - pre 166 meseci
Nisam siguran da sam te upotpunosti razumeo a evo i zasto.

Ovako sam pronasao dugme:
Code:
ChildWndHandle = FindWindowEx(ParentWndHandle, IntPtr.Zero, "Button", "1")


Znaci trazio sam Button u kome pise 1 zar ne?

E sad, nemam predstavu kako da pronadjem Button po nekom pretpostavljam indexu?

P.S. klik je uspeo ( za primer gore )


Primera radi, da vidis gde gresim, pokusao sam da pronadjem TextBox u kome pise aa na sledeci nacin i bas mi i nije uspelo :)

Code:
 ChildWndHandle = FindWindowEx(hwnd, IntPtr.Zero, "ThunderTextBox", "aa") 

 
Odgovor na temu

lonelyrider_44
Zrenjanin

Član broj: 42310
Poruke: 445
*.com
Via: [es] mailing liste



+20 Profil

icon Re: SendMesage problem05.09.2010. u 11:48 - pre 166 meseci
Kao prvo, da li si gledao dokumentaciju za f-ju FindWindowEx ?
http://msdn.microsoft.com/en-us/library/ms633500(VS.85).aspx
[code]

HWND WINAPI FindWindowEx(
__in_opt HWND hwndParent, //handle parent controle
__in_opt HWND hwndChildAfter,
__in_opt LPCTSTR lpszClass, //ime klase kontrole koju trazish, za
textbox je to klasa "edit"
__in_opt LPCTSTR lpszWindow //e ovo mi moglo da bude taj text koji
pishe u kontroli
);
[code]
Znachi, kad pozivash f-ju, ovako nekako bi trebalo to da izgleda:
[code]
FindWindowEx(hwnd,IntPtr.Zero,"edit","aa"); //Ako je to ono shto ti pishe
u tom textbox-u
//ili
FindWindowEx(hwnd,IntPtr.Zero,"edit","ThunderTextBox"); //mozda ovako uspe
[code]
ne znam shta je ThunderTextBox, da li je to ime klase ili objekta ?
Nadam se ti neshto od ovoga pomogne.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-1.sezampro.yu.



+322 Profil

icon Re: SendMesage problem05.09.2010. u 12:02 - pre 166 meseci
ThunderTextBox je ime klase. Edit je npr za "Textbox" iz Notepada, koji utvari i nije Textbox a pravi Textbox je ova klasa ThunderTextBox.

E sad probam ovo sto sinapisao gore ali ne vidim kako pronaci textbox pomocu nekog indexa i slicno ako u njemu ne pise nista. Znaci kada imam prazne textboxove koje treba popuniti.

EDIT
m-m nije uspeo naci handle tog textboxa. Sad sam vec prilicno frustriran, citavo jutro se mucim...
 
Odgovor na temu

lonelyrider_44
Zrenjanin

Član broj: 42310
Poruke: 445
*.com
Via: [es] mailing liste



+20 Profil

icon Re: SendMesage problem05.09.2010. u 12:26 - pre 166 meseci
Reci mi, jel ti pokushavash da uhvatish handle textbox-a iz prozora koji
si sam kreirao ? Ako je tako, prilikom kreiranja dao si neki id svom
textbox-u, pa bi trebalo da postoji neka f-ja koja ti za handle vraca id,
ili josh bolje, za id vraca handle... Jer, pazi, chak i ako ne znam
detalje realizacije, jedno je sigurno: postoji neshto shto jednoznachno
odredjuje svaku kontrolu, bio to id, ili ime kontrole(objekta, ne klase).
Takodje, prema dokumentaciji, za text kontrole mozesh da stavish NULL,
onda ce ti vratiti prvi objekat na koji naidje da je tog tipa (koliko sam
shvatio). Ako imash samo jedan textbox, onda ti ovo i odgovara.
Code:

    FindWindowEx(hwnd,IntPtr.Zero,"ThunderTextBox",IntPtr.Zero);

Generalno, ovako trazeci, f-ja bi trebalo da vrati sve handlove kontrola
koje se uklapaju u kriterijum pretrage. Ali povratna vrednost je samo
jedan handle. Tako da pokushaj i tako, mozda to pomogne.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-1.sezampro.yu.



+322 Profil

icon Re: SendMesage problem05.09.2010. u 12:36 - pre 166 meseci
Ne iz prozora koji sam kreirao.
Imam program za poslovni informacioni sistem koji bi bilo dobro da mogu sam da kontrolisem. Primera radi radi se o knjizenju. Napravio sam program koji iz elektronske forme izvoda vadi podatke, i "naucio" sam ga kako da sam proknjizi vecinu stavki. E sad sve to treba ubaciti u program za knjizenje koji je vec gotov sam po sebi i pravio ga je neko drugi. Sve sto mi je potrebno je da te moje sredjene podatke ubacim u njega isto kao sto bi to korisnik radio tako sto ce kliknuti na taj i taj button i u ta i ta polja upisati sve sto treba (znaci moram znati handle svakog polja ponaosob).

Code:

        Dim hwnd As Integer
        Dim ChildWndHandle As IntPtr
        hwnd = FindWindow(vbNullString, "Form1")


        ChildWndHandle = FindWindowEx(hwnd, IntPtr.Zero, "ThunderTextBox", IntPtr.Zero)
        MsgBox(ChildWndHandle)
        SendMessage(ChildWndHandle, WM_SETTEXT, 0, "Ja za Test")




cak i ovo ne radi, uvek dobijam vrednost 0. Pokusao sam mnoge primere sa Net-a ali nece da ih prihvati, ne znam zbog cega.
Ono sto sada pokusavam je da napravim program sa praznom formom i na njij jedan textbox. Pokrenem ga i ovim kodom pokusam da mu pristupim. Znaci imam samo jedan textbox ali vrednost je opet 0.

U primeru gore, kada idem red po red vidim da on pronadje hwnd ali za promenjivu ChildWndHandle vraca vrednost nula.
 
Odgovor na temu

lonelyrider_44
Zrenjanin

Član broj: 42310
Poruke: 445
*.com
Via: [es] mailing liste



+20 Profil

icon Re: SendMesage problem05.09.2010. u 12:50 - pre 166 meseci
U tom sluchaju, ako kad trazish handle za instancu klase ThunderTextBox,
on ne nadje nijedan handle, ja bi proverio da li je stvarno taj textbox
tipa klase ThunderTextbox .
Probaj da testirash ovo sa trazenjem handle-a bez zadavanja imena, tako
shto cesh traziti dugme, ali nemoj da prosledish i ime dugmeta, da vidish
da li ce ga naci. Ako to uspe, onda mislim da postoji ogromna verovatnoca
da trazish objekat pogreshne klase.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-1.sezampro.yu.



+322 Profil

icon Re: SendMesage problem05.09.2010. u 13:55 - pre 166 meseci
Ja sam budala... sta drugo reci. Mislim da sam shvatio sta se desilo. Imao sam program (ona forma kojoj hocu da pristupim) startovan u VB6 i program koji pravim startovan u VB.Net, i gl cuda, oba se zovu Form1. Kada im pristupam on je verovatno prisupio ovom programu koji pravim (posto je on prvi pokrenut) i na njemu nije mogao da pronadje objekte koje sam trazio.


Ok, uspeo sam pristupiti TextBoxu u kome nesto pise ali prazan je i dalje enigma :)

Code:

ChildWndHandle = FindWindowEx(ParentWndHandle, IntPtr.Zero, "ThunderRT6TextBox", vbNullString)


Ovim dobijem poslednji textbox
 
Odgovor na temu

[es] :: .NET :: SendMesage problem

[ Pregleda: 1753 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.