play sound triggered by click on form control - vba

I'm trying to trigger a sound by clicking on a form control in Excel 11. The handler for the click event tries to play a sound using sndPlaySound32 if it finds certain text on the clipboard.
I've declared the function sndPlaySound32, and call it with (simplified)
whatSound$ = "C:\WINDOWS\Media\Office97\Drop.wav"
sndPlaySound32 whatSound$, &H0
As long as Excel is the front app when I click the control then everything works fine and the sound plays (if the target text is found on the clipboard), but if I'm bringing the text in on the clipboard from another app like Notepad, where Excel is not the front app when the click occurs, then the first click on the control doesn't produce any sound. Subsequent clicks work normally. Other events on the form have no problem with this and continue to respond normally to the first click.
How can I make the sound play on the first click of the control when Excel is not the front app?
Edit 11/25/10:
I can't make the board Comments work. I click Add Comment but my comments aren't shown, so this is a reply to Boost.
I think it's something deeper than just bringing Excel to the front with the first click, because there are several of other actions that are triggered successfully by this first click on the control, (while another app is in front), and they all work just fine. It's only the playSound that doesn't work until subsequent clicks.
I've tried moving the playSound command both to the front and to the end of the list of other actions (e.g. font changes, text resizing etc.) that are supposed to happen with each click, and also tried putting delays in various places, but no joy. If I step through the code, the playSound procedure gets called correctly on the first click but it doesn't produce a sound.

I don't think there's a fix here. An application will not accept mouse events until it is "in focus." If Notepad is in focus, you will transfer focus from it to Excel with the first click, then Excel's event handlers will come into play and respond to subsequent events.
You could (and I don't know if it's even possible) put a transparent windows over the whole screen and interpret mouse-clicks in that context, and pass them to the appropriate underlying windows. SMOP, I suppose.

I finally found a workaround that's simple, reliable, and ugly. Since it won't play the sound on the first click, I just give it another chance. So now, in place of the code in my original post, it looks like this:
whatSound$ = "C:\WINDOWS\Media\Office97\Drop.wav"
sndPlaySound32 whatSound$, &H0
sndPlaySound32 whatSound$, &H0
It still ignores the first playSound command, but it plays the second one every time on the first click.

Related

Stop button in LabVIEW cannot be pressed during while loop execution inside an event structure

I am currently working on a LabVIEW project and have found myself stuck on how to make a while loop exit when I press the abort (stop) button. For a simple while loop I understand how to do this - but the problem is that this while loop is nested inside of an event structure and I'm guessing that the button cannot be pressed while the loop is executing. Attached here is a picture of part of my code (that contains this specific event case which is causing me problems): To spend a little more time explaining what the problem is - I think the code is doing what I want it to do (namely output a set of commands in a repeated cycle with a wait timer) but I cannot stop the code mid cycle (pressing the abort button with my mouse does nothing - as in the button doesn't show it being pressed and the indicator shows no change, I also can't use any other functionality of my program during the cycle which I'm assuming is related). And I do not want to stop the LabVIEW program from running entirely - just the code inside the while loop pictured above. This is what the front panel is configured too for completeness:
Essentially what I want to happen is the while loop to execute when I press DWG and in the middle of the cycle be able to abort it. Sorry if my code seems a little messy. Additionally, I've tried the same code with a for loop originally (via a conditional terminal so it could stop early) and that didn't work either. Thanks for any help I appreciate it!
Your problem is that inside the event structure, by default the UI is frozen so no UI actions (keyboard/mouse/etc) are processed until you exit that frame.
Option 1. You can right click the Event Structure and select "Edit events handled by this case" dialog and then uncheck the "Lock panel" checkbox -- that will allow the UI to be live while you are in that frame. I do not recommend this solution generally unless you have an extremely simple user interface because it leads to the user being able to change controls without the events behind those controls being processed (not a good UI experience for users). But if the UI is simple enough, that works.
Option 2. You can create a user event that is the code you want inside your While Loop. When the Deg Wait Go button is pressed, use the "Generate User Event" node to trigger that event. Do the same thing in the user event case so that the event re-triggers itself if and only if the Abort button has not been pressed.
Option 3. Create a separate loop OUTSIDE your UI loop that does your processing with some sort of command queue running between the UI loop and that other loop. The other loop moves into various states at the request of the UI loop... it's the one that does nothing until it receives a "go" message and then keeps looping until it receives a "stop" message. You can Google "queued message handler" for extensive details of this solution. This is the most common solution for complex UI requirements, especially useful for separating concerns of the UI code from the execution code.

