11. juli 2005 - 22:09Der 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.
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
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)
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?
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)..
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;
{ // 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;
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)
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.