mwinapi-commits Mailing List for Managed Windows API (Page 2)
Status: Beta
Brought to you by:
schierlm
You can subscribe to this list here.
2008 |
Jan
|
Feb
|
Mar
(2) |
Apr
(5) |
May
(1) |
Jun
(6) |
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2009 |
Jan
(2) |
Feb
(2) |
Mar
(1) |
Apr
(1) |
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
(5) |
Dec
|
2010 |
Jan
(2) |
Feb
(2) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
|
Nov
(1) |
Dec
|
2011 |
Jan
(10) |
Feb
(2) |
Mar
|
Apr
|
May
|
Jun
|
Jul
(2) |
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
2012 |
Jan
(1) |
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
(2) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2013 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(4) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(8) |
Dec
|
2015 |
Jan
(2) |
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(7) |
2016 |
Jan
(4) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2017 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
(2) |
2020 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(3) |
Oct
|
Nov
|
Dec
|
2024 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(3) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <zi...@us...> - 2014-11-26 12:04:12
|
Revision: 125 http://sourceforge.net/p/mwinapi/code/125 Author: ziewer Date: 2014-11-26 12:04:08 +0000 (Wed, 26 Nov 2014) Log Message: ----------- Avoid failure of accessibility API of Internet Explorer after requesting parent object Modified Paths: -------------- trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs Modified: trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs =================================================================== --- trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs 2014-11-26 10:31:31 UTC (rev 124) +++ trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs 2014-11-26 12:04:08 UTC (rev 125) @@ -358,6 +358,31 @@ { get { + try + { + // Internet Explorer recognition sometimes is stuck (permanently returning RPC_E_SERVERFAULT) + // after requesting SAO that corresponds to a frame of an HTML frameset. + // Such a frame is a RoleSystemClient with Name=<URI> and Description="MSAAHTML Registered Handler". + // The child is a RoleSystemPane with Value=<URI>. + // Hence stop requesting for parent when RoleSystemPane with URI value is found + // + // see also: + // About IE crashes after querying "MSAAHTML Registered Handler": + // http://community.nvda-project.org/changeset/96cd890c7878fd4f8805409dd83f3dde5c996b4f + // Some hint to ignore "MSAAHTML Registered Handler" in accessible ancestry: + // http://community.nvda-project.org/changeset/88c491d954743a6a02f14b1f144e234587f68430 + // similar special case handling and ignoring of "MSAAHTML Registered Handler": + // http://www.projky.com/dotnet/4.5.1/MS/Internal/AutomationProxies/Accessible.cs.html + + Uri uri = null; + if (RoleIndex == (int)AccRoles.ROLE_SYSTEM_PANE && Uri.TryCreate(Value, UriKind.Absolute, out uri) + && string.Equals(Window.Process.ProcessName, "iexplore", StringComparison.OrdinalIgnoreCase)) + { + // do not call parent + return null; + } + } + catch { } if (childID != 0) return new SystemAccessibleObject(iacc, 0); IAccessible p = (IAccessible)iacc.accParent; if (p == null) return null; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <zi...@us...> - 2014-11-26 10:31:39
|
Revision: 124 http://sourceforge.net/p/mwinapi/code/124 Author: ziewer Date: 2014-11-26 10:31:31 +0000 (Wed, 26 Nov 2014) Log Message: ----------- fixed SystemWindow.Rectangle for maximized windows with Windows Aero Glass comment added - see http://social.msdn.microsoft.com/Forums/en-US/windowsuidevelopment/thread/6c1c67a9-5548-4e9b-989f-c7dbac0b1375/ Modified Paths: -------------- trunk/ManagedWinapi/Windows/SystemWindow.cs Modified: trunk/ManagedWinapi/Windows/SystemWindow.cs =================================================================== --- trunk/ManagedWinapi/Windows/SystemWindow.cs 2014-11-26 10:23:27 UTC (rev 123) +++ trunk/ManagedWinapi/Windows/SystemWindow.cs 2014-11-26 10:31:31 UTC (rev 124) @@ -756,7 +756,8 @@ RECT r = new RECT(); GetWindowRect(_hwnd, out r); - // GetWindowRect returns wrong values for maximized windows when using Windows Aero desktop. + // GetWindowRect returns wrong values for maximized windows when using Windows Aero Glass desktop. + // see http://social.msdn.microsoft.com/Forums/en-US/windowsuidevelopment/thread/6c1c67a9-5548-4e9b-989f-c7dbac0b1375/ // Reduce bounds by negative padding of "glass" pixels for maximized windows. if ((Style & WindowStyleFlags.MAXIMIZE) > 0) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <zi...@us...> - 2014-11-26 10:23:34
|
Revision: 123 http://sourceforge.net/p/mwinapi/code/123 Author: ziewer Date: 2014-11-26 10:23:27 +0000 (Wed, 26 Nov 2014) Log Message: ----------- fixed SystemWindow.Rectangle for maximized windows with Windows Aero Modified Paths: -------------- trunk/ManagedWinapi/Windows/SystemWindow.cs Modified: trunk/ManagedWinapi/Windows/SystemWindow.cs =================================================================== --- trunk/ManagedWinapi/Windows/SystemWindow.cs 2014-11-25 17:35:37 UTC (rev 122) +++ trunk/ManagedWinapi/Windows/SystemWindow.cs 2014-11-26 10:23:27 UTC (rev 123) @@ -755,6 +755,24 @@ { RECT r = new RECT(); GetWindowRect(_hwnd, out r); + + // GetWindowRect returns wrong values for maximized windows when using Windows Aero desktop. + // Reduce bounds by negative padding of "glass" pixels for maximized windows. + if ((Style & WindowStyleFlags.MAXIMIZE) > 0) + { + // check whether top or left is negative + // check both to support dual screen setup where bounds.Left might be larger than 0 on right screen + int glass = Math.Min(r.Left, r.Top); + if (glass < 0) + { + // remove glass pixels from rectangle + r.Left -= glass; + r.Top -= glass; + r.Right += glass; + r.Bottom += glass; + } + } + return r; } } @@ -1087,8 +1105,7 @@ /// </summary> public void Highlight() { - RECT rect; - GetWindowRect(_hwnd, out rect); + RECT rect = Rectangle; using (WindowDeviceContext windowDC = GetDeviceContext(false)) { using (Graphics g = windowDC.CreateGraphics()) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <zi...@us...> - 2014-11-25 17:35:40
|
Revision: 122 http://sourceforge.net/p/mwinapi/code/122 Author: ziewer Date: 2014-11-25 17:35:37 +0000 (Tue, 25 Nov 2014) Log Message: ----------- Improved AccessibleEventListener.GetAccessibleObject(): Return parent or window on failure IAccessible implementation of object and/or child is missing. This avoids exceptions for HTML content in Internet Explorer Modified Paths: -------------- trunk/ManagedWinapi/Accessibility/AccessibleObjectListener.cs Modified: trunk/ManagedWinapi/Accessibility/AccessibleObjectListener.cs =================================================================== --- trunk/ManagedWinapi/Accessibility/AccessibleObjectListener.cs 2014-11-25 15:49:44 UTC (rev 121) +++ trunk/ManagedWinapi/Accessibility/AccessibleObjectListener.cs 2014-11-25 17:35:37 UTC (rev 122) @@ -161,6 +161,18 @@ IAccessible iacc; object child; uint result = AccessibleObjectFromEvent(e.HWnd, e.ObjectID, e.ChildID, out iacc, out child); + + // Note: AccessibleObjectFromEvent() sometimes fails due to missing IAccessible implementation of object and/or child + // This often happens for HTML content in Internet Explorer (e.g. for any <DIV> w/o 'role' attribute set). + // Try again without using ChildID and/or ObjectID, + // i.e. ChildID==0 will return the parent object; ObjectID==0 will return the parent window + if (result != 0 && e.ChildID != 0) + // second chance: try to receive object instead of child + result = AccessibleObjectFromEvent(e.HWnd, e.ObjectID, 0, out iacc, out child); + if (result != 0) + // third chance: try to receive window instead of object or child + result = AccessibleObjectFromEvent(e.HWnd, 0, 0, out iacc, out child); + if (result != 0) throw new Exception("AccessibleObjectFromPoint returned " + result); return new SystemAccessibleObject(iacc, (int)child); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <zi...@us...> - 2014-11-25 15:49:52
|
Revision: 121 http://sourceforge.net/p/mwinapi/code/121 Author: ziewer Date: 2014-11-25 15:49:44 +0000 (Tue, 25 Nov 2014) Log Message: ----------- implemented setter for Name and Value (as available in IAccessible) Modified Paths: -------------- trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs Modified: trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs =================================================================== --- trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs 2014-11-25 15:39:15 UTC (rev 120) +++ trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs 2014-11-25 15:49:44 UTC (rev 121) @@ -204,6 +204,11 @@ { return iacc.get_accName(childID); } + set + { + iacc.set_accName(childID, value); + } + } /// <summary> @@ -296,6 +301,14 @@ return null; } } + set + { + try + { + iacc.set_accValue(childID, value); + } + catch (COMException) { } + } } /// <summary> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <zi...@us...> - 2014-11-25 15:39:17
|
Revision: 120 http://sourceforge.net/p/mwinapi/code/120 Author: ziewer Date: 2014-11-25 15:39:15 +0000 (Tue, 25 Nov 2014) Log Message: ----------- Added enum AccRoles with constants for MSAA accessibility roles from oleacc.h Modified Paths: -------------- trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs Modified: trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs =================================================================== --- trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs 2014-11-25 14:27:03 UTC (rev 119) +++ trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs 2014-11-25 15:39:15 UTC (rev 120) @@ -710,4 +710,327 @@ /// </summary> OBJID_SOUND = 0xFFFFFFF5 } + + /// <summary> + /// This enumeration lists all kinds of accessible roles as returned by IAccessible::get_accRole() + /// Constants for MSAA accessibility roles from oleacc.h + /// </summary> + public enum AccRoles + { + /// <summary> + /// The object represents an alert or a condition that a user should be notified about. This role is used only for objects that embody an alert but are not associated with another user interface element, such as a message box, graphic, text, or sound. + /// </summary> + ROLE_SYSTEM_ALERT = 8, + + /// <summary> + /// The object represents an animation control whose content changes over time, such as a control that displays a series of bitmap frames. Animation controls are displayed when files are copied or when some other time-consuming task is performed. + /// </summary> + ROLE_SYSTEM_ANIMATION = 54, + + /// <summary> + /// The object represents a main window for an application. + /// </summary> + ROLE_SYSTEM_APPLICATION = 14, + + /// <summary> + /// The object represents a window border. The entire border is represented by a single object rather than by separate objects for each side. + /// </summary> + ROLE_SYSTEM_BORDER = 19, + + /// <summary> + /// The object represents a button that expands a list of items. + /// </summary> + ROLE_SYSTEM_BUTTONDROPDOWN = 56, + + /// <summary>The object represents a button that expands a grid. + /// </summary> + ROLE_SYSTEM_BUTTONDROPDOWNGRID = 58, + + /// <summary> + /// The object represents a button that expands a menu. + /// </summary> + ROLE_SYSTEM_BUTTONMENU = 57, + + /// <summary> + /// The object represents the system caret. + /// </summary> + ROLE_SYSTEM_CARET = 7, + + /// <summary> + /// The object represents a cell within a table. + /// </summary> + ROLE_SYSTEM_CELL = 29, + + /// <summary> + /// The object represents a cartoon-like graphic object, such as Microsoft Office Assistant, which is displayed to provide help to users of an application. + /// </summary> + ROLE_SYSTEM_CHARACTER = 32, + + /// <summary> + /// The object represents a graphical image used to chart data. + /// </summary> + ROLE_SYSTEM_CHART = 17, + + /// <summary> + /// The object represents a check box control: an option that is selected or cleared independently of other options. + /// </summary> + ROLE_SYSTEM_CHECKBUTTON = 44, + + /// <summary> + /// The object represents a window's client area. Microsoft Active Accessibility uses this role as a default if there is a question about the role of a UI element. + /// </summary> + ROLE_SYSTEM_CLIENT = 10, + + /// <summary>The object represents a control that displays time. + /// </summary> + ROLE_SYSTEM_CLOCK = 61, + + /// <summary> + /// The object represents a column of cells within a table. + /// </summary> + ROLE_SYSTEM_COLUMN = 27, + + /// <summary> + /// The object represents a column header, providing a visual label for a column in a table. + /// </summary> + ROLE_SYSTEM_COLUMNHEADER = 25, + + /// <summary> + /// The object represents a combo box: an edit control with an associated list box that provides a set of predefined choices. + /// </summary> + ROLE_SYSTEM_COMBOBOX = 46, + + /// <summary> + /// The object represents the system's mouse pointer. + /// </summary> + ROLE_SYSTEM_CURSOR = 6, + + /// <summary> + /// The object represents a graphical image that is used to diagram data. + /// </summary> + ROLE_SYSTEM_DIAGRAM = 53, + + /// <summary> + /// The object represents a dial or knob. + /// </summary> + ROLE_SYSTEM_DIAL = 49, + + /// <summary> + /// The object represents a dialog box or message box. + /// </summary> + ROLE_SYSTEM_DIALOG = 18, + + /// <summary> + /// The object represents a document window. A document window is always contained within an application window. This role applies only to MDI windows and refers to the object that contains the MDI title bar. + /// </summary> + ROLE_SYSTEM_DOCUMENT = 15, + + /// <summary> + /// The object represents the calendar control, SysDateTimePick32. The Microsoft Active Accessibility runtime component uses this role to indicate that either a date or a calendar control has been found. + /// </summary> + ROLE_SYSTEM_DROPLIST = 47, + + /// <summary> + /// The object represents a mathematical equation. + /// </summary> + ROLE_SYSTEM_EQUATION = 55, + + /// <summary> + /// The object represents a picture. + /// </summary> + ROLE_SYSTEM_GRAPHIC = 40, + + /// <summary> + /// The object represents a special mouse pointer that allows a user to manipulate user interface elements such as windows. One example of this involves resizing a window by dragging its lower-right corner. + /// </summary> + ROLE_SYSTEM_GRIP = 4, + + /// <summary> + /// The object logically groups other objects. There is not always a parent-child relationship between the grouping object and the objects it contains. + /// </summary> + ROLE_SYSTEM_GROUPING = 20, + + /// <summary> + /// The object displays a help topic in the form of a tooltip or help balloon. + /// </summary> + ROLE_SYSTEM_HELPBALLOON = 31, + + /// <summary> + /// The object represents a keyboard shortcut field that allows the user to enter a combination or sequence of keystrokes. + /// </summary> + ROLE_SYSTEM_HOTKEYFIELD = 50, + + /// <summary> + /// The object represents an indicator, such as a pointer graphic, that points to the current item. + /// </summary> + ROLE_SYSTEM_INDICATOR = 39, + + /// <summary> + /// The object represents an edit control that is designed for an IP address. The edit control is divided into sections, each for a specific part of the IP address. + /// </summary> + ROLE_SYSTEM_IPADDRESS = 63, // Not defined in all oleacc.h versions + + /// <summary>The object represents a link to something else. This object might look like text or a graphic, but it acts like a button. + /// </summary> + ROLE_SYSTEM_LINK = 30, + + /// <summary> + /// The object represents a list box, allowing the user to select one or more items. + /// </summary> + ROLE_SYSTEM_LIST = 33, + + /// <summary> + /// The object represents an item in a list box or in the list portion of a combo box, drop-down list box, or drop-down combo box. + /// </summary> + ROLE_SYSTEM_LISTITEM = 34, + + /// <summary>The object represents the menu bar (positioned beneath the title bar of a window) from which users select menus. + /// </summary> + ROLE_SYSTEM_MENUBAR = 2, + + /// <summary> + /// The object represents a menu item: an menu entry that the user can choose to carry out a command, select an option, or display another menu. Functionally, a menu item is equivalent to a push button, a radio button, a check box, or a menu. + /// </summary> + ROLE_SYSTEM_MENUITEM = 12, + + /// <summary> + /// The object represents a menu: a list of options, each with a specific action. All menu types must have role, including the drop-down menus which are displayed when selected from a menu bar; and shortcut menus, which are displayed by clicking the right mouse button. + /// </summary> + ROLE_SYSTEM_MENUPOPUP = 11, + + /// <summary> + /// The object represents an outline or a tree structure, such as a tree view control, that displays a hierarchical list and allows the user to expand and collapse branches. + /// </summary> + ROLE_SYSTEM_OUTLINE = 35, + + /// <summary> + /// The object represents an item that navigates like an outline item. The UP and DOWN ARROW keys are used to navigate through the outline. However, instead of expanding and collapsing when the LEFT and RIGHT ARROW key is pressed, these menus expand or collapse when the SPACEBAR or ENTER key is pressed and the item has focus. + /// </summary> + ROLE_SYSTEM_OUTLINEBUTTON = 64, // Not defined in all oleacc.h versions + + /// <summary> + /// The object represents an item in an outline or tree structure. + /// </summary> + ROLE_SYSTEM_OUTLINEITEM = 36, + + /// <summary> + /// The object represents a page tab. The only child of a page tab control is a ROLE_SYSTEM_GROUPING object that has the contents of the associated page. + /// </summary> + ROLE_SYSTEM_PAGETAB = 37, + + /// <summary> + /// The object represents a container of page tab controls. + /// </summary> + ROLE_SYSTEM_PAGETABLIST = 60, + + /// <summary> + /// The object represents a pane within a frame or a document window. Users can navigate between panes and within the contents of the current pane, but cannot navigate between items in different panes. Thus, panes represent a grouping level that is lower than frames or document windows, but higher than individual controls. The user navigates between panes by pressing TAB, F6, or CTRL+TAB, depending on the context. + /// </summary> + ROLE_SYSTEM_PANE = 16, + + /// <summary> + /// The object represents a progress bar, which dynamically shows how much of an operation in progress has completed. This control takes no user input. + /// </summary> + ROLE_SYSTEM_PROGRESSBAR = 48, + + /// <summary> + /// The object represents a progress bar, which dynamically shows how much of an operation in progress has completed. This control takes no user input. + /// </summary> + ROLE_SYSTEM_PROPERTYPAGE = 38, + + /// <summary> + /// The object represents a push-button control. + /// </summary> + ROLE_SYSTEM_PUSHBUTTON = 43, + + /// <summary> + /// The object represents an option button (formerly, a radio button). It is one of a group of mutually exclusive options. All objects that share the same parent and that have this attribute are assumed to be part of a single mutually exclusive group. To divide these objects into separate groups, use ROLE_SYSTEM_GROUPING objects. + /// </summary> + ROLE_SYSTEM_RADIOBUTTON = 45, + + /// <summary> + /// The object represents a row of cells within a table. + /// </summary> + ROLE_SYSTEM_ROW = 28, + + /// <summary> + /// The object represents a row header, which provides a visual label for a table row. + /// </summary> + ROLE_SYSTEM_ROWHEADER = 26, + + /// <summary> + /// The object represents a vertical or horizontal scroll bar, which is part of the client area or is used in a control. + /// </summary> + ROLE_SYSTEM_SCROLLBAR = 3, + + /// <summary> + /// The object is used to visually divide a space into two regions. Examples of separator objects include a separator menu item, and a bar that divides split panes within a window. + /// </summary> + ROLE_SYSTEM_SEPARATOR = 21, + + /// <summary> + /// The object represents a slider, which allows the user to adjust a setting in particular increments between minimum and maximum values. + /// </summary> + ROLE_SYSTEM_SLIDER = 51, + + /// <summary> + /// The object represents a system sound, which is associated with various system events. + /// </summary> + ROLE_SYSTEM_SOUND = 5, + + /// <summary> + /// The object represents a spin box, which is a control that allows the user to increment or decrement the value displayed in a separate "buddy" control that is associated with the spin box. + /// </summary> + ROLE_SYSTEM_SPINBUTTON = 52, + + /// <summary> + /// The object represents a button on a toolbar that has a drop-down list icon that is directly adjacent to the button. + /// </summary> + ROLE_SYSTEM_SPLITBUTTON = 62, // Not defined in all oleacc.h version + + /// <summary> + /// The object represents read-only text, such as labels for other controls or instructions in a dialog box. Static text cannot be modified or selected. + /// </summary> + ROLE_SYSTEM_STATICTEXT = 41, + + /// <summary> + /// The object represents a status bar, which is an area at the bottom of a window and which displays information about the current operation, state of the application, or selected object. The status bar has multiple fields, which display different kinds of information. + /// </summary> + ROLE_SYSTEM_STATUSBAR = 23, + + /// <summary> + /// The object represents a table that contains rows and columns of cells, and, optionally, row headers and column headers. + /// </summary> + ROLE_SYSTEM_TABLE = 24, + + /// <summary> + /// The object represents selectable text that allows edits or is designated as read-only. + /// </summary> + ROLE_SYSTEM_TEXT = 42, + + /// <summary> + /// The object represents a title or caption bar for a window. + /// </summary> + ROLE_SYSTEM_TITLEBAR = 1, + + /// <summary> + /// The object represents a toolbar, which is a grouping of controls that provides easy access to frequently used features. + /// </summary> + ROLE_SYSTEM_TOOLBAR = 22, + + /// <summary> + /// The object represents a tooltip that provides helpful hints. + /// </summary> + ROLE_SYSTEM_TOOLTIP = 13, + + /// <summary> + /// The object represents blank space between other objects. + /// </summary> + ROLE_SYSTEM_WHITESPACE = 59, + + /// <summary> + /// The object represents the window frame, which contains child objects such as a title bar, client, and other objects of a window. + /// </summary> + ROLE_SYSTEM_WINDOW = 9 + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <zi...@us...> - 2014-11-25 14:27:06
|
Revision: 119 http://sourceforge.net/p/mwinapi/code/119 Author: ziewer Date: 2014-11-25 14:27:03 +0000 (Tue, 25 Nov 2014) Log Message: ----------- Error handling in SystemAccessibleObject.Location: Return empty bounds on error Modified Paths: -------------- trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs Modified: trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs =================================================================== --- trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs 2013-07-23 09:11:58 UTC (rev 118) +++ trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs 2014-11-25 14:27:03 UTC (rev 119) @@ -270,10 +270,13 @@ { get { - int x, y, w, h; - iacc.accLocation(out x, out y, out w, out h, childID); - return new Rectangle(x, y, w, h); - + try + { + int x, y, w, h; + iacc.accLocation(out x, out y, out w, out h, childID); + return new Rectangle(x, y, w, h); + } + catch { return Rectangle.Empty; } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dan...@us...> - 2013-07-23 09:12:01
|
Revision: 118 http://sourceforge.net/p/mwinapi/code/118 Author: danielrose Date: 2013-07-23 09:11:58 +0000 (Tue, 23 Jul 2013) Log Message: ----------- Added a strong name key file to the solution. This allows creating a strong-name-signed release, which means ManagedWinapi can now be used from assemblies which are also strong-name-signed. The key file itself is not protected in any way. Added a new solution and project configuration "ReleaseSigned", which creates a strong-name-signed assembly. The output path is "bin\ReleaseSigned". Renamed the (unsigned) release configuration to "ReleaseUnsigned". Modified Paths: -------------- trunk/ManagedWinapi/ManagedWinapi-2010.csproj trunk/ManagedWinapi/ManagedWinapi.csproj trunk/ManagedWinapi-2010.sln trunk/ManagedWinapi.sln Added Paths: ----------- trunk/ManagedWinapi/ManagedWinapiKey.snk Modified: trunk/ManagedWinapi/ManagedWinapi-2010.csproj =================================================================== --- trunk/ManagedWinapi/ManagedWinapi-2010.csproj 2013-07-23 08:31:55 UTC (rev 117) +++ trunk/ManagedWinapi/ManagedWinapi-2010.csproj 2013-07-23 09:11:58 UTC (rev 118) @@ -23,7 +23,7 @@ <WarningLevel>4</WarningLevel> <DocumentationFile>bin\Debug\ManagedWinapi.XML</DocumentationFile> </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseUnsigned|AnyCPU' "> <DebugType>pdbonly</DebugType> <Optimize>true</Optimize> <OutputPath>bin\Release\</OutputPath> @@ -32,6 +32,17 @@ <WarningLevel>4</WarningLevel> <DocumentationFile>bin\Release\ManagedWinapi.XML</DocumentationFile> </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseSigned|AnyCPU'"> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\ReleaseSigned\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + <DocumentationFile>bin\ReleaseSigned\ManagedWinapi.XML</DocumentationFile> + <SignAssembly>true</SignAssembly> + <AssemblyOriginatorKeyFile>ManagedWinapiKey.snk</AssemblyOriginatorKeyFile> + </PropertyGroup> <ItemGroup> <Reference Include="Accessibility" /> <Reference Include="System" /> @@ -131,6 +142,9 @@ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup> + <ItemGroup> + <None Include="ManagedWinapiKey.snk" /> + </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. Modified: trunk/ManagedWinapi/ManagedWinapi.csproj =================================================================== --- trunk/ManagedWinapi/ManagedWinapi.csproj 2013-07-23 08:31:55 UTC (rev 117) +++ trunk/ManagedWinapi/ManagedWinapi.csproj 2013-07-23 09:11:58 UTC (rev 118) @@ -22,7 +22,7 @@ <WarningLevel>4</WarningLevel> <DocumentationFile>bin\Debug\ManagedWinapi.XML</DocumentationFile> </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseUnsigned|AnyCPU' "> <DebugType>pdbonly</DebugType> <Optimize>true</Optimize> <OutputPath>bin\Release\</OutputPath> @@ -31,6 +31,17 @@ <WarningLevel>4</WarningLevel> <DocumentationFile>bin\Release\ManagedWinapi.XML</DocumentationFile> </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseSigned|AnyCPU' "> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\ReleaseSigned\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + <DocumentationFile>bin\ReleaseSigned\ManagedWinapi.XML</DocumentationFile> + <SignAssembly>true</SignAssembly> + <AssemblyOriginatorKeyFile>ManagedWinapiKey.snk</AssemblyOriginatorKeyFile> + </PropertyGroup> <ItemGroup> <Reference Include="Accessibility" /> <Reference Include="System" /> @@ -130,6 +141,9 @@ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup> + <ItemGroup> + <None Include="ManagedWinapiKey.snk" /> + </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. Added: trunk/ManagedWinapi/ManagedWinapiKey.snk =================================================================== (Binary files differ) Index: trunk/ManagedWinapi/ManagedWinapiKey.snk =================================================================== --- trunk/ManagedWinapi/ManagedWinapiKey.snk 2013-07-23 08:31:55 UTC (rev 117) +++ trunk/ManagedWinapi/ManagedWinapiKey.snk 2013-07-23 09:11:58 UTC (rev 118) Property changes on: trunk/ManagedWinapi/ManagedWinapiKey.snk ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Modified: trunk/ManagedWinapi-2010.sln =================================================================== --- trunk/ManagedWinapi-2010.sln 2013-07-23 08:31:55 UTC (rev 117) +++ trunk/ManagedWinapi-2010.sln 2013-07-23 09:11:58 UTC (rev 118) @@ -6,13 +6,16 @@ Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU + ReleaseSigned|Any CPU = ReleaseSigned|Any CPU + ReleaseUnsigned|Any CPU = ReleaseUnsigned|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.Release|Any CPU.Build.0 = Release|Any CPU + {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.ReleaseSigned|Any CPU.ActiveCfg = ReleaseSigned|Any CPU + {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.ReleaseSigned|Any CPU.Build.0 = ReleaseSigned|Any CPU + {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.ReleaseUnsigned|Any CPU.ActiveCfg = ReleaseUnsigned|Any CPU + {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.ReleaseUnsigned|Any CPU.Build.0 = ReleaseUnsigned|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE Modified: trunk/ManagedWinapi.sln =================================================================== --- trunk/ManagedWinapi.sln 2013-07-23 08:31:55 UTC (rev 117) +++ trunk/ManagedWinapi.sln 2013-07-23 09:11:58 UTC (rev 118) @@ -1,18 +1,21 @@ Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual C# Express 2008 +# Visual Studio 2008 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ManagedWinapi", "ManagedWinapi\ManagedWinapi.csproj", "{FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU + ReleaseSigned|Any CPU = ReleaseSigned|Any CPU + ReleaseUnsigned|Any CPU = ReleaseUnsigned|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.Release|Any CPU.Build.0 = Release|Any CPU + {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.ReleaseSigned|Any CPU.ActiveCfg = ReleaseSigned|Any CPU + {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.ReleaseSigned|Any CPU.Build.0 = ReleaseSigned|Any CPU + {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.ReleaseUnsigned|Any CPU.ActiveCfg = ReleaseUnsigned|Any CPU + {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.ReleaseUnsigned|Any CPU.Build.0 = ReleaseUnsigned|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dan...@us...> - 2013-07-23 08:31:58
|
Revision: 117 http://sourceforge.net/p/mwinapi/code/117 Author: danielrose Date: 2013-07-23 08:31:55 +0000 (Tue, 23 Jul 2013) Log Message: ----------- Marked the assembly as CLS-compliant. Marked all places where this is not the case (such as by using uint) explicitly as not CLS-compliant. Modified Paths: -------------- trunk/ManagedWinapi/Accessibility/AccessibleObjectListener.cs trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs trunk/ManagedWinapi/Audio/Mixer/Mixer.cs trunk/ManagedWinapi/ExtendedFileInfo.cs trunk/ManagedWinapi/Hooks/JournalHook.cs trunk/ManagedWinapi/Hooks/LowLevelHook.cs trunk/ManagedWinapi/KeyboardKey.cs trunk/ManagedWinapi/PrivilegedActions.cs trunk/ManagedWinapi/Properties/AssemblyInfo.cs trunk/ManagedWinapi/Windows/SystemListView.cs trunk/ManagedWinapi/Windows/SystemWindow.cs Modified: trunk/ManagedWinapi/Accessibility/AccessibleObjectListener.cs =================================================================== --- trunk/ManagedWinapi/Accessibility/AccessibleObjectListener.cs 2013-07-23 08:17:11 UTC (rev 116) +++ trunk/ManagedWinapi/Accessibility/AccessibleObjectListener.cs 2013-07-23 08:31:55 UTC (rev 117) @@ -101,6 +101,7 @@ /// The Process ID to listen to. /// Default 0 listens to all processes. /// </summary> + [CLSCompliant(false)] public UInt32 ProcessId { get { return processId; } @@ -111,6 +112,7 @@ /// The Thread ID to listen to. /// Default 0 listens to all threads. /// </summary> + [CLSCompliant(false)] public UInt32 ThreadId { get { return threadId; } @@ -202,6 +204,7 @@ /// <summary> /// Initializes a new instance of the AccessibleEventArgs class. /// </summary> + [CLSCompliant(false)] public AccessibleEventArgs(AccessibleEventType eventType, IntPtr hwnd, uint idObject, uint idChild, uint dwEventThread, uint dwmsEventTime) { @@ -232,6 +235,7 @@ /// <summary> /// Object ID. /// </summary> + [CLSCompliant(false)] public uint ObjectID { get { return idObject; } @@ -240,6 +244,7 @@ /// <summary> /// Child ID. /// </summary> + [CLSCompliant(false)] public uint ChildID { get { return idChild; } @@ -248,6 +253,7 @@ /// <summary> /// The thread that generated this event. /// </summary> + [CLSCompliant(false)] public uint Thread { get { return dwEventThread; } @@ -256,6 +262,7 @@ /// <summary> /// Time in milliseconds when the event was generated. /// </summary> + [CLSCompliant(false)] public uint Time { get { return dwmsEventTime; } Modified: trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs =================================================================== --- trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs 2013-07-23 08:17:11 UTC (rev 116) +++ trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs 2013-07-23 08:31:55 UTC (rev 117) @@ -93,6 +93,7 @@ /// <param name="window">The window</param> /// <param name="objectID">Which accessibility object to get</param> /// <returns></returns> + [CLSCompliant(false)] public static SystemAccessibleObject FromWindow(SystemWindow window, AccessibleObjectID objectID) { IAccessible iacc = (IAccessible)AccessibleObjectFromWindow(window == null ? IntPtr.Zero : window.HWnd, (uint)objectID, new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}")); @@ -641,6 +642,7 @@ /// This enumeration lists all kinds of accessible objects that can /// be directly assigned to a window. /// </summary> + [CLSCompliant(false)] public enum AccessibleObjectID : uint { /// <summary> Modified: trunk/ManagedWinapi/Audio/Mixer/Mixer.cs =================================================================== --- trunk/ManagedWinapi/Audio/Mixer/Mixer.cs 2013-07-23 08:17:11 UTC (rev 116) +++ trunk/ManagedWinapi/Audio/Mixer/Mixer.cs 2013-07-23 08:31:55 UTC (rev 117) @@ -35,6 +35,7 @@ /// <summary> /// Gets the number of available mixers in this system. /// </summary> + [CLSCompliant(false)] public static uint MixerCount { get @@ -48,6 +49,7 @@ /// </summary> /// <param name="index">The zero-based index of this mixer.</param> /// <returns>A reference to this mixer.</returns> + [CLSCompliant(false)] public static Mixer OpenMixer(uint index) { if (index < 0 || index > MixerCount) Modified: trunk/ManagedWinapi/ExtendedFileInfo.cs =================================================================== --- trunk/ManagedWinapi/ExtendedFileInfo.cs 2013-07-23 08:17:11 UTC (rev 116) +++ trunk/ManagedWinapi/ExtendedFileInfo.cs 2013-07-23 08:31:55 UTC (rev 117) @@ -106,6 +106,7 @@ /// Get the size a file requires on disk. This takes NTFS /// compression into account. /// </summary> + [CLSCompliant(false)] public static ulong GetPhysicalFileSize(string filename) { uint high; @@ -125,6 +126,7 @@ /// <summary> /// Get the cluster size for the filesystem that contains the given file. /// </summary> + [CLSCompliant(false)] public static uint GetClusterSize(string filename) { uint sectors, bytes, dummy; Modified: trunk/ManagedWinapi/Hooks/JournalHook.cs =================================================================== --- trunk/ManagedWinapi/Hooks/JournalHook.cs 2013-07-23 08:17:11 UTC (rev 116) +++ trunk/ManagedWinapi/Hooks/JournalHook.cs 2013-07-23 08:31:55 UTC (rev 117) @@ -117,6 +117,7 @@ /// <summary> /// Creates a new journal message. /// </summary> + [CLSCompliant(false)] public JournalMessage(IntPtr hWnd, uint message, uint paramL, uint paramH, uint time) { msg = new JournalHook.EVENTMSG(); @@ -135,16 +136,19 @@ /// <summary> /// The message. /// </summary> + [CLSCompliant(false)] public uint Message { get { return msg.message; } } /// <summary> /// The first parameter of the message. /// </summary> + [CLSCompliant(false)] public uint ParamL { get { return msg.paramL; } } /// <summary> /// The second parameter of the message. /// </summary> + [CLSCompliant(false)] public uint ParamH { get { return msg.paramH; } } /// <summary> Modified: trunk/ManagedWinapi/Hooks/LowLevelHook.cs =================================================================== --- trunk/ManagedWinapi/Hooks/LowLevelHook.cs 2013-07-23 08:17:11 UTC (rev 116) +++ trunk/ManagedWinapi/Hooks/LowLevelHook.cs 2013-07-23 08:31:55 UTC (rev 117) @@ -423,6 +423,7 @@ /// <summary> /// Mouse event flags needed to replay this message. /// </summary> + [CLSCompliant(false)] public uint MouseEventFlags { get @@ -534,6 +535,7 @@ /// <summary> /// Flags needed to replay this event. /// </summary> + [CLSCompliant(false)] public uint KeyboardEventFlags { get Modified: trunk/ManagedWinapi/KeyboardKey.cs =================================================================== --- trunk/ManagedWinapi/KeyboardKey.cs 2013-07-23 08:17:11 UTC (rev 116) +++ trunk/ManagedWinapi/KeyboardKey.cs 2013-07-23 08:31:55 UTC (rev 117) @@ -123,6 +123,7 @@ /// Inject a keyboard event into the event loop, as if the user performed /// it with his keyboard. /// </summary> + [CLSCompliant(false)] public static void InjectKeyboardEvent(Keys key, byte scanCode, uint flags, UIntPtr extraInfo) { keybd_event((byte)key, scanCode, flags, extraInfo); @@ -132,6 +133,7 @@ /// Inject a mouse event into the event loop, as if the user performed /// it with his mouse. /// </summary> + [CLSCompliant(false)] public static void InjectMouseEvent(uint flags, uint dx, uint dy, uint data, UIntPtr extraInfo) { mouse_event(flags, dx, dy, data, extraInfo); Modified: trunk/ManagedWinapi/PrivilegedActions.cs =================================================================== --- trunk/ManagedWinapi/PrivilegedActions.cs 2013-07-23 08:17:11 UTC (rev 116) +++ trunk/ManagedWinapi/PrivilegedActions.cs 2013-07-23 08:31:55 UTC (rev 117) @@ -14,6 +14,7 @@ /// <summary> /// Shutdown the system. /// </summary> + [CLSCompliant(false)] public static void ShutDown(ShutdownAction action) { ShutDown(action, ShutdownForceMode.NoForce); @@ -22,6 +23,7 @@ /// <summary> /// Shutdown the system. /// </summary> + [CLSCompliant(false)] public static void ShutDown(ShutdownAction action, ShutdownForceMode forceMode) { ApiHelper.FailIfZero(ExitWindowsEx((uint)action | (uint)forceMode, SHTDN_REASON_FLAG_PLANNED)); @@ -70,6 +72,7 @@ /// <summary> /// Actions that can be performed at shutdown. /// </summary> + [CLSCompliant(false)] public enum ShutdownAction : uint { /// <summary> @@ -103,6 +106,7 @@ /// Whether shutdown should be forced if an application cancels it /// or is hung. /// </summary> + [CLSCompliant(false)] public enum ShutdownForceMode : uint { /// <summary> Modified: trunk/ManagedWinapi/Properties/AssemblyInfo.cs =================================================================== --- trunk/ManagedWinapi/Properties/AssemblyInfo.cs 2013-07-23 08:17:11 UTC (rev 116) +++ trunk/ManagedWinapi/Properties/AssemblyInfo.cs 2013-07-23 08:31:55 UTC (rev 117) @@ -1,3 +1,4 @@ +using System; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -33,3 +34,5 @@ // by using the '*' as shown below: [assembly: AssemblyVersion("0.3.0.3")] [assembly: AssemblyFileVersion("0.3.0.3")] + +[assembly: CLSCompliant(true)] Modified: trunk/ManagedWinapi/Windows/SystemListView.cs =================================================================== --- trunk/ManagedWinapi/Windows/SystemListView.cs 2013-07-23 08:17:11 UTC (rev 116) +++ trunk/ManagedWinapi/Windows/SystemListView.cs 2013-07-23 08:31:55 UTC (rev 117) @@ -209,6 +209,7 @@ /// <summary> /// State bits of this item. /// </summary> + [CLSCompliant(false)] public uint State { get { return state; } } /// <summary> Modified: trunk/ManagedWinapi/Windows/SystemWindow.cs =================================================================== --- trunk/ManagedWinapi/Windows/SystemWindow.cs 2013-07-23 08:17:11 UTC (rev 116) +++ trunk/ManagedWinapi/Windows/SystemWindow.cs 2013-07-23 08:31:55 UTC (rev 117) @@ -176,6 +176,7 @@ /// Extended Window Style Flags. The original constants started with WS_EX_. /// </summary> /// <seealso cref="SystemWindow.ExtendedStyle"/> + [CLSCompliant(false)] [Flags] public enum WindowExStyleFlags : uint { @@ -637,6 +638,7 @@ /// <summary> /// This window's extended style flags. /// </summary> + [CLSCompliant(false)] public WindowExStyleFlags ExtendedStyle { get This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dan...@us...> - 2013-07-23 08:17:14
|
Revision: 116 http://sourceforge.net/p/mwinapi/code/116 Author: danielrose Date: 2013-07-23 08:17:11 +0000 (Tue, 23 Jul 2013) Log Message: ----------- Deleted app.config, since it is used for applications, but not for class libraries. Modified Paths: -------------- trunk/ManagedWinapi/ManagedWinapi-2010.csproj trunk/ManagedWinapi/ManagedWinapi.csproj Removed Paths: ------------- trunk/ManagedWinapi/app.config Modified: trunk/ManagedWinapi/ManagedWinapi-2010.csproj =================================================================== --- trunk/ManagedWinapi/ManagedWinapi-2010.csproj 2013-07-23 08:13:36 UTC (rev 115) +++ trunk/ManagedWinapi/ManagedWinapi-2010.csproj 2013-07-23 08:17:11 UTC (rev 116) @@ -131,9 +131,6 @@ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup> - <ItemGroup> - <None Include="app.config" /> - </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. Modified: trunk/ManagedWinapi/ManagedWinapi.csproj =================================================================== --- trunk/ManagedWinapi/ManagedWinapi.csproj 2013-07-23 08:13:36 UTC (rev 115) +++ trunk/ManagedWinapi/ManagedWinapi.csproj 2013-07-23 08:17:11 UTC (rev 116) @@ -130,9 +130,6 @@ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup> - <ItemGroup> - <None Include="app.config" /> - </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. Deleted: trunk/ManagedWinapi/app.config =================================================================== --- trunk/ManagedWinapi/app.config 2013-07-23 08:13:36 UTC (rev 115) +++ trunk/ManagedWinapi/app.config 2013-07-23 08:17:11 UTC (rev 116) @@ -1,3 +0,0 @@ -<?xml version="1.0"?> -<configuration> -<startup><supportedRuntime version="v2.0.50727"/></startup></configuration> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dan...@us...> - 2013-07-23 08:13:44
|
Revision: 115 http://sourceforge.net/p/mwinapi/code/115 Author: danielrose Date: 2013-07-23 08:13:36 +0000 (Tue, 23 Jul 2013) Log Message: ----------- Added a Visual Studio 2010 version of ManagedWinapi which targets the .NET 4.0 client framework. Added Paths: ----------- trunk/ManagedWinapi/ManagedWinapi-2010.csproj trunk/ManagedWinapi-2010.sln Added: trunk/ManagedWinapi/ManagedWinapi-2010.csproj =================================================================== --- trunk/ManagedWinapi/ManagedWinapi-2010.csproj (rev 0) +++ trunk/ManagedWinapi/ManagedWinapi-2010.csproj 2013-07-23 08:13:36 UTC (rev 115) @@ -0,0 +1,145 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProductVersion>9.0.30729</ProductVersion> + <SchemaVersion>2.0</SchemaVersion> + <ProjectGuid>{FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}</ProjectGuid> + <OutputType>Library</OutputType> + <AppDesignerFolder>Properties</AppDesignerFolder> + <RootNamespace>ManagedWinapi</RootNamespace> + <AssemblyName>ManagedWinapi</AssemblyName> + <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> + <TargetFrameworkProfile>Client</TargetFrameworkProfile> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>bin\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + <DocumentationFile>bin\Debug\ManagedWinapi.XML</DocumentationFile> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + <DocumentationFile>bin\Release\ManagedWinapi.XML</DocumentationFile> + </PropertyGroup> + <ItemGroup> + <Reference Include="Accessibility" /> + <Reference Include="System" /> + <Reference Include="System.Data" /> + <Reference Include="System.Drawing" /> + <Reference Include="System.Management" /> + <Reference Include="System.Windows.Forms" /> + <Reference Include="System.Xml" /> + </ItemGroup> + <ItemGroup> + <Compile Include="Accessibility\AccessibleObjectListener.cs"> + <SubType>Component</SubType> + </Compile> + <Compile Include="BitmapDataHandler.cs" /> + <Compile Include="COMTypeInformation.cs" /> + <Compile Include="Windows\Contents\AccessibleWindowParser.cs" /> + <Compile Include="ExtendedFileInfo.cs" /> + <Compile Include="CodepointRange.cs" /> + <Compile Include="Hooks\Hook.cs"> + <SubType>Component</SubType> + </Compile> + <Compile Include="InputBlocker.cs" /> + <Compile Include="Hooks\JournalHook.cs"> + <SubType>Component</SubType> + </Compile> + <Compile Include="KeyboardKey.cs" /> + <Compile Include="Hooks\LowLevelHook.cs"> + <SubType>Component</SubType> + </Compile> + <Compile Include="MachineIdentifiers.cs" /> + <Compile Include="PixelData.cs" /> + <Compile Include="ProcessMemoryChunk.cs" /> + <Compile Include="ProcessTree.cs" /> + <Compile Include="Windows\Screenshot.cs" /> + <Compile Include="ShortcutBox.cs"> + <SubType>Component</SubType> + </Compile> + <Compile Include="ShortcutBox.Designer.cs"> + <DependentUpon>ShortcutBox.cs</DependentUpon> + </Compile> + <Compile Include="PrivilegedActions.cs" /> + <Compile Include="Accessibility\SystemAccessibleObject.cs" /> + <Compile Include="ApiHelper.cs" /> + <Compile Include="ClipboardNotifier.cs"> + <SubType>Component</SubType> + </Compile> + <Compile Include="Windows\Contents\ContentParserRegistry.cs" /> + <Compile Include="Windows\Contents\ListParser.cs" /> + <Compile Include="Windows\Contents\TextFieldParser.cs" /> + <Compile Include="Windows\Contents\WindowContent.cs" /> + <Compile Include="Windows\Contents\WindowContentParser.cs" /> + <Compile Include="Crosshair.cs"> + <SubType>UserControl</SubType> + </Compile> + <Compile Include="Crosshair.Designer.cs"> + <DependentUpon>Crosshair.cs</DependentUpon> + </Compile> + <Compile Include="Audio\Mixer\Mixer.cs" /> + <Compile Include="Audio\Mixer\MixerControl.cs" /> + <Compile Include="Audio\Mixer\MixerLine.cs" /> + <Compile Include="Windows\PInvokeTypes.cs" /> + <Compile Include="SendKeysEscaper.cs" /> + <Compile Include="Windows\EventDispatchingNativeWindow.cs" /> + <Compile Include="Hotkey.cs"> + <SubType>Component</SubType> + </Compile> + <Compile Include="LockKeyResetter.cs" /> + <Compile Include="Properties\AssemblyInfo.cs" /> + <Compile Include="Windows\SystemListBox.cs" /> + <Compile Include="Windows\SystemListView.cs" /> + <Compile Include="Windows\SystemTreeView.cs" /> + <Compile Include="Windows\SystemWindow.cs" /> + <Compile Include="TextCursor.cs" /> + <Compile Include="TextCursorProvider.cs"> + <SubType>Component</SubType> + </Compile> + <Service Include="{94E38DFF-614B-4cbd-B67C-F211BB35CE8B}" /> + </ItemGroup> + <ItemGroup> + <EmbeddedResource Include="Crosshair.resx"> + <SubType>Designer</SubType> + <DependentUpon>Crosshair.cs</DependentUpon> + </EmbeddedResource> + </ItemGroup> + <ItemGroup> + <EmbeddedResource Include="crosshair.ico" /> + </ItemGroup> + <ItemGroup> + <EmbeddedResource Include="crosshair.cur" /> + <EmbeddedResource Include="ShortcutBox.resx"> + <SubType>Designer</SubType> + <DependentUpon>ShortcutBox.cs</DependentUpon> + </EmbeddedResource> + </ItemGroup> + <ItemGroup> + <Content Include="ManagedWinapiNativeHelper.dll"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + </ItemGroup> + <ItemGroup> + <None Include="app.config" /> + </ItemGroup> + <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> + <!-- To modify your build process, add your task inside one of the targets below and uncomment it. + Other similar extension points exist, see Microsoft.Common.targets. + <Target Name="BeforeBuild"> + </Target> + <Target Name="AfterBuild"> + </Target> + --> +</Project> \ No newline at end of file Added: trunk/ManagedWinapi-2010.sln =================================================================== --- trunk/ManagedWinapi-2010.sln (rev 0) +++ trunk/ManagedWinapi-2010.sln 2013-07-23 08:13:36 UTC (rev 115) @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ManagedWinapi-2010", "ManagedWinapi\ManagedWinapi-2010.csproj", "{FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FBD3EC1E-47E2-4D2D-81C9-D6506125A09A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sch...@us...> - 2012-07-01 21:11:13
|
Revision: 114 http://mwinapi.svn.sourceforge.net/mwinapi/?rev=114&view=rev Author: schierlm Date: 2012-07-01 21:11:07 +0000 (Sun, 01 Jul 2012) Log Message: ----------- Fix linked files in ScreenShooter projects Modified Paths: -------------- trunk/Tools/ScreenShooter/ScreenShooterPaintDotNet.csproj trunk/Tools/ScreenShooter/ScreenShooterPlugin.csproj trunk/Tools/ScreenShooter/ScreenShooterStandalone.csproj Property Changed: ---------------- trunk/Tools/AOExplorer/ Property changes on: trunk/Tools/AOExplorer ___________________________________________________________________ Modified: svn:ignore - bin obj *.user + bin obj *.user *.suo Modified: trunk/Tools/ScreenShooter/ScreenShooterPaintDotNet.csproj =================================================================== --- trunk/Tools/ScreenShooter/ScreenShooterPaintDotNet.csproj 2012-07-01 16:06:19 UTC (rev 113) +++ trunk/Tools/ScreenShooter/ScreenShooterPaintDotNet.csproj 2012-07-01 21:11:07 UTC (rev 114) @@ -47,10 +47,10 @@ <Compile Include="..\..\ManagedWinapi\ApiHelper.cs"> <Link>Standalone\ApiHelper.cs</Link> </Compile> - <Compile Include="..\..\ManagedWinapi\EventDispatchingNativeWindow.cs"> + <Compile Include="..\..\ManagedWinapi\Windows\EventDispatchingNativeWindow.cs"> <Link>Standalone\EventDispatchingNativeWindow.cs</Link> </Compile> - <Compile Include="..\..\ManagedWinapi\Hook.cs"> + <Compile Include="..\..\ManagedWinapi\Hooks\Hook.cs"> <Link>Standalone\Hook.cs</Link> <SubType>Component</SubType> </Compile> @@ -61,14 +61,14 @@ <Compile Include="..\..\ManagedWinapi\KeyboardKey.cs"> <Link>Standalone\KeyboardKey.cs</Link> </Compile> - <Compile Include="..\..\ManagedWinapi\LowLevelHook.cs"> + <Compile Include="..\..\ManagedWinapi\Hooks\LowLevelHook.cs"> <Link>Standalone\LowLevelHook.cs</Link> <SubType>Component</SubType> </Compile> - <Compile Include="..\..\ManagedWinapi\PInvokeTypes.cs"> + <Compile Include="..\..\ManagedWinapi\Windows\PInvokeTypes.cs"> <Link>Standalone\PInvokeTypes.cs</Link> </Compile> - <Compile Include="..\..\ManagedWinapi\Screenshot.cs"> + <Compile Include="..\..\ManagedWinapi\Windows\Screenshot.cs"> <Link>Standalone\Screenshot.cs</Link> </Compile> <Compile Include="..\..\ManagedWinapi\ShortcutBox.cs"> @@ -79,10 +79,10 @@ <Link>Standalone\ShortcutBox.designer.cs</Link> <DependentUpon>ShortcutBox.cs</DependentUpon> </Compile> - <Compile Include="..\..\ManagedWinapi\SystemAccessibleObject.cs"> + <Compile Include="..\..\ManagedWinapi\Accessibility\SystemAccessibleObject.cs"> <Link>Standalone\SystemAccessibleObject.cs</Link> </Compile> - <Compile Include="..\..\ManagedWinapi\SystemWindow.cs"> + <Compile Include="..\..\ManagedWinapi\Windows\SystemWindow.cs"> <Link>Standalone\SystemWindow.cs</Link> </Compile> <Compile Include="MainFormPaintDotNet.cs"> Modified: trunk/Tools/ScreenShooter/ScreenShooterPlugin.csproj =================================================================== --- trunk/Tools/ScreenShooter/ScreenShooterPlugin.csproj 2012-07-01 16:06:19 UTC (rev 113) +++ trunk/Tools/ScreenShooter/ScreenShooterPlugin.csproj 2012-07-01 21:11:07 UTC (rev 114) @@ -59,10 +59,10 @@ <Compile Include="..\..\ManagedWinapi\ApiHelper.cs"> <Link>Standalone\ApiHelper.cs</Link> </Compile> - <Compile Include="..\..\ManagedWinapi\EventDispatchingNativeWindow.cs"> + <Compile Include="..\..\ManagedWinapi\Windows\EventDispatchingNativeWindow.cs"> <Link>Standalone\EventDispatchingNativeWindow.cs</Link> </Compile> - <Compile Include="..\..\ManagedWinapi\Hook.cs"> + <Compile Include="..\..\ManagedWinapi\Hooks\Hook.cs"> <Link>Standalone\Hook.cs</Link> <SubType>Component</SubType> </Compile> @@ -73,14 +73,14 @@ <Compile Include="..\..\ManagedWinapi\KeyboardKey.cs"> <Link>Standalone\KeyboardKey.cs</Link> </Compile> - <Compile Include="..\..\ManagedWinapi\LowLevelHook.cs"> + <Compile Include="..\..\ManagedWinapi\Hooks\LowLevelHook.cs"> <Link>Standalone\LowLevelHook.cs</Link> <SubType>Component</SubType> </Compile> - <Compile Include="..\..\ManagedWinapi\PInvokeTypes.cs"> + <Compile Include="..\..\ManagedWinapi\Windows\PInvokeTypes.cs"> <Link>Standalone\PInvokeTypes.cs</Link> </Compile> - <Compile Include="..\..\ManagedWinapi\Screenshot.cs"> + <Compile Include="..\..\ManagedWinapi\Windows\Screenshot.cs"> <Link>Standalone\Screenshot.cs</Link> </Compile> <Compile Include="..\..\ManagedWinapi\ShortcutBox.cs"> @@ -91,10 +91,10 @@ <Link>Standalone\ShortcutBox.designer.cs</Link> <DependentUpon>ShortcutBox.cs</DependentUpon> </Compile> - <Compile Include="..\..\ManagedWinapi\SystemAccessibleObject.cs"> + <Compile Include="..\..\ManagedWinapi\Accessibility\SystemAccessibleObject.cs"> <Link>Standalone\SystemAccessibleObject.cs</Link> </Compile> - <Compile Include="..\..\ManagedWinapi\SystemWindow.cs"> + <Compile Include="..\..\ManagedWinapi\Windows\SystemWindow.cs"> <Link>Standalone\SystemWindow.cs</Link> </Compile> <Compile Include="PluginForm.cs"> Modified: trunk/Tools/ScreenShooter/ScreenShooterStandalone.csproj =================================================================== --- trunk/Tools/ScreenShooter/ScreenShooterStandalone.csproj 2012-07-01 16:06:19 UTC (rev 113) +++ trunk/Tools/ScreenShooter/ScreenShooterStandalone.csproj 2012-07-01 21:11:07 UTC (rev 114) @@ -47,10 +47,10 @@ <Compile Include="..\..\ManagedWinapi\ApiHelper.cs"> <Link>Standalone\ApiHelper.cs</Link> </Compile> - <Compile Include="..\..\ManagedWinapi\EventDispatchingNativeWindow.cs"> + <Compile Include="..\..\ManagedWinapi\Windows\EventDispatchingNativeWindow.cs"> <Link>Standalone\EventDispatchingNativeWindow.cs</Link> </Compile> - <Compile Include="..\..\ManagedWinapi\Hook.cs"> + <Compile Include="..\..\ManagedWinapi\Hooks\Hook.cs"> <Link>Standalone\Hook.cs</Link> <SubType>Component</SubType> </Compile> @@ -61,14 +61,14 @@ <Compile Include="..\..\ManagedWinapi\KeyboardKey.cs"> <Link>Standalone\KeyboardKey.cs</Link> </Compile> - <Compile Include="..\..\ManagedWinapi\LowLevelHook.cs"> + <Compile Include="..\..\ManagedWinapi\Hooks\LowLevelHook.cs"> <Link>Standalone\LowLevelHook.cs</Link> <SubType>Component</SubType> </Compile> - <Compile Include="..\..\ManagedWinapi\PInvokeTypes.cs"> + <Compile Include="..\..\ManagedWinapi\Windows\PInvokeTypes.cs"> <Link>Standalone\PInvokeTypes.cs</Link> </Compile> - <Compile Include="..\..\ManagedWinapi\Screenshot.cs"> + <Compile Include="..\..\ManagedWinapi\Windows\Screenshot.cs"> <Link>Standalone\Screenshot.cs</Link> </Compile> <Compile Include="..\..\ManagedWinapi\ShortcutBox.cs"> @@ -79,10 +79,10 @@ <Link>Standalone\ShortcutBox.designer.cs</Link> <DependentUpon>ShortcutBox.cs</DependentUpon> </Compile> - <Compile Include="..\..\ManagedWinapi\SystemAccessibleObject.cs"> + <Compile Include="..\..\ManagedWinapi\Accessibility\SystemAccessibleObject.cs"> <Link>Standalone\SystemAccessibleObject.cs</Link> </Compile> - <Compile Include="..\..\ManagedWinapi\SystemWindow.cs"> + <Compile Include="..\..\ManagedWinapi\Windows\SystemWindow.cs"> <Link>Standalone\SystemWindow.cs</Link> </Compile> <Compile Include="MainForm.cs"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <po...@us...> - 2012-07-01 16:06:28
|
Revision: 113 http://mwinapi.svn.sourceforge.net/mwinapi/?rev=113&view=rev Author: poovenb Date: 2012-07-01 16:06:19 +0000 (Sun, 01 Jul 2012) Log Message: ----------- (1) Created new folders to organise namespaces: moved files accordingly. (2) Added TextCursor and TextCursorProvider that allow a custom caret to be used. However, this only seems to work well for TextBox Control types. The aim was to ensure that the user selected color is used: by default the Windows API applies a bit mask so that the displayed color will not match the user elected color for non-white backgrounds. (3) Added BitmapDataHandler and PixelData that provide fast bitmap modification for large bitmap operations. (4) It seems that Screenshot was not added to the project; Visual Studio 2010 has included it. Modified Paths: -------------- trunk/ManagedWinapi/ManagedWinapi.csproj Added Paths: ----------- trunk/ManagedWinapi/Accessibility/ trunk/ManagedWinapi/Accessibility/AccessibleObjectListener.cs trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs trunk/ManagedWinapi/Audio/ trunk/ManagedWinapi/Audio/Mixer/ trunk/ManagedWinapi/Audio/Mixer/Mixer.cs trunk/ManagedWinapi/Audio/Mixer/MixerControl.cs trunk/ManagedWinapi/Audio/Mixer/MixerLine.cs trunk/ManagedWinapi/BitmapDataHandler.cs trunk/ManagedWinapi/Hooks/ trunk/ManagedWinapi/Hooks/Hook.cs trunk/ManagedWinapi/Hooks/JournalHook.cs trunk/ManagedWinapi/Hooks/LowLevelHook.cs trunk/ManagedWinapi/PixelData.cs trunk/ManagedWinapi/TextCursor.cs trunk/ManagedWinapi/TextCursorProvider.cs trunk/ManagedWinapi/Windows/ trunk/ManagedWinapi/Windows/Contents/ trunk/ManagedWinapi/Windows/EventDispatchingNativeWindow.cs trunk/ManagedWinapi/Windows/PInvokeTypes.cs trunk/ManagedWinapi/Windows/Screenshot.cs trunk/ManagedWinapi/Windows/SystemListBox.cs trunk/ManagedWinapi/Windows/SystemListView.cs trunk/ManagedWinapi/Windows/SystemTreeView.cs trunk/ManagedWinapi/Windows/SystemWindow.cs Removed Paths: ------------- trunk/ManagedWinapi/AccessibleObjectListener.cs trunk/ManagedWinapi/Contents/ trunk/ManagedWinapi/EventDispatchingNativeWindow.cs trunk/ManagedWinapi/Hook.cs trunk/ManagedWinapi/JournalHook.cs trunk/ManagedWinapi/LowLevelHook.cs trunk/ManagedWinapi/Mixer.cs trunk/ManagedWinapi/MixerControl.cs trunk/ManagedWinapi/MixerLine.cs trunk/ManagedWinapi/PInvokeTypes.cs trunk/ManagedWinapi/Screenshot.cs trunk/ManagedWinapi/SystemAccessibleObject.cs trunk/ManagedWinapi/SystemListBox.cs trunk/ManagedWinapi/SystemListView.cs trunk/ManagedWinapi/SystemTreeView.cs trunk/ManagedWinapi/SystemWindow.cs Copied: trunk/ManagedWinapi/Accessibility/AccessibleObjectListener.cs (from rev 112, trunk/ManagedWinapi/AccessibleObjectListener.cs) =================================================================== --- trunk/ManagedWinapi/Accessibility/AccessibleObjectListener.cs (rev 0) +++ trunk/ManagedWinapi/Accessibility/AccessibleObjectListener.cs 2012-07-01 16:06:19 UTC (rev 113) @@ -0,0 +1,522 @@ +/* + * ManagedWinapi - A collection of .NET components that wrap PInvoke calls to + * access native API by managed code. http://mwinapi.sourceforge.net/ + * Copyright (C) 2006, 2007 Michael Schierl + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; see the file COPYING. if not, visit + * http://www.gnu.org/licenses/lgpl.html or write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +using System; +using System.ComponentModel; +using System.Runtime.InteropServices; +using Accessibility; + +namespace ManagedWinapi.Accessibility +{ + /// <summary> + /// Listens to events from the Windows accessibility system. These events are useful + /// if you want to write a screenreader or similar program. + /// </summary> + public class AccessibleEventListener : Component + { + /// <summary> + /// Occurs when an accessible event is received. + /// </summary> + public event AccessibleEventHandler EventOccurred; + + private bool enabled; + private IntPtr handle = IntPtr.Zero; + private AccessibleEventType min = AccessibleEventType.EVENT_MIN; + private AccessibleEventType max = AccessibleEventType.EVENT_MAX; + private WinEventDelegate internalDelegate; + private GCHandle gch; + private UInt32 processId = 0; + private UInt32 threadId = 0; + + /// <summary> + /// Initializes a new instance of this class with the specified container. + /// </summary> + /// <param name="container">The container to add it to.</param> + public AccessibleEventListener(IContainer container) + : this() + { + container.Add(this); + } + + /// <summary> + /// Initializes a new instance of this class. + /// </summary> + public AccessibleEventListener() + { + internalDelegate = new WinEventDelegate(InternalCallback); + gch = GCHandle.Alloc(internalDelegate); + } + + /// <summary> + /// Enables this listener so that it reports accessible events. + /// </summary> + public bool Enabled + { + get + { + return enabled; + } + set + { + enabled = value; + updateListener(); + } + } + + /// <summary> + /// The minimal event type to listen to. + /// </summary> + public AccessibleEventType MinimalEventType + { + get { return min; } + set { min = value; updateListener(); } + } + + /// <summary> + /// The maximal event type to listen to. + /// </summary> + public AccessibleEventType MaximalEventType + { + get { return max; } + set { max = value; updateListener(); } + } + + /// <summary> + /// The Process ID to listen to. + /// Default 0 listens to all processes. + /// </summary> + public UInt32 ProcessId + { + get { return processId; } + set { processId = value; updateListener(); } + } + + /// <summary> + /// The Thread ID to listen to. + /// Default 0 listens to all threads. + /// </summary> + public UInt32 ThreadId + { + get { return threadId; } + set { threadId = value; updateListener(); } + } + + private void updateListener() + { + if (handle != IntPtr.Zero) + { + UnhookWinEvent(handle); + handle = IntPtr.Zero; + } + if (enabled) + { + handle = SetWinEventHook(min, max, IntPtr.Zero, internalDelegate, processId, threadId, 0); + } + } + + /// <summary> + /// Releases all resources used by the System.ComponentModel.Component. + /// </summary> + /// <param name="disposing">Whether to dispose managed resources.</param> + protected override void Dispose(bool disposing) + { + if (enabled) + { + enabled = false; + updateListener(); + } + gch.Free(); + base.Dispose(disposing); + } + + private void InternalCallback(IntPtr hWinEventHook, AccessibleEventType eventType, + IntPtr hwnd, uint idObject, uint idChild, uint dwEventThread, uint dwmsEventTime) + { + if (hWinEventHook != handle) return; + AccessibleEventArgs aea = new AccessibleEventArgs(eventType, hwnd, idObject, idChild, dwEventThread, dwmsEventTime); + if (EventOccurred != null) + EventOccurred(this, aea); + } + + internal static SystemAccessibleObject GetAccessibleObject(AccessibleEventArgs e) + { + IAccessible iacc; + object child; + uint result = AccessibleObjectFromEvent(e.HWnd, e.ObjectID, e.ChildID, out iacc, out child); + if (result != 0) throw new Exception("AccessibleObjectFromPoint returned " + result); + return new SystemAccessibleObject(iacc, (int)child); + } + + #region PInvoke Declarations + + [DllImport("user32.dll")] + private static extern IntPtr SetWinEventHook(AccessibleEventType eventMin, AccessibleEventType eventMax, IntPtr + hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess, + uint idThread, uint dwFlags); + + [DllImport("user32.dll")] + static extern bool UnhookWinEvent(IntPtr hWinEventHook); + + private delegate void WinEventDelegate(IntPtr hWinEventHook, AccessibleEventType eventType, + IntPtr hwnd, uint idObject, uint idChild, uint dwEventThread, uint dwmsEventTime); + + [DllImport("oleacc.dll")] + private static extern uint AccessibleObjectFromEvent(IntPtr hwnd, uint dwObjectID, uint dwChildID, out IAccessible ppacc, [MarshalAs(UnmanagedType.Struct)] out object pvarChild); + + #endregion + } + + /// <summary> + /// Represents the method that will handle accessibility events. + /// </summary> + public delegate void AccessibleEventHandler(object sender, AccessibleEventArgs e); + + /// <summary> + /// Provides data for accessible events. + /// </summary> + public class AccessibleEventArgs : EventArgs + { + private AccessibleEventType eventType; + private IntPtr hWnd; + private uint idObject; + private uint idChild; + private uint dwEventThread; + private uint dwmsEventTime; + + /// <summary> + /// Initializes a new instance of the AccessibleEventArgs class. + /// </summary> + public AccessibleEventArgs(AccessibleEventType eventType, + IntPtr hwnd, uint idObject, uint idChild, uint dwEventThread, uint dwmsEventTime) + { + this.eventType = eventType; + this.hWnd = hwnd; + this.idObject = idObject; + this.idChild = idChild; + this.dwEventThread = dwEventThread; + this.dwmsEventTime = dwmsEventTime; + } + + /// <summary> + /// Type of this accessible event + /// </summary> + public AccessibleEventType EventType + { + get { return eventType; } + } + + /// <summary> + /// Handle of the affected window, if any. + /// </summary> + public IntPtr HWnd + { + get { return hWnd; } + } + + /// <summary> + /// Object ID. + /// </summary> + public uint ObjectID + { + get { return idObject; } + } + + /// <summary> + /// Child ID. + /// </summary> + public uint ChildID + { + get { return idChild; } + } + + /// <summary> + /// The thread that generated this event. + /// </summary> + public uint Thread + { + get { return dwEventThread; } + } + + /// <summary> + /// Time in milliseconds when the event was generated. + /// </summary> + public uint Time + { + get { return dwmsEventTime; } + } + + /// <summary> + /// The accessible object related to this event. + /// </summary> + public SystemAccessibleObject AccessibleObject + { + get + { + return AccessibleEventListener.GetAccessibleObject(this); + } + } + } + + /// <summary> + /// This enumeration lists known accessible event types. + /// </summary> + public enum AccessibleEventType + { + /// <summary> + /// Sent when a sound is played. Currently nothing is generating this, we + /// are going to be cleaning up the SOUNDSENTRY feature in the control panel + /// and will use this at that time. Applications implementing WinEvents + /// are perfectly welcome to use it. Clients of IAccessible* will simply + /// turn around and get back a non-visual object that describes the sound. + /// </summary> + EVENT_SYSTEM_SOUND = 0x0001, + + /// <summary> + /// Sent when an alert needs to be given to the user. MessageBoxes generate + /// alerts for example. + /// </summary> + EVENT_SYSTEM_ALERT = 0x0002, + + /// <summary> + /// Sent when the foreground (active) window changes, even if it is changing + /// to another window in the same thread as the previous one. + /// </summary> + EVENT_SYSTEM_FOREGROUND = 0x0003, + + /// <summary> + /// Sent when entering into and leaving from menu mode (system, app bar, and + /// track popups). + /// </summary> + EVENT_SYSTEM_MENUSTART = 0x0004, + + /// <summary> + /// Sent when entering into and leaving from menu mode (system, app bar, and + /// track popups). + /// </summary> + EVENT_SYSTEM_MENUEND = 0x0005, + + /// <summary> + /// Sent when a menu popup comes up and just before it is taken down. Note + /// that for a call to TrackPopupMenu(), a client will see EVENT_SYSTEM_MENUSTART + /// followed almost immediately by EVENT_SYSTEM_MENUPOPUPSTART for the popup + /// being shown. + /// </summary> + EVENT_SYSTEM_MENUPOPUPSTART = 0x0006, + + /// <summary> + /// Sent when a menu popup comes up and just before it is taken down. Note + /// that for a call to TrackPopupMenu(), a client will see EVENT_SYSTEM_MENUSTART + /// followed almost immediately by EVENT_SYSTEM_MENUPOPUPSTART for the popup + /// being shown. + /// </summary> + EVENT_SYSTEM_MENUPOPUPEND = 0x0007, + + + /// <summary> + /// Sent when a window takes the capture and releases the capture. + /// </summary> + EVENT_SYSTEM_CAPTURESTART = 0x0008, + + /// <summary> + /// Sent when a window takes the capture and releases the capture. + /// </summary> + EVENT_SYSTEM_CAPTUREEND = 0x0009, + + /// <summary> + /// Sent when a window enters and leaves move-size dragging mode. + /// </summary> + EVENT_SYSTEM_MOVESIZESTART = 0x000A, + + /// <summary> + /// Sent when a window enters and leaves move-size dragging mode. + /// </summary> + EVENT_SYSTEM_MOVESIZEEND = 0x000B, + + /// <summary> + /// Sent when a window enters and leaves context sensitive help mode. + /// </summary> + EVENT_SYSTEM_CONTEXTHELPSTART = 0x000C, + + /// <summary> + /// Sent when a window enters and leaves context sensitive help mode. + /// </summary> + EVENT_SYSTEM_CONTEXTHELPEND = 0x000D, + + /// <summary> + /// Sent when a window enters and leaves drag drop mode. Note that it is up + /// to apps and OLE to generate this, since the system doesn't know. Like + /// EVENT_SYSTEM_SOUND, it will be a while before this is prevalent. + /// </summary> + EVENT_SYSTEM_DRAGDROPSTART = 0x000E, + + /// <summary> + /// Sent when a window enters and leaves drag drop mode. Note that it is up + /// to apps and OLE to generate this, since the system doesn't know. Like + /// EVENT_SYSTEM_SOUND, it will be a while before this is prevalent. + /// </summary> + EVENT_SYSTEM_DRAGDROPEND = 0x000F, + + /// <summary> + /// Sent when a dialog comes up and just before it goes away. + /// </summary> + EVENT_SYSTEM_DIALOGSTART = 0x0010, + + /// <summary> + /// Sent when a dialog comes up and just before it goes away. + /// </summary> + EVENT_SYSTEM_DIALOGEND = 0x0011, + + /// <summary> + /// Sent when beginning and ending the tracking of a scrollbar in a window, + /// and also for scrollbar controls. + /// </summary> + EVENT_SYSTEM_SCROLLINGSTART = 0x0012, + + /// <summary> + /// Sent when beginning and ending the tracking of a scrollbar in a window, + /// and also for scrollbar controls. + /// </summary> + EVENT_SYSTEM_SCROLLINGEND = 0x0013, + + /// <summary> + /// Sent when beginning and ending alt-tab mode with the switch window. + /// </summary> + EVENT_SYSTEM_SWITCHSTART = 0x0014, + + /// <summary> + /// Sent when beginning and ending alt-tab mode with the switch window. + /// </summary> + EVENT_SYSTEM_SWITCHEND = 0x0015, + + /// <summary> + /// Sent when a window minimizes. + /// </summary> + EVENT_SYSTEM_MINIMIZESTART = 0x0016, + + /// <summary> + /// Sent just before a window restores. + /// </summary> + EVENT_SYSTEM_MINIMIZEEND = 0x0017, + + /// <summary> + /// hwnd + ID + idChild is created item + /// </summary> + EVENT_OBJECT_CREATE = 0x8000, + + /// <summary> + /// hwnd + ID + idChild is destroyed item + /// </summary> + EVENT_OBJECT_DESTROY = 0x8001, + + /// <summary> + /// hwnd + ID + idChild is shown item + /// </summary> + EVENT_OBJECT_SHOW = 0x8002, + + /// <summary> + /// hwnd + ID + idChild is hidden item + /// </summary> + EVENT_OBJECT_HIDE = 0x8003, + + /// <summary> + /// hwnd + ID + idChild is parent of zordering children + /// </summary> + EVENT_OBJECT_REORDER = 0x8004, + + /// <summary> + /// hwnd + ID + idChild is focused item + /// </summary> + EVENT_OBJECT_FOCUS = 0x8005, + + /// <summary> + /// hwnd + ID + idChild is selected item (if only one), or idChild is OBJID_WINDOW if complex + /// </summary> + EVENT_OBJECT_SELECTION = 0x8006, + + /// <summary> + /// hwnd + ID + idChild is item added + /// </summary> + EVENT_OBJECT_SELECTIONADD = 0x8007, + + /// <summary> + /// hwnd + ID + idChild is item removed + /// </summary> + EVENT_OBJECT_SELECTIONREMOVE = 0x8008, + + /// <summary> + /// hwnd + ID + idChild is parent of changed selected items + /// </summary> + EVENT_OBJECT_SELECTIONWITHIN = 0x8009, + + /// <summary> + /// hwnd + ID + idChild is item w/ state change + /// </summary> + EVENT_OBJECT_STATECHANGE = 0x800A, + + /// <summary> + /// hwnd + ID + idChild is moved/sized item + /// </summary> + EVENT_OBJECT_LOCATIONCHANGE = 0x800B, + + /// <summary> + /// hwnd + ID + idChild is item w/ name change + /// </summary> + EVENT_OBJECT_NAMECHANGE = 0x800C, + + /// <summary> + /// hwnd + ID + idChild is item w/ desc change + /// </summary> + EVENT_OBJECT_DESCRIPTIONCHANGE = 0x800D, + + /// <summary> + /// hwnd + ID + idChild is item w/ value change + /// </summary> + EVENT_OBJECT_VALUECHANGE = 0x800E, + + /// <summary> + /// hwnd + ID + idChild is item w/ new parent + /// </summary> + EVENT_OBJECT_PARENTCHANGE = 0x800F, + + /// <summary> + /// hwnd + ID + idChild is item w/ help change + /// </summary> + EVENT_OBJECT_HELPCHANGE = 0x8010, + + /// <summary> + /// hwnd + ID + idChild is item w/ def action change + /// </summary> + EVENT_OBJECT_DEFACTIONCHANGE = 0x8011, + + /// <summary> + /// hwnd + ID + idChild is item w/ keybd accel change + /// </summary> + EVENT_OBJECT_ACCELERATORCHANGE = 0x8012, + + /// <summary> + /// The lowest possible event value + /// </summary> + EVENT_MIN = 0x00000001, + + /// <summary> + /// The highest possible event value + /// </summary> + EVENT_MAX = 0x7FFFFFFF, + } +} Copied: trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs (from rev 112, trunk/ManagedWinapi/SystemAccessibleObject.cs) =================================================================== --- trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs (rev 0) +++ trunk/ManagedWinapi/Accessibility/SystemAccessibleObject.cs 2012-07-01 16:06:19 UTC (rev 113) @@ -0,0 +1,708 @@ +/* + * ManagedWinapi - A collection of .NET components that wrap PInvoke calls to + * access native API by managed code. http://mwinapi.sourceforge.net/ + * Copyright (C) 2006 Michael Schierl + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; see the file COPYING. if not, visit + * http://www.gnu.org/licenses/lgpl.html or write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +using System; +using System.Collections.Generic; +using System.Text; +using Accessibility; +using ManagedWinapi.Windows; +using System.Runtime.InteropServices; +using System.Drawing; +using System.Runtime.InteropServices.ComTypes; + +namespace ManagedWinapi.Accessibility +{ + /// <summary> + /// Provides access to the Active Accessibility API. Every <see cref="SystemWindow"/> + /// has one ore more AccessibleObjects attached that provide information about the + /// window to visually impaired people. This information is mainly used by screen + /// readers and other accessibility software.. + /// </summary> + public class SystemAccessibleObject + { + private IAccessible iacc; + private int childID; + + /// <summary> + /// The IAccessible instance of this object (if <see cref="ChildID"/> is zero) + /// or its parent. + /// </summary> + public IAccessible IAccessible { get { return iacc; } } + + /// <summary> + /// The underlying child ID + /// </summary> + public int ChildID { get { return childID; } } + + /// <summary> + /// Create an accessible object from an IAccessible instance and a child ID. + /// </summary> + public SystemAccessibleObject(IAccessible iacc, int childID) + { + if (iacc == null) throw new ArgumentNullException(); + //if (childID < 0) throw new ArgumentException(); + if (childID != 0) + { + try + { + object realChild = iacc.get_accChild(childID); + if (realChild != null) + { + iacc = (IAccessible)realChild; + childID = 0; + } + } + catch (ArgumentException) { } + catch (InvalidCastException) { } + } + this.iacc = iacc; + this.childID = childID; + } + + /// <summary> + /// Gets an accessibility object for given screen coordinates. + /// </summary> + public static SystemAccessibleObject FromPoint(int x, int y) + { + IAccessible iacc; + object ci; + IntPtr result = AccessibleObjectFromPoint(new ManagedWinapi.Windows.POINT(x, y), out iacc, out ci); + if (result != IntPtr.Zero) throw new Exception("AccessibleObjectFromPoint returned " + result.ToInt32()); + return new SystemAccessibleObject(iacc, (int)(ci ?? 0)); + } + + /// <summary> + /// Gets an accessibility object for a given window. + /// </summary> + /// <param name="window">The window</param> + /// <param name="objectID">Which accessibility object to get</param> + /// <returns></returns> + public static SystemAccessibleObject FromWindow(SystemWindow window, AccessibleObjectID objectID) + { + IAccessible iacc = (IAccessible)AccessibleObjectFromWindow(window == null ? IntPtr.Zero : window.HWnd, (uint)objectID, new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}")); + return new SystemAccessibleObject(iacc, 0); + } + + /// <summary> + /// Gets the automation object for a given window. + /// This is a COM object implementing the IDispatch interface, commonly + /// available from Microsoft Office windows. + /// </summary> + /// <param name="window">The window</param> + public static object COMObjectFromWindow(SystemWindow window) + { + return AccessibleObjectFromWindow(window == null ? IntPtr.Zero : window.HWnd, OBJID_NATIVEOM, new Guid("{00020400-0000-0000-C000-000000000046}")); + } + + /// <summary> + /// Gets an accessibility object for the mouse cursor. + /// </summary> + public static SystemAccessibleObject MouseCursor + { + get + { + return FromWindow(null, AccessibleObjectID.OBJID_CURSOR); + } + } + + /// <summary> + /// Gets an accessibility object for the input caret, or + /// <b>null</b> if there is none. + /// </summary> + public static SystemAccessibleObject Caret + { + get + { + try + { + return FromWindow(null, AccessibleObjectID.OBJID_CARET); + } + catch (COMException) + { + return null; + } + } + } + + /// <summary> + /// Convert a role number to a localized string. + /// </summary> + public static string RoleToString(int roleNumber) + { + StringBuilder sb = new StringBuilder(1024); + uint result = GetRoleText((uint)roleNumber, sb, 1024); + if (result == 0) throw new Exception("Invalid role number"); + return sb.ToString(); + } + + /// <summary> + /// Convert a state number (which may include more than one state bit) + /// to a localized string. + /// </summary> + public static String StateToString(int stateNumber) + { + if (stateNumber == 0) return "None"; + int lowBit = stateNumber & -stateNumber; + int restBits = stateNumber - lowBit; + String s1 = StateBitToString(lowBit); + if (restBits == 0) return s1; + return StateToString(restBits) + ", " + s1; + } + + /// <summary> + /// Convert a single state bit to a localized string. + /// </summary> + public static string StateBitToString(int stateBit) + { + StringBuilder sb = new StringBuilder(1024); + uint result = GetStateText((uint)stateBit, sb, 1024); + if (result == 0) throw new Exception("Invalid role number"); + return sb.ToString(); + } + + /// <summary> + /// The description of this accessible object. + /// </summary> + public string Description + { + get + { + try + { + return iacc.get_accDescription(childID); + } + catch (NotImplementedException) + { + return ""; + } + } + } + + /// <summary> + /// The name of this accessible object. + /// </summary> + public string Name + { + get + { + return iacc.get_accName(childID); + } + } + + /// <summary> + /// The role of this accessible object. This can either be an int + /// (for a predefined role) or a string. + /// </summary> + public object Role + { + get + { + return iacc.get_accRole(childID); + } + } + + /// <summary> + /// The role of this accessible object, as an integer. If this role + /// is not predefined, -1 is returned. + /// </summary> + public int RoleIndex + { + get + { + object role = Role; + if (role is int) + { + return (int)role; + } + else + { + return -1; + } + } + } + + /// <summary> + /// The role of this accessible object, as a localized string. + /// </summary> + public string RoleString + { + get + { + object role = Role; + if (role is int) + { + return RoleToString((int)role); + } + else if (role is string) + { + return (string)role; + } + else + { + return role.ToString(); + } + } + } + + /// <summary> + /// The location of this accessible object on screen. This rectangle + /// is the smallest rectangle that includes the whole object, but not + /// every point in the rectangle must be part of the object. + /// </summary> + public Rectangle Location + { + get + { + int x, y, w, h; + iacc.accLocation(out x, out y, out w, out h, childID); + return new Rectangle(x, y, w, h); + + } + } + + /// <summary> + /// The value of this accessible object. + /// </summary> + public string Value + { + get + { + try + { + return iacc.get_accValue(childID); + } + catch (COMException) + { + return null; + } + } + } + + /// <summary> + /// The state of this accessible object. + /// </summary> + public int State + { + get + { + try + { + return (int)iacc.get_accState(childID); + } + catch (COMException) + { + return 0; + } + } + } + + /// <summary> + /// A string representation of the state of this accessible object. + /// </summary> + public string StateString + { + get + { + return StateToString(State); + } + } + + /// <summary> + /// Whether this accessibile object is visible. + /// </summary> + public bool Visible + { + get + { + return (State & 0x8000) == 0; + } + } + + /// <summary> + /// The parent of this accessible object, or <b>null</b> if none exists. + /// </summary> + public SystemAccessibleObject Parent + { + get + { + if (childID != 0) return new SystemAccessibleObject(iacc, 0); + IAccessible p = (IAccessible)iacc.accParent; + if (p == null) return null; + return new SystemAccessibleObject(p, 0); + } + } + + /// <summary> + /// The keyboard shortcut of this accessible object. + /// </summary> + public string KeyboardShortcut + { + get + { + try + { + return iacc.get_accKeyboardShortcut(childID); + } + catch (ArgumentException) { return ""; } + catch (NotImplementedException) { return ""; } + catch (COMException) { return null; } + } + } + + /// <summary> + /// A string describing the default action of this accessible object. + /// For a button, this might be "Press". + /// </summary> + public string DefaultAction + { + get + { + try + { + return iacc.get_accDefaultAction(childID); + } + catch (COMException) { return null; } + } + } + + /// <summary> + /// Perform the default action of this accessible object. + /// </summary> + public void DoDefaultAction() + { + iacc.accDoDefaultAction(ChildID); + } + + /// <summary> + /// Get all objects of this accessible object that are selected. + /// </summary> + public SystemAccessibleObject[] SelectedObjects + { + get + { + if (childID != 0) return new SystemAccessibleObject[0]; + object sel; + try + { + sel = iacc.accSelection; + } + catch (NotImplementedException) + { + return new SystemAccessibleObject[0]; + } + catch (COMException) + { + return new SystemAccessibleObject[0]; + } + if (sel == null) return new SystemAccessibleObject[0]; + if (sel is IEnumVARIANT) + { + IEnumVARIANT e = (IEnumVARIANT)sel; + e.Reset(); + List<SystemAccessibleObject> retval = new List<SystemAccessibleObject>(); + object[] tmp = new object[1]; + while (e.Next(1, tmp, IntPtr.Zero) == 0) + { + if (tmp[0] is int && (int)tmp[0] < 0) break; + retval.Add(ObjectToSAO(tmp[0])); + } + return retval.ToArray(); + } + else + { + if (sel is int && (int)sel < 0) + { + return new SystemAccessibleObject[0]; + } + return new SystemAccessibleObject[] { ObjectToSAO(sel) }; + } + } + } + + private SystemAccessibleObject ObjectToSAO(object obj) + { + if (obj is int) + { + return new SystemAccessibleObject(iacc, (int)obj); + } + else + { + return new SystemAccessibleObject((IAccessible)obj, 0); + } + } + + /// <summary> + /// Get the SystemWindow that owns this accessible object. + /// </summary> + public SystemWindow Window + { + get + { + IntPtr hwnd; + WindowFromAccessibleObject(iacc, out hwnd); + return new SystemWindow(hwnd); + } + } + + /// <summary> + /// Get all child accessible objects. + /// </summary> + public SystemAccessibleObject[] Children + { + get + { + // ID-referenced objects cannot have children + if (childID != 0) return new SystemAccessibleObject[0]; + + int cs = iacc.accChildCount, csReal; + object[] children = new object[cs * 2]; + + uint result = AccessibleChildren(iacc, 0, cs * 2, children, out csReal); + if (result != 0 && result != 1) + return new SystemAccessibleObject[0]; + if (csReal == 1 && children[0] is int && (int)children[0] < 0) + return new SystemAccessibleObject[0]; + List<SystemAccessibleObject> values = new List<SystemAccessibleObject>(); + for (int i = 0; i < children.Length; i++) + { + if (children[i] != null) + { + try + { + values.Add(ObjectToSAO(children[i])); + } + catch (InvalidCastException) { } + } + } + return values.ToArray(); + } + } + + /// <summary> + /// Highlight the accessible object with a red border. + /// </summary> + public void Highlight() + { + Rectangle objectLocation = Location; + SystemWindow window = Window; + Rectangle windowLocation = window.Rectangle; + using (WindowDeviceContext windowDC = window.GetDeviceContext(false)) + { + using (Graphics g = windowDC.CreateGraphics()) + { + g.DrawRectangle(new Pen(Color.Red, 4), objectLocation.X - windowLocation.X, objectLocation.Y - windowLocation.Y, objectLocation.Width, objectLocation.Height); + } + } + } + + #region Equals and HashCode + + /// + public override bool Equals(System.Object obj) + { + if (obj == null) + { + return false; + } + SystemAccessibleObject sao = obj as SystemAccessibleObject; + return Equals(sao); + } + + /// + public bool Equals(SystemAccessibleObject sao) + { + if ((object)sao == null) + { + return false; + } + return childID == sao.childID && DeepEquals(iacc, sao.iacc); + } + + private static bool DeepEquals(IAccessible ia1, IAccessible ia2) + { + if (ia1.Equals(ia2)) return true; + if (Marshal.GetIUnknownForObject(ia1) == Marshal.GetIUnknownForObject(ia2)) return true; + try + { + if (ia1.accChildCount != ia2.accChildCount) return false; + SystemAccessibleObject sa1 = new SystemAccessibleObject(ia1, 0); + SystemAccessibleObject sa2 = new SystemAccessibleObject(ia2, 0); + if (sa1.Window.HWnd != sa2.Window.HWnd) return false; + if (sa1.Location != sa2.Location) return false; + if (sa1.DefaultAction != sa2.DefaultAction) return false; + if (sa1.Description != sa2.Description) return false; + if (sa1.KeyboardShortcut != sa2.KeyboardShortcut) return false; + if (sa1.Name != sa2.Name) return false; + if (!sa1.Role.Equals(sa2.Role)) return false; + if (sa1.State != sa2.State) return false; + if (sa1.Value != sa2.Value) return false; + if (sa1.Visible != sa2.Visible) return false; + if (ia1.accParent == null && ia2.accParent == null) return true; + if (ia1.accParent == null || ia2.accParent == null) return false; + } + catch (COMException) + { + return false; + } + bool de = DeepEquals((IAccessible)ia1.accParent, (IAccessible)ia2.accParent); + return de; + } + + /// + public override int GetHashCode() + { + return childID ^ iacc.GetHashCode(); + } + + /// <summary> + /// Compare two instances of this class for equality. + /// </summary> + public static bool operator ==(SystemAccessibleObject a, SystemAccessibleObject b) + { + if (System.Object.ReferenceEquals(a, b)) + { + return true; + } + if (((object)a == null) || ((object)b == null)) + { + return false; + } + return a.iacc == b.iacc && a.childID == b.childID; + } + + /// <summary> + /// Compare two instances of this class for inequality. + /// </summary> + public static bool operator !=(SystemAccessibleObject a, SystemAccessibleObject b) + { + return !(a == b); + } + + /// + public override string ToString() + { + try + { + return Name + " [" + RoleString + "]"; + } + catch + { + return "??"; + } + } + + #endregion + + #region PInvoke Declarations + + const uint OBJID_NATIVEOM = 0xFFFFFFF0; + + [DllImport("oleacc.dll")] + private static extern IntPtr AccessibleObjectFromPoint(POINT pt, [Out, MarshalAs(UnmanagedType.Interface)] out IAccessible accObj, [Out] out object ChildID); + [DllImport("oleacc.dll")] + private static extern uint GetRoleText(uint dwRole, [Out] StringBuilder lpszRole, uint cchRoleMax); + + [DllImport("oleacc.dll", ExactSpelling = true, PreserveSig = false)] + [return: MarshalAs(UnmanagedType.Interface)] + private static extern object AccessibleObjectFromWindow( + IntPtr hwnd, + uint dwObjectID, + [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid); + + [DllImport("oleacc.dll")] + private static extern uint GetStateText(uint dwStateBit, [Out] StringBuilder lpszStateBit, uint cchStateBitMax); + + [DllImport("oleacc.dll")] + private static extern uint WindowFromAccessibleObject(IAccessible pacc, out IntPtr phwnd); + + [DllImport("oleacc.dll")] + private static extern uint AccessibleChildren(IAccessible paccContainer, int iChildStart, int cChildren, [Out] object[] rgvarChildren, out int pcObtained); + + #endregion + } + + /// <summary> + /// This enumeration lists all kinds of accessible objects that can + /// be directly assigned to a window. + /// </summary> + public enum AccessibleObjectID : uint + { + /// <summary> + /// The window itself. + /// </summary> + OBJID_WINDOW = 0x00000000, + + /// <summary> + /// The system menu. + /// </summary> + OBJID_SYSMENU = 0xFFFFFFFF, + + /// <summary> + /// The title bar. + /// </summary> + OBJID_TITLEBAR = 0xFFFFFFFE, + + /// <summary> + /// The menu. + /// </summary> + OBJID_MENU = 0xFFFFFFFD, + + /// <summary> + /// The client area. + /// </summary> + OBJID_CLIENT = 0xFFFFFFFC, + + /// <summary> + /// The vertical scroll bar. + /// </summary> + OBJID_VSCROLL = 0xFFFFFFFB, + + /// <summary> + /// The horizontal scroll bar. + /// </summary> + OBJID_HSCROLL = 0xFFFFFFFA, + + /// <summary> + /// The size grip (part in the lower right corner that + /// makes resizing the window easier). + /// </summary> + OBJID_SIZEGRIP = 0xFFFFFFF9, + + /// <summary> + /// The caret (text cursor). + /// </summary> + OBJID_CARET = 0xFFFFFFF8, + + /// <summary> + /// The mouse cursor. There is only one mouse + /// cursor and it is not assigned to any window. + /// </summary> + OBJID_CURSOR = 0xFFFFFFF7, + + /// <summary> + /// An alert window. + /// </summary> + OBJID_ALERT = 0xFFFFFFF6, + + /// <summary> + /// A sound this window is playing. + /// </summary> + OBJID_SOUND = 0xFFFFFFF5 + } +} Deleted: trunk/ManagedWinapi/AccessibleObjectListener.cs =================================================================== --- trunk/ManagedWinapi/AccessibleObjectListener.cs 2012-04-20 16:24:56 UTC (rev 112) +++ trunk/ManagedWinapi/AccessibleObjectListener.cs 2012-07-01 16:06:19 UTC (rev 113) @@ -1,522 +0,0 @@ -/* - * ManagedWinapi - A collection of .NET components that wrap PInvoke calls to - * access native API by managed code. http://mwinapi.sourceforge.net/ - * Copyright (C) 2006, 2007 Michael Schierl - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; see the file COPYING. if not, visit - * http://www.gnu.org/licenses/lgpl.html or write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ -using System; -using System.ComponentModel; -using System.Runtime.InteropServices; -using Accessibility; - -namespace ManagedWinapi.Accessibility -{ - /// <summary> - /// Listens to events from the Windows accessibility system. These events are useful - /// if you want to write a screenreader or similar program. - /// </summary> - public class AccessibleEventListener : Component - { - /// <summary> - /// Occurs when an accessible event is received. - /// </summary> - public event AccessibleEventHandler EventOccurred; - - private bool enabled; - private IntPtr handle = IntPtr.Zero; - private AccessibleEventType min = AccessibleEventType.EVENT_MIN; - private AccessibleEventType max = AccessibleEventType.EVENT_MAX; - private WinEventDelegate internalDelegate; - private GCHandle gch; - private UInt32 processId = 0; - private UInt32 threadId = 0; - - /// <summary> - /// Initializes a new instance of this class with the specified container. - /// </summary> - /// <param name="container">The container to add it to.</param> - public AccessibleEventListener(IContainer container) - : this() - { - container.Add(this); - } - - /// <summary> - /// Initializes a new instance of this class. - /// </summary> - public AccessibleEventListener() - { - internalDelegate = new WinEventDelegate(InternalCallback); - gch = GCHandle.Alloc(internalDelegate); - } - - /// <summary> - /// Enables this listener so that it reports accessible events. - /// </summary> - public bool Enabled - { - get - { - return enabled; - } - set - { - enabled = value; - updateListener(); - } - } - - /// <summary> - /// The minimal event type to listen to. - /// </summary> - public AccessibleEventType MinimalEventType - { - get { return min; } - set { min = value; updateListener(); } - } - - /// <summary> - /// The maximal event type to listen to. - /// </summary> - public AccessibleEventType MaximalEventType - { - get { return max; } - set { max = value; updateListener(); } - } - - /// <summary> - /// The Process ID to listen to. - /// Default 0 listens to all processes. - /// </summary> - public UInt32 ProcessId - { - get { return processId; } - set { processId = value; updateListener(); } - } - - /// <summary> - /// The Thread ID to listen to. - /// Default 0 listens to all threads. - /// </summary> - public UInt32 ThreadId - { - get { return threadId; } - set { threadId = value; updateListener(); } - } - - private void updateListener() - { - if (handle != IntPtr.Zero) - { - UnhookWinEvent(handle); - handle = IntPtr.Zero; - } - if (enabled) - { - handle = SetWinEventHook(min, max, IntPtr.Zero, internalDelegate, processId, threadId, 0); - } - } - - /// <summary> - /// Releases all resources used by the System.ComponentModel.Component. - /// </summary> - /// <param name="disposing">Whether to dispose managed resources.</param> - protected override void Dispose(bool disposing) - { - if (enabled) - { - enabled = false; - updateListener(); - } - gch.Free(); - base.Dispose(disposing); - } - - private void InternalCallback(IntPtr hWinEventHook, AccessibleEventType eventType, - IntPtr hwnd, uint idObject, uint idChild, uint dwEventThread, uint dwmsEventTime) - { - if (hWinEventHook != handle) return; - AccessibleEventArgs aea = new AccessibleEventArgs(eventType, hwnd, idObject, idChild, dwEventThread, dwmsEventTime); - if (EventOccurred != null) - EventOccurred(this, aea); - } - - internal static SystemAccessibleObject GetAccessibleObject(AccessibleEventArgs e) - { - IAccessible iacc; - object child; - uint result = AccessibleObjectFromEvent(e.HWnd, e.ObjectID, e.ChildID, out iacc, out child); - if (result != 0) throw new Exception("AccessibleObjectFromPoint returned " + result); - return new SystemAccessibleObject(iacc, (int)child); - } - - #region PInvoke Declarations - - [DllImport("user32.dll")] - private static extern IntPtr SetWinEventHook(AccessibleEventType eventMin, AccessibleEventType eventMax, IntPtr - hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess, - uint idThread, uint dwFlags); - - [DllImport("user32.dll")] - static extern bool UnhookWinEvent(IntPtr hWinEventHook); - - private delegate void WinEventDelegate(IntPtr hWinEventHook, AccessibleEventType eventType, - IntPtr hwnd, uint idObject, uint idChild, uint dwEventThread, uint dwmsEventTime); - - [DllImport("oleacc.dll")] - private static extern uint AccessibleObjectFromEvent(IntPtr hwnd, uint dwObjectID, uint dwChildID, out IAccessible ppacc, [MarshalAs(UnmanagedType.Struct)] out object pvarChild); - - #endregion - } - - /// <summary> - /// Represents the method that will handle accessibility events. - /// </summary> - public delegate void AccessibleEventHandler(object sender, AccessibleEventArgs e); - - /// <summary> - /// Provides data for accessible events. - /// </summary> - public class AccessibleEventArgs : EventArgs - { - private AccessibleEventType eventType; - private IntPtr hWnd; - private uint idObject; - private uint idChild; - private uint dwEventThread; - private uint dwmsEventTime; - - /// <summary> - /// Initializes a new instance of the AccessibleEventArgs class. - /// </summary> - public AccessibleEventArgs(AccessibleEventType eventType, - IntPtr hwnd, uint idObject, uint idChild, uint dwEventThread, uint dwmsEventTime) - { - this.eventType = eventType; - this.hWnd = hwnd; - this.idObject = idObject; - this.idChild = idChild; - this.dwEventThread = dwEventThread; - this.dwmsEventTime = dwmsEventTime; - } - - /// <summary> - /// Type of this accessible event - /// </summary> - public AccessibleEventType EventType - { - get { return eventType; } - } - - /// <summary> - /// Handle of the affected window, if any. - /// </summary> - public IntPtr HWnd - { - get { return hWnd; } - } - - /// <summary> - /// Object ID. - /// </summary> - public uint ObjectID - { - get { return idObject; } - } - - /// <summary> - /// Child ID. - /// </summary> - public uint ChildID - { - get { return idChild; } - } - - /// <summary> - /// The thread that generated this event. - /// </summary> - public uint Thread - { - get { return dwEventThread; } - } - - /// <summary> - /// Time in milliseconds when the event was generated. - /// </summary> - public uint Time - { - get { return dwmsEventTime; } - } - - /// <summary> - /// The accessible object related to this event. - /// </summary> - public SystemAccessibleObject AccessibleObject - { - get - { - return AccessibleEventListener.GetAccessibleObject(this); - } - } - } - - /// <summary> - /// This enumeration lists known accessible event types. - /// </summary> - public enum AccessibleEventType - { - /// <summary> - /// Sent when a sound is played. Currently nothing is generating this, we - /// are going to be cleaning up the SOUNDSENTRY feature in the control panel - /// and will use this at that time. Applications implementing WinEvents - /// are perfectly welcome to use it. Clients of IAccessible* will simply - /// turn around and get back a non-visual object that describes the sound. - /// </summary> - EVENT_SYSTEM_SOUND = 0x0001, - - /// <summary> - /// Sent when an alert needs to be given to the user. MessageBoxes generate - /// alerts for example. - /// </summary> - EVENT_SYSTEM_ALERT = 0x0002, - - /// <summary> - /// Sent when the foreground (active) window changes, even if it is changing - /// to another window in the same thread as the previous one. - /// </summary> - EVENT_SYSTEM_FOREGROUND = 0x0003, - - /// <summary> - /// Sent when entering into and leaving from menu mode (system, app bar, and - /// track popups). - /// </summary> - EVENT_SYSTEM_MENUSTART = 0x0004, - - /// <summary> - /// Sent when entering into and leaving from menu mode (system, app bar, and - /// track popups). - /// </summary> - EVENT_SYSTEM_MENUEND = 0x0005, - - /// <summary> - /// Sent when a menu popup comes up and just before it is taken down. Note - /// that for a call to TrackPopupMenu(), a client will see EVENT_SYSTEM_MENUSTART - /// followed almost immediately by EVENT_SYSTEM_MENUPOPUPSTART for the popup - /// being shown. - /// </summary> - EVENT_SYSTEM_MENUPOPUPSTART = 0x0006, - - /// <summary> - /// Sent when a menu popup comes up and just before it is taken down. Note - /// that for a call to TrackPopupMenu(), a client will see EVENT_SYSTEM_MENUSTART - /// followed almost immediately by EVENT_SYSTEM_MENUPOPUPSTART for the popup - /// being shown. - /// </summary> - EVENT_SYSTEM_MENUPOPUPEND = 0x0007, - - - /// <summary> - /// Sent when a window takes the capture and releases the capture. - /// </summary> - EVENT_SYSTEM_CAPTURESTART = 0x0008, - - /// <summary> - /// Sent when a window takes the capture and releases the capture. - /// </summary> - EVENT_SYSTEM_CAPTUREEND = 0x0009, - - /// <summary> - /// Sent when a window enters and leaves move-size dragging mode. - /// </summary> - EVENT_SYSTEM_MOVESIZESTART = 0x000A, - - /// <summary> - /// Sent when a window enters and leaves move-size dragging mode. - /// </summary> - EVENT_SYSTEM_MOVESIZEEND = 0x000B, - - /// <summary> - /// Sent when a window enters and leaves context sensitive help mode. - /// </summary> - EVENT_SYSTEM_CONTEXTHELPSTART = 0x000C, - - /// <summary> - /// Sent when a window enters and leaves context sensitive help mode. - /// </summary> - EVENT_SYSTEM_CONTEXTHELPEND = 0x000D, - - /// <summary> - /// Sent when a window enters and leaves drag drop mode. Note that it is up - /// to apps and OLE to generate this, since the system doesn't know. Like - /// EVENT_SYSTEM_SOUND, it will be a while before this is prevalent. - /// </summary> - EVENT_SYSTEM_DRAGDROPSTART = 0x000E, - - /// <summary> - /// Sent when a window enters and leaves drag drop mode. Note that it is up - /// to apps and OLE to generate this, since the system doesn't know. Like - /// EVENT_SYSTEM_SOUND, it will be a while before this is prevalent. - /// </summary> - EVENT_SYSTEM_DRAGDROPEND = 0x000F, - - /// <summary> - /// Sent when a dialog comes up and just before it goes away. - /// </summary> - EVENT_SYSTEM_DIALOGSTART = 0x0010, - - /// <summary> - /// Sent when a dialog comes up and just before it goes away. - /// </summary> - EVENT_SYSTEM_DIALOGEND = 0x0011, - - /// <summary> - /// Sent when beginning and ending the tracking of a scrollbar in a window, - /// and also for scrollbar controls. - /// </summary> - EVENT_SYSTEM_SCROLLINGSTART = 0x0012, - - /// <summary> - /// Sent when beginning and ending the tracking of a scrollbar in a window, - /// and also for scrollbar controls. - /// </summary> - EVENT_SYSTEM_SCROLLINGEND = 0x0013, - - /// <summary> - /// Sent when beginning and ending alt-tab mode with the switch window. - /// </summary> - EVENT_SYSTEM_SWITCHSTART = 0x0014, - - /// <summary> - /// Sent when beginning and ending alt-tab mode with the switch window. - /// </summary> - EVENT_SYSTEM_SWITCHEND = 0x0015, - - /// <summary> - /// Sent when a window minimizes. - /// </summary> - EVENT_SYSTEM_MINIMIZESTART = 0x0016, - - /// <summary> - /// Sent just before a window restores. - /// </summary> - EVENT_SYSTEM_MINIMIZEEND = 0x0017, - - /// <summary> - /// hwnd + ID + idChild is created item - /// </summary> - EVENT_OBJECT_CREATE = 0x8000, - - /// <summary> - /// hwnd + ID + idChild is destroyed item - /// </summary> - EVENT_OBJECT_DESTROY = 0x8001, - - /// <summary> - /// hwnd + ID + idChild is shown item - /// </summary> - EVENT_OBJECT_SHOW = 0x8002, - - /// <summary> - /// hwnd + ID + idChild is hidden item - /// </summary> - EVENT_OBJECT_HIDE = 0x8003, - - /// <summary> - /// hwnd + ID + idChild is parent of zordering children - /// </summary> - ... [truncated message content] |
From: <sch...@us...> - 2012-04-20 16:25:05
|
Revision: 112 http://mwinapi.svn.sourceforge.net/mwinapi/?rev=112&view=rev Author: schierlm Date: 2012-04-20 16:24:56 +0000 (Fri, 20 Apr 2012) Log Message: ----------- - Detect ListView/TreeView by ClassName if empty - Speed up ListView grabbing by caching the SystemWindow.Process object [thanks to Yusufi Bharmal for the suggestions] Modified Paths: -------------- trunk/ManagedWinapi/Contents/ListParser.cs trunk/ManagedWinapi/SystemListView.cs trunk/ManagedWinapi/SystemTreeView.cs trunk/ManagedWinapi/SystemWindow.cs Modified: trunk/ManagedWinapi/Contents/ListParser.cs =================================================================== --- trunk/ManagedWinapi/Contents/ListParser.cs 2012-01-03 21:56:22 UTC (rev 111) +++ trunk/ManagedWinapi/Contents/ListParser.cs 2012-04-20 16:24:56 UTC (rev 112) @@ -206,14 +206,14 @@ { uint LVM_GETITEMCOUNT = (0x1000 + 4); int cnt = sw.SendGetMessage(LVM_GETITEMCOUNT); - return cnt != 0; + return cnt != 0 || sw.ClassName == "SysListView32"; } internal override WindowContent ParsePreviewContent(SystemWindow sw) { uint LVM_GETITEMCOUNT = (0x1000 + 4); int cnt = sw.SendGetMessage(LVM_GETITEMCOUNT); - if (cnt == 0) throw new Exception(); + if (cnt == 0 && sw.ClassName != "SysListView32") throw new Exception(); SystemAccessibleObject o = SystemAccessibleObject.FromWindow(sw, AccessibleObjectID.OBJID_CLIENT); if (o.RoleIndex == 33) { @@ -229,7 +229,7 @@ { uint LVM_GETITEMCOUNT = (0x1000 + 4); int cnt = sw.SendGetMessage(LVM_GETITEMCOUNT); - if (cnt == 0) throw new Exception(); + if (cnt == 0 && sw.ClassName != "SysListView32") throw new Exception(); try { SystemListView slv = SystemListView.FromSystemWindow(sw); @@ -410,7 +410,7 @@ internal override bool CanParseContent(SystemWindow sw) { int cnt = sw.SendGetMessage(TVM_GETCOUNT, 0); - return cnt != 0; + return cnt != 0 || sw.ClassName == "SysTreeView32"; } internal override WindowContent ParsePreviewContent(SystemWindow sw) Modified: trunk/ManagedWinapi/SystemListView.cs =================================================================== --- trunk/ManagedWinapi/SystemListView.cs 2012-01-03 21:56:22 UTC (rev 111) +++ trunk/ManagedWinapi/SystemListView.cs 2012-04-20 16:24:56 UTC (rev 112) @@ -36,7 +36,7 @@ /// </summary> public static SystemListView FromSystemWindow(SystemWindow sw) { - if (sw.SendGetMessage(LVM_GETITEMCOUNT) == 0) return null; + if (sw.SendGetMessage(LVM_GETITEMCOUNT) == 0 && sw.ClassName != "SysListView32") return null; return new SystemListView(sw); } Modified: trunk/ManagedWinapi/SystemTreeView.cs =================================================================== --- trunk/ManagedWinapi/SystemTreeView.cs 2012-01-03 21:56:22 UTC (rev 111) +++ trunk/ManagedWinapi/SystemTreeView.cs 2012-04-20 16:24:56 UTC (rev 112) @@ -36,7 +36,7 @@ /// </summary> public static SystemTreeView FromSystemWindow(SystemWindow sw) { - if (sw.SendGetMessage(TVM_GETCOUNT) == 0) return null; + if (sw.SendGetMessage(TVM_GETCOUNT) == 0 && sw.ClassName != "SysTreeView32") return null; return new SystemTreeView(sw); } Modified: trunk/ManagedWinapi/SystemWindow.cs =================================================================== --- trunk/ManagedWinapi/SystemWindow.cs 2012-01-03 21:56:22 UTC (rev 111) +++ trunk/ManagedWinapi/SystemWindow.cs 2012-04-20 16:24:56 UTC (rev 112) @@ -786,6 +786,8 @@ return IsChild(ancestor._hwnd, _hwnd); } + private Process _cachedProcess = null; + /// <summary> /// The process which created this window. /// </summary> @@ -793,9 +795,13 @@ { get { - int pid; - GetWindowThreadProcessId(HWnd, out pid); - return Process.GetProcessById(pid); + if (_cachedProcess == null) + { + int pid; + GetWindowThreadProcessId(HWnd, out pid); + _cachedProcess = Process.GetProcessById(pid); + } + return _cachedProcess; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sch...@us...> - 2012-01-03 21:56:28
|
Revision: 111 http://mwinapi.svn.sourceforge.net/mwinapi/?rev=111&view=rev Author: schierlm Date: 2012-01-03 21:56:22 +0000 (Tue, 03 Jan 2012) Log Message: ----------- Add support for requesting COM Automation object from a window, useful for controlling Microsoft Office applications. [submitted by S?\195?\169bastien de Menten <sdementen at gmail dot com>] Modified Paths: -------------- trunk/ManagedWinapi/SystemAccessibleObject.cs Modified: trunk/ManagedWinapi/SystemAccessibleObject.cs =================================================================== --- trunk/ManagedWinapi/SystemAccessibleObject.cs 2011-10-15 17:25:38 UTC (rev 110) +++ trunk/ManagedWinapi/SystemAccessibleObject.cs 2012-01-03 21:56:22 UTC (rev 111) @@ -100,6 +100,17 @@ } /// <summary> + /// Gets the automation object for a given window. + /// This is a COM object implementing the IDispatch interface, commonly + /// available from Microsoft Office windows. + /// </summary> + /// <param name="window">The window</param> + public static object COMObjectFromWindow(SystemWindow window) + { + return AccessibleObjectFromWindow(window == null ? IntPtr.Zero : window.HWnd, OBJID_NATIVEOM, new Guid("{00020400-0000-0000-C000-000000000046}")); + } + + /// <summary> /// Gets an accessibility object for the mouse cursor. /// </summary> public static SystemAccessibleObject MouseCursor @@ -600,6 +611,8 @@ #region PInvoke Declarations + const uint OBJID_NATIVEOM = 0xFFFFFFF0; + [DllImport("oleacc.dll")] private static extern IntPtr AccessibleObjectFromPoint(POINT pt, [Out, MarshalAs(UnmanagedType.Interface)] out IAccessible accObj, [Out] out object ChildID); [DllImport("oleacc.dll")] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sch...@us...> - 2011-10-15 17:25:44
|
Revision: 110 http://mwinapi.svn.sourceforge.net/mwinapi/?rev=110&view=rev Author: schierlm Date: 2011-10-15 17:25:38 +0000 (Sat, 15 Oct 2011) Log Message: ----------- Add magic entry for WPF Modified Paths: -------------- trunk/Tools/GuessEXE/magic.txt Modified: trunk/Tools/GuessEXE/magic.txt =================================================================== --- trunk/Tools/GuessEXE/magic.txt 2011-07-14 18:26:46 UTC (rev 109) +++ trunk/Tools/GuessEXE/magic.txt 2011-10-15 17:25:38 UTC (rev 110) @@ -1,3 +1,4 @@ +WNDCLASS,Windows Presentation Foundation,!>HwndWrapper\[.*;;[0-9a-f-]+\],HwndWrapper\[.*;;[0-9a-f-]+\] WNDCLASS,Windows .NET Forms 10,!>WindowsForms10\.Window\..* WNDCLASS,Windows .NET Forms,!>WindowsForms[0-9]+\.Window\..* WNDCLASS,Windows .NET Forms 10 (Without Toplevel),!~.*,WindowsForms10\..* @@ -31,6 +32,7 @@ IMPORT,Maybe MFC (DLL),~,MFC? (DLL),MFC.*\.DLL IMPORT,Cygwin,>,cygwin1\.dll SECTION,UPX compressed,!>,UPX0,UPX1 +SUMMARY,Microsoft .NET 2.0 WPF,!>,IMPORTS=Microsoft \.NET,STUB=0\+default,WNDCLASS=Windows Presentation Foundation SUMMARY,Microsoft .NET 2.0,!>,IMPORTS=Microsoft \.NET,STUB=0\+default,WNDCLASS=Windows \.NET Forms 10 SUMMARY,Visual Basic 6.0,!>,IMPORTS=Visual Basic 6\.0,STUB=56\+default,WNDCLASS=Visual Basic 6\.0 \(Runtime\) SUMMARY,Visual Basic 6.0,!>,IMPORTS=Visual Basic 6\.0,STUB=64\+default,WNDCLASS=Visual Basic 6\.0 \(Runtime\) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sch...@us...> - 2011-07-14 18:26:52
|
Revision: 109 http://mwinapi.svn.sourceforge.net/mwinapi/?rev=109&view=rev Author: schierlm Date: 2011-07-14 18:26:46 +0000 (Thu, 14 Jul 2011) Log Message: ----------- Replace System.Windows.Forms.Message structure by custom structure which correctly marshals the time and POINT fields. Keep the old delegate and methods as obsolete ones to not break compatibility (thanks to Daniel Rose). Modified Paths: -------------- trunk/ManagedWinapi/Hook.cs trunk/ManagedWinapi/JournalHook.cs trunk/ManagedWinapi/PInvokeTypes.cs Modified: trunk/ManagedWinapi/Hook.cs =================================================================== --- trunk/ManagedWinapi/Hook.cs 2011-07-13 17:24:53 UTC (rev 108) +++ trunk/ManagedWinapi/Hook.cs 2011-07-14 18:26:46 UTC (rev 109) @@ -26,6 +26,7 @@ using System.Diagnostics; using System.Reflection; using System.Threading; +using ManagedWinapi.Windows; namespace ManagedWinapi.Hooks { @@ -226,20 +227,40 @@ public class LocalMessageHook : Hook { /// <summary> - /// Called when a message has been intercepted. + /// Called when a message has been intercepted. Since this callback uses an incorrect + /// <see cref="System.Windows.Forms.Message"/> marshalling, it has been replaced by the + /// <see cref="MSGOccurred"/> event. /// </summary> + [Obsolete("Use MSGOccurred instead")] public event MessageCallback MessageOccurred; /// <summary> - /// Represents a method that handles a message from a message hook. + /// Represents a method that handles a message from a message hook. Since this callback + /// uses an incorrect <see cref="System.Windows.Forms.Message"/> marshalling, it has + /// been replaced by the <see cref="MSGCallback"/> event. /// </summary> /// <param name="msg"></param> + [Obsolete("Use MSGCallback instead")] public delegate void MessageCallback(Message msg); /// <summary> - /// Creates a local message hook and hooks it. + /// Called when a message has been intercepted. /// </summary> + public event MSGCallback MSGOccurred; + + /// <summary> + /// Represents a method that handles a message from a message hook. + /// </summary> + /// <param name="msg"></param> + public delegate void MSGCallback(MSG msg); + + /// <summary> + /// Creates a local message hook and hooks it. Since this constructor + /// uses an incorrect <see cref="System.Windows.Forms.Message"/> marshalling, it has + /// been replaced by constructor taking a <see cref="MSGCallback"/>. + /// </summary> /// <param name="callback"></param> + [Obsolete] public LocalMessageHook(MessageCallback callback) : this() { @@ -248,6 +269,17 @@ } /// <summary> + /// Creates a local message hook and hooks it. + /// </summary> + /// <param name="callback"></param> + public LocalMessageHook(MSGCallback callback) + : this() + { + this.MSGOccurred = callback; + StartHook(); + } + + /// <summary> /// Creates a local message hook. /// </summary> public LocalMessageHook() @@ -260,9 +292,14 @@ { if (code == HC_ACTION) { - Message msg = (Message)Marshal.PtrToStructure(lParam, typeof(Message)); + if (MSGOccurred != null) + { + MSG msg = (MSG)Marshal.PtrToStructure(lParam, typeof(MSG)); + MSGOccurred(msg); + } if (MessageOccurred != null) { + Message msg = (Message)Marshal.PtrToStructure(lParam, typeof(MSG)); MessageOccurred(msg); } } Modified: trunk/ManagedWinapi/JournalHook.cs =================================================================== --- trunk/ManagedWinapi/JournalHook.cs 2011-07-13 17:24:53 UTC (rev 108) +++ trunk/ManagedWinapi/JournalHook.cs 2011-07-14 18:26:46 UTC (rev 109) @@ -22,6 +22,7 @@ using System.Text; using System.ComponentModel; using System.Runtime.InteropServices; +using ManagedWinapi.Windows; namespace ManagedWinapi.Hooks { @@ -45,12 +46,12 @@ : base(type, true, false) { lmh = new LocalMessageHook(); - lmh.MessageOccurred += new LocalMessageHook.MessageCallback(lmh_Callback); + lmh.MSGOccurred += new LocalMessageHook.MSGCallback(lmh_Callback); } - private void lmh_Callback(System.Windows.Forms.Message msg) + private void lmh_Callback(MSG msg) { - if (msg.Msg == WM_CANCELJOURNAL) + if (msg.message == WM_CANCELJOURNAL) { hooked = false; lmh.Unhook(); Modified: trunk/ManagedWinapi/PInvokeTypes.cs =================================================================== --- trunk/ManagedWinapi/PInvokeTypes.cs 2011-07-13 17:24:53 UTC (rev 108) +++ trunk/ManagedWinapi/PInvokeTypes.cs 2011-07-14 18:26:46 UTC (rev 109) @@ -157,4 +157,40 @@ #endregion } + /// <summary> + /// The Win32 MSG structure. + /// </summary> + [StructLayout(LayoutKind.Sequential)] + public struct MSG + { + /// <summary> + /// The window handle of the message. + /// </summary> + public IntPtr hwnd; + + /// <summary> + /// The ID number for the message. + /// </summary> + public int message; + + /// <summary> + /// The WParam of the message. + /// </summary> + public IntPtr wParam; + + /// <summary> + /// The LParam of the message. + /// </summary> + public IntPtr lParam; + + /// <summary> + /// The time of the message. + /// </summary> + public int time; + + /// <summary> + /// The POINT of the message + /// </summary> + public POINT pt; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sch...@us...> - 2011-07-13 17:25:02
|
Revision: 108 http://mwinapi.svn.sourceforge.net/mwinapi/?rev=108&view=rev Author: schierlm Date: 2011-07-13 17:24:53 +0000 (Wed, 13 Jul 2011) Log Message: ----------- fix naming of wParam/lParam in MessageHook private method (thanks to Daniel Rose for spotting it) Modified Paths: -------------- trunk/ManagedWinapi/Hook.cs Modified: trunk/ManagedWinapi/Hook.cs =================================================================== --- trunk/ManagedWinapi/Hook.cs 2011-02-14 19:54:06 UTC (rev 107) +++ trunk/ManagedWinapi/Hook.cs 2011-07-13 17:24:53 UTC (rev 108) @@ -256,11 +256,11 @@ base.Callback += MessageHookCallback; } - private int MessageHookCallback(int code, IntPtr lParam, IntPtr wParam, ref bool callNext) + private int MessageHookCallback(int code, IntPtr wParam, IntPtr lParam, ref bool callNext) { if (code == HC_ACTION) { - Message msg = (Message)Marshal.PtrToStructure(wParam, typeof(Message)); + Message msg = (Message)Marshal.PtrToStructure(lParam, typeof(Message)); if (MessageOccurred != null) { MessageOccurred(msg); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sch...@us...> - 2011-02-14 19:54:12
|
Revision: 107 http://mwinapi.svn.sourceforge.net/mwinapi/?rev=107&view=rev Author: schierlm Date: 2011-02-14 19:54:06 +0000 (Mon, 14 Feb 2011) Log Message: ----------- - Highlight current rectangle while doing a scrolling screenshot Modified Paths: -------------- trunk/ManagedWinapi/Properties/AssemblyInfo.cs trunk/ManagedWinapi/Screenshot.cs Modified: trunk/ManagedWinapi/Properties/AssemblyInfo.cs =================================================================== --- trunk/ManagedWinapi/Properties/AssemblyInfo.cs 2011-02-01 17:32:55 UTC (rev 106) +++ trunk/ManagedWinapi/Properties/AssemblyInfo.cs 2011-02-14 19:54:06 UTC (rev 107) @@ -31,5 +31,5 @@ // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("0.3.0.2")] -[assembly: AssemblyFileVersion("0.3.0.2")] +[assembly: AssemblyVersion("0.3.0.3")] +[assembly: AssemblyFileVersion("0.3.0.3")] Modified: trunk/ManagedWinapi/Screenshot.cs =================================================================== --- trunk/ManagedWinapi/Screenshot.cs 2011-02-01 17:32:55 UTC (rev 106) +++ trunk/ManagedWinapi/Screenshot.cs 2011-02-14 19:54:06 UTC (rev 107) @@ -227,7 +227,7 @@ public static Bitmap TakeVerticalScrollingScreenshot(Point scrollPoint, Rectangle rect, Point? clickPoint) { int scrollCount; - return TakeScrollingScreenshot(scrollPoint, rect, clickPoint.HasValue ? clickPoint.Value : scrollPoint, clickPoint.HasValue, r => TakeScreenshot(r, false, null), out scrollCount); + return TakeScrollingScreenshot(scrollPoint, rect, clickPoint.HasValue ? clickPoint.Value : scrollPoint, clickPoint.HasValue, r => TakeScreenshot(r, false, null), r => HighlightRect(r), out scrollCount); } /// <summary> @@ -256,12 +256,13 @@ public static Bitmap TakeHorizontalScrollingScreenshot(Point scrollPoint, Rectangle rect, Point? clickPoint) { int scrollCount; - return FlipRotate(TakeScrollingScreenshot(new Point(scrollPoint.Y, scrollPoint.X), FlipRotate(rect), clickPoint.HasValue ? clickPoint.Value : scrollPoint, clickPoint.HasValue, r => FlipRotate(TakeScreenshot(FlipRotate(r), false, null)), out scrollCount)); + return FlipRotate(TakeScrollingScreenshot(new Point(scrollPoint.Y, scrollPoint.X), FlipRotate(rect), clickPoint.HasValue ? clickPoint.Value : scrollPoint, clickPoint.HasValue, r => FlipRotate(TakeScreenshot(FlipRotate(r), false, null)), r => HighlightRect(FlipRotate(r)), out scrollCount)); } private delegate Bitmap ScreenshotFunction(Rectangle rect); + private delegate void HighlightFunction(Rectangle rect); - private static Bitmap TakeScrollingScreenshot(Point centerPoint, Rectangle rect, Point mousePoint, bool click, ScreenshotFunction screenshot, out int scrollCount) + private static Bitmap TakeScrollingScreenshot(Point centerPoint, Rectangle rect, Point mousePoint, bool click, ScreenshotFunction screenshot, HighlightFunction highlight, out int scrollCount) { scrollCount = 0; Cursor.Position = mousePoint; @@ -282,6 +283,7 @@ KeyboardKey.InjectMouseEvent(0x0800, 0, 0, unchecked((uint)-120), UIntPtr.Zero); } Application.DoEvents(); + highlight(rect); Bitmap nextPart = screenshot(rect); int scrollHeight = AppendBelow(buffer, usedHeight, nextPart, false); foreach (int delay in new int[] { 0, 2, 10, 100, 200, 1000 }) @@ -290,6 +292,7 @@ break; Thread.Sleep(delay); Application.DoEvents(); + highlight(rect); nextPart = screenshot(rect); scrollHeight = AppendBelow(buffer, usedHeight, nextPart, false); } @@ -308,6 +311,7 @@ if (scrollHeight == -1) { CropToSimilarRange(centerPoint, ref rect, ref buffer, ref usedHeight, ref nextPart); + highlight(rect); scrollHeight = AppendBelow(buffer, usedHeight, nextPart, false); } if (scrollHeight <= 0) @@ -394,7 +398,7 @@ int pixel = nextPartPixels[x, y]; if (bufferPixels[x, y] != pixel) { - int score = 1000 / (Math.Abs(relX - x) + Math.Abs(relY - y)+1 ) + 1; + int score = 1000 / (Math.Abs(relX - x) + Math.Abs(relY - y) + 1) + 1; for (int scrollHeight = 1; scrollHeight < Math.Min(scrollScores.Length, rect.Height - y); scrollHeight++) { if (bufferPixels[x, y + scrollHeight] == pixel) @@ -594,6 +598,18 @@ return result; } + private static void HighlightRect(Rectangle rect) + { + SystemWindow window = SystemWindow.DesktopWindow; + using (WindowDeviceContext windowDC = window.GetDeviceContext(false)) + { + using (Graphics g = windowDC.CreateGraphics()) + { + g.DrawRectangle(Pens.Blue, rect.X - 1, rect.Y - 1, rect.Width + 2, rect.Height + 2); + } + } + } + private static Bitmap FlipRotate(Bitmap original) { Bitmap result = new Bitmap(original.Height, original.Width); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sch...@us...> - 2011-02-01 17:33:01
|
Revision: 106 http://mwinapi.svn.sourceforge.net/mwinapi/?rev=106&view=rev Author: schierlm Date: 2011-02-01 17:32:55 +0000 (Tue, 01 Feb 2011) Log Message: ----------- Yet another exception catcher for SystemAccessibleObject Modified Paths: -------------- trunk/ManagedWinapi/SystemAccessibleObject.cs Modified: trunk/ManagedWinapi/SystemAccessibleObject.cs =================================================================== --- trunk/ManagedWinapi/SystemAccessibleObject.cs 2011-01-23 15:43:58 UTC (rev 105) +++ trunk/ManagedWinapi/SystemAccessibleObject.cs 2011-02-01 17:32:55 UTC (rev 106) @@ -172,7 +172,14 @@ { get { - return iacc.get_accDescription(childID); + try + { + return iacc.get_accDescription(childID); + } + catch (NotImplementedException) + { + return ""; + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sch...@us...> - 2011-01-23 15:44:05
|
Revision: 105 http://mwinapi.svn.sourceforge.net/mwinapi/?rev=105&view=rev Author: schierlm Date: 2011-01-23 15:43:58 +0000 (Sun, 23 Jan 2011) Log Message: ----------- Add a standalone ScreenShooter project that starts Paint.NET automatically, as discussed in <http://forums.getpaint.net/index.php?/topic/20860-> Added Paths: ----------- trunk/Tools/ScreenShooter/MainFormPaintDotNet.Designer.cs trunk/Tools/ScreenShooter/MainFormPaintDotNet.cs trunk/Tools/ScreenShooter/MainFormPaintDotNet.resx trunk/Tools/ScreenShooter/ScreenShooterPaintDotNet.csproj trunk/Tools/ScreenShooter/ScreenShooterPaintDotNet.sln Property Changed: ---------------- trunk/Tools/ScreenShooter/ Property changes on: trunk/Tools/ScreenShooter ___________________________________________________________________ Modified: svn:ignore - bin obj ScreenShooter.csproj.user ScreenShooterStandalone.csproj.user ScreenShooterStandalone.suo ScreenShooterPlugin.csproj.user ScreenShooterPlugin.suo + bin obj ScreenShooter.csproj.user ScreenShooterStandalone.csproj.user ScreenShooterStandalone.suo ScreenShooterPlugin.csproj.user ScreenShooterPlugin.suo ScreenShooterPaintDotNet.suo Added: trunk/Tools/ScreenShooter/MainFormPaintDotNet.Designer.cs =================================================================== --- trunk/Tools/ScreenShooter/MainFormPaintDotNet.Designer.cs (rev 0) +++ trunk/Tools/ScreenShooter/MainFormPaintDotNet.Designer.cs 2011-01-23 15:43:58 UTC (rev 105) @@ -0,0 +1,130 @@ +namespace ScreenShooter +{ + partial class MainFormPaintDotNet + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Windows.Forms.ContextMenuStrip trayMenu; + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainFormPaintDotNet)); + this.configureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.quitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.trayIcon = new System.Windows.Forms.NotifyIcon(this.components); + this.hideButton = new System.Windows.Forms.Button(); + this.settings = new ScreenShooter.ScreenshotSettings(); + trayMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + trayMenu.SuspendLayout(); + this.SuspendLayout(); + // + // trayMenu + // + trayMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.configureToolStripMenuItem, + this.toolStripSeparator1, + this.quitToolStripMenuItem}); + trayMenu.Name = "trayMenu"; + trayMenu.Size = new System.Drawing.Size(140, 54); + // + // configureToolStripMenuItem + // + this.configureToolStripMenuItem.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold); + this.configureToolStripMenuItem.Name = "configureToolStripMenuItem"; + this.configureToolStripMenuItem.Size = new System.Drawing.Size(139, 22); + this.configureToolStripMenuItem.Text = "&Configure"; + this.configureToolStripMenuItem.Click += new System.EventHandler(this.configureToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(136, 6); + // + // quitToolStripMenuItem + // + this.quitToolStripMenuItem.Name = "quitToolStripMenuItem"; + this.quitToolStripMenuItem.Size = new System.Drawing.Size(139, 22); + this.quitToolStripMenuItem.Text = "&Quit"; + this.quitToolStripMenuItem.Click += new System.EventHandler(this.quitToolStripMenuItem_Click); + // + // trayIcon + // + this.trayIcon.ContextMenuStrip = trayMenu; + this.trayIcon.Text = "ScreenShooter Paint.NET Edition"; + this.trayIcon.Visible = true; + this.trayIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.trayIcon_MouseDoubleClick); + // + // hideButton + // + this.hideButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.hideButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.hideButton.Location = new System.Drawing.Point(301, 34); + this.hideButton.Name = "hideButton"; + this.hideButton.Size = new System.Drawing.Size(75, 23); + this.hideButton.TabIndex = 0; + this.hideButton.Text = "Hide"; + this.hideButton.UseVisualStyleBackColor = true; + this.hideButton.Click += new System.EventHandler(this.hideButton_Click); + // + // settings + // + this.settings.Location = new System.Drawing.Point(12, 12); + this.settings.Name = "settings"; + this.settings.Size = new System.Drawing.Size(376, 304); + this.settings.TabIndex = 1; + this.settings.ScreenshotTaken += new ScreenShooter.ScreenshotSettings.ScreenshotHandler(this.settings_ScreenshotTaken); + // + // MainFormPaintDotNet + // + this.AcceptButton = this.hideButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.hideButton; + this.ClientSize = new System.Drawing.Size(400, 328); + this.Controls.Add(this.hideButton); + this.Controls.Add(this.settings); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "MainFormPaintDotNet"; + this.Text = "ScreenShooter Paint.NET Edition"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainFormPaintDotNet_FormClosing); + trayMenu.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.NotifyIcon trayIcon; + private System.Windows.Forms.ToolStripMenuItem configureToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem quitToolStripMenuItem; + private System.Windows.Forms.Button hideButton; + private ScreenshotSettings settings; + } +} + Added: trunk/Tools/ScreenShooter/MainFormPaintDotNet.cs =================================================================== --- trunk/Tools/ScreenShooter/MainFormPaintDotNet.cs (rev 0) +++ trunk/Tools/ScreenShooter/MainFormPaintDotNet.cs 2011-01-23 15:43:58 UTC (rev 105) @@ -0,0 +1,90 @@ +using System; +using System.Drawing; +using System.Windows.Forms; +using System.IO; +using System.Drawing.Imaging; +using Microsoft.Win32; +using System.Diagnostics; + +namespace ScreenShooter +{ + public partial class MainFormPaintDotNet : Form + { + + int counter = 0; + string lastScreenshot = null; + + public MainFormPaintDotNet() + { + InitializeComponent(); + trayIcon.Icon = this.Icon; + string[] args = Environment.GetCommandLineArgs(); + if (args.Length > 1) + settings.Settings = args[1]; + settings.EnableHotkey(); + } + + private void settings_ScreenshotTaken(Bitmap bitmap) + { + MainFormPaintDotNet_FormClosing(this, null); + lastScreenshot = Path.Combine(Path.GetTempPath(), "~pdn" + counter + ".png"); + counter++; + bitmap.Save(lastScreenshot, ImageFormat.Png); + string path = Registry.GetValue(@"HKEY_LOCAL_MACHINE\Software\Paint.NET", "TARGETDIR", null) as string; + if (path == null) + { + MessageBox.Show("Paint.NET is not installed!"); + } + else + { + Process.Start(Path.Combine(path, "PaintDotNet.exe"), "untitled:\"" + lastScreenshot+"\""); + } + } + + private void quitToolStripMenuItem_Click(object sender, EventArgs e) + { + Dispose(); + } + + private void configureToolStripMenuItem_Click(object sender, EventArgs e) + { + Visible = true; + } + + private void trayIcon_MouseDoubleClick(object sender, MouseEventArgs e) + { + Visible = true; + } + + private void hideButton_Click(object sender, EventArgs e) + { + Keys mask = Keys.Shift | Keys.Control; + if ((Control.ModifierKeys & mask) == mask) + { + Clipboard.Clear(); + Clipboard.SetText(settings.Settings); + } + Visible = false; + } + + private void MainFormPaintDotNet_FormClosing(object sender, FormClosingEventArgs e) + { + if (lastScreenshot != null) + { + File.Delete(lastScreenshot); + lastScreenshot = null; + } + } + + /// <summary> + /// The main entry point for the application. + /// </summary> + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainFormPaintDotNet()); + } + } +} Added: trunk/Tools/ScreenShooter/MainFormPaintDotNet.resx =================================================================== --- trunk/Tools/ScreenShooter/MainFormPaintDotNet.resx (rev 0) +++ trunk/Tools/ScreenShooter/MainFormPaintDotNet.resx 2011-01-23 15:43:58 UTC (rev 105) @@ -0,0 +1,143 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <metadata name="trayMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>13, 17</value> + </metadata> + <metadata name="trayMenu.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> + <value>False</value> + </metadata> + <metadata name="trayIcon.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>102, 17</value> + </metadata> + <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> + <value>53</value> + </metadata> + <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> + <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value> + AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA/wAAAICAgAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAACIiIAAiIiIAIiIDMwIiIgAiIAMzACIiACIgMzMwIiIAIiADMwAiIgAiIgMzAi + IiACIiIAAiIiIAIiIiIiIiIgAAAAAAAAAAAAAAAiIgABEAAAACMyAAAAAAAAIzIAAAAAAAAiIgAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+BkAAPgf + AAD4HwAA+B8AAPgfAAD//wAA +</value> + </data> +</root> \ No newline at end of file Added: trunk/Tools/ScreenShooter/ScreenShooterPaintDotNet.csproj =================================================================== --- trunk/Tools/ScreenShooter/ScreenShooterPaintDotNet.csproj (rev 0) +++ trunk/Tools/ScreenShooter/ScreenShooterPaintDotNet.csproj 2011-01-23 15:43:58 UTC (rev 105) @@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProductVersion>9.0.30729</ProductVersion> + <SchemaVersion>2.0</SchemaVersion> + <ProjectGuid>{2723EC84-45DE-4B04-9D90-770B7846A9B1}</ProjectGuid> + <OutputType>WinExe</OutputType> + <AppDesignerFolder>Properties</AppDesignerFolder> + <RootNamespace>ScreenShooter</RootNamespace> + <AssemblyName>ScreenShooterPaintDotNet</AssemblyName> + <TargetFrameworkVersion>v2.0</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + <TargetFrameworkSubset> + </TargetFrameworkSubset> + <ApplicationIcon>icon.ico</ApplicationIcon> + <StartupObject> + </StartupObject> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>bin\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="Accessibility" /> + <Reference Include="System" /> + <Reference Include="System.Data" /> + <Reference Include="System.Drawing" /> + <Reference Include="System.Windows.Forms" /> + <Reference Include="System.Xml" /> + </ItemGroup> + <ItemGroup> + <Compile Include="..\..\ManagedWinapi\ApiHelper.cs"> + <Link>Standalone\ApiHelper.cs</Link> + </Compile> + <Compile Include="..\..\ManagedWinapi\EventDispatchingNativeWindow.cs"> + <Link>Standalone\EventDispatchingNativeWindow.cs</Link> + </Compile> + <Compile Include="..\..\ManagedWinapi\Hook.cs"> + <Link>Standalone\Hook.cs</Link> + <SubType>Component</SubType> + </Compile> + <Compile Include="..\..\ManagedWinapi\Hotkey.cs"> + <Link>Standalone\Hotkey.cs</Link> + <SubType>Component</SubType> + </Compile> + <Compile Include="..\..\ManagedWinapi\KeyboardKey.cs"> + <Link>Standalone\KeyboardKey.cs</Link> + </Compile> + <Compile Include="..\..\ManagedWinapi\LowLevelHook.cs"> + <Link>Standalone\LowLevelHook.cs</Link> + <SubType>Component</SubType> + </Compile> + <Compile Include="..\..\ManagedWinapi\PInvokeTypes.cs"> + <Link>Standalone\PInvokeTypes.cs</Link> + </Compile> + <Compile Include="..\..\ManagedWinapi\Screenshot.cs"> + <Link>Standalone\Screenshot.cs</Link> + </Compile> + <Compile Include="..\..\ManagedWinapi\ShortcutBox.cs"> + <Link>Standalone\ShortcutBox.cs</Link> + <SubType>Component</SubType> + </Compile> + <Compile Include="..\..\ManagedWinapi\ShortcutBox.designer.cs"> + <Link>Standalone\ShortcutBox.designer.cs</Link> + <DependentUpon>ShortcutBox.cs</DependentUpon> + </Compile> + <Compile Include="..\..\ManagedWinapi\SystemAccessibleObject.cs"> + <Link>Standalone\SystemAccessibleObject.cs</Link> + </Compile> + <Compile Include="..\..\ManagedWinapi\SystemWindow.cs"> + <Link>Standalone\SystemWindow.cs</Link> + </Compile> + <Compile Include="MainFormPaintDotNet.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="MainFormPaintDotNet.Designer.cs"> + <DependentUpon>MainFormPaintDotNet.cs</DependentUpon> + </Compile> + <Compile Include="Properties\AssemblyInfo.cs" /> + <Compile Include="ScreenshotSettings.cs"> + <SubType>UserControl</SubType> + </Compile> + <Compile Include="ScreenshotSettings.Designer.cs"> + <DependentUpon>ScreenshotSettings.cs</DependentUpon> + </Compile> + <Compile Include="SelectorForm.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="SelectorForm.Designer.cs"> + <DependentUpon>SelectorForm.cs</DependentUpon> + </Compile> + <Compile Include="Standalone\StandaloneStubs.cs" /> + <EmbeddedResource Include="..\..\ManagedWinapi\ShortcutBox.resx"> + <Link>Standalone\ShortcutBox.resx</Link> + <DependentUpon>ShortcutBox.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="MainFormPaintDotNet.resx"> + <DependentUpon>MainFormPaintDotNet.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="ScreenshotSettings.resx"> + <DependentUpon>ScreenshotSettings.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="SelectorForm.resx"> + <DependentUpon>SelectorForm.cs</DependentUpon> + </EmbeddedResource> + </ItemGroup> + <ItemGroup> + <Content Include="icon.ico" /> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> + <!-- To modify your build process, add your task inside one of the targets below and uncomment it. + Other similar extension points exist, see Microsoft.Common.targets. + <Target Name="BeforeBuild"> + </Target> + <Target Name="AfterBuild"> + </Target> + --> +</Project> \ No newline at end of file Added: trunk/Tools/ScreenShooter/ScreenShooterPaintDotNet.sln =================================================================== --- trunk/Tools/ScreenShooter/ScreenShooterPaintDotNet.sln (rev 0) +++ trunk/Tools/ScreenShooter/ScreenShooterPaintDotNet.sln 2011-01-23 15:43:58 UTC (rev 105) @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C# Express 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScreenShooterPaintDotNet", "ScreenShooterPaintDotNet.csproj", "{2723EC84-45DE-4B04-9D90-770B7846A9B1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2723EC84-45DE-4B04-9D90-770B7846A9B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2723EC84-45DE-4B04-9D90-770B7846A9B1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2723EC84-45DE-4B04-9D90-770B7846A9B1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2723EC84-45DE-4B04-9D90-770B7846A9B1}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sch...@us...> - 2011-01-22 20:07:54
|
Revision: 104 http://mwinapi.svn.sourceforge.net/mwinapi/?rev=104&view=rev Author: schierlm Date: 2011-01-22 20:07:48 +0000 (Sat, 22 Jan 2011) Log Message: ----------- Fix OverflowException on x64 architecture Modified Paths: -------------- trunk/ManagedWinapi/Properties/AssemblyInfo.cs trunk/ManagedWinapi/SystemWindow.cs Modified: trunk/ManagedWinapi/Properties/AssemblyInfo.cs =================================================================== --- trunk/ManagedWinapi/Properties/AssemblyInfo.cs 2011-01-14 21:55:15 UTC (rev 103) +++ trunk/ManagedWinapi/Properties/AssemblyInfo.cs 2011-01-22 20:07:48 UTC (rev 104) @@ -31,5 +31,5 @@ // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("0.3.0.1")] -[assembly: AssemblyFileVersion("0.3.0.1")] +[assembly: AssemblyVersion("0.3.0.2")] +[assembly: AssemblyFileVersion("0.3.0.2")] Modified: trunk/ManagedWinapi/SystemWindow.cs =================================================================== --- trunk/ManagedWinapi/SystemWindow.cs 2011-01-14 21:55:15 UTC (rev 103) +++ trunk/ManagedWinapi/SystemWindow.cs 2011-01-22 20:07:48 UTC (rev 104) @@ -625,7 +625,7 @@ { get { - return (WindowStyleFlags)GetWindowLongPtr(_hwnd, (int)(GWL.GWL_STYLE)); + return unchecked((WindowStyleFlags)GetWindowLongPtr(_hwnd, (int)(GWL.GWL_STYLE)).ToInt64()); } set { @@ -641,7 +641,7 @@ { get { - return (WindowExStyleFlags)GetWindowLongPtr(_hwnd, (int)(GWL.GWL_EXSTYLE)); + return unchecked((WindowExStyleFlags)GetWindowLongPtr(_hwnd, (int)(GWL.GWL_EXSTYLE)).ToInt64()); } set { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sch...@us...> - 2011-01-14 21:55:21
|
Revision: 103 http://mwinapi.svn.sourceforge.net/mwinapi/?rev=103&view=rev Author: schierlm Date: 2011-01-14 21:55:15 +0000 (Fri, 14 Jan 2011) Log Message: ----------- ScreenShooter: - Add support to initialize GUI options via command line - Add "hidden" feature to put command line for current GUI settings into clipboard - Update mnemonics for radio buttons - Add Paint.NET FileType Plugin that can generate screenshots by opening a .ScreenshotSettings file Modified Paths: -------------- trunk/Tools/ScreenShooter/MainForm.cs trunk/Tools/ScreenShooter/ScreenShooterStandalone.csproj trunk/Tools/ScreenShooter/ScreenshotSettings.Designer.cs Added Paths: ----------- trunk/Tools/ScreenShooter/Default.ScreenshotSettings trunk/Tools/ScreenShooter/PaintDotNetLib/ trunk/Tools/ScreenShooter/PaintDotNetLib/README trunk/Tools/ScreenShooter/PluginForm.Designer.cs trunk/Tools/ScreenShooter/PluginForm.cs trunk/Tools/ScreenShooter/PluginForm.resx trunk/Tools/ScreenShooter/ScreenShooterPlugin.csproj trunk/Tools/ScreenShooter/ScreenShooterPlugin.sln Property Changed: ---------------- trunk/Tools/ScreenShooter/ Property changes on: trunk/Tools/ScreenShooter ___________________________________________________________________ Modified: svn:ignore - bin obj ScreenShooter.csproj.user ScreenShooterStandalone.csproj.user ScreenShooterStandalone.suo + bin obj ScreenShooter.csproj.user ScreenShooterStandalone.csproj.user ScreenShooterStandalone.suo ScreenShooterPlugin.csproj.user ScreenShooterPlugin.suo Added: trunk/Tools/ScreenShooter/Default.ScreenshotSettings =================================================================== --- trunk/Tools/ScreenShooter/Default.ScreenshotSettings (rev 0) +++ trunk/Tools/ScreenShooter/Default.ScreenshotSettings 2011-01-14 21:55:15 UTC (rev 103) @@ -0,0 +1 @@ +ScreenShotSettings:W+83:1:0:0:0:0:0:0:1:0:0:0:0:0:0 \ No newline at end of file Modified: trunk/Tools/ScreenShooter/MainForm.cs =================================================================== --- trunk/Tools/ScreenShooter/MainForm.cs 2011-01-14 21:43:27 UTC (rev 102) +++ trunk/Tools/ScreenShooter/MainForm.cs 2011-01-14 21:55:15 UTC (rev 103) @@ -10,8 +10,10 @@ { InitializeComponent(); trayIcon.Icon = this.Icon; + string[] args = Environment.GetCommandLineArgs(); + if (args.Length > 1) + settings.Settings = args[1]; settings.EnableHotkey(); - ////setHotkeyButton_Click(setHotkeyButton, null); } private void settings_ScreenshotTaken(Bitmap bitmap) @@ -38,6 +40,12 @@ private void hideButton_Click(object sender, EventArgs e) { + Keys mask = Keys.Shift | Keys.Control; + if ((Control.ModifierKeys & mask) == mask) + { + Clipboard.Clear(); + Clipboard.SetText(settings.Settings); + } Visible = false; } } Property changes on: trunk/Tools/ScreenShooter/PaintDotNetLib ___________________________________________________________________ Added: svn:ignore + *.dll Added: trunk/Tools/ScreenShooter/PaintDotNetLib/README =================================================================== --- trunk/Tools/ScreenShooter/PaintDotNetLib/README (rev 0) +++ trunk/Tools/ScreenShooter/PaintDotNetLib/README 2011-01-14 21:55:15 UTC (rev 103) @@ -0,0 +1,6 @@ +To compile the Paint.NET plugin, add the following files from the Paint.NET +installation folder of Paint.NET 3.5.6 or later here: + +PaintDotNet.Base.dll +PaintDotNet.Core.dll +PaintDotNet.Data.dll \ No newline at end of file Added: trunk/Tools/ScreenShooter/PluginForm.Designer.cs =================================================================== --- trunk/Tools/ScreenShooter/PluginForm.Designer.cs (rev 0) +++ trunk/Tools/ScreenShooter/PluginForm.Designer.cs 2011-01-14 21:55:15 UTC (rev 103) @@ -0,0 +1,94 @@ +namespace ScreenShooter +{ + partial class PluginForm + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PluginForm)); + this.saveSettingsButton = new System.Windows.Forms.Button(); + this.saveDialog = new System.Windows.Forms.SaveFileDialog(); + this.settings = new ScreenShooter.ScreenshotSettings(); + this.doneTimer = new System.Windows.Forms.Timer(this.components); + this.SuspendLayout(); + // + // saveSettingsButton + // + this.saveSettingsButton.Location = new System.Drawing.Point(301, 21); + this.saveSettingsButton.Name = "saveSettingsButton"; + this.saveSettingsButton.Size = new System.Drawing.Size(75, 42); + this.saveSettingsButton.TabIndex = 0; + this.saveSettingsButton.Text = "Save S&ettings"; + this.saveSettingsButton.UseVisualStyleBackColor = true; + this.saveSettingsButton.Click += new System.EventHandler(this.saveSettingsButton_Click); + // + // saveDialog + // + this.saveDialog.DefaultExt = "ScreenshotSettings"; + this.saveDialog.FileName = "Custom.ScreenshotSettings"; + this.saveDialog.Filter = "Screenshot Settings Files (*.ScreenshotSettings)|*.ScreenshotSettings|All files (" + + "*.*)|*.*"; + this.saveDialog.RestoreDirectory = true; + this.saveDialog.Title = "Save Settings"; + // + // settings + // + this.settings.Location = new System.Drawing.Point(12, 12); + this.settings.Name = "settings"; + this.settings.Size = new System.Drawing.Size(376, 304); + this.settings.TabIndex = 1; + this.settings.ScreenshotTaken += new ScreenShooter.ScreenshotSettings.ScreenshotHandler(this.settings_ScreenshotTaken); + // + // doneTimer + // + this.doneTimer.Tick += new System.EventHandler(this.doneTimer_Tick); + // + // PluginForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(400, 328); + this.Controls.Add(this.saveSettingsButton); + this.Controls.Add(this.settings); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "PluginForm"; + this.Text = "ScreenShooter"; + this.ResumeLayout(false); + + } + + #endregion + + private ScreenshotSettings settings; + private System.Windows.Forms.Button saveSettingsButton; + private System.Windows.Forms.SaveFileDialog saveDialog; + private System.Windows.Forms.Timer doneTimer; + } +} + Added: trunk/Tools/ScreenShooter/PluginForm.cs =================================================================== --- trunk/Tools/ScreenShooter/PluginForm.cs (rev 0) +++ trunk/Tools/ScreenShooter/PluginForm.cs 2011-01-14 21:55:15 UTC (rev 103) @@ -0,0 +1,74 @@ +using System; +using System.Drawing; +using System.IO; +using System.Text; +using System.Threading; +using System.Windows.Forms; +using PaintDotNet; + +namespace ScreenShooter +{ + public partial class PluginForm : Form + { + public Bitmap ResultImage = new Bitmap(1, 1); + + public PluginForm(string settingsString) + { + InitializeComponent(); + settings.Settings = settingsString; + settings.EnableHotkey(); + } + + private void settings_ScreenshotTaken(Bitmap bitmap) + { + if (bitmap != null) + { + ResultImage = bitmap; + doneTimer.Enabled = true; + } + } + + private void saveSettingsButton_Click(object sender, EventArgs e) + { + if (saveDialog.ShowDialog() == DialogResult.OK) + { + File.WriteAllText(saveDialog.FileName, settings.Settings, Encoding.ASCII); + } + } + + private void doneTimer_Tick(object sender, EventArgs e) + { + doneTimer.Enabled = false; + Hide(); + } + } + + public class ScreenShooterFileType : FileType + { + public ScreenShooterFileType() : base("Screenshot Settings File", FileTypeFlags.SupportsLoading, new string[] { ".ScreenshotSettings" }) { } + + protected override Document OnLoad(Stream input) + { + Image resultImage = null; + Thread thread = new Thread(delegate() + { + PluginForm f = new PluginForm(new StreamReader(input, Encoding.ASCII).ReadToEnd()); + f.ShowDialog(); + f.Dispose(); + resultImage = f.ResultImage; + }); + thread.SetApartmentState(ApartmentState.STA); + thread.Start(); + thread.Join(); + return Document.FromImage(resultImage); + } + } + + public class ScreenShooterFileTypeFactory : IFileTypeFactory + { + public FileType[] GetFileTypeInstances() + { + return new FileType[] { new ScreenShooterFileType() }; + } + } +} Added: trunk/Tools/ScreenShooter/PluginForm.resx =================================================================== --- trunk/Tools/ScreenShooter/PluginForm.resx (rev 0) +++ trunk/Tools/ScreenShooter/PluginForm.resx 2011-01-14 21:55:15 UTC (rev 103) @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <metadata name="saveDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> + <metadata name="doneTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>122, 17</value> + </metadata> + <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> + <value>53</value> + </metadata> + <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> + <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value> + AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA/wAAAICAgAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAACIiIAAiIiIAIiIDMwIiIgAiIAMzACIiACIgMzMwIiIAIiADMwAiIgAiIgMzAi + IiACIiIAAiIiIAIiIiIiIiIgAAAAAAAAAAAAAAAiIgABEAAAACMyAAAAAAAAIzIAAAAAAAAiIgAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+BkAAPgf + AAD4HwAA+B8AAPgfAAD//wAA +</value> + </data> +</root> \ No newline at end of file Added: trunk/Tools/ScreenShooter/ScreenShooterPlugin.csproj =================================================================== --- trunk/Tools/ScreenShooter/ScreenShooterPlugin.csproj (rev 0) +++ trunk/Tools/ScreenShooter/ScreenShooterPlugin.csproj 2011-01-14 21:55:15 UTC (rev 103) @@ -0,0 +1,150 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProductVersion>9.0.30729</ProductVersion> + <SchemaVersion>2.0</SchemaVersion> + <ProjectGuid>{2723EC84-45DE-4B04-9D90-770B7846A9B1}</ProjectGuid> + <OutputType>Library</OutputType> + <AppDesignerFolder>Properties</AppDesignerFolder> + <RootNamespace>ScreenShooter</RootNamespace> + <AssemblyName>ScreenShooterPlugin</AssemblyName> + <TargetFrameworkVersion>v2.0</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + <TargetFrameworkSubset> + </TargetFrameworkSubset> + <ApplicationIcon>icon.ico</ApplicationIcon> + <StartupObject> + </StartupObject> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>bin\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="Accessibility" /> + <Reference Include="PaintDotNet.Base, Version=3.56.3972.42612, Culture=neutral, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>PaintDotNetLib\PaintDotNet.Base.dll</HintPath> + </Reference> + <Reference Include="PaintDotNet.Core, Version=3.56.3972.42620, Culture=neutral, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>PaintDotNetLib\PaintDotNet.Core.dll</HintPath> + </Reference> + <Reference Include="PaintDotNet.Data, Version=3.56.3972.42623, Culture=neutral, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>PaintDotNetLib\PaintDotNet.Data.dll</HintPath> + </Reference> + <Reference Include="System" /> + <Reference Include="System.Data" /> + <Reference Include="System.Drawing" /> + <Reference Include="System.Windows.Forms" /> + <Reference Include="System.Xml" /> + </ItemGroup> + <ItemGroup> + <Compile Include="..\..\ManagedWinapi\ApiHelper.cs"> + <Link>Standalone\ApiHelper.cs</Link> + </Compile> + <Compile Include="..\..\ManagedWinapi\EventDispatchingNativeWindow.cs"> + <Link>Standalone\EventDispatchingNativeWindow.cs</Link> + </Compile> + <Compile Include="..\..\ManagedWinapi\Hook.cs"> + <Link>Standalone\Hook.cs</Link> + <SubType>Component</SubType> + </Compile> + <Compile Include="..\..\ManagedWinapi\Hotkey.cs"> + <Link>Standalone\Hotkey.cs</Link> + <SubType>Component</SubType> + </Compile> + <Compile Include="..\..\ManagedWinapi\KeyboardKey.cs"> + <Link>Standalone\KeyboardKey.cs</Link> + </Compile> + <Compile Include="..\..\ManagedWinapi\LowLevelHook.cs"> + <Link>Standalone\LowLevelHook.cs</Link> + <SubType>Component</SubType> + </Compile> + <Compile Include="..\..\ManagedWinapi\PInvokeTypes.cs"> + <Link>Standalone\PInvokeTypes.cs</Link> + </Compile> + <Compile Include="..\..\ManagedWinapi\Screenshot.cs"> + <Link>Standalone\Screenshot.cs</Link> + </Compile> + <Compile Include="..\..\ManagedWinapi\ShortcutBox.cs"> + <Link>Standalone\ShortcutBox.cs</Link> + <SubType>Component</SubType> + </Compile> + <Compile Include="..\..\ManagedWinapi\ShortcutBox.designer.cs"> + <Link>Standalone\ShortcutBox.designer.cs</Link> + <DependentUpon>ShortcutBox.cs</DependentUpon> + </Compile> + <Compile Include="..\..\ManagedWinapi\SystemAccessibleObject.cs"> + <Link>Standalone\SystemAccessibleObject.cs</Link> + </Compile> + <Compile Include="..\..\ManagedWinapi\SystemWindow.cs"> + <Link>Standalone\SystemWindow.cs</Link> + </Compile> + <Compile Include="PluginForm.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="PluginForm.Designer.cs"> + <DependentUpon>PluginForm.cs</DependentUpon> + </Compile> + <Compile Include="Properties\AssemblyInfo.cs" /> + <Compile Include="ScreenshotSettings.cs"> + <SubType>UserControl</SubType> + </Compile> + <Compile Include="ScreenshotSettings.Designer.cs"> + <DependentUpon>ScreenshotSettings.cs</DependentUpon> + </Compile> + <Compile Include="SelectorForm.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="SelectorForm.Designer.cs"> + <DependentUpon>SelectorForm.cs</DependentUpon> + </Compile> + <Compile Include="Standalone\StandaloneStubs.cs" /> + <EmbeddedResource Include="..\..\ManagedWinapi\ShortcutBox.resx"> + <Link>Standalone\ShortcutBox.resx</Link> + <DependentUpon>ShortcutBox.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="PluginForm.resx"> + <DependentUpon>PluginForm.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="ScreenshotSettings.resx"> + <DependentUpon>ScreenshotSettings.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="SelectorForm.resx"> + <DependentUpon>SelectorForm.cs</DependentUpon> + </EmbeddedResource> + </ItemGroup> + <ItemGroup> + <Content Include="icon.ico" /> + </ItemGroup> + <ItemGroup> + <None Include="Default.ScreenshotSettings"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> + <!-- To modify your build process, add your task inside one of the targets below and uncomment it. + Other similar extension points exist, see Microsoft.Common.targets. + <Target Name="BeforeBuild"> + </Target> + <Target Name="AfterBuild"> + </Target> + --> +</Project> \ No newline at end of file Added: trunk/Tools/ScreenShooter/ScreenShooterPlugin.sln =================================================================== --- trunk/Tools/ScreenShooter/ScreenShooterPlugin.sln (rev 0) +++ trunk/Tools/ScreenShooter/ScreenShooterPlugin.sln 2011-01-14 21:55:15 UTC (rev 103) @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C# Express 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScreenShooterPlugin", "ScreenShooterPlugin.csproj", "{2723EC84-45DE-4B04-9D90-770B7846A9B1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2723EC84-45DE-4B04-9D90-770B7846A9B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2723EC84-45DE-4B04-9D90-770B7846A9B1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2723EC84-45DE-4B04-9D90-770B7846A9B1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2723EC84-45DE-4B04-9D90-770B7846A9B1}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal Modified: trunk/Tools/ScreenShooter/ScreenShooterStandalone.csproj =================================================================== --- trunk/Tools/ScreenShooter/ScreenShooterStandalone.csproj 2011-01-14 21:43:27 UTC (rev 102) +++ trunk/Tools/ScreenShooter/ScreenShooterStandalone.csproj 2011-01-14 21:55:15 UTC (rev 103) @@ -80,10 +80,10 @@ <DependentUpon>ShortcutBox.cs</DependentUpon> </Compile> <Compile Include="..\..\ManagedWinapi\SystemAccessibleObject.cs"> - <Link>SystemAccessibleObject.cs</Link> + <Link>Standalone\SystemAccessibleObject.cs</Link> </Compile> <Compile Include="..\..\ManagedWinapi\SystemWindow.cs"> - <Link>SystemWindow.cs</Link> + <Link>Standalone\SystemWindow.cs</Link> </Compile> <Compile Include="MainForm.cs"> <SubType>Form</SubType> Modified: trunk/Tools/ScreenShooter/ScreenshotSettings.Designer.cs =================================================================== --- trunk/Tools/ScreenShooter/ScreenshotSettings.Designer.cs 2011-01-14 21:43:27 UTC (rev 102) +++ trunk/Tools/ScreenShooter/ScreenshotSettings.Designer.cs 2011-01-14 21:55:15 UTC (rev 103) @@ -76,7 +76,7 @@ this.groupBox2.Size = new System.Drawing.Size(270, 48); this.groupBox2.TabIndex = 1; this.groupBox2.TabStop = false; - this.groupBox2.Text = "&Hotkey"; + this.groupBox2.Text = "Hot&key"; // // setHotkeyButton // @@ -195,7 +195,7 @@ this.autodetectScrollOption.Size = new System.Drawing.Size(196, 17); this.autodetectScrollOption.TabIndex = 0; this.autodetectScrollOption.TabStop = true; - this.autodetectScrollOption.Text = "Autodetect (try the next four options)"; + this.autodetectScrollOption.Text = "Auto&detect (try the next four options)"; this.autodetectScrollOption.UseVisualStyleBackColor = true; // // wmPrintScrollOption @@ -207,7 +207,7 @@ this.wmPrintScrollOption.Name = "wmPrintScrollOption"; this.wmPrintScrollOption.Size = new System.Drawing.Size(112, 17); this.wmPrintScrollOption.TabIndex = 1; - this.wmPrintScrollOption.Text = "Send WM_PRINT"; + this.wmPrintScrollOption.Text = "Send &WM_PRINT"; this.wmPrintScrollOption.UseVisualStyleBackColor = true; // // wmPrintClientScrollOption @@ -219,7 +219,7 @@ this.wmPrintClientScrollOption.Name = "wmPrintClientScrollOption"; this.wmPrintClientScrollOption.Size = new System.Drawing.Size(150, 17); this.wmPrintClientScrollOption.TabIndex = 2; - this.wmPrintClientScrollOption.Text = "Send WM_PRINTCLIENT"; + this.wmPrintClientScrollOption.Text = "Send WM_PRINTC&LIENT"; this.wmPrintClientScrollOption.UseVisualStyleBackColor = true; // // vWheelScrollOption @@ -231,7 +231,7 @@ this.vWheelScrollOption.Name = "vWheelScrollOption"; this.vWheelScrollOption.Size = new System.Drawing.Size(175, 17); this.vWheelScrollOption.TabIndex = 3; - this.vWheelScrollOption.Text = "Send vertical scroll wheel event"; + this.vWheelScrollOption.Text = "Send &vertical scroll wheel event"; this.vWheelScrollOption.UseVisualStyleBackColor = true; // // hWheelScrollOption @@ -243,7 +243,7 @@ this.hWheelScrollOption.Name = "hWheelScrollOption"; this.hWheelScrollOption.Size = new System.Drawing.Size(186, 17); this.hWheelScrollOption.TabIndex = 4; - this.hWheelScrollOption.Text = "Send horizontal scroll wheel event"; + this.hWheelScrollOption.Text = "Send &horizontal scroll wheel event"; this.hWheelScrollOption.UseVisualStyleBackColor = true; // // scrollingAreaBox @@ -270,9 +270,9 @@ this.vBarScrollOption.AutoSize = true; this.vBarScrollOption.Location = new System.Drawing.Point(6, 135); this.vBarScrollOption.Name = "vBarScrollOption"; - this.vBarScrollOption.Size = new System.Drawing.Size(137, 17); + this.vBarScrollOption.Size = new System.Drawing.Size(126, 17); this.vBarScrollOption.TabIndex = 9; - this.vBarScrollOption.Text = "Use horizontal scroll bar"; + this.vBarScrollOption.Text = "Use vertical scroll &bar"; this.vBarScrollOption.UseVisualStyleBackColor = true; // // hBarScrollOption @@ -282,9 +282,9 @@ this.hBarScrollOption.AutoSize = true; this.hBarScrollOption.Location = new System.Drawing.Point(6, 157); this.hBarScrollOption.Name = "hBarScrollOption"; - this.hBarScrollOption.Size = new System.Drawing.Size(126, 17); + this.hBarScrollOption.Size = new System.Drawing.Size(137, 17); this.hBarScrollOption.TabIndex = 8; - this.hBarScrollOption.Text = "Use vertical scroll bar"; + this.hBarScrollOption.Text = "&Use horizontal scroll bar"; this.hBarScrollOption.UseVisualStyleBackColor = true; // // shortcutBox This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sch...@us...> - 2011-01-14 21:43:34
|
Revision: 102 http://mwinapi.svn.sourceforge.net/mwinapi/?rev=102&view=rev Author: schierlm Date: 2011-01-14 21:43:27 +0000 (Fri, 14 Jan 2011) Log Message: ----------- Make the EventDispatchingNativeWindow instance thread static, to make it work as expected in a multithreaded environment Modified Paths: -------------- trunk/ManagedWinapi/EventDispatchingNativeWindow.cs trunk/ManagedWinapi/Hotkey.cs trunk/ManagedWinapi/Mixer.cs Modified: trunk/ManagedWinapi/EventDispatchingNativeWindow.cs =================================================================== --- trunk/ManagedWinapi/EventDispatchingNativeWindow.cs 2011-01-13 21:44:46 UTC (rev 101) +++ trunk/ManagedWinapi/EventDispatchingNativeWindow.cs 2011-01-14 21:43:27 UTC (rev 102) @@ -44,6 +44,7 @@ { private static Object myLock = new Object(); + [ThreadStatic] private static EventDispatchingNativeWindow _instance; /// <summary> Modified: trunk/ManagedWinapi/Hotkey.cs =================================================================== --- trunk/ManagedWinapi/Hotkey.cs 2011-01-13 21:44:46 UTC (rev 101) +++ trunk/ManagedWinapi/Hotkey.cs 2011-01-14 21:43:27 UTC (rev 102) @@ -48,6 +48,7 @@ private Keys _keyCode; private bool _ctrl, _alt, _shift, _windows; private readonly IntPtr hWnd; + private readonly EventDispatchingNativeWindow nativeWindow; /// <summary> /// Initializes a new instance of this class with the specified container. @@ -63,12 +64,13 @@ /// </summary> public Hotkey() { - EventDispatchingNativeWindow.Instance.EventHandler += nw_EventHandler; + nativeWindow = EventDispatchingNativeWindow.Instance; + nativeWindow.EventHandler += nw_EventHandler; lock(myStaticLock) { hotkeyIndex = ++hotkeyCounter; } - hWnd = EventDispatchingNativeWindow.Instance.Handle; + hWnd = nativeWindow.Handle; } /// <summary> @@ -159,7 +161,7 @@ { isDisposed = true; updateHotkey(false); - EventDispatchingNativeWindow.Instance.EventHandler -= nw_EventHandler; + nativeWindow.EventHandler -= nw_EventHandler; base.Dispose(disposing); } Modified: trunk/ManagedWinapi/Mixer.cs =================================================================== --- trunk/ManagedWinapi/Mixer.cs 2011-01-13 21:44:46 UTC (rev 101) +++ trunk/ManagedWinapi/Mixer.cs 2011-01-14 21:43:27 UTC (rev 102) @@ -66,6 +66,7 @@ private MIXERCAPS mc; private IList<DestinationLine> destLines = null; private bool createEvents; + private readonly EventDispatchingNativeWindow nativeWindow; /// <summary> /// Occurs when a control of this mixer changes value. @@ -80,7 +81,8 @@ private Mixer(IntPtr hMixer) { this.hMixer = hMixer; - EventDispatchingNativeWindow.Instance.EventHandler += ednw_EventHandler; + nativeWindow = EventDispatchingNativeWindow.Instance; + nativeWindow.EventHandler += ednw_EventHandler; mixerGetDevCapsA(hMixer, ref mc, Marshal.SizeOf(mc)); } @@ -188,7 +190,7 @@ if (hMixer.ToInt32() != 0) { mixerClose(hMixer); - EventDispatchingNativeWindow.Instance.EventHandler -= ednw_EventHandler; + nativeWindow.EventHandler -= ednw_EventHandler; hMixer = IntPtr.Zero; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sch...@us...> - 2011-01-13 21:44:52
|
Revision: 101 http://mwinapi.svn.sourceforge.net/mwinapi/?rev=101&view=rev Author: schierlm Date: 2011-01-13 21:44:46 +0000 (Thu, 13 Jan 2011) Log Message: ----------- speed scrolling screenshots up a bit Modified Paths: -------------- trunk/ManagedWinapi/Screenshot.cs Modified: trunk/ManagedWinapi/Screenshot.cs =================================================================== --- trunk/ManagedWinapi/Screenshot.cs 2011-01-12 22:47:10 UTC (rev 100) +++ trunk/ManagedWinapi/Screenshot.cs 2011-01-13 21:44:46 UTC (rev 101) @@ -268,6 +268,7 @@ Bitmap buffer = screenshot(rect); int usedHeight = buffer.Height; buffer = ResizeBitmap(buffer, buffer.Height * 4); + bool lastMayBeIncomplete = false; while (Cursor.Position == mousePoint) { scrollCount++; @@ -282,7 +283,7 @@ } Application.DoEvents(); Bitmap nextPart = screenshot(rect); - int scrollHeight = AppendBelow(buffer, usedHeight, nextPart); + int scrollHeight = AppendBelow(buffer, usedHeight, nextPart, false); foreach (int delay in new int[] { 0, 2, 10, 100, 200, 1000 }) { if (scrollHeight > 0 || Cursor.Position != mousePoint) @@ -290,12 +291,24 @@ Thread.Sleep(delay); Application.DoEvents(); nextPart = screenshot(rect); - scrollHeight = AppendBelow(buffer, usedHeight, nextPart); + scrollHeight = AppendBelow(buffer, usedHeight, nextPart, false); } if (scrollHeight == -1) { + if (lastMayBeIncomplete) + { + scrollHeight = AppendBelow(buffer, usedHeight, nextPart, true); + } + lastMayBeIncomplete = false; + } + else + { + lastMayBeIncomplete = true; + } + if (scrollHeight == -1) + { CropToSimilarRange(centerPoint, ref rect, ref buffer, ref usedHeight, ref nextPart); - scrollHeight = AppendBelow(buffer, usedHeight, nextPart); + scrollHeight = AppendBelow(buffer, usedHeight, nextPart, false); } if (scrollHeight <= 0) break; @@ -313,9 +326,21 @@ int relX = centerPoint.X - rect.X; int relY = centerPoint.Y - rect.Y; + // copy all pixel values + int[,] bufferPixels = new int[rect.Width, rect.Height]; + int[,] nextPartPixels = new int[rect.Width, rect.Height]; + for (int x = 0; x < rect.Width; x++) + { + for (int y = 0; y < rect.Height; y++) + { + bufferPixels[x, y] = buffer.GetPixel(x, y + offs).ToArgb(); + nextPartPixels[x, y] = nextPart.GetPixel(x, y).ToArgb(); + } + } + // find a different point int diffX = relX, diffY = relY; - if (buffer.GetPixel(relX, relY + offs) == nextPart.GetPixel(relX, relY)) + if (bufferPixels[relX, relY] == nextPartPixels[relX, relY]) { bool found = false; int maxDistance = Math.Min(Math.Min(relX, relY), Math.Min(nextPart.Width - relX, nextPart.Height - relY)); @@ -325,28 +350,28 @@ { int x = relX - i + j; int y = relY - i; - if (buffer.GetPixel(x, y + offs) != nextPart.GetPixel(x, y)) + if (bufferPixels[x, y] != nextPartPixels[x, y]) { diffX = x; diffY = y; found = true; break; } x = relX + i; y = relY - i + j; - if (buffer.GetPixel(x, y + offs) != nextPart.GetPixel(x, y)) + if (bufferPixels[x, y] != nextPartPixels[x, y]) { diffX = x; diffY = y; found = true; break; } x = relX + i - j; y = relY + i; - if (buffer.GetPixel(x, y + offs) != nextPart.GetPixel(x, y)) + if (bufferPixels[x, y] != nextPartPixels[x, y]) { diffX = x; diffY = y; found = true; break; } x = relX - i; y = relY + i - j; - if (buffer.GetPixel(x, y + offs) != nextPart.GetPixel(x, y)) + if (bufferPixels[x, y] != nextPartPixels[x, y]) { diffX = x; diffY = y; found = true; break; @@ -366,13 +391,13 @@ for (int y = 0; y < rect.Height; y++) { // look at every pixel that does not match unmoved - Color pixel = nextPart.GetPixel(x, y); - if (buffer.GetPixel(x, y + offs) != pixel) + int pixel = nextPartPixels[x, y]; + if (bufferPixels[x, y] != pixel) { - int score = 1000 / (Math.Abs(relX - x) + Math.Abs(relY - y)) + 1; - for (int scrollHeight = 1; scrollHeight < scrollScores.Length; scrollHeight++) + int score = 1000 / (Math.Abs(relX - x) + Math.Abs(relY - y)+1 ) + 1; + for (int scrollHeight = 1; scrollHeight < Math.Min(scrollScores.Length, rect.Height - y); scrollHeight++) { - if (buffer.GetPixel(x, y + offs + scrollHeight) == pixel) + if (bufferPixels[x, y + scrollHeight] == pixel) { scrollScores[scrollHeight] += score; } @@ -384,8 +409,8 @@ // remove scores that do not preserve relX/relY or diffX/diffY for (int scrollHeight = 1; scrollHeight < scrollScores.Length; scrollHeight++) { - if (buffer.GetPixel(relX, relY + offs + scrollHeight) != nextPart.GetPixel(relX, relY) - || buffer.GetPixel(diffX, diffY + offs + scrollHeight) != nextPart.GetPixel(diffX, diffY)) + if ((relY + scrollHeight < rect.Height && bufferPixels[relX, relY + scrollHeight] != nextPartPixels[relX, relY]) + || (diffY + scrollHeight < rect.Height && bufferPixels[diffX, diffY + scrollHeight] != nextPartPixels[diffX, diffY])) { scrollScores[scrollHeight] = 0; } @@ -417,14 +442,14 @@ scrollScores[scrollHeight] = 0; // check the maximum rectangle that scrolls and its size - int minY = 0, maxY = rect.Height - 1; + int minY = 0, maxY = rect.Height - 1 - scrollHeight; // first scan up and down with a width of 7 pixels for (int y = relY - 1; y >= minY; y--) { bool same = true; for (int x = relX - 3; x <= relX + 3; x++) { - if (buffer.GetPixel(x, y + offs + scrollHeight) != nextPart.GetPixel(x, y)) + if (bufferPixels[x, y + scrollHeight] != nextPartPixels[x, y]) { same = false; break; @@ -440,7 +465,7 @@ bool same = true; for (int x = relX - 3; x <= relX + 3; x++) { - if (buffer.GetPixel(x, y + offs + scrollHeight) != nextPart.GetPixel(x, y)) + if (bufferPixels[x, y + scrollHeight] != nextPartPixels[x, y]) { same = false; break; @@ -452,14 +477,14 @@ } } // now check left and right - int minX = 0, maxX = rect.Height - 1; + int minX = 0, maxX = rect.Width - 1; for (int x = relX - 1; x >= minX; x--) { bool same = true; for (int y = minY; y <= maxY; y++) { - if (buffer.GetPixel(x, y + offs + scrollHeight) != nextPart.GetPixel(x, y)) + if (bufferPixels[x, y + scrollHeight] != nextPartPixels[x, y]) { same = false; break; @@ -473,7 +498,7 @@ bool same = true; for (int y = minY; y <= maxY; y++) { - if (buffer.GetPixel(x, y + offs + scrollHeight) != nextPart.GetPixel(x, y)) + if (bufferPixels[x, y + scrollHeight] != nextPartPixels[x, y]) { same = false; break; @@ -519,17 +544,31 @@ return result; } - private static int AppendBelow(Bitmap buffer, int usedHeight, Bitmap nextPart) + private static int AppendBelow(Bitmap buffer, int usedHeight, Bitmap nextPart, bool ignoreLastPart) { int offs = usedHeight - nextPart.Height; - for (int scrollHeight = 0; scrollHeight < nextPart.Height / 2; scrollHeight++) + + // copy all pixel values + int[,] bufferPixels = new int[nextPart.Width, nextPart.Height]; + int[,] nextPartPixels = new int[nextPart.Width, nextPart.Height]; + for (int x = 0; x < nextPart.Width; x++) { + for (int y = 0; y < nextPart.Height; y++) + { + bufferPixels[x, y] = buffer.GetPixel(x, y + offs).ToArgb(); + nextPartPixels[x, y] = nextPart.GetPixel(x, y).ToArgb(); + } + } + + // find offset and append + for (int scrollHeight = 0; scrollHeight < nextPart.Height / (ignoreLastPart ? 4 : 2); scrollHeight++) + { bool same = true; - for (int y = 0; same && y < nextPart.Height - scrollHeight; y++) + for (int y = 0; same && y < nextPart.Height - scrollHeight * (ignoreLastPart ? 2 : 1); y++) { for (int x = 0; same && x < nextPart.Width; x++) { - if (nextPart.GetPixel(x, y) != buffer.GetPixel(x, y + offs + scrollHeight)) + if (nextPartPixels[x, y] != bufferPixels[x, y + scrollHeight]) same = false; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |