Avatar billede semiprofkode Nybegynder
30. juni 2006 - 00:02 Der er 31 kommentarer

Hvordan får jeg en liste over "klikbare" elementer på skærmen?

Hvordan får jeg en liste over "klikbare" elementer på skærmen på et givet tidspunkt? inklusiv deres skærmrelative(ikke vindue relative) koordinatsæt.
Avatar billede mikkel_sommer Nybegynder
30. juni 2006 - 10:47 #1
Du kan bruge den her til at løbe dine controls igennem:

foreach(Control control in this.Controls){}

I den kan du så bruge:

control.CanSelect - boolean som angiver om der kan klikkes på elementet
control.Left & control.Right - til at finde placeringen(hvis det skal være placeringen på skærmen må du nok ud i noget beregning hvor du anvender formens størrelse og placering sammen med disse)
Avatar billede mikkel_sommer Nybegynder
30. juni 2006 - 10:57 #2
Måske noget i retning af:

string s = string.Empty;
foreach(Control control in this.Controls)
{
  int left = this.Left  + control.Left;
  int right = this.Top + control.Top;
  s += control.Name.ToString() + " - " + control.CanSelect.ToString() + " - " +
    left + " - " + right + " ---------- ";
}
textBox7.Text = s;
Avatar billede semiprofkode Nybegynder
30. juni 2006 - 15:47 #3
Joooo det er nok en del af svaret, men jeg har bruge for ALLE elementer på skærmen ikke kun dem som er i min egen Form.
Avatar billede segato Nybegynder
30. juni 2006 - 21:50 #4
Det kan du ikke fra managed code, men du kan bruge win32 api til at løse dit problem. Søg på EnumWindows og EnumChildWindows i google så har du en milliard løsninger.
Avatar billede semiprofkode Nybegynder
26. juli 2006 - 11:03 #5
hej, jeg kan få en handle til topvinduet med
public static extern IntPtr GetForegroundWindow();

fra denne handle kan jeg umiddelbart kun få et nativeWindow:
NativeWindow nw = NativeWindow.FromHandle(GetForegroundWindow());
NativeWindow har ikke Controls som member. Hvordan gør jeg så? Nogle ideer?
Avatar billede segato Nybegynder
26. juli 2006 - 11:49 #6
Du skal gøre som jeg skrev lige ovenover. Brug EnumWindows til at finde dit vindue, og når du har dit vindue bruger du EnumChildWindows:

http://www.c-sharpcorner.com/UploadFile/shrijeetnair/win32api12062005005528AM/win32api.aspx?ArticleID=c8ca42aa-faec-448d-b9ea-da5ac627dcbb
Avatar billede semiprofkode Nybegynder
26. juli 2006 - 23:24 #7
Er det fordi childWindows er det samme som en control?
Avatar billede segato Nybegynder
27. juli 2006 - 08:08 #8
Ja alle kontroller så som knapper, menuer, combo bokse ... er child windows.
Avatar billede semiprofkode Nybegynder
19. august 2006 - 23:56 #9
ok, nu har jeg sat mig rigtig grundigt ind i sagerne, spy++ giver et godt indblik i vinduernes "stamtræ". MEN der er store problemer, f.eks. kan jeg ikke få fat i elementer som ligger i en collection som property på en control, f.eks. tabpages på en tabcontrol eller buttons i en toolbar. Og på websider er det for mig fuldstændig uoverskueligt hvad der er klikbart eller ej. HJÆLP ?
Avatar billede segato Nybegynder
21. august 2006 - 14:31 #10
Tabbars og menuer osv kan du ikke rigtigt faa fat i med mindre du paa forhaand kender applikationen. De nye toolstrips i .NET f.eks. supportere ikke win32 api. Men er det ikke .NET applikationer kan du naar du har handlet se om det er en menu eller en tabbar og saa sende beskeder til kontrolen. F.eks er der en funktion der hedder GetMenu() og her for du et obeject MENU. Ud for det kan du saa bruge GetSubMenu() og saa faa en under menu som  du saa kan klikke paa. Du maa ikke haenge mig op paa stave fejl sidder i slovenien men er ret sikker paa det er det funktionerne hedder. Samme funktionalitet faa til tabbar. Proev at google paa GetMenu og GetSubMenu.
Avatar billede semiprofkode Nybegynder
21. august 2006 - 19:34 #11
ok tak! men hvad med web sider, interenet explorer f.eks. Jeg kan slet ikke få fat i nogle komponenter på en side. De er gemt på en eller anden måde. Bruger nu MiniSpy som er en opgradering