Debugging problem in VB.Net with Windows Forms with losing events

We have a huge application that runs through a mass of code for every click you do. In one specific case, where you have a specific control in plain sight (so that the events are firing) and you load some special data into it and then click on the new button the form loses some events, like the closing event (you cannot close the form anymore and stop points in debug mode are not triggered) and one validating of a ComboBox that is really needed for the program. The only thing you can do when you get this kind of error is to restart the application to get out of this subform. But I tested it for 2 days now and even when I activate all points in the 'Exception Settings' I don't get any exceptions. The form (and other controls) are not losing ALL events. The resize, for example, still works. Even a specifically called AddHandler is not firing. Can you iterate somehow through the EventHandlerList? Or is there any way to test WHERE the event dies? Somehow any ideas on how to debug such a problem?

VB.net Application wide Copy and paste (Text)

Im trying to implement application wide copy and paste short cuts. (ctrl+C) etc.
The application consists of forms drawn in tab pages, and there are quite alot of forms. Ideally im after something (in the keypress of the main form) that would just see if the active control is a text box and If so pastes or copies text. Doing so on every text box on every form is unfeasible.
Another approach i guess would be to override the text box control application wide?
There must be an easy way to do this surely.
My googling so far hasn't come up with anything. Thankyou.
Ok; turns out there was a simple problem preventing this from working.
The EDIT menu in the menu bar on the main parent form was 'consuming' these keyboard short cuts.
Deleting this menu fixed the issue instantly.

Can't View VBA Form

So I created a form, and have been using it for a while.
All of a sudden today it stopped working. Other forms load and can be viewed but not this one.
The weirdest part is that the controls still respond!
So I can't actually see the form but I can still interact with it. (only using keyboard no mouse clicks are responding) I know the form is enabled. But I simply can't see it! I have restarted excel, and the whole computer.
I even completely removed all code in the userform to see if I could get the blank shell to load, and while I can tell it loads (it disables everything in excel until I use Alt+F4) it still won't be visible. I have checked the Enabled, All Colors, Captiuon, Width, Height, Top, Left, StartUpPostion, SpecialEffect, Zoom, DrawBuffer properties and everything is fine.
I have also Exported and reimported it and still simply nothing. Also tried importing it into another Workbook, nothing. I at my wits end (not that it's very far to reach!)
Also, I can still see the userform in the designer I can still edit it, I get NO errors. This happens not only when calling the form in code, but even when running it right from the designer.
Any one ever have this issue? Any ideas or solutions?
The issue ended up being the Top and left properties. While I did check them, they way I checked them was not accurate; I still have no idea why, but I think it defiantly has something to do with dual monitor setup.
The way I tested double checked the forms top and left properties was by creating a new form and adding a button on the button click event I had a msgbox show the top and left properties of the form at time of clicking.
I then moved the new form to where I wanted the form that woudn't show to be and clicked the button; I then set these values to the form that wouldn't show.
I tested this location and made sure to match the properties with the values I wanted multiple times and it didn't work.
For some reason the values needed where about 1000 digits off (instead of 250 I needed to use 1250) even though I had set the form right where I wanted the new one to be and made sure to save the properties when they matched what I wanted

App calls Method on mouse click. How can I stop it?

So I am pretty new to Xcode and Objective C, I've been using it about 2 weeks now. I am building an app for OSX. One of the windows in the app has 5 text boxes, some labels and a submit button at the bottom. The submit button is linked to a method that closes the window, opens a new one and outputs the contents of the text boxes into one text field on the new window.
I had it working correctly, but now when I do anything but click on the top text field the submit method is called and the window closes. I can click on the black space in the window, but click on any of the objects calls the method. Also, pressing tab calls the method. I am not sure when I did to cause this error, but any insight or tips would be very useful.
Sorry if this is vague, I'm not even sure how to describe the problem. If you need any specific information please ask.
Try looking in Interface Builder. Ctrl Click or Right click on the each one of the fields that are responding with calling the function. See if they are linked to the function.
Also check the "responder" as was suggested earlier. You can do this by also right click or ctrl clicking the red responder box labeled "responder". See if anything in there maps to your function