coding a screenshot tool - allowing user to select a part of screen

Started by
5 comments, last by Servant of the Lord 9 years, 12 months ago

Hi guys. How to code (in WINAPI) util that would allow user to select part of the screen? I'm going to make a screenshot maker tool like the one available in AQQ communicator. I'd like to allow user selection of certain parts of screen (select first and second corner). Then I need to capture the pixels data in RGB or RGBA format. Any ideas how to do this?

Advertisement

You could have a look at my code here. Should work fine for what you need (with some adjustment of course). The raw buffer thing is just a managed byte array btw.

The last version of the code is here, but it's a bit more complex, but it support all type of bitmaps color depth, and the cursor part is fixed.

Just change Info.BitsPerPixel = 32; to 24 for RGB images.

Thank you, but that's related to "making screenshot" part of the question.
What about the selecting a rectangle on the screenshot with mouse? User should be able to do this somehow. Click and drag to make rectangle and then confirm making a screenshot. Something like that. Any ideas?

Are you referring to the whole screen, or the applications window? There are api's for getting the global mouse coordinates. Though I'm a bit iffy on the best way to draw the rectangle, in old school GDI land, i believe there was a way to get the desktop's HDC and then draw using that. I'd imagine it's something similar on more modern windows.

On the other hand, if you just want the application window, well that's relatively easy, just a matter of drawing a rectangle within your own framework.

Well, if you look at my code, im taking the whole screen with GetWindowRect(), but if you supply your own value to the x,y,w,h variables it will only take that area. Now, i have no idea about how your app work so im just giving you the code for the screenshot, how you take it is up to you.


Though I'm a bit iffy on the best way to draw the rectangle, in old school GDI land, i believe there was a way to get the desktop's HDC and then draw using that.

Yep, that's what those lines are for


HWND hDesktopWnd = GetDesktopWindow();
HDC hdc = GetDC(hDesktopWnd);


Perhaps you could make a gui with some edit box for the coordinates, and a preview windows and see the rectangle into that.

Hah, for some reason I find it amusing that it's remained the same after so many years.

Maybe they are having trouble with the rectangle portion? That's just looking at when the mouse first gets it down message, thats your first point, then just look at mouse move messages while the mouse is still down to get a second point. And you have your rectangle right there, you might have to take the mins/maxes of it to make sure it's not negative, but its pretty straightforward. (And probably also in Vortez's code, I'd imagine)

If you are looking for a tool to do this on the entire desktop, such tools already exist for free that can save you work. I use Greenshot, which, by the way, is open source so you can take a look and see how it works.

If you are looking to do this from inside your game, and only selecting a portion of your game window, then just use your API of choice to get the previous screen buffer, and copy a subrect of the RGB data and save that. Draw your own rect using your game's existing drawing code - just pause the logic of your game while doing so. I wouldn't touch Win32 at all for that, unless I was already writing the game in Win32. Think of the screenshot functionality as a in-game feature, and implement it within the confines of the structure of your game that already exists.

For me, using SFML, the actual screen-capturing code is as easy as:


sf::Image entireScreen = myRenderWindow.capture();
sf::Image portionOfScreen;
portionOfScreen.create(userSelectedRectangle.width, userSelectedRectangle.height);
portionOfScreen.copy(entireScreen, 0, 0, userSelectedRectangle);

portionOfScreen.saveToFile("screenshot.png");

How to get 'userSelectedRectangle' would be dependent on your game's architecture, but really shouldn't be hard.

[Edit:] Ah, but you aren't making a game, and you are wanting to capture a portion of the entire monitor, so everything I said above is irrelevant. ph34r.png

This topic is closed to new replies.

Advertisement