http://www.codeproject.com/tools/minispy.asp

Den slår ikke ud når jeg spionerer på web controls, og jeg kan ikke finde nogen logik i parents/childs til at finde controls'ene. Det var meningen at getChildAtPoint skulle give mig en vilkårlig control uden så meget ballade, men det er altså ikke tilfældet.

Er det virkelig sådan en stor ballade at få fat i klikbare elementer?
Avatar billede segato Nybegynder
22. august 2006 - 12:35 #12
IE kontrol er jo WebBrowser kontrollen. Du kan ikke faa fat i klikbare elementer der. Hvis det er html sidder du vil have fat i skal du bruge WebBrowser kontrol. Skriver lidt mere naar jeg kommer hjem om 3 dage, har noget kode du kan faa.
Avatar billede semiprofkode Nybegynder
22. august 2006 - 21:36 #13
cool, det glæder jeg mig til....
Avatar billede segato Nybegynder
24. august 2006 - 17:38 #14
Jeg skal lige høre om det er windows knapper du vil fange eller HtmlElementer i IE du er ude efter?
Avatar billede semiprofkode Nybegynder
24. august 2006 - 18:50 #15
det er begge dele. Alt hvad der er kan klikkes på i windows såmænd.
Avatar billede segato Nybegynder
24. august 2006 - 19:01 #16
Det er ikke rigtigt muligt. Prøv at tage din spy og så kør den over IE. Browser Kontrollen udgør en kontrol. Du kan på denne ikke få fat i klikbare elementer på samme måde. Her er det en hel anden løsning der skal til.
Avatar billede semiprofkode Nybegynder
24. august 2006 - 19:14 #17
ja det ville være rart med anden løsning, det her er langhåret. Jeg skal bare registrere om musen(cursoren) befinder sig over noget klikbart globalt i windows.
Avatar billede segato Nybegynder
24. august 2006 - 19:42 #18
Ok jeg smider dig noget kode mandag hvor jeg returnere til arbejde.
Avatar billede segato Nybegynder
24. august 2006 - 19:55 #19
http://www.codeproject.com/csharp/screen_capturing.asp

Det var den her side jeg brugte til at lave mit eget. Der står præcis hvad du skal bruge.

http://www.codeproject.com/csharp/screen_capturing.asp
Avatar billede semiprofkode Nybegynder
29. august 2006 - 14:22 #20
Ok, jeg har læst siden igennem og prøvet demoen, den kan finde controls i applikationer, bare ikke de klikbare, og den kan ikke finde noget i internet explorer. Har jeg misforstået noget? Findes der ikke en lettere løsning til noget så simpelt som at tjekke om musen er over noget klibart? Hvad med at sende et klik, se om det udløser en event, og så bare aflyse eventen i det tilfælde?
Avatar billede segato Nybegynder
29. august 2006 - 15:01 #21
Hvorfor den ikke kan finde noget i internet exploreren er fordi det er en stor kontrol og ikke som alm vinduer et parent vindue med en masse childs. Hvis du vil klikke på kontroller i IE skal du hook dig op på IE hente HtmlDocument ud, og herfra hente dit ønsket htmlelement og lave en klik på det. Så du er nød til at dele din opgave op i to hvis du vil anvende begge metoder. Hvis jeg var dig ville jeg får windows delen bruge det program der blev vist i eksempelt på det link jeg viste dig til at få fat i vinduer. Så gør det sådan som du selv siger at man kan sende beskder til det givne vindue, f.eks. mouse_down og kort efter mouse_op (klik).

