Avatar billede Lasse Novice
11. juli 2005 - 22:09 Der er 13 kommentarer og
1 løsning

Fange windows message i et "fremmed vindue"

Jeg har et vindue der modtager nogle messages. Jeg er interesseret i specielt een message. Hvordan kan jeg vide hvornaar vinduet modtager denne message? (en funktion a la Spy ++). Jeg udvikler til pocket pc.
Avatar billede sovsekoder Nybegynder
12. juli 2005 - 16:44 #1
du skal hooke wndproc for dit vindue:
SetWindowLongA( wnd.Handle, GWL_WNDPROC, oldWndProc )

send en GWL_WNDPROC message til vinduet hvor dugiver din nyefunktion med... når du er færdig skal du sætte den "gamle" wndProc funktion tilbage...

her er nogle keywords til google:
wndproc GWL_WNDPROC hook subclass winodw handle C#

der må være nogen der harlavet en luksus klasse til at hooke med.. hvis ikke du vil bruge energi på den slags...
Avatar billede sovsekoder Nybegynder
12. juli 2005 - 16:44 #2
i din nye wndproc kan du undersøgealle messages vinduet får...give beskeden videre ændre den - kort sagt køre hva som helst..
Avatar billede Lasse Novice
12. juli 2005 - 16:59 #3
Jeg er igang med at lave et grimt hack :-o Derfor maa jeg ikke fjerne messages fra den oprindelige WndProc, kun snuse.... Som jeg forstaar, saa medfoerer din loesning at jeg redirigerer messages fra den oprindelige WndProc til min WndProc. Det medfoerer jo at den oprindelige WndProc ikke modtager sine messages. (mm. jeg laver noget post processing)
Avatar billede sovsekoder Nybegynder
12. juli 2005 - 19:13 #4
så vidt jeg husker får du pointeren til din "forrige" wndproc...

den kan du bare kalde med de parametre den nye får.. så for du sniffed som du vil..
Avatar billede sovsekoder Nybegynder
12. juli 2005 - 19:14 #5
så din nye wndproc er noget i stil med:
blah2 WndProc(Blah...)
{
  retrun fnpOldWndProc(Blah...);
}
Avatar billede Lasse Novice
12. juli 2005 - 19:20 #6
Ok, jeg har nu laest lidt mere om det, og ser din pointe. Ikke desto mindre, har du nogensinde faaet dette til at virke under CF? Jeg faar smidt en NotSupportedException idet jeg kalder SetWindowLong. Ved at laese paa nettet, viser det sig at unmanaged kode ikke kan kalde managed kode via delegate (ikke implementeret) i v1.1 og under. I v2 bliver det dermed understoettet.

Er der andre metoder til at faa dette til at virke?
Avatar billede Lasse Novice
12. juli 2005 - 22:10 #7
Jeg laver bare en dll fra evc der goer det istedet for. Et svar => point
Avatar billede sovsekoder Nybegynder
28. juli 2005 - 17:00 #8
har fået det til at virke... sub-classsede internetexplorer komponent i C#
Avatar billede sovsekoder Nybegynder
28. juli 2005 - 17:01 #9
har dog ikke koden her ved hånden, kan muligvis godt skaffe den hvis du gerne vil ha noget kode (er ikke 100% sikker på at jeg ente med at bruge den løsning - var vist en smartere måde at løse det problem jeg sadmed dengang)..
Avatar billede sovsekoder Nybegynder
28. juli 2005 - 17:33 #10
koden er her : (fandt nogget på nettet)
lav en form (Form1) med en knap som kører følgende kode:
private void button1_Click(object sender, System.EventArgs e)
{
    Form2 f = new Form2();
    f.Show();

    // Subclass den nye form
    SubclassHWnd sc = new SubclassHWnd(f.Handle);   
}

klassen SubclassHWnd  er defineret ved:
public class SubclassHWnd
{
    // Win32 API needed
    [DllImport("user32")]
    private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, Win32WndProc newProc);
    [DllImport("user32")]
    private static extern int CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, int Msg, int wParam, int lParam);

    // A delegate that matches Win32 WNDPROC:
    private delegate int Win32WndProc(IntPtr hWnd, int Msg, int wParam, int lParam);

    // from winuser.h:
    private const int GWL_WNDPROC = -4;
    private const int WM_LBUTTONDOWN = 0x0201;

    // program variables
    private IntPtr oldWndProc = IntPtr.Zero;
    private Win32WndProc newWndProc = null;

    public SubclassHWnd(IntPtr hWnd)

    {
        // hWnd is the window you want to subclass..., create a new
        // delegate for the new wndproc
        newWndProc = new Win32WndProc(MyWndProc);
        // subclass
        oldWndProc = SetWindowLong(hWnd, GWL_WNDPROC, newWndProc);
    }

    // this is the new wndproc, just show a messagebox on left button down:
    private int MyWndProc(IntPtr hWnd, int Msg, int wParam, int lParam)

    {
        switch(Msg)
        {
                        // Insæt alle dine message "lyttere her"
            case WM_LBUTTONDOWN:
                MessageBox.Show("Clicked");
                // Indkommenter følgende hvis du ikke vil ha vinduet processerer beskeden selv
                                //return 0;

            default:
                break;
        }

        return CallWindowProc(oldWndProc, hWnd, Msg, wParam, lParam);
    }
}
Avatar billede sovsekoder Nybegynder
28. juli 2005 - 17:33 #11
...og så skal man sæføli' også ha en tom form, From2, altså den form som subclass'es
Avatar billede Lasse Novice
29. juli 2005 - 01:00 #12
sovsekoder>> Det vil stadig ikke virke under CF. CF kan ikke marshalle delegates til funktionspointere i CF1.0. Dette er foerst suporteret under CF2.0 (som stadig er i Beta og derfor ikke er brugbart for mig)
Avatar billede sovsekoder Nybegynder
29. juli 2005 - 21:03 #13
arrr... undskyld, havde ikke bit mærke i at du brugte compact framework... - kender ikke rigtigt noget til det - sorry
Avatar billede Lasse Novice
07. september 2005 - 22:59 #14
Her er pointene anyway...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester