|
Hello Everybody,
I have an application running in a Citrix MetaFrame. That application automates Outlook so read the user's inbox and send emails. I create and release the outlook instance like that:
Application outlook = new ApplicationClass();
try
{
DoSomething(outlook);
}
finally
{
Marshal.ReleaseComObject(outlook);
outlook = null;
}
[EDIT]I cannot call outlook.quit() , because it would also close all local instances, if you run the application locally (outside MetaFrame).[/EDIT]
It works fine. The users run the application in the MetaFrame and their visible Outlook instances locally on their desktops.
The only problem is: They forget going to meetings, because Outlook doesn't show them any notifications a few minutes before an Appointment starts. The remote Outlook (running invisibly in the MetaFrame) prevents the local Oulook from showing the notifications.
For example, you add an appointment to your calendar folder and configure a reminder 10 minutes before starting time. So, you expect Outlook's notify-window to pop up ten minutes before the appointment.
It does pop up, if nothing is running via Citrix at the moment. But if my application is running, there will be no notify-windows, the local Outlook instance won't show any reminders.
What is the problem? Does anyone know why the calendar reminders don't work locally, while there's another instance running in a Citrix MetaFrame? Please tell me...
Thanks in advance,
coco
_____________________________________________________________________________
I don't expect too much, all I want is your vote for Halbsichtigkeit.
-- modified at 4:03 Friday 7th July, 2006
|
|
|
|
|
Why values are not same? I simple want to find the position of Cursor through LParam. But calculated values are different.
<br />
Point screenMousePointOld = Control.MousePosition;<br />
Point screenMousePoint = new Point(LoWord(message.LParam.ToInt32()), HiWord(message.LParam.ToInt32()));<br />
<br />
private static int HiWord(int number)<br />
{<br />
if ((number & 0x80000000) == 0x80000000)<br />
return (number >> 16);<br />
else<br />
return (number >> 16) & 0xffff ;<br />
}<br />
<br />
private static int LoWord(int number)<br />
{<br />
return number & 0xffff;<br />
}<br />
What I am doing wrong?
|
|
|
|
|
Since LParam is 64 bit number, so you have to convert it to int64 type.
|
|
|
|
|
hi. i am trying to prevent the form from queueing repeat clicks.
i set the cursor to wait, but when the user clicks on a menu button it queues the command still.
i want it to ignore the command.
how do i do this?
i tried the following:
if(cursor.current == cursors.waitcursor)
return;
cursor.current = cursors.waitcursor;
|
|
|
|
|
Hello
Check the MouseCapture property. Set it to true in an irrelevant control of your form -eg. the statusbar-, this way it will capture the mouse and no other control will respond to hovering or clicking, until you release the capture again by setting it to false in the same control.
Regards
|
|
|
|
|
can you please elaborate?
which mouse capture?
|
|
|
|
|
Hello
There is a Control.Capture property in all controls. When you set it to true in any control, it will capture the mouse and the mouse click won't work until you click on something else once, then the control will lose its capture and the second click will work -remember: the first won't do anything- This will give you a chance to handle the MouseCaptureChanged event of that control to check if you intentionally released the mouse -you might want to use a boolean here-, or if the user clicked somewhere. If so, it will recapture the mouse. Here is a code snippit:
bool Release;
public void MyMethod()
{
Release = false;
UseWaitCursor = true;
MyControl.Capture = true;
UseWaitCursor = false;
Release = true;
MyControl.Capture = false;
}
private void MyControl_MouseCaptureChanged(object sender, EventArgs e)
{
if(!Release)
MyControl.Capture = true;
}
Regards
|
|
|
|
|
how do i associate the method with my control?
|
|
|
|
|
What method?? The MyMethod is your method that does the lengthy operation. you write it from the scratch!! The other one is the event handler. Just select your control, then double click on its MouseCaptureChanged event in the event tab of its property grid.
If you don't already have a control to capture the mouse just make a dummy one:
Control MyControl = new Control();
|
|
|
|
|
i cant seem to get the MouseCaptureChanged event on my dummy control, myControl.
myClass()
{
busy = false;
Control myControl = new Control();
myControl.Capture = false;
}
myLongMethod()
{
myControl.Capture = true;
busy = true;
Cursor.Current = Cursors.WaitCursor;
// work code
Cursor.Current = Cursors.Default;
busy = false;
myControl.Capture = false;
}
btw, i appreciate the help. it probably seems really simple and basic to you, but for some reason i cant get it to work.
|
|
|
|
|
Hello
Forgive me if I say that your code has some mistakes . One of them is that you don't really recognize the scope of objects. if you declare an object in one method, it's destroyed & goes out of scope once the method is over -well, there are more details on this subject-.
Also you must add an event handler for your event to be handled by a method -notice the += operator below-
I'll assume that MyClass is your class, & it's driven from System.Windows.From
class MyClass : Form
{
Control Dummy;
bool busy;
MyClass()
{
Dummy = new Control();
busy = false;
Dummy.MouseCaptureChanged += new EventHandler(Dummy_MouseCaptureChanged);
}
public void MyLongMethod()
{
busy = true;
Dummy.Capture = true;
UseWaitCursor = true;
busy = false;
Dummy.Capture = false;
UseWaitCursor = false;
}
void Dummy_MouseCaptureChanged(object sender, EventArgs e)
{
if (busy)
Dummy.Capture = true;
}
}
Happy programming
|
|
|
|
|
when i compile this code, i get the following error:
System.Windows.Forms.Control' does not contain a definition for 'MouseCaptureChanged
MS development environment 2003 version 7.1.3088
.net framework 1.1 version 1.1.4322 sp1
edit: turns out this event is only in 2.0
-- modified at 1:41 Monday 10th July, 2006
|
|
|
|
|
Hello
lushgrass wrote: turns out this event is only in 2.0
unfortunately that is true. Yet still the Capture property is present in the Framework 1.1 you are using. So instead of using the MouseCaptureChanged event. You may use the Control.LostFocus like this:
1- Change the event handler declaration to this:
Dummy.LostFocus += new EventHandler(Dummy_LostFocus);
2- And the event handler definition into this:
private void Dummy_LostFocus(object sender, System.EventArgs e)
{
if(Busy)
Dummy.Capture = true;
}
Regards
|
|
|
|
|
so the end code should look like the following:
<br />
public class Form1<br />
{<br />
private StatusBar status;<br />
private bool busy;<br />
private Control control;<br />
<br />
public Form1()<br />
{<br />
status.Capture = true;<br />
busy = false;<br />
control = new Control();<br />
control.Capture = false;<br />
control.LostFocus += new EventHandler(control_LostFocus);<br />
}<br />
<br />
private void control_LostFocus()<br />
{<br />
if(busy)<br />
control.Capture = true;<br />
}<br />
<br />
private void Search()<br />
{<br />
status.Text = "Searching";<br />
busy = true;<br />
control.Capture = true;<br />
<br />
<br />
control.Capture = false;<br />
busy = false;<br />
status.Text = "";<br />
}<br />
}<br />
|
|
|
|
|
Hello
Well, something like that. Yet there are two modifications
public class Form1
{
private StatusBar status;
private bool busy;
private Control control;
public Form1()
{
busy = false;
control = new Control();
control.Capture = false;
control.LostFocus += new EventHandler(control_LostFocus);
}
private void control_LostFocus()
{
if(busy)
control.Capture = true;
}
private void Search()
{
status.Text = "Searching";
busy = true;
control.Capture = true;
busy = false;
control.Capture = false;
status.Text = "";
}
}
NB.
Next time use the "pre" instead of "code " formatting
Regards
|
|
|
|
|
for some reason this doesnt resolve my issue.
if i click on search really quickly it still searches in series instead of ignoring the extra clicks.
|
|
|
|
|
If this is your problem simply add
if(busy)
return;
at the beginning of the click event handler (ie. Button1_clicked) or the Search() method
Ragards
|
|
|
|
|
i inserted that code before the actual searching method.
still didnt work.
does it matter if the event is from a menu?
or would any other events throw it off?
edit 1: right now the only solution i can find is to pop up
another form that says there is something being processed.
it wouldnt have any buttons and would lock the user out
until the process succeeds or fails.
edit 2: just tested it and was unsuccessful. the parent
form seems unable to do anything while the child form has
focus.
the problem has expanded slightly to include any action that
requires a period of time from the network.
still hoping for ideas.
-- modified at 1:07 Thursday 13th July, 2006
|
|
|
|
|
Hello
There are many ways of dealing with this problem -lengthy operations- and each programmer chooses what suits him. Just at a glance I can think of some:
1- Put the operation on a separate thread and never stop dealing with the user
2- Disable all child controls using foreach loop in the parent
3- Override click event handlers in all child controls to display a gentle message explaining why the form is not responding
4- Displaying a modal form that captures the focus with a ProgressBar, Statusbar, and a cancel button.
PS.
I've tested the code I gave you, and it works fine. The problem must be in your implementation.
Regards
|
|
|
|
|
do i need to link the control to anything?
like, there are several buttons and menus that need to lock out the user while it is doing it's thing.
1 is a menu. another is a picturebox that simulates a button.
do i need to somehow add them to the control? or will just having the control work?
edit:
i put in debug comments for the LostFocus method. i didnt see any of the comments come out.
private void m_Control_LostFocus(object sender, EventArgs e)
{
if(this.m_BusySearching)
{
Debug.WriteLine("control_lostfocus: busy");
this.m_Control.Capture = true;
}
else
{
Debug.WriteLine("control_lostfocus: not busy");
}
}
-- modified at 7:04 Thursday 13th July, 2006
|
|
|
|
|
Hello
Your problem is that your dummy control doesn't get focus at all. That is why it doesn't lose focus when the user clicks anywhere else.
Before the
dummy.Capture = true;
line insert this:
dummy.Select();
Well, the Focus() method is only present in the .Net 2.0, but try this, maybe it'll work.
Regards
|
|
|
|
|
i tried both of the following:
myControl.Select();
myControl.Capture = true;
and also
myControl.Focus();
myControl.Capture = true;
.net 1.1 has focus() as well as select. neither call it up though.
by the way, the way i'm testing this is by doing the following:
1. start up the program.
2. click on search once.
3. wait until it's done searching.
4. click on search 3 times.
my program has a timer to auto search again, but it's every 10 minutes.
each time it does a search it does a debug line.
again, thanks for the help. i'm pretty sure this is a small error somewhere ...
|
|
|
|
|
Hello
I wish I could help you more, but I must see the whole code and test it.
Good luck, and I hope you make it.
Regards
|
|
|
|
|
maybe you can suggest a Control tutorial...
something else i tried was before i go into the search method, i do a
SearchButton.Enable = false;
however this doesnt work either.
|
|
|
|
|
could i have done something to this form to accidentally make it always listen?
how is your Control solution different from Form.Controls?
i'm not able to add MainMenu items to Form.Controls.
however, there is a this.Capture field. can i use that somehow?
-- modified at 4:41 Monday 17th July, 2006
|
|
|
|