En anden måde er at lave en applikation der ikke finder vinduer men blor klikker på nogle specielle koordinater. Så du laver en slags rekorder.  Den vil virke med IE også. Der findes en masse gratis af sådan recordere på nettet herunder ghostmouse.
Avatar billede segato Nybegynder
29. august 2006 - 15:02 #22
Der findes ingen nem løsning som opfylder begge din ønsker.
Avatar billede semiprofkode Nybegynder
29. august 2006 - 16:29 #23
Jeg er ikke helt med, det ser ud til at ghostmouse kan "optage" musens opførsel og gentage den. Hvordan kan jeg bruge det? Jeg ved allerede hvordan man sender mouse events som mouse_down, problemet er hvordan jeg ser om det udløser en event. Og aflyser den. Jeg tænker i retning af en mouse hook ligesom en keyboard hook. ?
Avatar billede segato Nybegynder
29. august 2006 - 19:22 #24
Ok jeg kan desværre ikke hjælpe mere som sagt er der de metoder jeg har fortalt om. Om der er andre mere smarte metoder kan jeg ikke svare på.
Avatar billede semiprofkode Nybegynder
30. august 2006 - 09:49 #25
Jeg tror lige jeg skal indskyde, at jeg ikke skal bruge det her til noget snusket spyware el. lign. men til næste version af mit program mousedream, se ttp://www.mousedream.dk/Vision_DK.htm

Jeg forstår ikke helt hvad du foreslår mig at bruge ghostmouse til.
Avatar billede segato Nybegynder
30. august 2006 - 11:53 #26
Nu er det jo først nu jeg faktisk ved hvad du vil lave, har jo ikke før vidst hvad det var du ville. Du vil asso styre musen med keybord, og ikke finde alle klikbare elementer

Så ville jeg flytte Cursor (evt via pil taster) på følgende måde:

System.Windows.Forms.Cursor.Position = System.Windows.Forms.Cursor.Position+3; //hvis man trykker pil ned

Og hvis man klikker pace f.eks. udfører man et klik;

Win32.mouse_event(Win32.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, IntPtr.Zero);         
            Win32.mouse_event(Win32.MOUSEEVENTF_LEFTUP, 0, 0, 0, IntPtr.Zero);

            if (!DoubleClick)
                return;

            System.Threading.Thread.Sleep(100);

            Win32.mouse_event(Win32.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, IntPtr.Zero);
            Win32.mouse_event(Win32.MOUSEEVENTF_LEFTUP, 0, 0, 0, IntPtr.Zero);
