Address Book dialog focus issue

  • Thread starter Thread starter Tom
  • Start date Start date
T

Tom

Hello,

I have an Outlook Add-in that creates a custom dialog, and within that
dialog we try to open the Address Book Dialog. The problem is that within
the custom Dialog the address dialog does not gain focus. If I open the
Address Book dialog within Outlook from a button click - lets say from a
Add-in toolbar - the Address Book dialog works fine. However if I try to
open it up from a dialog the Address Book does not gain focus. This happens
whether we create modeless or modal dialogs. The code below works from a
button click on the add-in toolbar, but will not work if I create a dialog
and then try to open the address book from the custom dialog. Does anybody
know of any work around.

Thanks,
Tom -

IUnknownPtr pUnk = spNameSpace->GetMAPIOBJECT();

CComQIPtr<IMAPISession, &IID_IMAPISession> spSession(pUnk);

ULONG ulUIParam = (ULONG)(void*)m_hWnd;

if(spSession)

{

CComPtr<IAddrBook> spAddrBook;

HRESULT h = spSession->OpenAddressBook(ulUIParam, NULL, 0, &spAddrBook);

if(SUCCEEDED(h) && spAddrBook)

{

LPADRLIST lpAddrList = NULL;

LPSTR rglpszDestTitles[1];

ULONG rgulDestComps[1];

ULONG ulFlags = DIALOG_MODAL | AB_RESOLVE;

rglpszDestTitles[0] = "To";

rgulDestComps[0] = MAPI_TO;



ADRPARM adrparm;

adrparm.cbABContEntryID = 0;

adrparm.lpABContEntryID = NULL;

adrparm.ulFlags = ulFlags;

adrparm.lpReserved = NULL;

adrparm.ulHelpContext = 0;

adrparm.lpszHelpFileName = NULL;

adrparm.lpfnABSDI = NULL;

adrparm.lpfnDismiss = NULL;

adrparm.lpvDismissContext = NULL;

adrparm.lpszCaption = "Select Recipients";

adrparm.lpszNewEntryTitle = "For this test dialog";

adrparm.lpszDestWellsTitle = "Selected Recipients:";

adrparm.cDestFields = 1;

adrparm.nDestFieldFocus = 0;

adrparm.lppszDestTitles = rglpszDestTitles;

adrparm.lpulDestComps = rgulDestComps;

adrparm.lpContRestriction = NULL;

adrparm.lpHierRestriction = NULL;

spAddrBook->Address((ULONG*)&ulUIParam, (LPADRPARM)&adrparm,
&lpAddrList);



}
 
Have you tried getting the hWnd of the dialog and of the AddressBook dialog
and using SetWindowLong() to set the z-order of the forms?
 
Hi Ken,

Yes I have tried setting the z-order, hook procedures and a number of other
experiments. I believe this may have something to do with Extended MAPI
login. My theory is that when Outlook logs in the Outlook window handle is
used in a way that screws up message processing. The real bazaar part of the
issue is when I click on the address book window the Outlook Window
momentarily gets focus and then reverts back to my dialog. I believe you are
correct in your assumption that the z-order is messed up - however I think
that there is a piece of the puzzle (along with hair) that I am missing.

Thanks,
Tom -


Ken Slovak - said:
Have you tried getting the hWnd of the dialog and of the AddressBook
dialog and using SetWindowLong() to set the z-order of the forms?




Tom said:
Hello,

I have an Outlook Add-in that creates a custom dialog, and within that
dialog we try to open the Address Book Dialog. The problem is that within
the custom Dialog the address dialog does not gain focus. If I open the
Address Book dialog within Outlook from a button click - lets say from a
Add-in toolbar - the Address Book dialog works fine. However if I try to
open it up from a dialog the Address Book does not gain focus. This
happens whether we create modeless or modal dialogs. The code below works
from a button click on the add-in toolbar, but will not work if I create
a dialog and then try to open the address book from the custom dialog.
Does anybody know of any work around.

Thanks,
Tom -

IUnknownPtr pUnk = spNameSpace->GetMAPIOBJECT();

CComQIPtr<IMAPISession, &IID_IMAPISession> spSession(pUnk);

ULONG ulUIParam = (ULONG)(void*)m_hWnd;

if(spSession)

{

CComPtr<IAddrBook> spAddrBook;

HRESULT h = spSession->OpenAddressBook(ulUIParam, NULL, 0, &spAddrBook);

if(SUCCEEDED(h) && spAddrBook)

{

LPADRLIST lpAddrList = NULL;

LPSTR rglpszDestTitles[1];

ULONG rgulDestComps[1];

ULONG ulFlags = DIALOG_MODAL | AB_RESOLVE;

rglpszDestTitles[0] = "To";

rgulDestComps[0] = MAPI_TO;



ADRPARM adrparm;

adrparm.cbABContEntryID = 0;

adrparm.lpABContEntryID = NULL;

adrparm.ulFlags = ulFlags;

adrparm.lpReserved = NULL;

adrparm.ulHelpContext = 0;

adrparm.lpszHelpFileName = NULL;

adrparm.lpfnABSDI = NULL;

adrparm.lpfnDismiss = NULL;

adrparm.lpvDismissContext = NULL;

adrparm.lpszCaption = "Select Recipients";

adrparm.lpszNewEntryTitle = "For this test dialog";

adrparm.lpszDestWellsTitle = "Selected Recipients:";

adrparm.cDestFields = 1;

adrparm.nDestFieldFocus = 0;

adrparm.lppszDestTitles = rglpszDestTitles;

adrparm.lpulDestComps = rgulDestComps;

adrparm.lpContRestriction = NULL;

adrparm.lpHierRestriction = NULL;

spAddrBook->Address((ULONG*)&ulUIParam, (LPADRPARM)&adrparm,
&lpAddrList);



}
 
Since you're using Extended MAPI for opening the Address Book dialog maybe
it might be better if you posted about this in
microsoft.public.win32.programmer.messaging. The Extended MAPI specialists
hang out there so you're more likely to get an answer that you can use.
 
How is your modal dialog that launches teh AB dialog displayed? Did tou make
the active Explorer or Inspector its parent?

Dmitry Streblechenko (MVP)
http://www.dimastr.com/
OutlookSpy - Outlook, CDO
and MAPI Developer Tool
 
Hi Dmityr,

I have tried using the Outlook window, and the active Explorer window as the
parent- not to mention about every other window. We are opening our custom
modeless dialog from a toolbar button command. Then from a button command I
open the address book.
 
How do you retrieve the Outlook window handle and make it the parent of your
window?
Whar if you pass to Address() the handle of the Outlook window?

Dmitry Streblechenko (MVP)
http://www.dimastr.com/
OutlookSpy - Outlook, CDO
and MAPI Developer Tool
 
Hi Dmitry,

Well I found the problem. I did the old fashion method of commenting out
code until you get the expected behavior. With our custom dialog we are
creating a custom caption (titlebar) and handling some of the Non Client
messages. As it turns out I was returning a FALSE (zero) for the
WM_NCACTIVATE message which was screwing up the activation logic. Actually I
had reviewed this code a few times and it never dawned on me that I was
returning the improper value. Once I started returing TRUE all things
started operating normal.

BTW - I did check the Visual Studio message functionality and it does put a
return value of FALSE for the default message.

Thanks for your help.

Tom -
 
Back
Top