Author |
Topic: Window handles (Read 267 times) |
|
KenDown
Full Member
member is offline


Posts: 181
|
 |
Window handles
« Thread started on: Nov 23rd, 2017, 2:08pm » |
|
I recently wrote a program that needed to send out e-mails, so I used the method given in the Wiki. You define to$ and from$ and so on, send the string to something or other and your mail program opens up with the To and From fields filled out.
However there is a 256 character limit (or was it 512?) which means that there has to be another method of entering the message. I used one of the keyboard imitating routines from the Wiki and it all works splendidly. The program calls the mail prog, pauses until the input focus is no longer @hwnd% and then types to the handle given by GetForegroundWindow.
Yesterday I got a scream for help from one of the users: my program was malfunctioning and the message was ending up being typed into the "From" box.
It all worked fine at my end, so I hotfooted it over there and discovered that the wretched woman has changed her mail client to something horrible produced by Microsoft, which opens up a dialog box that you have to click and close before proceeding to the mail. That was what was messing things up.
So my question is, is there any way of associating a window handle with a particular program? Is there a call which will tell me that 123456789 is the dialog box and 234567891 is the main window?
Any help appreciated.
|
|
Logged
|
|
|
|
DDRM
Administrator
member is offline


Gender: 
Posts: 321
|
 |
Re: Window handles
« Reply #1 on: Nov 24th, 2017, 4:19pm » |
|
Hi Kendall,
Not strictly an answer to your question, which I don't know, but have you re-tried simply generating the body text as a single string and sending that using the method listed in the wiki? Since the advent of BB4W 6 you can have infinite length strings. I've just made one with a body of 633 characters, and it seems to generate the email fine. I don't recommend actually sending it - no idea who Joe Bloggs is, but he probably gets enough random junk...
Best wishes,
D Code: to$="joe_bloggs@gmail.com"
subject$="Test for emailing from BB4W"
body$="This is a long message, comfortably above the size limit. To achieve that I'm going to type a load of rubbish, about how exciting everything is at work. "
body$+=" This may not be strictly accurate, but it does take up space and use more than 256 characters, I should think - or at least it will once I've"
body$+=" finished typing some more! For example, this is Friday evening, it's after 5pm, and I'm still here because I can't tear myself away from the place. "
body$+="Well, OK, it's because I know the traffic will be awful, and I might as well stay here playing with BB4W trying this out, rather than "
body$+="sitting in a traffic jam getting depressed at the news."
PRINT body$
PRINT LEN(body$)
SYS "ShellExecute", 0, 0, "mailto:"+to$+ \
\ "?subject="+subject$+ \
\ "&body="+body$, 0, 0, 0
|
|
Logged
|
|
|
|
DDRM
Administrator
member is offline


Gender: 
Posts: 321
|
 |
Re: Window handles
« Reply #2 on: Nov 24th, 2017, 4:48pm » |
|
Trying to answer your original question, how about "GetClassName"? Given a window handle, it returns a string containing the class name. For example this: Code: DIM buffer% 256
SYS "GetClassName",@hwnd%,buffer%,256 TO t%
IF t%=0 THEN PRINT"Failed" ELSE PRINT$$buffer% returns "BBCProg", which is presumably the custom class created by BB4W for its standard output window.
This page: https://msdn.microsoft.com/en-us/library/windows/desktop/ms633574(v=vs.85).aspx#class_styles
(note this link seems broken, so you'll need to copy and paste, not just click)
lists the standard system classes, and if I read it right suggests the ID for a dialogue box is "#32770", which, hopefully not coincidentally, is what this code returns: Code: INSTALL @lib$+"WINLIB2"
dlg% = FN_newdialog("Hello world",100,100,400,200,8,256)
PROC_showdialog(dlg%)
DIM buffer% 256
SYS "GetClassName",!dlg%,buffer%,256 TO t%
IF t%=0 THEN PRINT"Failed" ELSE PRINT$$buffer%
PROC_closedialog(dlg%)
That will allow you to check that it isn't (or is) talking to a dialogue box, but I'm not sure that gets you much further forward. I suspect that the "from" box and the "message" box might have the same class (probably "edit"), so it would be hard to check your output was going into the right box, so I suspect my previous answer, of just using a long string sent as the body parameter, might be more robust.
best wishes,
D
|
|
Logged
|
|
|
|
KenDown
Full Member
member is offline


Posts: 181
|
 |
Re: Window handles
« Reply #3 on: Nov 24th, 2017, 8:12pm » |
|
I'll have to try it, but my understanding is that it is the mail program which won't accept the longer strings rather than being a limitation with BB4W.
As for the other, gee, I wish I was clever like you! I'll play around with that and see if I can get it working. I'll keep you posted.
|
|
Logged
|
|
|
|
KenDown
Full Member
member is offline


Posts: 181
|
 |
Re: Window handles
« Reply #4 on: Nov 24th, 2017, 8:30pm » |
|
Hmmm. GetForegroundWindow returns mailw%. While waiting for the mail client to open up the GetClassName,@hwnd% returns "BBC BASIC" as you state above, but as soon as the client opens and I try
SYS"GetClassName",!mailw%,buffer%,256TOt%
t%=0 and $$buffer% returns a null string.
Am I doing something wrong?
|
|
Logged
|
|
|
|
DDRM
Administrator
member is offline


Gender: 
Posts: 321
|
 |
Re: Window handles
« Reply #5 on: Nov 26th, 2017, 3:39pm » |
|
Hi Kendall,
MSDN says GetForegroundWindow returns a handle, so you probably don't need !mailw%, just mailw% itself. Does that work?
best wishes,
D
|
|
Logged
|
|
|
|
KenDown
Full Member
member is offline


Posts: 181
|
 |
Re: Window handles
« Reply #6 on: Nov 26th, 2017, 5:18pm » |
|
Sorry, I should have mentioned that I tried both with and without the !
You can see what I'm doing with this code fragment:
DIMbuffer%256 REPEAT SYS"GetForegroundWindow"TOmailw% UNTILmailw%<>@hwnd% VDU7 SYS"GetClassName",mailw%,buffer%,256TOt% PRINTt% PRINT$$buffer%
Have a Notepad (or other) window ready on your desktop. Run the above program and then click in the Notepad window, which will set it as the foreground window, so the Notepad handle is not the same as @hwnd% and the program beeps, gets the class name and displays it (or doesn't display it, as the case may be).
Thanks for your help.
|
|
Logged
|
|
|
|
KenDown
Full Member
member is offline


Posts: 181
|
 |
Re: Window handles
« Reply #7 on: Nov 26th, 2017, 5:20pm » |
|
However you are correct that the ! is a mistake. If you click in the code window for BB4W instead of Notepad, with the ! the program hangs up and crashes, without the ! it reports BBCWin with t% set to 6 (on my setup).
|
|
Logged
|
|
|
|
|