Avatar billede segato Nybegynder
30. august 2006 - 11:53 #27
using System;
using System.Drawing;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace Waahoo
{
    public class Win32
    {
        public const int GWL_STYLE = (-16);
        public const uint MAX_PATH = 260;
        public const UInt32 MOUSEEVENTF_LEFTDOWN = 0x0002;
        public const UInt32 MOUSEEVENTF_LEFTUP = 0x0004;
        public const int RDW_INVALIDATE = 0x0001;
        public const int RDW_INTERNALPAINT = 0x0002;
        public const int RDW_ERASE = 0x0004;
        public const int RDW_VALIDATE = 0x0008;
        public const int RDW_NOINTERNALPAINT = 0x0010;
        public const int RDW_NOERASE = 0x0020;
        public const int RDW_NOCHILDREN = 0x0040;
        public const int RDW_ALLCHILDREN = 0x0080;
        public const int RDW_UPDATENOW = 0x0100;
        public const int RDW_ERASENOW = 0x0200;
        public const int RDW_FRAME = 0x0400;
        public const int RDW_NOFRAME = 0x0800;
        public const int GW_CHILD = 5;
        public const int GW_HWNDNEXT = 2;

        public const int HIDE_WINDOW = 0;
        public const int SHOW_OPENWINDOW = 1;
        public const int SHOW_ICONWINDOW = 2;
        public const int SHOW_FULLSCREEN = 3;
        public const int SHOW_OPENNOACTIVATE = 4;
        public const int SW_PARENTCLOSING = 1;
        public const int SW_OTHERZOOM = 2;
        public const int SW_PARENTOPENING = 3;
        public const int SW_OTHERUNZOOM = 4;

        public const int SWP_NOSIZE = 0x0001;
        public const int SWP_NOMOVE = 0x0002;
        public const int SWP_NOZORDER = 0x0004;
        public const int SWP_NOREDRAW = 0x0008;
        public const int SWP_NOACTIVATE = 0x0010;
        public const int SWP_FRAMECHANGED = 0x0020; /* The frame changed: send WM_NCCALCSIZE */
        public const int SWP_SHOWWINDOW = 0x0040;
        public const int SWP_HIDEWINDOW = 0x0080;
        public const int SWP_NOCOPYBITS = 0x0100;
        public const int SWP_NOOWNERZORDER = 0x0200; /* Don't do owner Z ordering */
        public const int SWP_NOSENDCHANGING = 0x0400;  /* Don't send WM_WINDOWPOSCHANGING */
        public const int SWP_DRAWFRAME = SWP_FRAMECHANGED;
        public const int SWP_NOREPOSITION = SWP_NOOWNERZORDER;
        public const int SWP_DEFERERASE = 0x2000;
        public const int SWP_ASYNCWINDOWPOS = 0x4000;

        public const int HWND_TOP = 0;
        public const int HWND_BOTTOM = 1;
        public const int HWND_TOPMOST = -1;
        public const int HWND_NOTOPMOST = -2;

        public const int WM_SCROLL = 276; // Horizontal scroll
        public const int WM_VSCROLL = 277; // Vertical scroll
        public const int SB_LINEUP = 0; // Scrolls one line up
        public const int SB_LINELEFT = 0;// Scrolls one cell left
        public const int SB_LINEDOWN = 1; // Scrolls one line down
        public const int SB_LINERIGHT = 1;// Scrolls one cell right
        public const int SB_PAGEUP = 2; // Scrolls one page up
        public const int SB_PAGELEFT = 2;// Scrolls one page left
        public const int SB_PAGEDOWN = 3; // Scrolls one page down
        public const int SB_PAGERIGTH = 3; // Scrolls one page right
        public const int SB_PAGETOP = 6; // Scrolls to the upper left
        public const int SB_LEFT = 6; // Scrolls to the left
        public const int SB_PAGEBOTTOM = 7; // Scrolls to the upper right
        public const int SB_RIGHT = 7; // Scrolls to the right
        public const int SB_ENDSCROLL = 8; // Ends scroll

        public enum ShowWindowCmds
        {
            SW_HIDE = 0,
            SW_SHOWNORMAL = 1,
            SW_NORMAL = 1,
            SW_SHOWMINIMIZED = 2,
            SW_SHOWMAXIMIZED = 3,
            SW_MAXIMIZE = 3,
            SW_SHOWNOACTIVATE = 4,
            SW_SHOW = 5,
            SW_MINIMIZE = 6,
            SW_SHOWMINNOACTIVE = 7,
            SW_SHOWNA = 8,
            SW_RESTORE = 9,
            SW_SHOWDEFAULT = 10,
            SW_FORCEMINIMIZE = 11,
            SW_MAX = 11
        }

        public enum WindowMessages
        {
            WM_NULL = 0x0000,
            WM_CREATE = 0x0001,
            WM_DESTROY = 0x0002,
            WM_MOVE = 0x0003,
            WM_SIZE = 0x0005,
            WM_ACTIVATE = 0x0006,
            WM_SETFOCUS = 0x0007,
            WM_KILLFOCUS = 0x0008,
            WM_ENABLE = 0x000A,
            WM_SETREDRAW = 0x000B,
            WM_SETTEXT = 0x000C,
            WM_GETTEXT = 0x000D,
            WM_GETTEXTLENGTH = 0x000E,
            WM_PAINT = 0x000F,
            WM_CLOSE = 0x0010,
            WM_QUERYENDSESSION = 0x0011,
            WM_QUIT = 0x0012,
            WM_QUERYOPEN = 0x0013,
            WM_ERASEBKGND = 0x0014,
            WM_SYSCOLORCHANGE = 0x0015,
            WM_ENDSESSION = 0x0016,
            WM_SHOWWINDOW = 0x0018,
            WM_CTLCOLOR = 0x0019,
            WM_WININICHANGE = 0x001A,
            WM_SETTINGCHANGE = 0x001A,
            WM_DEVMODECHANGE = 0x001B,
            WM_ACTIVATEAPP = 0x001C,
            WM_FONTCHANGE = 0x001D,
            WM_TIMECHANGE = 0x001E,
            WM_CANCELMODE = 0x001F,
            WM_SETCURSOR = 0x0020,
            WM_MOUSEACTIVATE = 0x0021,
            WM_CHILDACTIVATE = 0x0022,
            WM_QUEUESYNC = 0x0023,
            WM_GETMINMAXINFO = 0x0024,
            WM_PAINTICON = 0x0026,
            WM_ICONERASEBKGND = 0x0027,
            WM_NEXTDLGCTL = 0x0028,
            WM_SPOOLERSTATUS = 0x002A,
            WM_DRAWITEM = 0x002B,
            WM_MEASUREITEM = 0x002C,
            WM_DELETEITEM = 0x002D,
            WM_VKEYTOITEM = 0x002E,
            WM_CHARTOITEM = 0x002F,
            WM_SETFONT = 0x0030,
            WM_GETFONT = 0x0031,
            WM_SETHOTKEY = 0x0032,
            WM_GETHOTKEY = 0x0033,
            WM_QUERYDRAGICON = 0x0037,
            WM_COMPAREITEM = 0x0039,
            WM_GETOBJECT = 0x003D,
            WM_COMPACTING = 0x0041,
            WM_COMMNOTIFY = 0x0044,
            WM_WINDOWPOSCHANGING = 0x0046,
            WM_WINDOWPOSCHANGED = 0x0047,
            WM_POWER = 0x0048,
            WM_COPYDATA = 0x004A,
            WM_CANCELJOURNAL = 0x004B,
            WM_NOTIFY = 0x004E,
            WM_INPUTLANGCHANGEREQUEST = 0x0050,
            WM_INPUTLANGCHANGE = 0x0051,
            WM_TCARD = 0x0052,
            WM_HELP = 0x0053,
            WM_USERCHANGED = 0x0054,
            WM_NOTIFYFORMAT = 0x0055,
            WM_CONTEXTMENU = 0x007B,
            WM_STYLECHANGING = 0x007C,
            WM_STYLECHANGED = 0x007D,
            WM_DISPLAYCHANGE = 0x007E,
            WM_GETICON = 0x007F,
            WM_SETICON = 0x0080,
            WM_NCCREATE = 0x0081,
            WM_NCDESTROY = 0x0082,
            WM_NCCALCSIZE = 0x0083,
            WM_NCHITTEST = 0x0084,
            WM_NCPAINT = 0x0085,
            WM_NCACTIVATE = 0x0086,
            WM_GETDLGCODE = 0x0087,
            WM_SYNCPAINT = 0x0088,
            WM_NCMOUSEMOVE = 0x00A0,
            WM_NCLBUTTONDOWN = 0x00A1,
            WM_NCLBUTTONUP = 0x00A2,
            WM_NCLBUTTONDBLCLK = 0x00A3,
            WM_NCRBUTTONDOWN = 0x00A4,
            WM_NCRBUTTONUP = 0x00A5,
            WM_NCRBUTTONDBLCLK = 0x00A6,
            WM_NCMBUTTONDOWN = 0x00A7,
            WM_NCMBUTTONUP = 0x00A8,
            WM_NCMBUTTONDBLCLK = 0x00A9,
            WM_KEYDOWN = 0x0100,
            WM_KEYUP = 0x0101,
            WM_CHAR = 0x0102,
            WM_DEADCHAR = 0x0103,
            WM_SYSKEYDOWN = 0x0104,
            WM_SYSKEYUP = 0x0105,
            WM_SYSCHAR = 0x0106,
            WM_SYSDEADCHAR = 0x0107,
            WM_KEYLAST = 0x0108,
            WM_IME_STARTCOMPOSITION = 0x010D,
            WM_IME_ENDCOMPOSITION = 0x010E,
            WM_IME_COMPOSITION = 0x010F,
            WM_IME_KEYLAST = 0x010F,
            WM_INITDIALOG = 0x0110,
            WM_COMMAND = 0x0111,
            WM_SYSCOMMAND = 0x0112,
            WM_TIMER = 0x0113,
            WM_HSCROLL = 0x0114,
            WM_VSCROLL = 0x0115,
            WM_INITMENU = 0x0116,
            WM_INITMENUPOPUP = 0x0117,
            WM_MENUSELECT = 0x011F,
            WM_MENUCHAR = 0x0120,
            WM_ENTERIDLE = 0x0121,
            WM_MENURBUTTONUP = 0x0122,
            WM_MENUDRAG = 0x0123,
            WM_MENUGETOBJECT = 0x0124,
            WM_UNINITMENUPOPUP = 0x0125,
            WM_MENUCOMMAND = 0x0126,
            WM_CTLCOLORMSGBOX = 0x0132,
            WM_CTLCOLOREDIT = 0x0133,
            WM_CTLCOLORLISTBOX = 0x0134,
            WM_CTLCOLORBTN = 0x0135,
            WM_CTLCOLORDLG = 0x0136,
            WM_CTLCOLORSCROLLBAR = 0x0137,
            WM_CTLCOLORSTATIC = 0x0138,
            WM_MOUSEMOVE = 0x0200,
            WM_LBUTTONDOWN = 0x0201,
            WM_LBUTTONUP = 0x0202,
            WM_LBUTTONDBLCLK = 0x0203,
            WM_RBUTTONDOWN = 0x0204,
            WM_RBUTTONUP = 0x0205,
            WM_RBUTTONDBLCLK = 0x0206,
            WM_MBUTTONDOWN = 0x0207,
            WM_MBUTTONUP = 0x0208,
            WM_MBUTTONDBLCLK = 0x0209,
            WM_MOUSEWHEEL = 0x020A,
            WM_PARENTNOTIFY = 0x0210,
            WM_ENTERMENULOOP = 0x0211,
            WM_EXITMENULOOP = 0x0212,
            WM_NEXTMENU = 0x0213,
            WM_SIZING = 0x0214,
            WM_CAPTURECHANGED = 0x0215,
            WM_MOVING = 0x0216,
            WM_DEVICECHANGE = 0x0219,
            WM_MDICREATE = 0x0220,
            WM_MDIDESTROY = 0x0221,
            WM_MDIACTIVATE = 0x0222,
            WM_MDIRESTORE = 0x0223,
            WM_MDINEXT = 0x0224,
            WM_MDIMAXIMIZE = 0x0225,
            WM_MDITILE = 0x0226,
            WM_MDICASCADE = 0x0227,
            WM_MDIICONARRANGE = 0x0228,
            WM_MDIGETACTIVE = 0x0229,
            WM_MDISETMENU = 0x0230,
            WM_ENTERSIZEMOVE = 0x0231,
            WM_EXITSIZEMOVE = 0x0232,
            WM_DROPFILES = 0x0233,
            WM_MDIREFRESHMENU = 0x0234,
            WM_IME_SETCONTEXT = 0x0281,
            WM_IME_NOTIFY = 0x0282,
            WM_IME_CONTROL = 0x0283,
            WM_IME_COMPOSITIONFULL = 0x0284,
            WM_IME_SELECT = 0x0285,
            WM_IME_CHAR = 0x0286,
            WM_IME_REQUEST = 0x0288,
            WM_IME_KEYDOWN = 0x0290,
            WM_IME_KEYUP = 0x0291,
            WM_MOUSEHOVER = 0x02A1,
            WM_MOUSELEAVE = 0x02A3,
            WM_CUT = 0x0300,
            WM_COPY = 0x0301,
            WM_PASTE = 0x0302,
            WM_CLEAR = 0x0303,
            WM_UNDO = 0x0304,
            WM_RENDERFORMAT = 0x0305,
            WM_RENDERALLFORMATS = 0x0306,
            WM_DESTROYCLIPBOARD = 0x0307,
            WM_DRAWCLIPBOARD = 0x0308,
            WM_PAINTCLIPBOARD = 0x0309,
            WM_VSCROLLCLIPBOARD = 0x030A,
            WM_SIZECLIPBOARD = 0x030B,
            WM_ASKCBFORMATNAME = 0x030C,
            WM_CHANGECBCHAIN = 0x030D,
            WM_HSCROLLCLIPBOARD = 0x030E,
            WM_QUERYNEWPALETTE = 0x030F,
            WM_PALETTEISCHANGING = 0x0310,
            WM_PALETTECHANGED = 0x0311,
            WM_HOTKEY = 0x0312,
            WM_PRINT = 0x0317,
            WM_PRINTCLIENT = 0x0318,
            WM_HANDHELDFIRST = 0x0358,
            WM_HANDHELDLAST = 0x035F,
            WM_AFXFIRST = 0x0360,
            WM_AFXLAST = 0x037F,
            WM_PENWINFIRST = 0x0380,
            WM_PENWINLAST = 0x038F,
            WM_APP = 0x8000,
            WM_USER = 0x0400,
            WM_REFLECT = WM_USER + 0x1c00
        }

        public struct Rect
        {
            public int left;
            public int top;
            public int right;
            public int bottom;

            public int Width
            {
                get
                {
                    return right - left;
                }
            }

            public int Height
            {
                get
                {
                    return bottom - top;
                }
            }
        }

        public static string GetClassName(IntPtr hWnd)
        {
            StringBuilder sb = new StringBuilder(256);
            Win32.GetClassName(hWnd, sb, 256);
            return sb.ToString();
        }

        public static string GetWindowText(IntPtr hWnd)
        {
            StringBuilder sb = new StringBuilder(256);
            Win32.GetWindowText(hWnd, sb, 256);
            return sb.ToString();
        }

        public static IntPtr GetOwnerWindow(IntPtr childHwnd)
        {
            while ((int)childHwnd != 0)
            {
                int h = Win32.GetWindowLong(childHwnd, GWL_STYLE);
                int is_child = h & 0x40000000;

                if (is_child == 0)
                {
                    return childHwnd;
                }

                childHwnd = Win32.GetParent(childHwnd);
            }
            return childHwnd;
        }

        public static string GetWinFormsId(IntPtr hwnd)
        {
            return WinFormsUtilities.GetWinFormsId(hwnd);
        }

        [DllImport("user32.dll")]
        public static extern bool GetWindowRect(IntPtr hwnd, ref Rect rectangle);
        [DllImport("user32.dll")]
        public static extern IntPtr GetMenu(IntPtr hWnd);
        [DllImport("user32.dll")]
        public static extern IntPtr GetSubMenu(IntPtr hMenu, int nPos);
        [DllImport("user32.dll")]
        public static extern int GetMenuItemCount(IntPtr hMenu);
        [DllImport("user32.dll", EntryPoint = "ClientToScreen")]
        static public extern bool ClientToScreen(IntPtr hWnd, ref Point lpPoint);
        [DllImport("User32.dll")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
        [DllImport("User32.dll")]
        public static extern int GetWindowLong(IntPtr hWnd, int style);
        [DllImport("User32.dll")]
        public static extern IntPtr GetParent(IntPtr hWnd);
        [DllImport("User32.dll")]
        public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
        [DllImport("user32.dll")]
        public static extern int ShowWindow(IntPtr hWnd, int nCmdShow);
        [DllImport("user32.dll")]
        public static extern void mouse_event(UInt32 dwFlags, UInt32 dx, UInt32 dy, UInt32 dwData, IntPtr dwExtraInfo);
        [DllImport("user32.dll")]
        public static extern IntPtr WindowFromPoint(Point pt);
        [DllImport("User32.dll")]
        public static extern bool EnumChildWindows(IntPtr hWndParent, Delegate lpEnumFunc, IntPtr lParam);
        [DllImport("User32.dll")]
        static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
        [DllImport("user32.dll")]
        public static extern IntPtr SetCapture(IntPtr hWnd);
        [DllImport("user32.dll")]
        public static extern int ReleaseCapture();
        [DllImport("user32.dll")]
        public static extern IntPtr GetWindowDC(IntPtr hwnd);
        [DllImport("user32.dll")]
        public static extern Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc);
        [DllImport("user32.dll")]
        public static extern int InvalidateRect(IntPtr hWnd, IntPtr lpRect, int bErase);
        [DllImport("user32.dll")]
        public static extern int UpdateWindow(IntPtr hWnd);
        [DllImport("user32.dll")]
        public static extern int RedrawWindow(IntPtr hWnd, IntPtr lprcUpdate, IntPtr hrgnUpdate, uint flags);
        [DllImport("user32.dll")]
        public static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
        [DllImport("User32.dll")]
        public static extern int SendMessageTimeout(IntPtr hWnd, int uMsg, int wParam, int lParam, int fuFlags, int uTimeout, out int lpdwResult);
        [DllImport("User32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam);
    }
}
Avatar billede semiprofkode Nybegynder
30. august 2006 - 22:25 #28
ok, men det har jeg allerede lavet, tjek forsiden af hjemmesiden og download evt. softwaren. Problemet er stadig det samme, jeg vil tjekke om musen er over noget klikbart, jeg skal bruge det til en ny funktionalitet i næste version af mousedream.

Hvordan tjekker man om et klik udløser en event globalt? Og hvad mente du med at jeg skulle prøve ghostmouse......
Avatar billede segato Nybegynder
31. august 2006 - 08:56 #29
Ghostmouse anbefalede jeg inden jeg kendte din løsning du vil formentlig ikke kunne bruge gjostmouse til det store. Jeg kan ikke hjælpe dig med hvad der er klikbart for hvad er definitionen er klikbart, er alt ikke det? Hvis du mener knapper er dette mulligt da vinduet har et class name der hedder button. I .NET er classname lidt anderledes men man kan stadig se det er en knap. Samme er gældende for menuer. Men det jo kun en lille bitte del af klikbare elementer. Hvad med alle de kontroller som udviklerne selv har lavet. Dem kan du jo ikke vide om de er klikbare eller ej. Så du vil kun kunne løse det for en lille del.
Avatar billede semiprofkode Nybegynder
02. september 2006 - 19:56 #30
hej, skal vi ikke lige chatte om det? Det ser ud til vi laver lidt af det samme til hverdag. Jeg er funkyluxstory@hotmail.com
Avatar billede segato Nybegynder
03. september 2006 - 16:21 #31
Jeg har tilføjet dig på msn.
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