|
1. You should use Assembly.ManifestModule (at least with assemblies containing a single module) instead of the first entry in Assembly.GetModules() .
2. You should declare P/Invoke methods as private and expose them through wrapped classes. P/Invoke is dangerous and you should make sure that you handle all inputs from potential unknown and malicious callers. This leads into my next point.
3. You should declare the P/Invoke methods with SetLastError=true . If an error occurs, call Marshal.GetLastWin32Error and let us know what the actual error is. Without that, all one can know is an error occured (which you already know). Wrapper this method would allow you to do that and throw a Win32Exception (or any exception - this is just an example) with the last error as reported by Windows (so the exception is more actionable).
There are several good articles here on Code Project that may help shed some light on what might be wrong. Just search for "SetWindowsHookEx".
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
|
All that says at the bottom is that to use the Unicode version of the function (NT supports Unicode and ANSI, while Win9x only supports ANSI) you have to use a shim named unicows.dll. You needn't worry about this since you're using CharSet.Auto . You need to figure out what the error is, though. See my paragraph about using Marshal.GetLastWin32Error() .
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
sorry to bother you again but i realy dont understand what you mean.
i was looking for a method named ManifestModule and i didnt fint it.
and i also dont know what is P/Invoke
Can you help me?
Ran.
R.Z
|
|
|
|
|
Assembly.ManifestModule is new in .NET 2.0, so if you're not programming against .NET 2.0 you won't have it.
P/Invoke is the act of calling native functions in .NET. It's what you call defining methods attributed with DllImportAttribute like you're doing.
Please add code to call Marshal.GetLastWin32Error and report what the error is on Win9x. The fact that 0 is returned simply means an error occured but there are many errors that could have occured and without knowing which one it's impossible to help you further.
I would also suggest looking for articles here on Code Project that use SetWindowsHookEx . Sample code works on both 9x and NT at least for the ones I have tested (some time back when I was an editor).
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
well i've changed the public to private like you said.
now i put this line before throwing the exception:
MessageBox.Show(Marshal.GetLastWin32Error().ToString());
that will show me the error number i guess.
and wrote : SetLastError=true
run it on the win98 and it gives me the number 127.
what that means? did i win anything ?
R.Z
|
|
|
|
|
If you lookup error 127 in winerror.h (available with VC++ that may be installed with your VS install, and online on http://msdn.microsoft.com[^]) you'll see that the error is ERROR_PROC_NOT_FOUND , which translates to the English text, "The specified procedure could not be found." I would recommend taking a look at http://msdn.microsoft.com/msdnmag/issues/02/10/cuttingedge/[^].
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
well, its generaly nice but it doesn't help regarding win98.
i have allready succesfuly using Hooking but i just want to make sure the client can run it too.
in Microsoft they say:
WH_KEYBOARD
Installs a hook procedure that monitors keystroke messages. For more information, see the KeyboardProc hook procedure.
WH_KEYBOARD_LL
Windows NT/2000/XP: Installs a hook procedure that monitors low-level keyboard input events. For more information, see the LowLevelKeyboardProc hook procedure.
is it posible that the WH_KEYBOARD_LL is only on XP and not win98?
R.Z
|
|
|
|
|
Yeah, the WH_KEYBOARD_LL hook is only available in NT4.0 SP3 and above. Windows 9x is not supported.
Hey Heath! How's it going in Redmond?
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Hi Dave,
so how can i get KeyUp/Pressed/Down , MouseClick events on using .net on 98?
Thanks,
Ran.
R.Z
|
|
|
|
|
You can use WH_KEYBOARD and WH_MOUSE . These will give you the scan codes for keys pressed and mouse messages like move, click, etc., respectively. The article I linked shows an example and other articles on this site have further examples. I encourage you to use the other features of this web site. There's thousands of articles at your disposable with a rating system in place so you know which ones are good.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
Is it possible to change the DefaultValue attribute for a property for a derived class without having to re-define the whole property?
|
|
|
|
|
It actually depends on how you plan to use it. Normally, yes, you would have to override the property and attribute it with a different value for the DefaultValueAttribute constructor.
If the object is only to be used with Component Model clients (like the PropertyGrid ) you can implement ICustomTypeDescritor and when a PropertyDescriptor is requested for the property you can return a custom implementation that returns a different instance of DefaultValueAttribute from the PropertyDescriptor.Attributes . See the documentation for ICustomTypeDescriptor for more details. You can return the default implementation for most methods you don't need to override using the TypeDescriptor class (corresponding methods to ICustomTypeDescriptor take an additional parameter that basically says not to use any ICustomTypeDescriptor implementation).
Since you care about the DefaultValueAttribute and this is generally used at design-time (though not necessary), you could also implement a custom designer that does essentially what I mentioned above. If this was a Component derivative you would implement a derivative of ComponentDesigner and override PostFilterAttributes .
Generally speaking, though - it's far easier of a change and easier to maintain with less possibility of bugs to just override the property. It could be as easy as the following:
public class MyBase
{
bool _boolProperty = true;
[DefaultValue(true)]
public virtual bool BoolProperty
{
get { return _boolProperty; }
set { _boolProperty = value; }
}
}
public class MyDerivative : MyBase
{
public MyDerivative()
{
BoolProperty = false;
}
[DefaultValue(false)]
public override bool BoolProperty
{
get { return base.BoolProperty; }
set { base.BoolProperty = value; }
}
} See, there's nothing really to implement - just set the member of the base class. Many classes within the .NET Framework base class library do this when necessary. It's just a cleaner design and doesn't depend on callers having to implement or use rather difficult interfaces.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
Hi!
I have a hashtable and add values from time to time like this:
users.Add("Bob", 4);
users.Add("John", 10);
Now I want each entry I add into this list to be removed after a certain amount of time, e.g. 10 minutes.
So I add "Bob", and Bob will be autoamtically removed from the hashtable after 10 minutes, same for John.
What is the best way to do this?
regards
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Run a clean-up function off a timer that scans the list for items older than 10 minutes, and deletes them. You'll have to keep track of how old an item is, of course. How you do that is really up to you, but I'd make the "value" portion of the table entry actually a class instance that holds your useful data plus a DateTime value.
|
|
|
|
|
It thought about that idea too, but found it a bit unflexible. But when there's no other way that's how I will do it.
regards
modified 12-Sep-18 21:01pm.
|
|
|
|
|
I think the System.Web.Caching.Cache class is what are you looking for ...
You can use it in WinForms application as shown below:
<br />
using System.Threading;<br />
using System.Web;<br />
using System.Web.Caching;<br />
<br />
namespace WindowsApplication8<br />
{<br />
public sealed class WinCache<br />
{<br />
private static HttpRuntime _httpRuntime;<br />
<br />
public static Cache Cache<br />
{<br />
get<br />
{<br />
EnsureHttpRuntime();<br />
return HttpRuntime.Cache;<br />
}<br />
}<br />
<br />
private static void EnsureHttpRuntime()<br />
{<br />
if( null == _httpRuntime )<br />
{<br />
try<br />
{<br />
Monitor.Enter( typeof( WinCache ) );<br />
if( null == _httpRuntime )<br />
{<br />
_httpRuntime = new HttpRuntime();<br />
}<br />
}<br />
finally<br />
{<br />
Monitor.Exit( typeof( WinCache ) );<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
Then you can easily insert the values into WinCache in following way:
<br />
WinCache.Cache.Insert("Bob", 4, null, DateTime.Now.AddMinutes(10), TimeSpan.Zero);<br />
WinCache.Cache.Insert("John", 10, null, DateTime.Now.AddMinutes(10), TimeSpan.Zero);<br />
DevIntelligence.com - My blog for .Net Developers
-- modified at 17:31 Tuesday 24th January, 2006
|
|
|
|
|
tarasn wrote: I think the System.Web.Caching.Cache class is what are you looking for ...
You can use it in WinForms application as shown below:
I'm not sure if you should be applauded for code reuse or censored for abusing existing code into a place where it has no business being. (mainly because I don't know anything about the web classes)
|
|
|
|
|
I don't see any problem with my answer .You can create Console application and check the code that I sent .Instead reinventing the wheel ( and wasting the time ) you can use well implemented class .I highly recommend you read more on MSDN about Cache class - probably it solves your .Net problem too .
DevIntelligence.com - My blog for .Net Developers
|
|
|
|
|
This looks cool, but what's all the web stuff in there? I don't plan on using any http capabilities in my console application (and thus no WinForms).
regards
modified 12-Sep-18 21:01pm.
|
|
|
|
|
The WinCache class can be used in console application.
DevIntelligence.com - My blog for .Net Developers
|
|
|
|
|
I am writing a interface with Managed DirectX. I decided to use their build in UI, CustomUI. For one of the buttons, I have it clear the screen and then I need it to play a AVI file right in the window. I found some code that uses
the DirectX AudioVideoPlayback. The example it showed me did it in windows.forms. Here is the link to the example. The problem is I am tyring to figure out an easy
way to implement this into my CustomUI. I need to give the video ownership,
but I am not sure what window I use to give ownership. And can I do this without having to create a Windows.Forms? Thank help or input would be great.
Thanks.
|
|
|
|
|
From experience, Direct3D (which im pretty sure CustomUI is built in) does not like to share sys resources.
I have never used the DirectX AV Playback libraries, but I do know there are lots of posts on other forums like this - maybe you should create two seperate windows, or make a custom designed "flat" button in win.forms?
|
|
|
|
|
So it should be possible to create a second window, using the CreateWindow(); method and then use that to host my video playback?
|
|
|
|
|
Possibly yes, you could use the HWND of the second window to exchange commands between them both.
What are you intending to use the GUI for? If its only simple, then you may want to consider using hotkeys.
|
|
|
|