|
Thanks a lot that solved my problem. But in the documentation of InitCommonControlsEx it says that it is not necessary to use it if we use a manifest. In that case i do not understand.
|
|
|
|
|
Hi together,
I have a big problem. I hope somebody can help me:
I implemented a service that runs under the local system account and checks if any screen blanker is activated. I use the following code:
bool result = false;
SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, (LPVOID) &result, 0); This works fine on Win XP, but on Win 2000 the function always return true. It is a known bug according to article number 318781 on MSDN.
The suggested workaround is to look for the entry "SCRNSAVE.EXE" under the registry key "HKCU\Control Panel\Desktop" using the following two lines:
RegOpenKeyEx(HKEY_CURRENT_USER, "Control Panel\\Desktop", 0, KEY_READ, &hKeyScrSave);
RegQueryValueEx(hKeyScrSave, "SCRNSAVE.EXE", NULL, NULL, (LPBYTE) szData, &dwData); Now the problem arises: As my service runs under the local system account, access to "HKEY_CURRENT_USER" is redirected to "HKEY_USERS\.DEFAULT".
So the result refers to the logon screen saver, which is (usually) always activated. But I only want this result if no user in logged in.
Therefore my question: Does anybody has a solution, how to check if a screen saver is active under 2000 like SystemParametersInfo(SPI_GETSCREENSAVEACTIVE) does it for XP? An idea how to access data under "HKEY_CURRENT_USER" from the local system account would also be very valuable for me.
Thank you very much for any hints,
Marcus.
|
|
|
|
|
Two quick things - first SystemParametersInfo(...) does not use C++ types, so you should be passing the address of a BOOL (an int , or 4-bytes under 32-bit MS), not a bool (1-byte under 32-bit MS).
Second, I am pretty sure that screen savers run on a separate desktop, the "screen saver desktop". Search MSDN for information on Window Stations and Desktops for more information.
If I am correct, you might be able to determine which desktop is active, and from that determine if a screen saver is running.
Peace!
-=- James If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong! Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road! DeleteFXPFiles & CheckFavorites (Please rate this post!)
|
|
|
|
|
Hi James,
thank you very much for your reply!
Concerning the bool/BOOL issue: I'm actually using a BOOL. In my message, however, I cut & pasted the code from MSDN, which seems to contain several bugs/typos Anyway, thanks for the hint.
Concerning the desktop issue: I think you are right. Some time ago I've read that the screen saver runs on another desktop. So I'll dig into that again
Thank you again,
Marcus.
|
|
|
|
|
khb wrote: SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, (LPVOID) &result, 0);
I think you want to check SPI_GETSCREENSAVERRUNNING instead.
khb wrote: Now the problem arises: As my service runs under the local system account, access to "HKEY_CURRENT_USER" is redirected to "HKEY_USERS\.DEFAULT".
See MSDN article Q168877 for an example.
"Let us be thankful for the fools. But for them the rest of us could not succeed." - Mark Twain
"There is no death, only a change of worlds." - Native American Proverb
|
|
|
|
|
Hi David,
I think that what I posted was correct. I want to check if a user has "installed" a screen saver so that I can expect that there is a change that it will start running somewhen. Anyway, I check if it is actually running, too.
The howto on Q168877 seems to be exactly what I was looking for, great!
Thank you,
Marcus.
|
|
|
|
|
Hi,
I am creating an array of pointers that point to unsigned char arrays like so
unsigned char* data[3];
where
data[0] = new unsigned char[256];
data[1] = new unsigned char[256];
data[2] = new unsigned char[256];
I now want to return this pointer array data from one function. How can I do that? Or what way could I return data[0], data[1] and data[2]?
Thanks for any help cause am a bit stuck here
|
|
|
|
|
You can't return an array - If you burry it in a stuct you can work around this. i.e.
struct MyData
{
unsigned char* data[3];
};
MyData Function()
{
MyData md;
return md;
}
Steve
|
|
|
|
|
Oh ok! Thanks.
I will call that function in a different class though. So do I have to define another struct (lets call it MyData') and then lets say
void callFunction
{
md'.data[3]=Class::Function;
...}
How would I go about getting data[0], data[1] and data[2] then? Sorry just a bit confused as its like arrays, pointers and structs and am quite new to this.
Thanks in advance for any help!
|
|
|
|
|
Code like this:
MyData d1, d2;
d1 = d2;
Copies dt.data[0] , dt.data[1] and dt.data[2] (and all the rest if any).
Steve
|
|
|
|
|
you'll have to create the MyData::operator = () member for this, otherwise, it will only copy the addresses, not the array contents...
|
|
|
|
|
The question said, "return this pointer array" - I believe it's the addresses that he wants copied - Although it wasn't clearly stated.
Steve
|
|
|
|
|
Stephen Hewitt wrote: Although it wasn't clearly stated
agreed
|
|
|
|
|
your code is incorrect because you return a local object...
>> You can't return an array
yes we can, by returning the pointer... it is exactly the same when you pass arrays as parameters to functions.
|
|
|
|
|
v2.0 wrote: your code is incorrect because you return a local object...
No I don't - I return a copy of a local object - This is fine. Returning a pointer or reference to a local object is where you get into trouble.
v2.0 wrote: >> You can't return an array
yes we can, by returning the pointer... it is exactly the same when you pass arrays as parameters to functions.
Returning a pointer is not the same as returning an array - A process called "decay" occurs and you lose the size info. With the code I gave (array in a struct) an array is returned and no decay occurs and the length is not lost - But the data is copied not referenced.
Steve
|
|
|
|
|
Stephen Hewitt wrote: A process called "decay" occurs and you lose the size info
Not just that, but you also effectively change the type of the variable - an array is generally a valid location in memory (whose location cannot be changed easily), while a pointer can point to a valid location in memory. (This difference is also important when optimizing code.)
Peave!
-=- James If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong! Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road! DeleteFXPFiles & CheckFavorites (Please rate this post!)
|
|
|
|
|
Since you have to put the returned array in an array anyway, you can create this "reception" array before calling the function and pass it as a parameter to the function. I think this is a much better solution than trying to "return" it, even burried in a struct.
~RaGE();
|
|
|
|
|
ahhhh, good ol' C runtime
Well done Mr "Diplomacy" ;P
|
|
|
|
|
V2.0 is too much for me. I'll go back to V1.6.
~RaGE();
|
|
|
|
|
v3.0 release date is set to 02/05/06... don't forget it
|
|
|
|
|
Hi i am doing a project and am making a tetris game in C++ V 6.0. So far i have crated the main menu screen... now i need to draw out a grid and start to make shapes fall... it seems i dont know how to do this. Does anyone have any tips or any codes i could have a look at??
Cheers for the help guys!
|
|
|
|
|
The best option is probably to create a custom control and do all the drawing yourself. Take a look at the miscellaneous controls on this site to see how to make one (it is not easy). Then to make the shapes fall, I think a timer will do that.
|
|
|
|
|
Hi!
Another way how to find out how to do that is to have a look at some related articles here on codeproject. Just type "tetris" to the search bar and you will get some hits, e.g.:
http://www.codeproject.com/cpp/CImgTetris.asp[^]
Best regards,
Marcus.
|
|
|
|
|
To start without debug is OK, but when I press F5 to start debugging, then it tells me that:
Debugging information for "....exe" cannot be found or does not match.
Binary was not built with debug information.
The "Solution Configurations" has already be set as "Debug".
Why cannot start debugging?
The problem only exists in C++, while C# is OK.
I've installed fully except x64 choice in C++.
VS2005 team suite edition.
华夏光宇世界,文明引领着我纵横驰骋于天地之间。
|
|
|
|
|
Open the project propertiesm choose 'General' under the 'C/C++' item. There you should see "Debug information Format". Make sure "Program Database" at least is selected.
Hope this helps
|
|
|
|